@ottochain/sdk 2.3.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/dist/cjs/apps/contracts/index.js +15 -8
  2. package/dist/cjs/apps/contracts/state-machines/contract-agreement.js +35 -40
  3. package/dist/cjs/apps/contracts/state-machines/contract-escrow.js +80 -37
  4. package/dist/cjs/apps/contracts/state-machines/contract-universal.js +4 -4
  5. package/dist/cjs/apps/corporate/index.js +2 -2
  6. package/dist/cjs/apps/corporate/state-machines/corp-board.js +169 -59
  7. package/dist/cjs/apps/corporate/state-machines/corp-entity.js +245 -47
  8. package/dist/cjs/apps/corporate/state-machines/corp-securities.js +407 -99
  9. package/dist/cjs/apps/corporate/state-machines/corp-shareholders.js +151 -37
  10. package/dist/cjs/apps/governance/index.js +14 -14
  11. package/dist/cjs/apps/governance/state-machines/dao-multisig.js +58 -40
  12. package/dist/cjs/apps/governance/state-machines/dao-reputation.js +46 -40
  13. package/dist/cjs/apps/governance/state-machines/dao-single.js +28 -11
  14. package/dist/cjs/apps/governance/state-machines/dao-token.js +67 -41
  15. package/dist/cjs/apps/governance/state-machines/governance-simple.js +93 -61
  16. package/dist/cjs/apps/governance/state-machines/governance-universal.js +2 -2
  17. package/dist/cjs/apps/identity/constants.js +55 -14
  18. package/dist/cjs/apps/identity/index.js +27 -11
  19. package/dist/cjs/apps/identity/state-machines/identity-agent.js +3 -3
  20. package/dist/cjs/apps/identity/state-machines/identity-oracle.js +25 -22
  21. package/dist/cjs/apps/identity/state-machines/identity-registry.js +288 -0
  22. package/dist/cjs/apps/identity/state-machines/identity-universal.js +3 -3
  23. package/dist/cjs/apps/identity/state-machines/index.js +3 -1
  24. package/dist/cjs/apps/index.js +19 -8
  25. package/dist/cjs/apps/lending/assets.js +223 -0
  26. package/dist/cjs/apps/lending/credit-scoring.js +87 -0
  27. package/dist/cjs/apps/lending/eligibility.js +121 -0
  28. package/dist/cjs/apps/lending/index.js +91 -0
  29. package/dist/cjs/apps/lending/state-machines/index.js +9 -0
  30. package/dist/cjs/apps/lending/state-machines/lending-zk-loan.js +412 -0
  31. package/dist/cjs/apps/markets/index.js +21 -11
  32. package/dist/cjs/apps/markets/state-machines/market-auction.js +14 -13
  33. package/dist/cjs/apps/markets/state-machines/market-crowdfund.js +29 -24
  34. package/dist/cjs/apps/markets/state-machines/market-group-buy.js +24 -26
  35. package/dist/cjs/apps/markets/state-machines/market-prediction.js +80 -53
  36. package/dist/cjs/apps/markets/state-machines/market-universal.js +5 -5
  37. package/dist/cjs/apps/oracles/index.js +2 -2
  38. package/dist/cjs/errors.js +3 -3
  39. package/dist/cjs/generated/google/protobuf/struct.js +4 -4
  40. package/dist/cjs/generated/index.js +11 -7
  41. package/dist/cjs/generated/openapi.js +6 -0
  42. package/dist/cjs/generated/ottochain/apps/contracts/v1/contract.js +50 -50
  43. package/dist/cjs/generated/ottochain/apps/corporate/v1/corporate.js +19 -20
  44. package/dist/cjs/generated/ottochain/apps/governance/v1/governance.js +13 -13
  45. package/dist/cjs/generated/ottochain/apps/identity/v1/attestation.js +4 -4
  46. package/dist/cjs/generated/ottochain/apps/identity/v1/identity.js +124 -130
  47. package/dist/cjs/generated/ottochain/apps/markets/v1/market.js +107 -107
  48. package/dist/cjs/generated/ottochain/v1/common.js +4 -4
  49. package/dist/cjs/generated/ottochain/v1/fiber.js +4 -4
  50. package/dist/cjs/index.js +41 -7
  51. package/dist/cjs/openapi.js +2 -0
  52. package/dist/cjs/ottochain/drop-nulls.js +1 -2
  53. package/dist/cjs/ottochain/genesis-manifest.js +11 -11
  54. package/dist/cjs/ottochain/index.js +23 -13
  55. package/dist/cjs/ottochain/metagraph-client.js +65 -8
  56. package/dist/cjs/ottochain/snapshot.js +11 -12
  57. package/dist/cjs/ottochain/transaction.js +57 -14
  58. package/dist/cjs/ottochain/types.js +16 -2
  59. package/dist/cjs/privacy/index.js +14 -0
  60. package/dist/cjs/privacy/sealed-bid.js +210 -0
  61. package/dist/cjs/privacy/shield-app.js +131 -0
  62. package/dist/cjs/schema/effects.js +40 -0
  63. package/dist/cjs/schema/fiber-app.js +19 -13
  64. package/dist/cjs/schema/guard-lint.js +352 -0
  65. package/dist/cjs/schema/guards.js +246 -0
  66. package/dist/cjs/signing.js +80 -0
  67. package/dist/cjs/types.js +2 -3
  68. package/dist/cjs/validation.js +8 -8
  69. package/dist/cjs/verify.js +9 -4
  70. package/dist/cjs/zk/commit.js +53 -0
  71. package/dist/cjs/zk/guard.js +107 -0
  72. package/dist/cjs/zk/index.js +48 -0
  73. package/dist/cjs/zk/preimage.js +37 -0
  74. package/dist/cjs/zk/prover.js +87 -0
  75. package/dist/cjs/zk/registry.js +62 -0
  76. package/dist/cjs/zk/types.js +28 -0
  77. package/dist/cjs/zk/witness.js +19 -0
  78. package/dist/esm/apps/contracts/index.js +7 -3
  79. package/dist/esm/apps/contracts/state-machines/contract-agreement.js +35 -40
  80. package/dist/esm/apps/contracts/state-machines/contract-escrow.js +80 -37
  81. package/dist/esm/apps/contracts/state-machines/contract-universal.js +4 -4
  82. package/dist/esm/apps/corporate/state-machines/corp-board.js +169 -59
  83. package/dist/esm/apps/corporate/state-machines/corp-entity.js +245 -47
  84. package/dist/esm/apps/corporate/state-machines/corp-securities.js +407 -99
  85. package/dist/esm/apps/corporate/state-machines/corp-shareholders.js +151 -37
  86. package/dist/esm/apps/governance/state-machines/dao-multisig.js +58 -40
  87. package/dist/esm/apps/governance/state-machines/dao-reputation.js +46 -40
  88. package/dist/esm/apps/governance/state-machines/dao-single.js +28 -11
  89. package/dist/esm/apps/governance/state-machines/dao-token.js +67 -41
  90. package/dist/esm/apps/governance/state-machines/governance-simple.js +93 -61
  91. package/dist/esm/apps/governance/state-machines/governance-universal.js +2 -2
  92. package/dist/esm/apps/identity/constants.js +51 -12
  93. package/dist/esm/apps/identity/index.js +12 -7
  94. package/dist/esm/apps/identity/state-machines/identity-agent.js +3 -3
  95. package/dist/esm/apps/identity/state-machines/identity-oracle.js +25 -22
  96. package/dist/esm/apps/identity/state-machines/identity-registry.js +285 -0
  97. package/dist/esm/apps/identity/state-machines/identity-universal.js +3 -3
  98. package/dist/esm/apps/identity/state-machines/index.js +1 -0
  99. package/dist/esm/apps/index.js +1 -0
  100. package/dist/esm/apps/lending/assets.js +207 -0
  101. package/dist/esm/apps/lending/credit-scoring.js +81 -0
  102. package/dist/esm/apps/lending/eligibility.js +115 -0
  103. package/dist/esm/apps/lending/index.js +69 -0
  104. package/dist/esm/apps/lending/state-machines/index.js +5 -0
  105. package/dist/esm/apps/lending/state-machines/lending-zk-loan.js +409 -0
  106. package/dist/esm/apps/markets/index.js +8 -4
  107. package/dist/esm/apps/markets/state-machines/market-auction.js +14 -13
  108. package/dist/esm/apps/markets/state-machines/market-crowdfund.js +29 -24
  109. package/dist/esm/apps/markets/state-machines/market-group-buy.js +24 -26
  110. package/dist/esm/apps/markets/state-machines/market-prediction.js +80 -53
  111. package/dist/esm/apps/markets/state-machines/market-universal.js +5 -5
  112. package/dist/esm/generated/index.js +9 -5
  113. package/dist/esm/generated/openapi.js +5 -0
  114. package/dist/esm/generated/ottochain/apps/contracts/v1/contract.js +46 -46
  115. package/dist/esm/generated/ottochain/apps/identity/v1/identity.js +114 -120
  116. package/dist/esm/generated/ottochain/apps/markets/v1/market.js +100 -100
  117. package/dist/esm/index.js +21 -2
  118. package/dist/esm/openapi.js +1 -0
  119. package/dist/esm/ottochain/genesis-manifest.js +9 -9
  120. package/dist/esm/ottochain/index.js +2 -3
  121. package/dist/esm/ottochain/metagraph-client.js +65 -8
  122. package/dist/esm/ottochain/snapshot.js +4 -4
  123. package/dist/esm/ottochain/transaction.js +43 -3
  124. package/dist/esm/ottochain/types.js +15 -1
  125. package/dist/esm/privacy/index.js +6 -0
  126. package/dist/esm/privacy/sealed-bid.js +206 -0
  127. package/dist/esm/privacy/shield-app.js +127 -0
  128. package/dist/esm/schema/effects.js +35 -0
  129. package/dist/esm/schema/fiber-app.js +13 -6
  130. package/dist/esm/schema/guard-lint.js +346 -0
  131. package/dist/esm/schema/guards.js +229 -0
  132. package/dist/esm/signing.js +74 -0
  133. package/dist/esm/verify.js +8 -2
  134. package/dist/esm/zk/commit.js +44 -0
  135. package/dist/esm/zk/guard.js +99 -0
  136. package/dist/esm/zk/index.js +19 -0
  137. package/dist/esm/zk/preimage.js +30 -0
  138. package/dist/esm/zk/prover.js +82 -0
  139. package/dist/esm/zk/registry.js +55 -0
  140. package/dist/esm/zk/types.js +25 -0
  141. package/dist/esm/zk/witness.js +15 -0
  142. package/dist/types/apps/contracts/index.d.ts +69 -209
  143. package/dist/types/apps/contracts/state-machines/contract-agreement.d.ts +20 -95
  144. package/dist/types/apps/contracts/state-machines/contract-escrow.d.ts +46 -112
  145. package/dist/types/apps/corporate/index.d.ts +1040 -304
  146. package/dist/types/apps/corporate/state-machines/corp-board.d.ts +188 -52
  147. package/dist/types/apps/corporate/state-machines/corp-entity.d.ts +267 -62
  148. package/dist/types/apps/corporate/state-machines/corp-securities.d.ts +355 -131
  149. package/dist/types/apps/corporate/state-machines/corp-shareholders.d.ts +225 -53
  150. package/dist/types/apps/governance/index.d.ts +296 -398
  151. package/dist/types/apps/governance/state-machines/dao-multisig.d.ts +77 -92
  152. package/dist/types/apps/governance/state-machines/dao-reputation.d.ts +42 -66
  153. package/dist/types/apps/governance/state-machines/dao-single.d.ts +25 -47
  154. package/dist/types/apps/governance/state-machines/dao-token.d.ts +60 -49
  155. package/dist/types/apps/governance/state-machines/governance-simple.d.ts +87 -117
  156. package/dist/types/apps/governance/state-machines/governance-universal.d.ts +2 -2
  157. package/dist/types/apps/identity/constants.d.ts +32 -4
  158. package/dist/types/apps/identity/index.d.ts +378 -94
  159. package/dist/types/apps/identity/state-machines/identity-oracle.d.ts +16 -87
  160. package/dist/types/apps/identity/state-machines/identity-registry.d.ts +379 -0
  161. package/dist/types/apps/identity/state-machines/index.d.ts +1 -0
  162. package/dist/types/apps/index.d.ts +1 -0
  163. package/dist/types/apps/lending/assets.d.ts +258 -0
  164. package/dist/types/apps/lending/credit-scoring.d.ts +80 -0
  165. package/dist/types/apps/lending/eligibility.d.ts +83 -0
  166. package/dist/types/apps/lending/index.d.ts +548 -0
  167. package/dist/types/apps/lending/state-machines/index.d.ts +5 -0
  168. package/dist/types/apps/lending/state-machines/lending-zk-loan.d.ts +528 -0
  169. package/dist/types/apps/markets/index.d.ts +108 -203
  170. package/dist/types/apps/markets/state-machines/market-auction.d.ts +13 -37
  171. package/dist/types/apps/markets/state-machines/market-crowdfund.d.ts +16 -34
  172. package/dist/types/apps/markets/state-machines/market-group-buy.d.ts +17 -43
  173. package/dist/types/apps/markets/state-machines/market-prediction.d.ts +51 -72
  174. package/dist/types/apps/markets/state-machines/market-universal.d.ts +5 -5
  175. package/dist/types/generated/index.d.ts +5 -5
  176. package/dist/types/generated/openapi.d.ts +1257 -0
  177. package/dist/types/generated/ottochain/apps/contracts/v1/contract.d.ts +5 -5
  178. package/dist/types/generated/ottochain/apps/identity/v1/identity.d.ts +12 -12
  179. package/dist/types/generated/ottochain/apps/markets/v1/market.d.ts +11 -11
  180. package/dist/types/index.d.ts +6 -2
  181. package/dist/types/openapi.d.ts +22 -0
  182. package/dist/types/ottochain/genesis-manifest.d.ts +5 -5
  183. package/dist/types/ottochain/index.d.ts +5 -6
  184. package/dist/types/ottochain/metagraph-client.d.ts +49 -7
  185. package/dist/types/ottochain/snapshot.d.ts +6 -6
  186. package/dist/types/ottochain/transaction.d.ts +33 -1
  187. package/dist/types/ottochain/types.d.ts +335 -30
  188. package/dist/types/privacy/index.d.ts +6 -0
  189. package/dist/types/privacy/sealed-bid.d.ts +348 -0
  190. package/dist/types/privacy/shield-app.d.ts +48 -0
  191. package/dist/types/schema/effects.d.ts +34 -0
  192. package/dist/types/schema/fiber-app.d.ts +1 -2
  193. package/dist/types/schema/guard-lint.d.ts +111 -0
  194. package/dist/types/schema/guards.d.ts +134 -0
  195. package/dist/types/signing.d.ts +45 -0
  196. package/dist/types/validation.d.ts +22 -217
  197. package/dist/types/verify.d.ts +4 -0
  198. package/dist/types/zk/commit.d.ts +28 -0
  199. package/dist/types/zk/guard.d.ts +46 -0
  200. package/dist/types/zk/index.d.ts +19 -0
  201. package/dist/types/zk/preimage.d.ts +10 -0
  202. package/dist/types/zk/prover.d.ts +34 -0
  203. package/dist/types/zk/registry.d.ts +34 -0
  204. package/dist/types/zk/types.d.ts +33 -0
  205. package/dist/types/zk/witness.d.ts +40 -0
  206. package/package.json +27 -13
  207. package/dist/cjs/ottochain/normalize.js +0 -186
  208. package/dist/esm/ottochain/normalize.js +0 -179
  209. package/dist/types/ottochain/normalize.d.ts +0 -79
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.daoMultisigDef = void 0;
4
4
  const fiber_app_js_1 = require("../../../schema/fiber-app.js");
5
+ const guards_js_1 = require("../../../schema/guards.js");
5
6
  /**
6
7
  * N-of-M multisig governance. Requires threshold signatures for actions.
7
8
  */
@@ -113,10 +114,8 @@ exports.daoMultisigDef = (0, fiber_app_js_1.defineFiberApp)({
113
114
  },
114
115
  },
115
116
  dissolve: {
116
- description: "Dissolve the DAO (requires unanimous signer count)",
117
- properties: {
118
- signatureCount: { type: "number" },
119
- },
117
+ description: "Dissolve the DAO (requires every signer to sign this op — verified unanimity)",
118
+ properties: {},
120
119
  },
121
120
  },
122
121
  states: {
@@ -155,7 +154,7 @@ exports.daoMultisigDef = (0, fiber_app_js_1.defineFiberApp)({
155
154
  from: "ACTIVE",
156
155
  to: "PENDING",
157
156
  eventName: "propose",
158
- guard: { in: [{ var: "event.agent" }, { var: "state.signers" }] },
157
+ guard: (0, guards_js_1.actorInSet)("state.signers"),
159
158
  effect: {
160
159
  merge: [
161
160
  { var: "state" },
@@ -165,13 +164,13 @@ exports.daoMultisigDef = (0, fiber_app_js_1.defineFiberApp)({
165
164
  actionType: { var: "event.actionType" },
166
165
  payload: { var: "event.payload" },
167
166
  proposer: { var: "event.agent" },
168
- proposedAt: { var: "$timestamp" },
167
+ proposedAt: { var: "$ordinal" },
169
168
  expiresAt: {
170
- "+": [{ var: "$timestamp" }, { var: "state.proposalTTLMs" }],
169
+ "+": [{ var: "$ordinal" }, { var: "state.proposalTTLMs" }],
171
170
  },
172
171
  },
173
172
  signatures: {
174
- setKey: [{}, { var: "event.agent" }, { var: "$timestamp" }],
173
+ set: [{}, { var: "event.agent" }, { var: "$ordinal" }],
175
174
  },
176
175
  },
177
176
  ],
@@ -185,15 +184,15 @@ exports.daoMultisigDef = (0, fiber_app_js_1.defineFiberApp)({
185
184
  eventName: "sign",
186
185
  guard: {
187
186
  and: [
188
- { in: [{ var: "event.agent" }, { var: "state.signers" }] },
187
+ (0, guards_js_1.actorInSet)("state.signers"),
189
188
  {
190
189
  "!": [
191
- { getKey: [{ var: "state.signatures" }, { var: "event.agent" }] },
190
+ { has: [{ var: "state.signatures" }, { var: "event.agent" }] },
192
191
  ],
193
192
  },
194
193
  {
195
194
  "<": [
196
- { size: { var: "state.signatures" } },
195
+ { length: [{ keys: [{ var: "state.signatures" }] }] },
197
196
  { var: "state.threshold" },
198
197
  ],
199
198
  },
@@ -204,10 +203,10 @@ exports.daoMultisigDef = (0, fiber_app_js_1.defineFiberApp)({
204
203
  { var: "state" },
205
204
  {
206
205
  signatures: {
207
- setKey: [
206
+ set: [
208
207
  { var: "state.signatures" },
209
208
  { var: "event.agent" },
210
- { var: "$timestamp" },
209
+ { var: "$ordinal" },
211
210
  ],
212
211
  },
213
212
  },
@@ -222,7 +221,7 @@ exports.daoMultisigDef = (0, fiber_app_js_1.defineFiberApp)({
222
221
  eventName: "execute",
223
222
  guard: {
224
223
  ">=": [
225
- { size: { var: "state.signatures" } },
224
+ { length: [{ keys: [{ var: "state.signatures" }] }] },
226
225
  { var: "state.threshold" },
227
226
  ],
228
227
  },
@@ -239,17 +238,25 @@ exports.daoMultisigDef = (0, fiber_app_js_1.defineFiberApp)({
239
238
  type: { var: "state.proposal.actionType" },
240
239
  payload: { var: "state.proposal.payload" },
241
240
  signatures: { var: "state.signatures" },
242
- executedAt: { var: "$timestamp" },
241
+ executedAt: { var: "$ordinal" },
243
242
  },
244
243
  ],
245
244
  ],
246
245
  },
247
246
  proposal: null,
248
247
  signatures: {},
248
+ // A3 fix: transition-level `emits` is dropped by the chain; emit from INSIDE the effect
249
+ // under the reserved `_emit` key (extracted as an EmittedEvent, stripped from state).
250
+ _emit: [
251
+ {
252
+ name: "multisig_executed",
253
+ data: { proposalId: { var: "state.proposal.id" } },
254
+ destination: "external",
255
+ },
256
+ ],
249
257
  },
250
258
  ],
251
259
  },
252
- emits: [{ event: "multisig_executed", to: "external" }],
253
260
  dependencies: [],
254
261
  },
255
262
  // PENDING → ACTIVE: cancel (expired or proposer)
@@ -259,10 +266,8 @@ exports.daoMultisigDef = (0, fiber_app_js_1.defineFiberApp)({
259
266
  eventName: "cancel",
260
267
  guard: {
261
268
  or: [
262
- { ">": [{ var: "$timestamp" }, { var: "state.proposal.expiresAt" }] },
263
- {
264
- "===": [{ var: "event.agent" }, { var: "state.proposal.proposer" }],
265
- },
269
+ { ">": [{ var: "$ordinal" }, { var: "state.proposal.expiresAt" }] },
270
+ (0, guards_js_1.signerIsParty)("state.proposal.proposer"),
266
271
  ],
267
272
  },
268
273
  effect: {
@@ -276,7 +281,7 @@ exports.daoMultisigDef = (0, fiber_app_js_1.defineFiberApp)({
276
281
  {
277
282
  merge: [
278
283
  { var: "state.proposal" },
279
- { cancelledAt: { var: "$timestamp" } },
284
+ { cancelledAt: { var: "$ordinal" } },
280
285
  ],
281
286
  },
282
287
  ],
@@ -294,7 +299,7 @@ exports.daoMultisigDef = (0, fiber_app_js_1.defineFiberApp)({
294
299
  from: "ACTIVE",
295
300
  to: "PENDING",
296
301
  eventName: "propose_add_signer",
297
- guard: { in: [{ var: "event.agent" }, { var: "state.signers" }] },
302
+ guard: (0, guards_js_1.actorInSet)("state.signers"),
298
303
  effect: {
299
304
  merge: [
300
305
  { var: "state" },
@@ -304,13 +309,13 @@ exports.daoMultisigDef = (0, fiber_app_js_1.defineFiberApp)({
304
309
  actionType: "add_signer",
305
310
  payload: { newSigner: { var: "event.newSigner" } },
306
311
  proposer: { var: "event.agent" },
307
- proposedAt: { var: "$timestamp" },
312
+ proposedAt: { var: "$ordinal" },
308
313
  expiresAt: {
309
- "+": [{ var: "$timestamp" }, { var: "state.proposalTTLMs" }],
314
+ "+": [{ var: "$ordinal" }, { var: "state.proposalTTLMs" }],
310
315
  },
311
316
  },
312
317
  signatures: {
313
- setKey: [{}, { var: "event.agent" }, { var: "$timestamp" }],
318
+ set: [{}, { var: "event.agent" }, { var: "$ordinal" }],
314
319
  },
315
320
  },
316
321
  ],
@@ -324,10 +329,10 @@ exports.daoMultisigDef = (0, fiber_app_js_1.defineFiberApp)({
324
329
  eventName: "propose_remove_signer",
325
330
  guard: {
326
331
  and: [
327
- { in: [{ var: "event.agent" }, { var: "state.signers" }] },
332
+ (0, guards_js_1.actorInSet)("state.signers"),
328
333
  {
329
334
  ">": [
330
- { size: { var: "state.signers" } },
335
+ { length: [{ var: "state.signers" }] },
331
336
  { var: "state.threshold" },
332
337
  ],
333
338
  },
@@ -342,13 +347,13 @@ exports.daoMultisigDef = (0, fiber_app_js_1.defineFiberApp)({
342
347
  actionType: "remove_signer",
343
348
  payload: { removeSigner: { var: "event.removeSigner" } },
344
349
  proposer: { var: "event.agent" },
345
- proposedAt: { var: "$timestamp" },
350
+ proposedAt: { var: "$ordinal" },
346
351
  expiresAt: {
347
- "+": [{ var: "$timestamp" }, { var: "state.proposalTTLMs" }],
352
+ "+": [{ var: "$ordinal" }, { var: "state.proposalTTLMs" }],
348
353
  },
349
354
  },
350
355
  signatures: {
351
- setKey: [{}, { var: "event.agent" }, { var: "$timestamp" }],
356
+ set: [{}, { var: "event.agent" }, { var: "$ordinal" }],
352
357
  },
353
358
  },
354
359
  ],
@@ -362,12 +367,12 @@ exports.daoMultisigDef = (0, fiber_app_js_1.defineFiberApp)({
362
367
  eventName: "propose_change_threshold",
363
368
  guard: {
364
369
  and: [
365
- { in: [{ var: "event.agent" }, { var: "state.signers" }] },
370
+ (0, guards_js_1.actorInSet)("state.signers"),
366
371
  { ">=": [{ var: "event.newThreshold" }, 1] },
367
372
  {
368
373
  "<=": [
369
374
  { var: "event.newThreshold" },
370
- { size: { var: "state.signers" } },
375
+ { length: [{ var: "state.signers" }] },
371
376
  ],
372
377
  },
373
378
  ],
@@ -381,13 +386,13 @@ exports.daoMultisigDef = (0, fiber_app_js_1.defineFiberApp)({
381
386
  actionType: "change_threshold",
382
387
  payload: { newThreshold: { var: "event.newThreshold" } },
383
388
  proposer: { var: "event.agent" },
384
- proposedAt: { var: "$timestamp" },
389
+ proposedAt: { var: "$ordinal" },
385
390
  expiresAt: {
386
- "+": [{ var: "$timestamp" }, { var: "state.proposalTTLMs" }],
391
+ "+": [{ var: "$ordinal" }, { var: "state.proposalTTLMs" }],
387
392
  },
388
393
  },
389
394
  signatures: {
390
- setKey: [{}, { var: "event.agent" }, { var: "$timestamp" }],
395
+ set: [{}, { var: "event.agent" }, { var: "$ordinal" }],
391
396
  },
392
397
  },
393
398
  ],
@@ -403,7 +408,7 @@ exports.daoMultisigDef = (0, fiber_app_js_1.defineFiberApp)({
403
408
  and: [
404
409
  {
405
410
  ">=": [
406
- { size: { var: "state.signatures" } },
411
+ { length: [{ keys: [{ var: "state.signatures" }] }] },
407
412
  { var: "state.threshold" },
408
413
  ],
409
414
  },
@@ -473,16 +478,29 @@ exports.daoMultisigDef = (0, fiber_app_js_1.defineFiberApp)({
473
478
  from: "ACTIVE",
474
479
  to: "DISSOLVED",
475
480
  eventName: "dissolve",
481
+ // S2 fix: dissolution must not trust an attacker-supplied count. Derive
482
+ // unanimity from the CHAIN-VERIFIED signers — every signer in state.signers
483
+ // must be among proofs[].address (with a non-empty belt). signers is an array.
476
484
  guard: {
477
- "===": [
478
- { var: "event.signatureCount" },
479
- { size: { var: "state.signers" } },
485
+ and: [
486
+ { ">": [{ length: [{ var: "state.signers" }] }, 0] },
487
+ {
488
+ all: [
489
+ { var: "state.signers" },
490
+ {
491
+ in: [
492
+ { var: "" },
493
+ { map: [{ var: "proofs" }, { var: "address" }] },
494
+ ],
495
+ },
496
+ ],
497
+ },
480
498
  ],
481
499
  },
482
500
  effect: {
483
501
  merge: [
484
502
  { var: "state" },
485
- { dissolvedAt: { var: "$timestamp" }, status: "DISSOLVED" },
503
+ { dissolvedAt: { var: "$ordinal" }, status: "DISSOLVED" },
486
504
  ],
487
505
  },
488
506
  dependencies: [],
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.daoReputationDef = void 0;
4
4
  const fiber_app_js_1 = require("../../../schema/fiber-app.js");
5
+ const guards_js_1 = require("../../../schema/guards.js");
5
6
  /**
6
7
  * Reputation-based governance. Minimum reputation required for participation.
7
8
  */
@@ -179,9 +180,9 @@ exports.daoReputationDef = (0, fiber_app_js_1.defineFiberApp)({
179
180
  actionType: { var: "event.actionType" },
180
181
  payload: { var: "event.payload" },
181
182
  proposer: { var: "event.agent" },
182
- proposedAt: { var: "$timestamp" },
183
+ proposedAt: { var: "$ordinal" },
183
184
  deadline: {
184
- "+": [{ var: "$timestamp" }, { var: "state.votingPeriodMs" }],
185
+ "+": [{ var: "$ordinal" }, { var: "state.votingPeriodMs" }],
185
186
  },
186
187
  },
187
188
  votes: { for: [], against: [], abstain: [] },
@@ -203,20 +204,10 @@ exports.daoReputationDef = (0, fiber_app_js_1.defineFiberApp)({
203
204
  { var: "state.voteThreshold" },
204
205
  ],
205
206
  },
206
- {
207
- "!": [{ in: [{ var: "event.agent" }, { var: "state.votes.for" }] }],
208
- },
209
- {
210
- "!": [
211
- { in: [{ var: "event.agent" }, { var: "state.votes.against" }] },
212
- ],
213
- },
214
- {
215
- "!": [
216
- { in: [{ var: "event.agent" }, { var: "state.votes.abstain" }] },
217
- ],
218
- },
219
- { "<=": [{ var: "$timestamp" }, { var: "state.proposal.deadline" }] },
207
+ { "!": [(0, guards_js_1.signerInSet)("state.votes.for")] },
208
+ { "!": [(0, guards_js_1.signerInSet)("state.votes.against")] },
209
+ { "!": [(0, guards_js_1.signerInSet)("state.votes.abstain")] },
210
+ { "<=": [{ var: "$ordinal" }, { var: "state.proposal.deadline" }] },
220
211
  ],
221
212
  },
222
213
  effect: {
@@ -278,21 +269,23 @@ exports.daoReputationDef = (0, fiber_app_js_1.defineFiberApp)({
278
269
  from: "VOTING",
279
270
  to: "ACTIVE",
280
271
  eventName: "execute",
272
+ // A2 fix: votes.for/against/abstain are arrays of voter addresses; count with
273
+ // `length` (size is not a JLVM opcode).
281
274
  guard: {
282
275
  and: [
283
- { ">": [{ var: "$timestamp" }, { var: "state.proposal.deadline" }] },
276
+ { ">": [{ var: "$ordinal" }, { var: "state.proposal.deadline" }] },
284
277
  {
285
278
  ">": [
286
- { size: { var: "state.votes.for" } },
287
- { size: { var: "state.votes.against" } },
279
+ { length: [{ var: "state.votes.for" }] },
280
+ { length: [{ var: "state.votes.against" }] },
288
281
  ],
289
282
  },
290
283
  {
291
284
  ">=": [
292
285
  {
293
286
  "+": [
294
- { size: { var: "state.votes.for" } },
295
- { size: { var: "state.votes.against" } },
287
+ { length: [{ var: "state.votes.for" }] },
288
+ { length: [{ var: "state.votes.against" }] },
296
289
  ],
297
290
  },
298
291
  { var: "state.quorum" },
@@ -312,23 +305,25 @@ exports.daoReputationDef = (0, fiber_app_js_1.defineFiberApp)({
312
305
  type: "executed",
313
306
  proposal: { var: "state.proposal" },
314
307
  votes: { var: "state.votes" },
315
- at: { var: "$timestamp" },
308
+ at: { var: "$ordinal" },
316
309
  },
317
310
  ],
318
311
  ],
319
312
  },
320
313
  proposal: null,
321
314
  votes: null,
315
+ // A3 fix: transition-level `emits` is dropped by the chain; emit from INSIDE the effect
316
+ // under the reserved `_emit` key (extracted as an EmittedEvent, stripped from state).
317
+ _emit: [
318
+ {
319
+ name: "proposal_executed",
320
+ data: { action: "increase", agents: { var: "state.votes.for" } },
321
+ destination: "Reputation",
322
+ },
323
+ ],
322
324
  },
323
325
  ],
324
326
  },
325
- emits: [
326
- {
327
- event: "proposal_executed",
328
- to: "Reputation",
329
- payload: { action: "increase", agents: { var: "state.votes.for" } },
330
- },
331
- ],
332
327
  dependencies: [],
333
328
  },
334
329
  // VOTING → ACTIVE: reject (voting ended, for <= against or quorum not met)
@@ -336,23 +331,25 @@ exports.daoReputationDef = (0, fiber_app_js_1.defineFiberApp)({
336
331
  from: "VOTING",
337
332
  to: "ACTIVE",
338
333
  eventName: "reject",
334
+ // A2 fix: count the array-shaped vote tallies with `length` (size is not a JLVM
335
+ // opcode).
339
336
  guard: {
340
337
  and: [
341
- { ">": [{ var: "$timestamp" }, { var: "state.proposal.deadline" }] },
338
+ { ">": [{ var: "$ordinal" }, { var: "state.proposal.deadline" }] },
342
339
  {
343
340
  or: [
344
341
  {
345
342
  "<=": [
346
- { size: { var: "state.votes.for" } },
347
- { size: { var: "state.votes.against" } },
343
+ { length: [{ var: "state.votes.for" }] },
344
+ { length: [{ var: "state.votes.against" }] },
348
345
  ],
349
346
  },
350
347
  {
351
348
  "<": [
352
349
  {
353
350
  "+": [
354
- { size: { var: "state.votes.for" } },
355
- { size: { var: "state.votes.against" } },
351
+ { length: [{ var: "state.votes.for" }] },
352
+ { length: [{ var: "state.votes.against" }] },
356
353
  ],
357
354
  },
358
355
  { var: "state.quorum" },
@@ -374,7 +371,7 @@ exports.daoReputationDef = (0, fiber_app_js_1.defineFiberApp)({
374
371
  type: "rejected",
375
372
  proposal: { var: "state.proposal" },
376
373
  votes: { var: "state.votes" },
377
- at: { var: "$timestamp" },
374
+ at: { var: "$ordinal" },
378
375
  },
379
376
  ],
380
377
  ],
@@ -391,8 +388,17 @@ exports.daoReputationDef = (0, fiber_app_js_1.defineFiberApp)({
391
388
  from: "ACTIVE",
392
389
  to: "ACTIVE",
393
390
  eventName: "join",
391
+ // S1/A2: bind event.agent to a verified signer (actorIsSigner) so the member is appended to the
392
+ // array and keyed into memberJoinedAt under a CHAIN-VERIFIED address (set is the rc.5 map-write
393
+ // opcode), and dedup on that bound actor.
394
+ // TODO(#24): event.agentReputation is self-asserted. Replace the reputation clause with
395
+ // signerHasReputation(registryReputationPath(<registryDep>), "state.memberThreshold") once
396
+ // runtime-updatable dependencies (#24) let a std-app bind the identity-registry instance — the
397
+ // same gate as corp-board's removal-resolution. The registry foundation + read helper already
398
+ // exist (src/apps/identity/state-machines/identity-registry.ts, guards.signerHasReputation).
394
399
  guard: {
395
400
  and: [
401
+ (0, guards_js_1.actorIsSigner)(),
396
402
  {
397
403
  ">=": [
398
404
  { var: "event.agentReputation" },
@@ -410,10 +416,10 @@ exports.daoReputationDef = (0, fiber_app_js_1.defineFiberApp)({
410
416
  cat: [{ var: "state.members" }, [{ var: "event.agent" }]],
411
417
  },
412
418
  memberJoinedAt: {
413
- setKey: [
419
+ set: [
414
420
  { var: "state.memberJoinedAt" },
415
421
  { var: "event.agent" },
416
- { var: "$timestamp" },
422
+ { var: "$ordinal" },
417
423
  ],
418
424
  },
419
425
  },
@@ -426,7 +432,7 @@ exports.daoReputationDef = (0, fiber_app_js_1.defineFiberApp)({
426
432
  from: "ACTIVE",
427
433
  to: "ACTIVE",
428
434
  eventName: "leave",
429
- guard: { in: [{ var: "event.agent" }, { var: "state.members" }] },
435
+ guard: (0, guards_js_1.signerInSet)("state.members"),
430
436
  effect: {
431
437
  merge: [
432
438
  { var: "state" },
@@ -467,9 +473,9 @@ exports.daoReputationDef = (0, fiber_app_js_1.defineFiberApp)({
467
473
  proposeThreshold: { var: "event.proposeThreshold" },
468
474
  },
469
475
  proposer: { var: "event.agent" },
470
- proposedAt: { var: "$timestamp" },
476
+ proposedAt: { var: "$ordinal" },
471
477
  deadline: {
472
- "+": [{ var: "$timestamp" }, { var: "state.votingPeriodMs" }],
478
+ "+": [{ var: "$ordinal" }, { var: "state.votingPeriodMs" }],
473
479
  },
474
480
  },
475
481
  votes: { for: [], against: [], abstain: [] },
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.daoSingleDef = void 0;
4
4
  const fiber_app_js_1 = require("../../../schema/fiber-app.js");
5
+ const guards_js_1 = require("../../../schema/guards.js");
5
6
  /**
6
7
  * Single owner controls all actions. Simplest governance model.
7
8
  */
@@ -113,7 +114,7 @@ exports.daoSingleDef = (0, fiber_app_js_1.defineFiberApp)({
113
114
  from: "ACTIVE",
114
115
  to: "ACTIVE",
115
116
  eventName: "execute",
116
- guard: { "===": [{ var: "event.agent" }, { var: "state.owner" }] },
117
+ guard: (0, guards_js_1.signerIsParty)("state.owner"),
117
118
  effect: {
118
119
  merge: [
119
120
  { var: "state" },
@@ -126,15 +127,23 @@ exports.daoSingleDef = (0, fiber_app_js_1.defineFiberApp)({
126
127
  id: { var: "event.actionId" },
127
128
  type: { var: "event.actionType" },
128
129
  payload: { var: "event.payload" },
129
- executedAt: { var: "$timestamp" },
130
+ executedAt: { var: "$ordinal" },
130
131
  },
131
132
  ],
132
133
  ],
133
134
  },
135
+ // A3 fix: transition-level `emits` is dropped by the chain; emit from INSIDE the effect
136
+ // under the reserved `_emit` key (extracted as an EmittedEvent, stripped from state).
137
+ _emit: [
138
+ {
139
+ name: "action_executed",
140
+ data: { actionId: { var: "event.actionId" } },
141
+ destination: "external",
142
+ },
143
+ ],
134
144
  },
135
145
  ],
136
146
  },
137
- emits: [{ event: "action_executed", to: "external" }],
138
147
  dependencies: [],
139
148
  },
140
149
  // ACTIVE → TRANSFERRING: transfer_ownership (owner only)
@@ -142,13 +151,13 @@ exports.daoSingleDef = (0, fiber_app_js_1.defineFiberApp)({
142
151
  from: "ACTIVE",
143
152
  to: "TRANSFERRING",
144
153
  eventName: "transfer_ownership",
145
- guard: { "===": [{ var: "event.agent" }, { var: "state.owner" }] },
154
+ guard: (0, guards_js_1.signerIsParty)("state.owner"),
146
155
  effect: {
147
156
  merge: [
148
157
  { var: "state" },
149
158
  {
150
159
  pendingOwner: { var: "event.newOwner" },
151
- transferInitiatedAt: { var: "$timestamp" },
160
+ transferInitiatedAt: { var: "$ordinal" },
152
161
  },
153
162
  ],
154
163
  },
@@ -159,7 +168,7 @@ exports.daoSingleDef = (0, fiber_app_js_1.defineFiberApp)({
159
168
  from: "TRANSFERRING",
160
169
  to: "ACTIVE",
161
170
  eventName: "accept_ownership",
162
- guard: { "===": [{ var: "event.agent" }, { var: "state.pendingOwner" }] },
171
+ guard: (0, guards_js_1.signerIsParty)("state.pendingOwner"),
163
172
  effect: {
164
173
  merge: [
165
174
  { var: "state" },
@@ -174,15 +183,23 @@ exports.daoSingleDef = (0, fiber_app_js_1.defineFiberApp)({
174
183
  {
175
184
  from: { var: "state.owner" },
176
185
  to: { var: "state.pendingOwner" },
177
- at: { var: "$timestamp" },
186
+ at: { var: "$ordinal" },
178
187
  },
179
188
  ],
180
189
  ],
181
190
  },
191
+ // A3 fix: transition-level `emits` is dropped by the chain; emit from INSIDE the effect
192
+ // under the reserved `_emit` key (extracted as an EmittedEvent, stripped from state).
193
+ _emit: [
194
+ {
195
+ name: "ownership_transferred",
196
+ data: { var: "event" },
197
+ destination: "Identity",
198
+ },
199
+ ],
182
200
  },
183
201
  ],
184
202
  },
185
- emits: [{ event: "ownership_transferred", to: "Identity" }],
186
203
  dependencies: [],
187
204
  },
188
205
  // TRANSFERRING → ACTIVE: cancel_transfer (owner only)
@@ -190,7 +207,7 @@ exports.daoSingleDef = (0, fiber_app_js_1.defineFiberApp)({
190
207
  from: "TRANSFERRING",
191
208
  to: "ACTIVE",
192
209
  eventName: "cancel_transfer",
193
- guard: { "===": [{ var: "event.agent" }, { var: "state.owner" }] },
210
+ guard: (0, guards_js_1.signerIsParty)("state.owner"),
194
211
  effect: {
195
212
  merge: [
196
213
  { var: "state" },
@@ -207,12 +224,12 @@ exports.daoSingleDef = (0, fiber_app_js_1.defineFiberApp)({
207
224
  from: "ACTIVE",
208
225
  to: "DISSOLVED",
209
226
  eventName: "dissolve",
210
- guard: { "===": [{ var: "event.agent" }, { var: "state.owner" }] },
227
+ guard: (0, guards_js_1.signerIsParty)("state.owner"),
211
228
  effect: {
212
229
  merge: [
213
230
  { var: "state" },
214
231
  {
215
- dissolvedAt: { var: "$timestamp" },
232
+ dissolvedAt: { var: "$ordinal" },
216
233
  status: "DISSOLVED",
217
234
  },
218
235
  ],