@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
@@ -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,16 +114,38 @@ 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: {
123
- ACTIVE: { id: "ACTIVE", isFinal: false, metadata: null },
124
- PENDING: { id: "PENDING", isFinal: false, metadata: null },
125
- DISSOLVED: { id: "DISSOLVED", isFinal: true, metadata: null },
122
+ ACTIVE: {
123
+ id: "ACTIVE",
124
+ isFinal: false,
125
+ metadata: {
126
+ label: "Active",
127
+ description: "Multisig is idle and ready to propose an action",
128
+ category: "initial",
129
+ },
130
+ },
131
+ PENDING: {
132
+ id: "PENDING",
133
+ isFinal: false,
134
+ metadata: {
135
+ label: "Pending",
136
+ description: "An action is awaiting the required signature threshold",
137
+ category: "pending",
138
+ },
139
+ },
140
+ DISSOLVED: {
141
+ id: "DISSOLVED",
142
+ isFinal: true,
143
+ metadata: {
144
+ label: "Dissolved",
145
+ description: "Multisig DAO dissolved (terminal)",
146
+ category: "terminal",
147
+ },
148
+ },
126
149
  },
127
150
  initialState: "ACTIVE",
128
151
  transitions: [
@@ -131,7 +154,7 @@ exports.daoMultisigDef = (0, fiber_app_js_1.defineFiberApp)({
131
154
  from: "ACTIVE",
132
155
  to: "PENDING",
133
156
  eventName: "propose",
134
- guard: { in: [{ var: "event.agent" }, { var: "state.signers" }] },
157
+ guard: (0, guards_js_1.actorInSet)("state.signers"),
135
158
  effect: {
136
159
  merge: [
137
160
  { var: "state" },
@@ -141,13 +164,13 @@ exports.daoMultisigDef = (0, fiber_app_js_1.defineFiberApp)({
141
164
  actionType: { var: "event.actionType" },
142
165
  payload: { var: "event.payload" },
143
166
  proposer: { var: "event.agent" },
144
- proposedAt: { var: "$timestamp" },
167
+ proposedAt: { var: "$ordinal" },
145
168
  expiresAt: {
146
- "+": [{ var: "$timestamp" }, { var: "state.proposalTTLMs" }],
169
+ "+": [{ var: "$ordinal" }, { var: "state.proposalTTLMs" }],
147
170
  },
148
171
  },
149
172
  signatures: {
150
- setKey: [{}, { var: "event.agent" }, { var: "$timestamp" }],
173
+ set: [{}, { var: "event.agent" }, { var: "$ordinal" }],
151
174
  },
152
175
  },
153
176
  ],
@@ -161,15 +184,15 @@ exports.daoMultisigDef = (0, fiber_app_js_1.defineFiberApp)({
161
184
  eventName: "sign",
162
185
  guard: {
163
186
  and: [
164
- { in: [{ var: "event.agent" }, { var: "state.signers" }] },
187
+ (0, guards_js_1.actorInSet)("state.signers"),
165
188
  {
166
189
  "!": [
167
- { getKey: [{ var: "state.signatures" }, { var: "event.agent" }] },
190
+ { has: [{ var: "state.signatures" }, { var: "event.agent" }] },
168
191
  ],
169
192
  },
170
193
  {
171
194
  "<": [
172
- { size: { var: "state.signatures" } },
195
+ { length: [{ keys: [{ var: "state.signatures" }] }] },
173
196
  { var: "state.threshold" },
174
197
  ],
175
198
  },
@@ -180,10 +203,10 @@ exports.daoMultisigDef = (0, fiber_app_js_1.defineFiberApp)({
180
203
  { var: "state" },
181
204
  {
182
205
  signatures: {
183
- setKey: [
206
+ set: [
184
207
  { var: "state.signatures" },
185
208
  { var: "event.agent" },
186
- { var: "$timestamp" },
209
+ { var: "$ordinal" },
187
210
  ],
188
211
  },
189
212
  },
@@ -198,7 +221,7 @@ exports.daoMultisigDef = (0, fiber_app_js_1.defineFiberApp)({
198
221
  eventName: "execute",
199
222
  guard: {
200
223
  ">=": [
201
- { size: { var: "state.signatures" } },
224
+ { length: [{ keys: [{ var: "state.signatures" }] }] },
202
225
  { var: "state.threshold" },
203
226
  ],
204
227
  },
@@ -215,17 +238,25 @@ exports.daoMultisigDef = (0, fiber_app_js_1.defineFiberApp)({
215
238
  type: { var: "state.proposal.actionType" },
216
239
  payload: { var: "state.proposal.payload" },
217
240
  signatures: { var: "state.signatures" },
218
- executedAt: { var: "$timestamp" },
241
+ executedAt: { var: "$ordinal" },
219
242
  },
220
243
  ],
221
244
  ],
222
245
  },
223
246
  proposal: null,
224
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
+ ],
225
257
  },
226
258
  ],
227
259
  },
228
- emits: [{ event: "multisig_executed", to: "external" }],
229
260
  dependencies: [],
230
261
  },
231
262
  // PENDING → ACTIVE: cancel (expired or proposer)
@@ -235,10 +266,8 @@ exports.daoMultisigDef = (0, fiber_app_js_1.defineFiberApp)({
235
266
  eventName: "cancel",
236
267
  guard: {
237
268
  or: [
238
- { ">": [{ var: "$timestamp" }, { var: "state.proposal.expiresAt" }] },
239
- {
240
- "===": [{ var: "event.agent" }, { var: "state.proposal.proposer" }],
241
- },
269
+ { ">": [{ var: "$ordinal" }, { var: "state.proposal.expiresAt" }] },
270
+ (0, guards_js_1.signerIsParty)("state.proposal.proposer"),
242
271
  ],
243
272
  },
244
273
  effect: {
@@ -252,7 +281,7 @@ exports.daoMultisigDef = (0, fiber_app_js_1.defineFiberApp)({
252
281
  {
253
282
  merge: [
254
283
  { var: "state.proposal" },
255
- { cancelledAt: { var: "$timestamp" } },
284
+ { cancelledAt: { var: "$ordinal" } },
256
285
  ],
257
286
  },
258
287
  ],
@@ -270,7 +299,7 @@ exports.daoMultisigDef = (0, fiber_app_js_1.defineFiberApp)({
270
299
  from: "ACTIVE",
271
300
  to: "PENDING",
272
301
  eventName: "propose_add_signer",
273
- guard: { in: [{ var: "event.agent" }, { var: "state.signers" }] },
302
+ guard: (0, guards_js_1.actorInSet)("state.signers"),
274
303
  effect: {
275
304
  merge: [
276
305
  { var: "state" },
@@ -280,13 +309,13 @@ exports.daoMultisigDef = (0, fiber_app_js_1.defineFiberApp)({
280
309
  actionType: "add_signer",
281
310
  payload: { newSigner: { var: "event.newSigner" } },
282
311
  proposer: { var: "event.agent" },
283
- proposedAt: { var: "$timestamp" },
312
+ proposedAt: { var: "$ordinal" },
284
313
  expiresAt: {
285
- "+": [{ var: "$timestamp" }, { var: "state.proposalTTLMs" }],
314
+ "+": [{ var: "$ordinal" }, { var: "state.proposalTTLMs" }],
286
315
  },
287
316
  },
288
317
  signatures: {
289
- setKey: [{}, { var: "event.agent" }, { var: "$timestamp" }],
318
+ set: [{}, { var: "event.agent" }, { var: "$ordinal" }],
290
319
  },
291
320
  },
292
321
  ],
@@ -300,10 +329,10 @@ exports.daoMultisigDef = (0, fiber_app_js_1.defineFiberApp)({
300
329
  eventName: "propose_remove_signer",
301
330
  guard: {
302
331
  and: [
303
- { in: [{ var: "event.agent" }, { var: "state.signers" }] },
332
+ (0, guards_js_1.actorInSet)("state.signers"),
304
333
  {
305
334
  ">": [
306
- { size: { var: "state.signers" } },
335
+ { length: [{ var: "state.signers" }] },
307
336
  { var: "state.threshold" },
308
337
  ],
309
338
  },
@@ -318,13 +347,13 @@ exports.daoMultisigDef = (0, fiber_app_js_1.defineFiberApp)({
318
347
  actionType: "remove_signer",
319
348
  payload: { removeSigner: { var: "event.removeSigner" } },
320
349
  proposer: { var: "event.agent" },
321
- proposedAt: { var: "$timestamp" },
350
+ proposedAt: { var: "$ordinal" },
322
351
  expiresAt: {
323
- "+": [{ var: "$timestamp" }, { var: "state.proposalTTLMs" }],
352
+ "+": [{ var: "$ordinal" }, { var: "state.proposalTTLMs" }],
324
353
  },
325
354
  },
326
355
  signatures: {
327
- setKey: [{}, { var: "event.agent" }, { var: "$timestamp" }],
356
+ set: [{}, { var: "event.agent" }, { var: "$ordinal" }],
328
357
  },
329
358
  },
330
359
  ],
@@ -338,12 +367,12 @@ exports.daoMultisigDef = (0, fiber_app_js_1.defineFiberApp)({
338
367
  eventName: "propose_change_threshold",
339
368
  guard: {
340
369
  and: [
341
- { in: [{ var: "event.agent" }, { var: "state.signers" }] },
370
+ (0, guards_js_1.actorInSet)("state.signers"),
342
371
  { ">=": [{ var: "event.newThreshold" }, 1] },
343
372
  {
344
373
  "<=": [
345
374
  { var: "event.newThreshold" },
346
- { size: { var: "state.signers" } },
375
+ { length: [{ var: "state.signers" }] },
347
376
  ],
348
377
  },
349
378
  ],
@@ -357,13 +386,13 @@ exports.daoMultisigDef = (0, fiber_app_js_1.defineFiberApp)({
357
386
  actionType: "change_threshold",
358
387
  payload: { newThreshold: { var: "event.newThreshold" } },
359
388
  proposer: { var: "event.agent" },
360
- proposedAt: { var: "$timestamp" },
389
+ proposedAt: { var: "$ordinal" },
361
390
  expiresAt: {
362
- "+": [{ var: "$timestamp" }, { var: "state.proposalTTLMs" }],
391
+ "+": [{ var: "$ordinal" }, { var: "state.proposalTTLMs" }],
363
392
  },
364
393
  },
365
394
  signatures: {
366
- setKey: [{}, { var: "event.agent" }, { var: "$timestamp" }],
395
+ set: [{}, { var: "event.agent" }, { var: "$ordinal" }],
367
396
  },
368
397
  },
369
398
  ],
@@ -379,7 +408,7 @@ exports.daoMultisigDef = (0, fiber_app_js_1.defineFiberApp)({
379
408
  and: [
380
409
  {
381
410
  ">=": [
382
- { size: { var: "state.signatures" } },
411
+ { length: [{ keys: [{ var: "state.signatures" }] }] },
383
412
  { var: "state.threshold" },
384
413
  ],
385
414
  },
@@ -449,16 +478,29 @@ exports.daoMultisigDef = (0, fiber_app_js_1.defineFiberApp)({
449
478
  from: "ACTIVE",
450
479
  to: "DISSOLVED",
451
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.
452
484
  guard: {
453
- "===": [
454
- { var: "event.signatureCount" },
455
- { 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
+ },
456
498
  ],
457
499
  },
458
500
  effect: {
459
501
  merge: [
460
502
  { var: "state" },
461
- { dissolvedAt: { var: "$timestamp" }, status: "DISSOLVED" },
503
+ { dissolvedAt: { var: "$ordinal" }, status: "DISSOLVED" },
462
504
  ],
463
505
  },
464
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
  */
@@ -127,9 +128,33 @@ exports.daoReputationDef = (0, fiber_app_js_1.defineFiberApp)({
127
128
  },
128
129
  },
129
130
  states: {
130
- ACTIVE: { id: "ACTIVE", isFinal: false, metadata: null },
131
- VOTING: { id: "VOTING", isFinal: false, metadata: null },
132
- DISSOLVED: { id: "DISSOLVED", isFinal: true, metadata: null },
131
+ ACTIVE: {
132
+ id: "ACTIVE",
133
+ isFinal: false,
134
+ metadata: {
135
+ label: "Active",
136
+ description: "DAO is idle and ready to accept a proposal",
137
+ category: "initial",
138
+ },
139
+ },
140
+ VOTING: {
141
+ id: "VOTING",
142
+ isFinal: false,
143
+ metadata: {
144
+ label: "Voting",
145
+ description: "Members vote with reputation-weighted power",
146
+ category: "pending",
147
+ },
148
+ },
149
+ DISSOLVED: {
150
+ id: "DISSOLVED",
151
+ isFinal: true,
152
+ metadata: {
153
+ label: "Dissolved",
154
+ description: "Reputation DAO dissolved (terminal)",
155
+ category: "terminal",
156
+ },
157
+ },
133
158
  },
134
159
  initialState: "ACTIVE",
135
160
  transitions: [
@@ -155,9 +180,9 @@ exports.daoReputationDef = (0, fiber_app_js_1.defineFiberApp)({
155
180
  actionType: { var: "event.actionType" },
156
181
  payload: { var: "event.payload" },
157
182
  proposer: { var: "event.agent" },
158
- proposedAt: { var: "$timestamp" },
183
+ proposedAt: { var: "$ordinal" },
159
184
  deadline: {
160
- "+": [{ var: "$timestamp" }, { var: "state.votingPeriodMs" }],
185
+ "+": [{ var: "$ordinal" }, { var: "state.votingPeriodMs" }],
161
186
  },
162
187
  },
163
188
  votes: { for: [], against: [], abstain: [] },
@@ -179,20 +204,10 @@ exports.daoReputationDef = (0, fiber_app_js_1.defineFiberApp)({
179
204
  { var: "state.voteThreshold" },
180
205
  ],
181
206
  },
182
- {
183
- "!": [{ in: [{ var: "event.agent" }, { var: "state.votes.for" }] }],
184
- },
185
- {
186
- "!": [
187
- { in: [{ var: "event.agent" }, { var: "state.votes.against" }] },
188
- ],
189
- },
190
- {
191
- "!": [
192
- { in: [{ var: "event.agent" }, { var: "state.votes.abstain" }] },
193
- ],
194
- },
195
- { "<=": [{ 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" }] },
196
211
  ],
197
212
  },
198
213
  effect: {
@@ -254,21 +269,23 @@ exports.daoReputationDef = (0, fiber_app_js_1.defineFiberApp)({
254
269
  from: "VOTING",
255
270
  to: "ACTIVE",
256
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).
257
274
  guard: {
258
275
  and: [
259
- { ">": [{ var: "$timestamp" }, { var: "state.proposal.deadline" }] },
276
+ { ">": [{ var: "$ordinal" }, { var: "state.proposal.deadline" }] },
260
277
  {
261
278
  ">": [
262
- { size: { var: "state.votes.for" } },
263
- { size: { var: "state.votes.against" } },
279
+ { length: [{ var: "state.votes.for" }] },
280
+ { length: [{ var: "state.votes.against" }] },
264
281
  ],
265
282
  },
266
283
  {
267
284
  ">=": [
268
285
  {
269
286
  "+": [
270
- { size: { var: "state.votes.for" } },
271
- { size: { var: "state.votes.against" } },
287
+ { length: [{ var: "state.votes.for" }] },
288
+ { length: [{ var: "state.votes.against" }] },
272
289
  ],
273
290
  },
274
291
  { var: "state.quorum" },
@@ -288,23 +305,25 @@ exports.daoReputationDef = (0, fiber_app_js_1.defineFiberApp)({
288
305
  type: "executed",
289
306
  proposal: { var: "state.proposal" },
290
307
  votes: { var: "state.votes" },
291
- at: { var: "$timestamp" },
308
+ at: { var: "$ordinal" },
292
309
  },
293
310
  ],
294
311
  ],
295
312
  },
296
313
  proposal: null,
297
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
+ ],
298
324
  },
299
325
  ],
300
326
  },
301
- emits: [
302
- {
303
- event: "proposal_executed",
304
- to: "Reputation",
305
- payload: { action: "increase", agents: { var: "state.votes.for" } },
306
- },
307
- ],
308
327
  dependencies: [],
309
328
  },
310
329
  // VOTING → ACTIVE: reject (voting ended, for <= against or quorum not met)
@@ -312,23 +331,25 @@ exports.daoReputationDef = (0, fiber_app_js_1.defineFiberApp)({
312
331
  from: "VOTING",
313
332
  to: "ACTIVE",
314
333
  eventName: "reject",
334
+ // A2 fix: count the array-shaped vote tallies with `length` (size is not a JLVM
335
+ // opcode).
315
336
  guard: {
316
337
  and: [
317
- { ">": [{ var: "$timestamp" }, { var: "state.proposal.deadline" }] },
338
+ { ">": [{ var: "$ordinal" }, { var: "state.proposal.deadline" }] },
318
339
  {
319
340
  or: [
320
341
  {
321
342
  "<=": [
322
- { size: { var: "state.votes.for" } },
323
- { size: { var: "state.votes.against" } },
343
+ { length: [{ var: "state.votes.for" }] },
344
+ { length: [{ var: "state.votes.against" }] },
324
345
  ],
325
346
  },
326
347
  {
327
348
  "<": [
328
349
  {
329
350
  "+": [
330
- { size: { var: "state.votes.for" } },
331
- { size: { var: "state.votes.against" } },
351
+ { length: [{ var: "state.votes.for" }] },
352
+ { length: [{ var: "state.votes.against" }] },
332
353
  ],
333
354
  },
334
355
  { var: "state.quorum" },
@@ -350,7 +371,7 @@ exports.daoReputationDef = (0, fiber_app_js_1.defineFiberApp)({
350
371
  type: "rejected",
351
372
  proposal: { var: "state.proposal" },
352
373
  votes: { var: "state.votes" },
353
- at: { var: "$timestamp" },
374
+ at: { var: "$ordinal" },
354
375
  },
355
376
  ],
356
377
  ],
@@ -367,8 +388,17 @@ exports.daoReputationDef = (0, fiber_app_js_1.defineFiberApp)({
367
388
  from: "ACTIVE",
368
389
  to: "ACTIVE",
369
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).
370
399
  guard: {
371
400
  and: [
401
+ (0, guards_js_1.actorIsSigner)(),
372
402
  {
373
403
  ">=": [
374
404
  { var: "event.agentReputation" },
@@ -386,10 +416,10 @@ exports.daoReputationDef = (0, fiber_app_js_1.defineFiberApp)({
386
416
  cat: [{ var: "state.members" }, [{ var: "event.agent" }]],
387
417
  },
388
418
  memberJoinedAt: {
389
- setKey: [
419
+ set: [
390
420
  { var: "state.memberJoinedAt" },
391
421
  { var: "event.agent" },
392
- { var: "$timestamp" },
422
+ { var: "$ordinal" },
393
423
  ],
394
424
  },
395
425
  },
@@ -402,7 +432,7 @@ exports.daoReputationDef = (0, fiber_app_js_1.defineFiberApp)({
402
432
  from: "ACTIVE",
403
433
  to: "ACTIVE",
404
434
  eventName: "leave",
405
- guard: { in: [{ var: "event.agent" }, { var: "state.members" }] },
435
+ guard: (0, guards_js_1.signerInSet)("state.members"),
406
436
  effect: {
407
437
  merge: [
408
438
  { var: "state" },
@@ -443,9 +473,9 @@ exports.daoReputationDef = (0, fiber_app_js_1.defineFiberApp)({
443
473
  proposeThreshold: { var: "event.proposeThreshold" },
444
474
  },
445
475
  proposer: { var: "event.agent" },
446
- proposedAt: { var: "$timestamp" },
476
+ proposedAt: { var: "$ordinal" },
447
477
  deadline: {
448
- "+": [{ var: "$timestamp" }, { var: "state.votingPeriodMs" }],
478
+ "+": [{ var: "$ordinal" }, { var: "state.votingPeriodMs" }],
449
479
  },
450
480
  },
451
481
  votes: { for: [], against: [], abstain: [] },