@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
@@ -1,4 +1,5 @@
1
1
  import { defineFiberApp } from "../../../schema/fiber-app.js";
2
+ import { actorInSet, signerIsParty } from "../../../schema/guards.js";
2
3
  /**
3
4
  * N-of-M multisig governance. Requires threshold signatures for actions.
4
5
  */
@@ -110,10 +111,8 @@ export const daoMultisigDef = defineFiberApp({
110
111
  },
111
112
  },
112
113
  dissolve: {
113
- description: "Dissolve the DAO (requires unanimous signer count)",
114
- properties: {
115
- signatureCount: { type: "number" },
116
- },
114
+ description: "Dissolve the DAO (requires every signer to sign this op — verified unanimity)",
115
+ properties: {},
117
116
  },
118
117
  },
119
118
  states: {
@@ -152,7 +151,7 @@ export const daoMultisigDef = defineFiberApp({
152
151
  from: "ACTIVE",
153
152
  to: "PENDING",
154
153
  eventName: "propose",
155
- guard: { in: [{ var: "event.agent" }, { var: "state.signers" }] },
154
+ guard: actorInSet("state.signers"),
156
155
  effect: {
157
156
  merge: [
158
157
  { var: "state" },
@@ -162,13 +161,13 @@ export const daoMultisigDef = defineFiberApp({
162
161
  actionType: { var: "event.actionType" },
163
162
  payload: { var: "event.payload" },
164
163
  proposer: { var: "event.agent" },
165
- proposedAt: { var: "$timestamp" },
164
+ proposedAt: { var: "$ordinal" },
166
165
  expiresAt: {
167
- "+": [{ var: "$timestamp" }, { var: "state.proposalTTLMs" }],
166
+ "+": [{ var: "$ordinal" }, { var: "state.proposalTTLMs" }],
168
167
  },
169
168
  },
170
169
  signatures: {
171
- setKey: [{}, { var: "event.agent" }, { var: "$timestamp" }],
170
+ set: [{}, { var: "event.agent" }, { var: "$ordinal" }],
172
171
  },
173
172
  },
174
173
  ],
@@ -182,15 +181,15 @@ export const daoMultisigDef = defineFiberApp({
182
181
  eventName: "sign",
183
182
  guard: {
184
183
  and: [
185
- { in: [{ var: "event.agent" }, { var: "state.signers" }] },
184
+ actorInSet("state.signers"),
186
185
  {
187
186
  "!": [
188
- { getKey: [{ var: "state.signatures" }, { var: "event.agent" }] },
187
+ { has: [{ var: "state.signatures" }, { var: "event.agent" }] },
189
188
  ],
190
189
  },
191
190
  {
192
191
  "<": [
193
- { size: { var: "state.signatures" } },
192
+ { length: [{ keys: [{ var: "state.signatures" }] }] },
194
193
  { var: "state.threshold" },
195
194
  ],
196
195
  },
@@ -201,10 +200,10 @@ export const daoMultisigDef = defineFiberApp({
201
200
  { var: "state" },
202
201
  {
203
202
  signatures: {
204
- setKey: [
203
+ set: [
205
204
  { var: "state.signatures" },
206
205
  { var: "event.agent" },
207
- { var: "$timestamp" },
206
+ { var: "$ordinal" },
208
207
  ],
209
208
  },
210
209
  },
@@ -219,7 +218,7 @@ export const daoMultisigDef = defineFiberApp({
219
218
  eventName: "execute",
220
219
  guard: {
221
220
  ">=": [
222
- { size: { var: "state.signatures" } },
221
+ { length: [{ keys: [{ var: "state.signatures" }] }] },
223
222
  { var: "state.threshold" },
224
223
  ],
225
224
  },
@@ -236,17 +235,25 @@ export const daoMultisigDef = defineFiberApp({
236
235
  type: { var: "state.proposal.actionType" },
237
236
  payload: { var: "state.proposal.payload" },
238
237
  signatures: { var: "state.signatures" },
239
- executedAt: { var: "$timestamp" },
238
+ executedAt: { var: "$ordinal" },
240
239
  },
241
240
  ],
242
241
  ],
243
242
  },
244
243
  proposal: null,
245
244
  signatures: {},
245
+ // A3 fix: transition-level `emits` is dropped by the chain; emit from INSIDE the effect
246
+ // under the reserved `_emit` key (extracted as an EmittedEvent, stripped from state).
247
+ _emit: [
248
+ {
249
+ name: "multisig_executed",
250
+ data: { proposalId: { var: "state.proposal.id" } },
251
+ destination: "external",
252
+ },
253
+ ],
246
254
  },
247
255
  ],
248
256
  },
249
- emits: [{ event: "multisig_executed", to: "external" }],
250
257
  dependencies: [],
251
258
  },
252
259
  // PENDING → ACTIVE: cancel (expired or proposer)
@@ -256,10 +263,8 @@ export const daoMultisigDef = defineFiberApp({
256
263
  eventName: "cancel",
257
264
  guard: {
258
265
  or: [
259
- { ">": [{ var: "$timestamp" }, { var: "state.proposal.expiresAt" }] },
260
- {
261
- "===": [{ var: "event.agent" }, { var: "state.proposal.proposer" }],
262
- },
266
+ { ">": [{ var: "$ordinal" }, { var: "state.proposal.expiresAt" }] },
267
+ signerIsParty("state.proposal.proposer"),
263
268
  ],
264
269
  },
265
270
  effect: {
@@ -273,7 +278,7 @@ export const daoMultisigDef = defineFiberApp({
273
278
  {
274
279
  merge: [
275
280
  { var: "state.proposal" },
276
- { cancelledAt: { var: "$timestamp" } },
281
+ { cancelledAt: { var: "$ordinal" } },
277
282
  ],
278
283
  },
279
284
  ],
@@ -291,7 +296,7 @@ export const daoMultisigDef = defineFiberApp({
291
296
  from: "ACTIVE",
292
297
  to: "PENDING",
293
298
  eventName: "propose_add_signer",
294
- guard: { in: [{ var: "event.agent" }, { var: "state.signers" }] },
299
+ guard: actorInSet("state.signers"),
295
300
  effect: {
296
301
  merge: [
297
302
  { var: "state" },
@@ -301,13 +306,13 @@ export const daoMultisigDef = defineFiberApp({
301
306
  actionType: "add_signer",
302
307
  payload: { newSigner: { var: "event.newSigner" } },
303
308
  proposer: { var: "event.agent" },
304
- proposedAt: { var: "$timestamp" },
309
+ proposedAt: { var: "$ordinal" },
305
310
  expiresAt: {
306
- "+": [{ var: "$timestamp" }, { var: "state.proposalTTLMs" }],
311
+ "+": [{ var: "$ordinal" }, { var: "state.proposalTTLMs" }],
307
312
  },
308
313
  },
309
314
  signatures: {
310
- setKey: [{}, { var: "event.agent" }, { var: "$timestamp" }],
315
+ set: [{}, { var: "event.agent" }, { var: "$ordinal" }],
311
316
  },
312
317
  },
313
318
  ],
@@ -321,10 +326,10 @@ export const daoMultisigDef = defineFiberApp({
321
326
  eventName: "propose_remove_signer",
322
327
  guard: {
323
328
  and: [
324
- { in: [{ var: "event.agent" }, { var: "state.signers" }] },
329
+ actorInSet("state.signers"),
325
330
  {
326
331
  ">": [
327
- { size: { var: "state.signers" } },
332
+ { length: [{ var: "state.signers" }] },
328
333
  { var: "state.threshold" },
329
334
  ],
330
335
  },
@@ -339,13 +344,13 @@ export const daoMultisigDef = defineFiberApp({
339
344
  actionType: "remove_signer",
340
345
  payload: { removeSigner: { var: "event.removeSigner" } },
341
346
  proposer: { var: "event.agent" },
342
- proposedAt: { var: "$timestamp" },
347
+ proposedAt: { var: "$ordinal" },
343
348
  expiresAt: {
344
- "+": [{ var: "$timestamp" }, { var: "state.proposalTTLMs" }],
349
+ "+": [{ var: "$ordinal" }, { var: "state.proposalTTLMs" }],
345
350
  },
346
351
  },
347
352
  signatures: {
348
- setKey: [{}, { var: "event.agent" }, { var: "$timestamp" }],
353
+ set: [{}, { var: "event.agent" }, { var: "$ordinal" }],
349
354
  },
350
355
  },
351
356
  ],
@@ -359,12 +364,12 @@ export const daoMultisigDef = defineFiberApp({
359
364
  eventName: "propose_change_threshold",
360
365
  guard: {
361
366
  and: [
362
- { in: [{ var: "event.agent" }, { var: "state.signers" }] },
367
+ actorInSet("state.signers"),
363
368
  { ">=": [{ var: "event.newThreshold" }, 1] },
364
369
  {
365
370
  "<=": [
366
371
  { var: "event.newThreshold" },
367
- { size: { var: "state.signers" } },
372
+ { length: [{ var: "state.signers" }] },
368
373
  ],
369
374
  },
370
375
  ],
@@ -378,13 +383,13 @@ export const daoMultisigDef = defineFiberApp({
378
383
  actionType: "change_threshold",
379
384
  payload: { newThreshold: { var: "event.newThreshold" } },
380
385
  proposer: { var: "event.agent" },
381
- proposedAt: { var: "$timestamp" },
386
+ proposedAt: { var: "$ordinal" },
382
387
  expiresAt: {
383
- "+": [{ var: "$timestamp" }, { var: "state.proposalTTLMs" }],
388
+ "+": [{ var: "$ordinal" }, { var: "state.proposalTTLMs" }],
384
389
  },
385
390
  },
386
391
  signatures: {
387
- setKey: [{}, { var: "event.agent" }, { var: "$timestamp" }],
392
+ set: [{}, { var: "event.agent" }, { var: "$ordinal" }],
388
393
  },
389
394
  },
390
395
  ],
@@ -400,7 +405,7 @@ export const daoMultisigDef = defineFiberApp({
400
405
  and: [
401
406
  {
402
407
  ">=": [
403
- { size: { var: "state.signatures" } },
408
+ { length: [{ keys: [{ var: "state.signatures" }] }] },
404
409
  { var: "state.threshold" },
405
410
  ],
406
411
  },
@@ -470,16 +475,29 @@ export const daoMultisigDef = defineFiberApp({
470
475
  from: "ACTIVE",
471
476
  to: "DISSOLVED",
472
477
  eventName: "dissolve",
478
+ // S2 fix: dissolution must not trust an attacker-supplied count. Derive
479
+ // unanimity from the CHAIN-VERIFIED signers — every signer in state.signers
480
+ // must be among proofs[].address (with a non-empty belt). signers is an array.
473
481
  guard: {
474
- "===": [
475
- { var: "event.signatureCount" },
476
- { size: { var: "state.signers" } },
482
+ and: [
483
+ { ">": [{ length: [{ var: "state.signers" }] }, 0] },
484
+ {
485
+ all: [
486
+ { var: "state.signers" },
487
+ {
488
+ in: [
489
+ { var: "" },
490
+ { map: [{ var: "proofs" }, { var: "address" }] },
491
+ ],
492
+ },
493
+ ],
494
+ },
477
495
  ],
478
496
  },
479
497
  effect: {
480
498
  merge: [
481
499
  { var: "state" },
482
- { dissolvedAt: { var: "$timestamp" }, status: "DISSOLVED" },
500
+ { dissolvedAt: { var: "$ordinal" }, status: "DISSOLVED" },
483
501
  ],
484
502
  },
485
503
  dependencies: [],
@@ -1,4 +1,5 @@
1
1
  import { defineFiberApp } from "../../../schema/fiber-app.js";
2
+ import { actorIsSigner, signerInSet } from "../../../schema/guards.js";
2
3
  /**
3
4
  * Reputation-based governance. Minimum reputation required for participation.
4
5
  */
@@ -176,9 +177,9 @@ export const daoReputationDef = defineFiberApp({
176
177
  actionType: { var: "event.actionType" },
177
178
  payload: { var: "event.payload" },
178
179
  proposer: { var: "event.agent" },
179
- proposedAt: { var: "$timestamp" },
180
+ proposedAt: { var: "$ordinal" },
180
181
  deadline: {
181
- "+": [{ var: "$timestamp" }, { var: "state.votingPeriodMs" }],
182
+ "+": [{ var: "$ordinal" }, { var: "state.votingPeriodMs" }],
182
183
  },
183
184
  },
184
185
  votes: { for: [], against: [], abstain: [] },
@@ -200,20 +201,10 @@ export const daoReputationDef = defineFiberApp({
200
201
  { var: "state.voteThreshold" },
201
202
  ],
202
203
  },
203
- {
204
- "!": [{ in: [{ var: "event.agent" }, { var: "state.votes.for" }] }],
205
- },
206
- {
207
- "!": [
208
- { in: [{ var: "event.agent" }, { var: "state.votes.against" }] },
209
- ],
210
- },
211
- {
212
- "!": [
213
- { in: [{ var: "event.agent" }, { var: "state.votes.abstain" }] },
214
- ],
215
- },
216
- { "<=": [{ var: "$timestamp" }, { var: "state.proposal.deadline" }] },
204
+ { "!": [signerInSet("state.votes.for")] },
205
+ { "!": [signerInSet("state.votes.against")] },
206
+ { "!": [signerInSet("state.votes.abstain")] },
207
+ { "<=": [{ var: "$ordinal" }, { var: "state.proposal.deadline" }] },
217
208
  ],
218
209
  },
219
210
  effect: {
@@ -275,21 +266,23 @@ export const daoReputationDef = defineFiberApp({
275
266
  from: "VOTING",
276
267
  to: "ACTIVE",
277
268
  eventName: "execute",
269
+ // A2 fix: votes.for/against/abstain are arrays of voter addresses; count with
270
+ // `length` (size is not a JLVM opcode).
278
271
  guard: {
279
272
  and: [
280
- { ">": [{ var: "$timestamp" }, { var: "state.proposal.deadline" }] },
273
+ { ">": [{ var: "$ordinal" }, { var: "state.proposal.deadline" }] },
281
274
  {
282
275
  ">": [
283
- { size: { var: "state.votes.for" } },
284
- { size: { var: "state.votes.against" } },
276
+ { length: [{ var: "state.votes.for" }] },
277
+ { length: [{ var: "state.votes.against" }] },
285
278
  ],
286
279
  },
287
280
  {
288
281
  ">=": [
289
282
  {
290
283
  "+": [
291
- { size: { var: "state.votes.for" } },
292
- { size: { var: "state.votes.against" } },
284
+ { length: [{ var: "state.votes.for" }] },
285
+ { length: [{ var: "state.votes.against" }] },
293
286
  ],
294
287
  },
295
288
  { var: "state.quorum" },
@@ -309,23 +302,25 @@ export const daoReputationDef = defineFiberApp({
309
302
  type: "executed",
310
303
  proposal: { var: "state.proposal" },
311
304
  votes: { var: "state.votes" },
312
- at: { var: "$timestamp" },
305
+ at: { var: "$ordinal" },
313
306
  },
314
307
  ],
315
308
  ],
316
309
  },
317
310
  proposal: null,
318
311
  votes: null,
312
+ // A3 fix: transition-level `emits` is dropped by the chain; emit from INSIDE the effect
313
+ // under the reserved `_emit` key (extracted as an EmittedEvent, stripped from state).
314
+ _emit: [
315
+ {
316
+ name: "proposal_executed",
317
+ data: { action: "increase", agents: { var: "state.votes.for" } },
318
+ destination: "Reputation",
319
+ },
320
+ ],
319
321
  },
320
322
  ],
321
323
  },
322
- emits: [
323
- {
324
- event: "proposal_executed",
325
- to: "Reputation",
326
- payload: { action: "increase", agents: { var: "state.votes.for" } },
327
- },
328
- ],
329
324
  dependencies: [],
330
325
  },
331
326
  // VOTING → ACTIVE: reject (voting ended, for <= against or quorum not met)
@@ -333,23 +328,25 @@ export const daoReputationDef = defineFiberApp({
333
328
  from: "VOTING",
334
329
  to: "ACTIVE",
335
330
  eventName: "reject",
331
+ // A2 fix: count the array-shaped vote tallies with `length` (size is not a JLVM
332
+ // opcode).
336
333
  guard: {
337
334
  and: [
338
- { ">": [{ var: "$timestamp" }, { var: "state.proposal.deadline" }] },
335
+ { ">": [{ var: "$ordinal" }, { var: "state.proposal.deadline" }] },
339
336
  {
340
337
  or: [
341
338
  {
342
339
  "<=": [
343
- { size: { var: "state.votes.for" } },
344
- { size: { var: "state.votes.against" } },
340
+ { length: [{ var: "state.votes.for" }] },
341
+ { length: [{ var: "state.votes.against" }] },
345
342
  ],
346
343
  },
347
344
  {
348
345
  "<": [
349
346
  {
350
347
  "+": [
351
- { size: { var: "state.votes.for" } },
352
- { size: { var: "state.votes.against" } },
348
+ { length: [{ var: "state.votes.for" }] },
349
+ { length: [{ var: "state.votes.against" }] },
353
350
  ],
354
351
  },
355
352
  { var: "state.quorum" },
@@ -371,7 +368,7 @@ export const daoReputationDef = defineFiberApp({
371
368
  type: "rejected",
372
369
  proposal: { var: "state.proposal" },
373
370
  votes: { var: "state.votes" },
374
- at: { var: "$timestamp" },
371
+ at: { var: "$ordinal" },
375
372
  },
376
373
  ],
377
374
  ],
@@ -388,8 +385,17 @@ export const daoReputationDef = defineFiberApp({
388
385
  from: "ACTIVE",
389
386
  to: "ACTIVE",
390
387
  eventName: "join",
388
+ // S1/A2: bind event.agent to a verified signer (actorIsSigner) so the member is appended to the
389
+ // array and keyed into memberJoinedAt under a CHAIN-VERIFIED address (set is the rc.5 map-write
390
+ // opcode), and dedup on that bound actor.
391
+ // TODO(#24): event.agentReputation is self-asserted. Replace the reputation clause with
392
+ // signerHasReputation(registryReputationPath(<registryDep>), "state.memberThreshold") once
393
+ // runtime-updatable dependencies (#24) let a std-app bind the identity-registry instance — the
394
+ // same gate as corp-board's removal-resolution. The registry foundation + read helper already
395
+ // exist (src/apps/identity/state-machines/identity-registry.ts, guards.signerHasReputation).
391
396
  guard: {
392
397
  and: [
398
+ actorIsSigner(),
393
399
  {
394
400
  ">=": [
395
401
  { var: "event.agentReputation" },
@@ -407,10 +413,10 @@ export const daoReputationDef = defineFiberApp({
407
413
  cat: [{ var: "state.members" }, [{ var: "event.agent" }]],
408
414
  },
409
415
  memberJoinedAt: {
410
- setKey: [
416
+ set: [
411
417
  { var: "state.memberJoinedAt" },
412
418
  { var: "event.agent" },
413
- { var: "$timestamp" },
419
+ { var: "$ordinal" },
414
420
  ],
415
421
  },
416
422
  },
@@ -423,7 +429,7 @@ export const daoReputationDef = defineFiberApp({
423
429
  from: "ACTIVE",
424
430
  to: "ACTIVE",
425
431
  eventName: "leave",
426
- guard: { in: [{ var: "event.agent" }, { var: "state.members" }] },
432
+ guard: signerInSet("state.members"),
427
433
  effect: {
428
434
  merge: [
429
435
  { var: "state" },
@@ -464,9 +470,9 @@ export const daoReputationDef = defineFiberApp({
464
470
  proposeThreshold: { var: "event.proposeThreshold" },
465
471
  },
466
472
  proposer: { var: "event.agent" },
467
- proposedAt: { var: "$timestamp" },
473
+ proposedAt: { var: "$ordinal" },
468
474
  deadline: {
469
- "+": [{ var: "$timestamp" }, { var: "state.votingPeriodMs" }],
475
+ "+": [{ var: "$ordinal" }, { var: "state.votingPeriodMs" }],
470
476
  },
471
477
  },
472
478
  votes: { for: [], against: [], abstain: [] },
@@ -1,4 +1,5 @@
1
1
  import { defineFiberApp } from "../../../schema/fiber-app.js";
2
+ import { signerIsParty } from "../../../schema/guards.js";
2
3
  /**
3
4
  * Single owner controls all actions. Simplest governance model.
4
5
  */
@@ -110,7 +111,7 @@ export const daoSingleDef = defineFiberApp({
110
111
  from: "ACTIVE",
111
112
  to: "ACTIVE",
112
113
  eventName: "execute",
113
- guard: { "===": [{ var: "event.agent" }, { var: "state.owner" }] },
114
+ guard: signerIsParty("state.owner"),
114
115
  effect: {
115
116
  merge: [
116
117
  { var: "state" },
@@ -123,15 +124,23 @@ export const daoSingleDef = defineFiberApp({
123
124
  id: { var: "event.actionId" },
124
125
  type: { var: "event.actionType" },
125
126
  payload: { var: "event.payload" },
126
- executedAt: { var: "$timestamp" },
127
+ executedAt: { var: "$ordinal" },
127
128
  },
128
129
  ],
129
130
  ],
130
131
  },
132
+ // A3 fix: transition-level `emits` is dropped by the chain; emit from INSIDE the effect
133
+ // under the reserved `_emit` key (extracted as an EmittedEvent, stripped from state).
134
+ _emit: [
135
+ {
136
+ name: "action_executed",
137
+ data: { actionId: { var: "event.actionId" } },
138
+ destination: "external",
139
+ },
140
+ ],
131
141
  },
132
142
  ],
133
143
  },
134
- emits: [{ event: "action_executed", to: "external" }],
135
144
  dependencies: [],
136
145
  },
137
146
  // ACTIVE → TRANSFERRING: transfer_ownership (owner only)
@@ -139,13 +148,13 @@ export const daoSingleDef = defineFiberApp({
139
148
  from: "ACTIVE",
140
149
  to: "TRANSFERRING",
141
150
  eventName: "transfer_ownership",
142
- guard: { "===": [{ var: "event.agent" }, { var: "state.owner" }] },
151
+ guard: signerIsParty("state.owner"),
143
152
  effect: {
144
153
  merge: [
145
154
  { var: "state" },
146
155
  {
147
156
  pendingOwner: { var: "event.newOwner" },
148
- transferInitiatedAt: { var: "$timestamp" },
157
+ transferInitiatedAt: { var: "$ordinal" },
149
158
  },
150
159
  ],
151
160
  },
@@ -156,7 +165,7 @@ export const daoSingleDef = defineFiberApp({
156
165
  from: "TRANSFERRING",
157
166
  to: "ACTIVE",
158
167
  eventName: "accept_ownership",
159
- guard: { "===": [{ var: "event.agent" }, { var: "state.pendingOwner" }] },
168
+ guard: signerIsParty("state.pendingOwner"),
160
169
  effect: {
161
170
  merge: [
162
171
  { var: "state" },
@@ -171,15 +180,23 @@ export const daoSingleDef = defineFiberApp({
171
180
  {
172
181
  from: { var: "state.owner" },
173
182
  to: { var: "state.pendingOwner" },
174
- at: { var: "$timestamp" },
183
+ at: { var: "$ordinal" },
175
184
  },
176
185
  ],
177
186
  ],
178
187
  },
188
+ // A3 fix: transition-level `emits` is dropped by the chain; emit from INSIDE the effect
189
+ // under the reserved `_emit` key (extracted as an EmittedEvent, stripped from state).
190
+ _emit: [
191
+ {
192
+ name: "ownership_transferred",
193
+ data: { var: "event" },
194
+ destination: "Identity",
195
+ },
196
+ ],
179
197
  },
180
198
  ],
181
199
  },
182
- emits: [{ event: "ownership_transferred", to: "Identity" }],
183
200
  dependencies: [],
184
201
  },
185
202
  // TRANSFERRING → ACTIVE: cancel_transfer (owner only)
@@ -187,7 +204,7 @@ export const daoSingleDef = defineFiberApp({
187
204
  from: "TRANSFERRING",
188
205
  to: "ACTIVE",
189
206
  eventName: "cancel_transfer",
190
- guard: { "===": [{ var: "event.agent" }, { var: "state.owner" }] },
207
+ guard: signerIsParty("state.owner"),
191
208
  effect: {
192
209
  merge: [
193
210
  { var: "state" },
@@ -204,12 +221,12 @@ export const daoSingleDef = defineFiberApp({
204
221
  from: "ACTIVE",
205
222
  to: "DISSOLVED",
206
223
  eventName: "dissolve",
207
- guard: { "===": [{ var: "event.agent" }, { var: "state.owner" }] },
224
+ guard: signerIsParty("state.owner"),
208
225
  effect: {
209
226
  merge: [
210
227
  { var: "state" },
211
228
  {
212
- dissolvedAt: { var: "$timestamp" },
229
+ dissolvedAt: { var: "$ordinal" },
213
230
  status: "DISSOLVED",
214
231
  },
215
232
  ],