@ottochain/sdk 2.2.5 → 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 (222) hide show
  1. package/dist/cjs/apps/contracts/index.js +15 -8
  2. package/dist/cjs/apps/contracts/state-machines/contract-agreement.js +89 -46
  3. package/dist/cjs/apps/contracts/state-machines/contract-escrow.js +152 -45
  4. package/dist/cjs/apps/contracts/state-machines/contract-universal.js +40 -8
  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 +85 -43
  12. package/dist/cjs/apps/governance/state-machines/dao-reputation.js +73 -43
  13. package/dist/cjs/apps/governance/state-machines/dao-single.js +55 -14
  14. package/dist/cjs/apps/governance/state-machines/dao-token.js +103 -45
  15. package/dist/cjs/apps/governance/state-machines/governance-simple.js +129 -65
  16. package/dist/cjs/apps/governance/state-machines/governance-universal.js +29 -5
  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 +57 -9
  20. package/dist/cjs/apps/identity/state-machines/identity-oracle.js +70 -27
  21. package/dist/cjs/apps/identity/state-machines/identity-registry.js +288 -0
  22. package/dist/cjs/apps/identity/state-machines/identity-universal.js +30 -6
  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 +44 -19
  33. package/dist/cjs/apps/markets/state-machines/market-crowdfund.js +54 -29
  34. package/dist/cjs/apps/markets/state-machines/market-group-buy.js +53 -31
  35. package/dist/cjs/apps/markets/state-machines/market-prediction.js +120 -61
  36. package/dist/cjs/apps/markets/state-machines/market-universal.js +50 -10
  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 +1722 -1
  49. package/dist/cjs/generated/ottochain/v1/fiber.js +355 -5
  50. package/dist/cjs/generated/ottochain/v1/messages.js +775 -3
  51. package/dist/cjs/generated/ottochain/v1/records.js +350 -3
  52. package/dist/cjs/index.js +45 -7
  53. package/dist/cjs/openapi.js +2 -0
  54. package/dist/cjs/ottochain/drop-nulls.js +1 -2
  55. package/dist/cjs/ottochain/genesis-manifest.js +193 -0
  56. package/dist/cjs/ottochain/index.js +27 -13
  57. package/dist/cjs/ottochain/metagraph-client.js +65 -8
  58. package/dist/cjs/ottochain/snapshot.js +11 -12
  59. package/dist/cjs/ottochain/transaction.js +57 -14
  60. package/dist/cjs/ottochain/types.js +19 -1
  61. package/dist/cjs/privacy/index.js +14 -0
  62. package/dist/cjs/privacy/sealed-bid.js +210 -0
  63. package/dist/cjs/privacy/shield-app.js +131 -0
  64. package/dist/cjs/schema/effects.js +40 -0
  65. package/dist/cjs/schema/fiber-app.js +19 -13
  66. package/dist/cjs/schema/guard-lint.js +352 -0
  67. package/dist/cjs/schema/guards.js +246 -0
  68. package/dist/cjs/signing.js +80 -0
  69. package/dist/cjs/types.js +2 -3
  70. package/dist/cjs/validation.js +8 -8
  71. package/dist/cjs/verify.js +9 -4
  72. package/dist/cjs/zk/commit.js +53 -0
  73. package/dist/cjs/zk/guard.js +107 -0
  74. package/dist/cjs/zk/index.js +48 -0
  75. package/dist/cjs/zk/preimage.js +37 -0
  76. package/dist/cjs/zk/prover.js +87 -0
  77. package/dist/cjs/zk/registry.js +62 -0
  78. package/dist/cjs/zk/types.js +28 -0
  79. package/dist/cjs/zk/witness.js +19 -0
  80. package/dist/esm/apps/contracts/index.js +7 -3
  81. package/dist/esm/apps/contracts/state-machines/contract-agreement.js +89 -46
  82. package/dist/esm/apps/contracts/state-machines/contract-escrow.js +152 -45
  83. package/dist/esm/apps/contracts/state-machines/contract-universal.js +40 -8
  84. package/dist/esm/apps/corporate/state-machines/corp-board.js +169 -59
  85. package/dist/esm/apps/corporate/state-machines/corp-entity.js +245 -47
  86. package/dist/esm/apps/corporate/state-machines/corp-securities.js +407 -99
  87. package/dist/esm/apps/corporate/state-machines/corp-shareholders.js +151 -37
  88. package/dist/esm/apps/governance/state-machines/dao-multisig.js +85 -43
  89. package/dist/esm/apps/governance/state-machines/dao-reputation.js +73 -43
  90. package/dist/esm/apps/governance/state-machines/dao-single.js +55 -14
  91. package/dist/esm/apps/governance/state-machines/dao-token.js +103 -45
  92. package/dist/esm/apps/governance/state-machines/governance-simple.js +129 -65
  93. package/dist/esm/apps/governance/state-machines/governance-universal.js +29 -5
  94. package/dist/esm/apps/identity/constants.js +51 -12
  95. package/dist/esm/apps/identity/index.js +12 -7
  96. package/dist/esm/apps/identity/state-machines/identity-agent.js +57 -9
  97. package/dist/esm/apps/identity/state-machines/identity-oracle.js +70 -27
  98. package/dist/esm/apps/identity/state-machines/identity-registry.js +285 -0
  99. package/dist/esm/apps/identity/state-machines/identity-universal.js +30 -6
  100. package/dist/esm/apps/identity/state-machines/index.js +1 -0
  101. package/dist/esm/apps/index.js +1 -0
  102. package/dist/esm/apps/lending/assets.js +207 -0
  103. package/dist/esm/apps/lending/credit-scoring.js +81 -0
  104. package/dist/esm/apps/lending/eligibility.js +115 -0
  105. package/dist/esm/apps/lending/index.js +69 -0
  106. package/dist/esm/apps/lending/state-machines/index.js +5 -0
  107. package/dist/esm/apps/lending/state-machines/lending-zk-loan.js +409 -0
  108. package/dist/esm/apps/markets/index.js +8 -4
  109. package/dist/esm/apps/markets/state-machines/market-auction.js +44 -19
  110. package/dist/esm/apps/markets/state-machines/market-crowdfund.js +54 -29
  111. package/dist/esm/apps/markets/state-machines/market-group-buy.js +53 -31
  112. package/dist/esm/apps/markets/state-machines/market-prediction.js +120 -61
  113. package/dist/esm/apps/markets/state-machines/market-universal.js +50 -10
  114. package/dist/esm/generated/index.js +9 -5
  115. package/dist/esm/generated/openapi.js +5 -0
  116. package/dist/esm/generated/ottochain/apps/contracts/v1/contract.js +46 -46
  117. package/dist/esm/generated/ottochain/apps/identity/v1/identity.js +114 -120
  118. package/dist/esm/generated/ottochain/apps/markets/v1/market.js +100 -100
  119. package/dist/esm/generated/ottochain/v1/common.js +1718 -0
  120. package/dist/esm/generated/ottochain/v1/fiber.js +351 -1
  121. package/dist/esm/generated/ottochain/v1/messages.js +774 -2
  122. package/dist/esm/generated/ottochain/v1/records.js +349 -2
  123. package/dist/esm/index.js +23 -2
  124. package/dist/esm/openapi.js +1 -0
  125. package/dist/esm/ottochain/genesis-manifest.js +189 -0
  126. package/dist/esm/ottochain/index.js +4 -3
  127. package/dist/esm/ottochain/metagraph-client.js +65 -8
  128. package/dist/esm/ottochain/snapshot.js +4 -4
  129. package/dist/esm/ottochain/transaction.js +43 -3
  130. package/dist/esm/ottochain/types.js +18 -0
  131. package/dist/esm/privacy/index.js +6 -0
  132. package/dist/esm/privacy/sealed-bid.js +206 -0
  133. package/dist/esm/privacy/shield-app.js +127 -0
  134. package/dist/esm/schema/effects.js +35 -0
  135. package/dist/esm/schema/fiber-app.js +13 -6
  136. package/dist/esm/schema/guard-lint.js +346 -0
  137. package/dist/esm/schema/guards.js +229 -0
  138. package/dist/esm/signing.js +74 -0
  139. package/dist/esm/verify.js +8 -2
  140. package/dist/esm/zk/commit.js +44 -0
  141. package/dist/esm/zk/guard.js +99 -0
  142. package/dist/esm/zk/index.js +19 -0
  143. package/dist/esm/zk/preimage.js +30 -0
  144. package/dist/esm/zk/prover.js +82 -0
  145. package/dist/esm/zk/registry.js +55 -0
  146. package/dist/esm/zk/types.js +25 -0
  147. package/dist/esm/zk/witness.js +15 -0
  148. package/dist/types/apps/contracts/index.d.ts +159 -227
  149. package/dist/types/apps/contracts/state-machines/contract-agreement.d.ts +50 -101
  150. package/dist/types/apps/contracts/state-machines/contract-escrow.d.ts +86 -120
  151. package/dist/types/apps/contracts/state-machines/contract-universal.d.ts +20 -4
  152. package/dist/types/apps/corporate/index.d.ts +1040 -304
  153. package/dist/types/apps/corporate/state-machines/corp-board.d.ts +188 -52
  154. package/dist/types/apps/corporate/state-machines/corp-entity.d.ts +267 -62
  155. package/dist/types/apps/corporate/state-machines/corp-securities.d.ts +355 -131
  156. package/dist/types/apps/corporate/state-machines/corp-shareholders.d.ts +225 -53
  157. package/dist/types/apps/governance/index.d.ts +396 -417
  158. package/dist/types/apps/governance/state-machines/dao-multisig.d.ts +92 -95
  159. package/dist/types/apps/governance/state-machines/dao-reputation.d.ts +57 -69
  160. package/dist/types/apps/governance/state-machines/dao-single.d.ts +40 -50
  161. package/dist/types/apps/governance/state-machines/dao-token.d.ts +80 -53
  162. package/dist/types/apps/governance/state-machines/governance-simple.d.ts +107 -121
  163. package/dist/types/apps/governance/state-machines/governance-universal.d.ts +17 -5
  164. package/dist/types/apps/identity/constants.d.ts +32 -4
  165. package/dist/types/apps/identity/index.d.ts +449 -100
  166. package/dist/types/apps/identity/state-machines/identity-agent.d.ts +30 -0
  167. package/dist/types/apps/identity/state-machines/identity-oracle.d.ts +41 -87
  168. package/dist/types/apps/identity/state-machines/identity-registry.d.ts +379 -0
  169. package/dist/types/apps/identity/state-machines/identity-universal.d.ts +15 -0
  170. package/dist/types/apps/identity/state-machines/index.d.ts +1 -0
  171. package/dist/types/apps/index.d.ts +1 -0
  172. package/dist/types/apps/lending/assets.d.ts +258 -0
  173. package/dist/types/apps/lending/credit-scoring.d.ts +80 -0
  174. package/dist/types/apps/lending/eligibility.d.ts +83 -0
  175. package/dist/types/apps/lending/index.d.ts +548 -0
  176. package/dist/types/apps/lending/state-machines/index.d.ts +5 -0
  177. package/dist/types/apps/lending/state-machines/lending-zk-loan.d.ts +528 -0
  178. package/dist/types/apps/markets/index.d.ts +184 -204
  179. package/dist/types/apps/markets/state-machines/market-auction.d.ts +25 -37
  180. package/dist/types/apps/markets/state-machines/market-crowdfund.d.ts +26 -34
  181. package/dist/types/apps/markets/state-machines/market-group-buy.d.ts +31 -43
  182. package/dist/types/apps/markets/state-machines/market-prediction.d.ts +67 -72
  183. package/dist/types/apps/markets/state-machines/market-universal.d.ts +30 -10
  184. package/dist/types/generated/index.d.ts +5 -5
  185. package/dist/types/generated/openapi.d.ts +1257 -0
  186. package/dist/types/generated/ottochain/apps/contracts/v1/contract.d.ts +5 -5
  187. package/dist/types/generated/ottochain/apps/identity/v1/identity.d.ts +12 -12
  188. package/dist/types/generated/ottochain/apps/markets/v1/market.d.ts +11 -11
  189. package/dist/types/generated/ottochain/v1/common.d.ts +228 -0
  190. package/dist/types/generated/ottochain/v1/fiber.d.ts +32 -1
  191. package/dist/types/generated/ottochain/v1/messages.d.ts +84 -0
  192. package/dist/types/generated/ottochain/v1/records.d.ts +34 -0
  193. package/dist/types/index.d.ts +8 -2
  194. package/dist/types/openapi.d.ts +22 -0
  195. package/dist/types/ottochain/genesis-manifest.d.ts +130 -0
  196. package/dist/types/ottochain/index.d.ts +6 -5
  197. package/dist/types/ottochain/metagraph-client.d.ts +49 -7
  198. package/dist/types/ottochain/snapshot.d.ts +6 -6
  199. package/dist/types/ottochain/transaction.d.ts +33 -1
  200. package/dist/types/ottochain/types.d.ts +602 -11
  201. package/dist/types/privacy/index.d.ts +6 -0
  202. package/dist/types/privacy/sealed-bid.d.ts +348 -0
  203. package/dist/types/privacy/shield-app.d.ts +48 -0
  204. package/dist/types/schema/effects.d.ts +34 -0
  205. package/dist/types/schema/fiber-app.d.ts +41 -3
  206. package/dist/types/schema/guard-lint.d.ts +111 -0
  207. package/dist/types/schema/guards.d.ts +134 -0
  208. package/dist/types/signing.d.ts +45 -0
  209. package/dist/types/validation.d.ts +22 -217
  210. package/dist/types/verify.d.ts +4 -0
  211. package/dist/types/zk/commit.d.ts +28 -0
  212. package/dist/types/zk/guard.d.ts +46 -0
  213. package/dist/types/zk/index.d.ts +19 -0
  214. package/dist/types/zk/preimage.d.ts +10 -0
  215. package/dist/types/zk/prover.d.ts +34 -0
  216. package/dist/types/zk/registry.d.ts +34 -0
  217. package/dist/types/zk/types.d.ts +33 -0
  218. package/dist/types/zk/witness.d.ts +40 -0
  219. package/package.json +52 -35
  220. package/dist/cjs/ottochain/normalize.js +0 -186
  221. package/dist/esm/ottochain/normalize.js +0 -179
  222. 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,16 +111,38 @@ 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: {
120
- ACTIVE: { id: "ACTIVE", isFinal: false, metadata: null },
121
- PENDING: { id: "PENDING", isFinal: false, metadata: null },
122
- DISSOLVED: { id: "DISSOLVED", isFinal: true, metadata: null },
119
+ ACTIVE: {
120
+ id: "ACTIVE",
121
+ isFinal: false,
122
+ metadata: {
123
+ label: "Active",
124
+ description: "Multisig is idle and ready to propose an action",
125
+ category: "initial",
126
+ },
127
+ },
128
+ PENDING: {
129
+ id: "PENDING",
130
+ isFinal: false,
131
+ metadata: {
132
+ label: "Pending",
133
+ description: "An action is awaiting the required signature threshold",
134
+ category: "pending",
135
+ },
136
+ },
137
+ DISSOLVED: {
138
+ id: "DISSOLVED",
139
+ isFinal: true,
140
+ metadata: {
141
+ label: "Dissolved",
142
+ description: "Multisig DAO dissolved (terminal)",
143
+ category: "terminal",
144
+ },
145
+ },
123
146
  },
124
147
  initialState: "ACTIVE",
125
148
  transitions: [
@@ -128,7 +151,7 @@ export const daoMultisigDef = defineFiberApp({
128
151
  from: "ACTIVE",
129
152
  to: "PENDING",
130
153
  eventName: "propose",
131
- guard: { in: [{ var: "event.agent" }, { var: "state.signers" }] },
154
+ guard: actorInSet("state.signers"),
132
155
  effect: {
133
156
  merge: [
134
157
  { var: "state" },
@@ -138,13 +161,13 @@ export const daoMultisigDef = defineFiberApp({
138
161
  actionType: { var: "event.actionType" },
139
162
  payload: { var: "event.payload" },
140
163
  proposer: { var: "event.agent" },
141
- proposedAt: { var: "$timestamp" },
164
+ proposedAt: { var: "$ordinal" },
142
165
  expiresAt: {
143
- "+": [{ var: "$timestamp" }, { var: "state.proposalTTLMs" }],
166
+ "+": [{ var: "$ordinal" }, { var: "state.proposalTTLMs" }],
144
167
  },
145
168
  },
146
169
  signatures: {
147
- setKey: [{}, { var: "event.agent" }, { var: "$timestamp" }],
170
+ set: [{}, { var: "event.agent" }, { var: "$ordinal" }],
148
171
  },
149
172
  },
150
173
  ],
@@ -158,15 +181,15 @@ export const daoMultisigDef = defineFiberApp({
158
181
  eventName: "sign",
159
182
  guard: {
160
183
  and: [
161
- { in: [{ var: "event.agent" }, { var: "state.signers" }] },
184
+ actorInSet("state.signers"),
162
185
  {
163
186
  "!": [
164
- { getKey: [{ var: "state.signatures" }, { var: "event.agent" }] },
187
+ { has: [{ var: "state.signatures" }, { var: "event.agent" }] },
165
188
  ],
166
189
  },
167
190
  {
168
191
  "<": [
169
- { size: { var: "state.signatures" } },
192
+ { length: [{ keys: [{ var: "state.signatures" }] }] },
170
193
  { var: "state.threshold" },
171
194
  ],
172
195
  },
@@ -177,10 +200,10 @@ export const daoMultisigDef = defineFiberApp({
177
200
  { var: "state" },
178
201
  {
179
202
  signatures: {
180
- setKey: [
203
+ set: [
181
204
  { var: "state.signatures" },
182
205
  { var: "event.agent" },
183
- { var: "$timestamp" },
206
+ { var: "$ordinal" },
184
207
  ],
185
208
  },
186
209
  },
@@ -195,7 +218,7 @@ export const daoMultisigDef = defineFiberApp({
195
218
  eventName: "execute",
196
219
  guard: {
197
220
  ">=": [
198
- { size: { var: "state.signatures" } },
221
+ { length: [{ keys: [{ var: "state.signatures" }] }] },
199
222
  { var: "state.threshold" },
200
223
  ],
201
224
  },
@@ -212,17 +235,25 @@ export const daoMultisigDef = defineFiberApp({
212
235
  type: { var: "state.proposal.actionType" },
213
236
  payload: { var: "state.proposal.payload" },
214
237
  signatures: { var: "state.signatures" },
215
- executedAt: { var: "$timestamp" },
238
+ executedAt: { var: "$ordinal" },
216
239
  },
217
240
  ],
218
241
  ],
219
242
  },
220
243
  proposal: null,
221
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
+ ],
222
254
  },
223
255
  ],
224
256
  },
225
- emits: [{ event: "multisig_executed", to: "external" }],
226
257
  dependencies: [],
227
258
  },
228
259
  // PENDING → ACTIVE: cancel (expired or proposer)
@@ -232,10 +263,8 @@ export const daoMultisigDef = defineFiberApp({
232
263
  eventName: "cancel",
233
264
  guard: {
234
265
  or: [
235
- { ">": [{ var: "$timestamp" }, { var: "state.proposal.expiresAt" }] },
236
- {
237
- "===": [{ var: "event.agent" }, { var: "state.proposal.proposer" }],
238
- },
266
+ { ">": [{ var: "$ordinal" }, { var: "state.proposal.expiresAt" }] },
267
+ signerIsParty("state.proposal.proposer"),
239
268
  ],
240
269
  },
241
270
  effect: {
@@ -249,7 +278,7 @@ export const daoMultisigDef = defineFiberApp({
249
278
  {
250
279
  merge: [
251
280
  { var: "state.proposal" },
252
- { cancelledAt: { var: "$timestamp" } },
281
+ { cancelledAt: { var: "$ordinal" } },
253
282
  ],
254
283
  },
255
284
  ],
@@ -267,7 +296,7 @@ export const daoMultisigDef = defineFiberApp({
267
296
  from: "ACTIVE",
268
297
  to: "PENDING",
269
298
  eventName: "propose_add_signer",
270
- guard: { in: [{ var: "event.agent" }, { var: "state.signers" }] },
299
+ guard: actorInSet("state.signers"),
271
300
  effect: {
272
301
  merge: [
273
302
  { var: "state" },
@@ -277,13 +306,13 @@ export const daoMultisigDef = defineFiberApp({
277
306
  actionType: "add_signer",
278
307
  payload: { newSigner: { var: "event.newSigner" } },
279
308
  proposer: { var: "event.agent" },
280
- proposedAt: { var: "$timestamp" },
309
+ proposedAt: { var: "$ordinal" },
281
310
  expiresAt: {
282
- "+": [{ var: "$timestamp" }, { var: "state.proposalTTLMs" }],
311
+ "+": [{ var: "$ordinal" }, { var: "state.proposalTTLMs" }],
283
312
  },
284
313
  },
285
314
  signatures: {
286
- setKey: [{}, { var: "event.agent" }, { var: "$timestamp" }],
315
+ set: [{}, { var: "event.agent" }, { var: "$ordinal" }],
287
316
  },
288
317
  },
289
318
  ],
@@ -297,10 +326,10 @@ export const daoMultisigDef = defineFiberApp({
297
326
  eventName: "propose_remove_signer",
298
327
  guard: {
299
328
  and: [
300
- { in: [{ var: "event.agent" }, { var: "state.signers" }] },
329
+ actorInSet("state.signers"),
301
330
  {
302
331
  ">": [
303
- { size: { var: "state.signers" } },
332
+ { length: [{ var: "state.signers" }] },
304
333
  { var: "state.threshold" },
305
334
  ],
306
335
  },
@@ -315,13 +344,13 @@ export const daoMultisigDef = defineFiberApp({
315
344
  actionType: "remove_signer",
316
345
  payload: { removeSigner: { var: "event.removeSigner" } },
317
346
  proposer: { var: "event.agent" },
318
- proposedAt: { var: "$timestamp" },
347
+ proposedAt: { var: "$ordinal" },
319
348
  expiresAt: {
320
- "+": [{ var: "$timestamp" }, { var: "state.proposalTTLMs" }],
349
+ "+": [{ var: "$ordinal" }, { var: "state.proposalTTLMs" }],
321
350
  },
322
351
  },
323
352
  signatures: {
324
- setKey: [{}, { var: "event.agent" }, { var: "$timestamp" }],
353
+ set: [{}, { var: "event.agent" }, { var: "$ordinal" }],
325
354
  },
326
355
  },
327
356
  ],
@@ -335,12 +364,12 @@ export const daoMultisigDef = defineFiberApp({
335
364
  eventName: "propose_change_threshold",
336
365
  guard: {
337
366
  and: [
338
- { in: [{ var: "event.agent" }, { var: "state.signers" }] },
367
+ actorInSet("state.signers"),
339
368
  { ">=": [{ var: "event.newThreshold" }, 1] },
340
369
  {
341
370
  "<=": [
342
371
  { var: "event.newThreshold" },
343
- { size: { var: "state.signers" } },
372
+ { length: [{ var: "state.signers" }] },
344
373
  ],
345
374
  },
346
375
  ],
@@ -354,13 +383,13 @@ export const daoMultisigDef = defineFiberApp({
354
383
  actionType: "change_threshold",
355
384
  payload: { newThreshold: { var: "event.newThreshold" } },
356
385
  proposer: { var: "event.agent" },
357
- proposedAt: { var: "$timestamp" },
386
+ proposedAt: { var: "$ordinal" },
358
387
  expiresAt: {
359
- "+": [{ var: "$timestamp" }, { var: "state.proposalTTLMs" }],
388
+ "+": [{ var: "$ordinal" }, { var: "state.proposalTTLMs" }],
360
389
  },
361
390
  },
362
391
  signatures: {
363
- setKey: [{}, { var: "event.agent" }, { var: "$timestamp" }],
392
+ set: [{}, { var: "event.agent" }, { var: "$ordinal" }],
364
393
  },
365
394
  },
366
395
  ],
@@ -376,7 +405,7 @@ export const daoMultisigDef = defineFiberApp({
376
405
  and: [
377
406
  {
378
407
  ">=": [
379
- { size: { var: "state.signatures" } },
408
+ { length: [{ keys: [{ var: "state.signatures" }] }] },
380
409
  { var: "state.threshold" },
381
410
  ],
382
411
  },
@@ -446,16 +475,29 @@ export const daoMultisigDef = defineFiberApp({
446
475
  from: "ACTIVE",
447
476
  to: "DISSOLVED",
448
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.
449
481
  guard: {
450
- "===": [
451
- { var: "event.signatureCount" },
452
- { 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
+ },
453
495
  ],
454
496
  },
455
497
  effect: {
456
498
  merge: [
457
499
  { var: "state" },
458
- { dissolvedAt: { var: "$timestamp" }, status: "DISSOLVED" },
500
+ { dissolvedAt: { var: "$ordinal" }, status: "DISSOLVED" },
459
501
  ],
460
502
  },
461
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
  */
@@ -124,9 +125,33 @@ export const daoReputationDef = defineFiberApp({
124
125
  },
125
126
  },
126
127
  states: {
127
- ACTIVE: { id: "ACTIVE", isFinal: false, metadata: null },
128
- VOTING: { id: "VOTING", isFinal: false, metadata: null },
129
- DISSOLVED: { id: "DISSOLVED", isFinal: true, metadata: null },
128
+ ACTIVE: {
129
+ id: "ACTIVE",
130
+ isFinal: false,
131
+ metadata: {
132
+ label: "Active",
133
+ description: "DAO is idle and ready to accept a proposal",
134
+ category: "initial",
135
+ },
136
+ },
137
+ VOTING: {
138
+ id: "VOTING",
139
+ isFinal: false,
140
+ metadata: {
141
+ label: "Voting",
142
+ description: "Members vote with reputation-weighted power",
143
+ category: "pending",
144
+ },
145
+ },
146
+ DISSOLVED: {
147
+ id: "DISSOLVED",
148
+ isFinal: true,
149
+ metadata: {
150
+ label: "Dissolved",
151
+ description: "Reputation DAO dissolved (terminal)",
152
+ category: "terminal",
153
+ },
154
+ },
130
155
  },
131
156
  initialState: "ACTIVE",
132
157
  transitions: [
@@ -152,9 +177,9 @@ export const daoReputationDef = defineFiberApp({
152
177
  actionType: { var: "event.actionType" },
153
178
  payload: { var: "event.payload" },
154
179
  proposer: { var: "event.agent" },
155
- proposedAt: { var: "$timestamp" },
180
+ proposedAt: { var: "$ordinal" },
156
181
  deadline: {
157
- "+": [{ var: "$timestamp" }, { var: "state.votingPeriodMs" }],
182
+ "+": [{ var: "$ordinal" }, { var: "state.votingPeriodMs" }],
158
183
  },
159
184
  },
160
185
  votes: { for: [], against: [], abstain: [] },
@@ -176,20 +201,10 @@ export const daoReputationDef = defineFiberApp({
176
201
  { var: "state.voteThreshold" },
177
202
  ],
178
203
  },
179
- {
180
- "!": [{ in: [{ var: "event.agent" }, { var: "state.votes.for" }] }],
181
- },
182
- {
183
- "!": [
184
- { in: [{ var: "event.agent" }, { var: "state.votes.against" }] },
185
- ],
186
- },
187
- {
188
- "!": [
189
- { in: [{ var: "event.agent" }, { var: "state.votes.abstain" }] },
190
- ],
191
- },
192
- { "<=": [{ 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" }] },
193
208
  ],
194
209
  },
195
210
  effect: {
@@ -251,21 +266,23 @@ export const daoReputationDef = defineFiberApp({
251
266
  from: "VOTING",
252
267
  to: "ACTIVE",
253
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).
254
271
  guard: {
255
272
  and: [
256
- { ">": [{ var: "$timestamp" }, { var: "state.proposal.deadline" }] },
273
+ { ">": [{ var: "$ordinal" }, { var: "state.proposal.deadline" }] },
257
274
  {
258
275
  ">": [
259
- { size: { var: "state.votes.for" } },
260
- { size: { var: "state.votes.against" } },
276
+ { length: [{ var: "state.votes.for" }] },
277
+ { length: [{ var: "state.votes.against" }] },
261
278
  ],
262
279
  },
263
280
  {
264
281
  ">=": [
265
282
  {
266
283
  "+": [
267
- { size: { var: "state.votes.for" } },
268
- { size: { var: "state.votes.against" } },
284
+ { length: [{ var: "state.votes.for" }] },
285
+ { length: [{ var: "state.votes.against" }] },
269
286
  ],
270
287
  },
271
288
  { var: "state.quorum" },
@@ -285,23 +302,25 @@ export const daoReputationDef = defineFiberApp({
285
302
  type: "executed",
286
303
  proposal: { var: "state.proposal" },
287
304
  votes: { var: "state.votes" },
288
- at: { var: "$timestamp" },
305
+ at: { var: "$ordinal" },
289
306
  },
290
307
  ],
291
308
  ],
292
309
  },
293
310
  proposal: null,
294
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
+ ],
295
321
  },
296
322
  ],
297
323
  },
298
- emits: [
299
- {
300
- event: "proposal_executed",
301
- to: "Reputation",
302
- payload: { action: "increase", agents: { var: "state.votes.for" } },
303
- },
304
- ],
305
324
  dependencies: [],
306
325
  },
307
326
  // VOTING → ACTIVE: reject (voting ended, for <= against or quorum not met)
@@ -309,23 +328,25 @@ export const daoReputationDef = defineFiberApp({
309
328
  from: "VOTING",
310
329
  to: "ACTIVE",
311
330
  eventName: "reject",
331
+ // A2 fix: count the array-shaped vote tallies with `length` (size is not a JLVM
332
+ // opcode).
312
333
  guard: {
313
334
  and: [
314
- { ">": [{ var: "$timestamp" }, { var: "state.proposal.deadline" }] },
335
+ { ">": [{ var: "$ordinal" }, { var: "state.proposal.deadline" }] },
315
336
  {
316
337
  or: [
317
338
  {
318
339
  "<=": [
319
- { size: { var: "state.votes.for" } },
320
- { size: { var: "state.votes.against" } },
340
+ { length: [{ var: "state.votes.for" }] },
341
+ { length: [{ var: "state.votes.against" }] },
321
342
  ],
322
343
  },
323
344
  {
324
345
  "<": [
325
346
  {
326
347
  "+": [
327
- { size: { var: "state.votes.for" } },
328
- { size: { var: "state.votes.against" } },
348
+ { length: [{ var: "state.votes.for" }] },
349
+ { length: [{ var: "state.votes.against" }] },
329
350
  ],
330
351
  },
331
352
  { var: "state.quorum" },
@@ -347,7 +368,7 @@ export const daoReputationDef = defineFiberApp({
347
368
  type: "rejected",
348
369
  proposal: { var: "state.proposal" },
349
370
  votes: { var: "state.votes" },
350
- at: { var: "$timestamp" },
371
+ at: { var: "$ordinal" },
351
372
  },
352
373
  ],
353
374
  ],
@@ -364,8 +385,17 @@ export const daoReputationDef = defineFiberApp({
364
385
  from: "ACTIVE",
365
386
  to: "ACTIVE",
366
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).
367
396
  guard: {
368
397
  and: [
398
+ actorIsSigner(),
369
399
  {
370
400
  ">=": [
371
401
  { var: "event.agentReputation" },
@@ -383,10 +413,10 @@ export const daoReputationDef = defineFiberApp({
383
413
  cat: [{ var: "state.members" }, [{ var: "event.agent" }]],
384
414
  },
385
415
  memberJoinedAt: {
386
- setKey: [
416
+ set: [
387
417
  { var: "state.memberJoinedAt" },
388
418
  { var: "event.agent" },
389
- { var: "$timestamp" },
419
+ { var: "$ordinal" },
390
420
  ],
391
421
  },
392
422
  },
@@ -399,7 +429,7 @@ export const daoReputationDef = defineFiberApp({
399
429
  from: "ACTIVE",
400
430
  to: "ACTIVE",
401
431
  eventName: "leave",
402
- guard: { in: [{ var: "event.agent" }, { var: "state.members" }] },
432
+ guard: signerInSet("state.members"),
403
433
  effect: {
404
434
  merge: [
405
435
  { var: "state" },
@@ -440,9 +470,9 @@ export const daoReputationDef = defineFiberApp({
440
470
  proposeThreshold: { var: "event.proposeThreshold" },
441
471
  },
442
472
  proposer: { var: "event.agent" },
443
- proposedAt: { var: "$timestamp" },
473
+ proposedAt: { var: "$ordinal" },
444
474
  deadline: {
445
- "+": [{ var: "$timestamp" }, { var: "state.votingPeriodMs" }],
475
+ "+": [{ var: "$ordinal" }, { var: "state.votingPeriodMs" }],
446
476
  },
447
477
  },
448
478
  votes: { for: [], against: [], abstain: [] },