@ottochain/sdk 2.3.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/dist/cjs/apps/contracts/index.js +15 -8
  2. package/dist/cjs/apps/contracts/state-machines/contract-agreement.js +35 -40
  3. package/dist/cjs/apps/contracts/state-machines/contract-escrow.js +80 -37
  4. package/dist/cjs/apps/contracts/state-machines/contract-universal.js +4 -4
  5. package/dist/cjs/apps/corporate/index.js +2 -2
  6. package/dist/cjs/apps/corporate/state-machines/corp-board.js +169 -59
  7. package/dist/cjs/apps/corporate/state-machines/corp-entity.js +245 -47
  8. package/dist/cjs/apps/corporate/state-machines/corp-securities.js +407 -99
  9. package/dist/cjs/apps/corporate/state-machines/corp-shareholders.js +151 -37
  10. package/dist/cjs/apps/governance/index.js +14 -14
  11. package/dist/cjs/apps/governance/state-machines/dao-multisig.js +58 -40
  12. package/dist/cjs/apps/governance/state-machines/dao-reputation.js +46 -40
  13. package/dist/cjs/apps/governance/state-machines/dao-single.js +28 -11
  14. package/dist/cjs/apps/governance/state-machines/dao-token.js +67 -41
  15. package/dist/cjs/apps/governance/state-machines/governance-simple.js +93 -61
  16. package/dist/cjs/apps/governance/state-machines/governance-universal.js +2 -2
  17. package/dist/cjs/apps/identity/constants.js +55 -14
  18. package/dist/cjs/apps/identity/index.js +27 -11
  19. package/dist/cjs/apps/identity/state-machines/identity-agent.js +3 -3
  20. package/dist/cjs/apps/identity/state-machines/identity-oracle.js +25 -22
  21. package/dist/cjs/apps/identity/state-machines/identity-registry.js +288 -0
  22. package/dist/cjs/apps/identity/state-machines/identity-universal.js +3 -3
  23. package/dist/cjs/apps/identity/state-machines/index.js +3 -1
  24. package/dist/cjs/apps/index.js +19 -8
  25. package/dist/cjs/apps/lending/assets.js +223 -0
  26. package/dist/cjs/apps/lending/credit-scoring.js +87 -0
  27. package/dist/cjs/apps/lending/eligibility.js +121 -0
  28. package/dist/cjs/apps/lending/index.js +91 -0
  29. package/dist/cjs/apps/lending/state-machines/index.js +9 -0
  30. package/dist/cjs/apps/lending/state-machines/lending-zk-loan.js +412 -0
  31. package/dist/cjs/apps/markets/index.js +21 -11
  32. package/dist/cjs/apps/markets/state-machines/market-auction.js +14 -13
  33. package/dist/cjs/apps/markets/state-machines/market-crowdfund.js +29 -24
  34. package/dist/cjs/apps/markets/state-machines/market-group-buy.js +24 -26
  35. package/dist/cjs/apps/markets/state-machines/market-prediction.js +80 -53
  36. package/dist/cjs/apps/markets/state-machines/market-universal.js +5 -5
  37. package/dist/cjs/apps/oracles/index.js +2 -2
  38. package/dist/cjs/errors.js +3 -3
  39. package/dist/cjs/generated/google/protobuf/struct.js +4 -4
  40. package/dist/cjs/generated/index.js +11 -7
  41. package/dist/cjs/generated/openapi.js +6 -0
  42. package/dist/cjs/generated/ottochain/apps/contracts/v1/contract.js +50 -50
  43. package/dist/cjs/generated/ottochain/apps/corporate/v1/corporate.js +19 -20
  44. package/dist/cjs/generated/ottochain/apps/governance/v1/governance.js +13 -13
  45. package/dist/cjs/generated/ottochain/apps/identity/v1/attestation.js +4 -4
  46. package/dist/cjs/generated/ottochain/apps/identity/v1/identity.js +124 -130
  47. package/dist/cjs/generated/ottochain/apps/markets/v1/market.js +107 -107
  48. package/dist/cjs/generated/ottochain/v1/common.js +4 -4
  49. package/dist/cjs/generated/ottochain/v1/fiber.js +4 -4
  50. package/dist/cjs/index.js +41 -7
  51. package/dist/cjs/openapi.js +2 -0
  52. package/dist/cjs/ottochain/drop-nulls.js +1 -2
  53. package/dist/cjs/ottochain/genesis-manifest.js +11 -11
  54. package/dist/cjs/ottochain/index.js +23 -13
  55. package/dist/cjs/ottochain/metagraph-client.js +65 -8
  56. package/dist/cjs/ottochain/snapshot.js +11 -12
  57. package/dist/cjs/ottochain/transaction.js +57 -14
  58. package/dist/cjs/ottochain/types.js +16 -2
  59. package/dist/cjs/privacy/index.js +14 -0
  60. package/dist/cjs/privacy/sealed-bid.js +210 -0
  61. package/dist/cjs/privacy/shield-app.js +131 -0
  62. package/dist/cjs/schema/effects.js +40 -0
  63. package/dist/cjs/schema/fiber-app.js +19 -13
  64. package/dist/cjs/schema/guard-lint.js +352 -0
  65. package/dist/cjs/schema/guards.js +246 -0
  66. package/dist/cjs/signing.js +80 -0
  67. package/dist/cjs/types.js +2 -3
  68. package/dist/cjs/validation.js +8 -8
  69. package/dist/cjs/verify.js +9 -4
  70. package/dist/cjs/zk/commit.js +53 -0
  71. package/dist/cjs/zk/guard.js +107 -0
  72. package/dist/cjs/zk/index.js +48 -0
  73. package/dist/cjs/zk/preimage.js +37 -0
  74. package/dist/cjs/zk/prover.js +87 -0
  75. package/dist/cjs/zk/registry.js +62 -0
  76. package/dist/cjs/zk/types.js +28 -0
  77. package/dist/cjs/zk/witness.js +19 -0
  78. package/dist/esm/apps/contracts/index.js +7 -3
  79. package/dist/esm/apps/contracts/state-machines/contract-agreement.js +35 -40
  80. package/dist/esm/apps/contracts/state-machines/contract-escrow.js +80 -37
  81. package/dist/esm/apps/contracts/state-machines/contract-universal.js +4 -4
  82. package/dist/esm/apps/corporate/state-machines/corp-board.js +169 -59
  83. package/dist/esm/apps/corporate/state-machines/corp-entity.js +245 -47
  84. package/dist/esm/apps/corporate/state-machines/corp-securities.js +407 -99
  85. package/dist/esm/apps/corporate/state-machines/corp-shareholders.js +151 -37
  86. package/dist/esm/apps/governance/state-machines/dao-multisig.js +58 -40
  87. package/dist/esm/apps/governance/state-machines/dao-reputation.js +46 -40
  88. package/dist/esm/apps/governance/state-machines/dao-single.js +28 -11
  89. package/dist/esm/apps/governance/state-machines/dao-token.js +67 -41
  90. package/dist/esm/apps/governance/state-machines/governance-simple.js +93 -61
  91. package/dist/esm/apps/governance/state-machines/governance-universal.js +2 -2
  92. package/dist/esm/apps/identity/constants.js +51 -12
  93. package/dist/esm/apps/identity/index.js +12 -7
  94. package/dist/esm/apps/identity/state-machines/identity-agent.js +3 -3
  95. package/dist/esm/apps/identity/state-machines/identity-oracle.js +25 -22
  96. package/dist/esm/apps/identity/state-machines/identity-registry.js +285 -0
  97. package/dist/esm/apps/identity/state-machines/identity-universal.js +3 -3
  98. package/dist/esm/apps/identity/state-machines/index.js +1 -0
  99. package/dist/esm/apps/index.js +1 -0
  100. package/dist/esm/apps/lending/assets.js +207 -0
  101. package/dist/esm/apps/lending/credit-scoring.js +81 -0
  102. package/dist/esm/apps/lending/eligibility.js +115 -0
  103. package/dist/esm/apps/lending/index.js +69 -0
  104. package/dist/esm/apps/lending/state-machines/index.js +5 -0
  105. package/dist/esm/apps/lending/state-machines/lending-zk-loan.js +409 -0
  106. package/dist/esm/apps/markets/index.js +8 -4
  107. package/dist/esm/apps/markets/state-machines/market-auction.js +14 -13
  108. package/dist/esm/apps/markets/state-machines/market-crowdfund.js +29 -24
  109. package/dist/esm/apps/markets/state-machines/market-group-buy.js +24 -26
  110. package/dist/esm/apps/markets/state-machines/market-prediction.js +80 -53
  111. package/dist/esm/apps/markets/state-machines/market-universal.js +5 -5
  112. package/dist/esm/generated/index.js +9 -5
  113. package/dist/esm/generated/openapi.js +5 -0
  114. package/dist/esm/generated/ottochain/apps/contracts/v1/contract.js +46 -46
  115. package/dist/esm/generated/ottochain/apps/identity/v1/identity.js +114 -120
  116. package/dist/esm/generated/ottochain/apps/markets/v1/market.js +100 -100
  117. package/dist/esm/index.js +21 -2
  118. package/dist/esm/openapi.js +1 -0
  119. package/dist/esm/ottochain/genesis-manifest.js +9 -9
  120. package/dist/esm/ottochain/index.js +2 -3
  121. package/dist/esm/ottochain/metagraph-client.js +65 -8
  122. package/dist/esm/ottochain/snapshot.js +4 -4
  123. package/dist/esm/ottochain/transaction.js +43 -3
  124. package/dist/esm/ottochain/types.js +15 -1
  125. package/dist/esm/privacy/index.js +6 -0
  126. package/dist/esm/privacy/sealed-bid.js +206 -0
  127. package/dist/esm/privacy/shield-app.js +127 -0
  128. package/dist/esm/schema/effects.js +35 -0
  129. package/dist/esm/schema/fiber-app.js +13 -6
  130. package/dist/esm/schema/guard-lint.js +346 -0
  131. package/dist/esm/schema/guards.js +229 -0
  132. package/dist/esm/signing.js +74 -0
  133. package/dist/esm/verify.js +8 -2
  134. package/dist/esm/zk/commit.js +44 -0
  135. package/dist/esm/zk/guard.js +99 -0
  136. package/dist/esm/zk/index.js +19 -0
  137. package/dist/esm/zk/preimage.js +30 -0
  138. package/dist/esm/zk/prover.js +82 -0
  139. package/dist/esm/zk/registry.js +55 -0
  140. package/dist/esm/zk/types.js +25 -0
  141. package/dist/esm/zk/witness.js +15 -0
  142. package/dist/types/apps/contracts/index.d.ts +69 -209
  143. package/dist/types/apps/contracts/state-machines/contract-agreement.d.ts +20 -95
  144. package/dist/types/apps/contracts/state-machines/contract-escrow.d.ts +46 -112
  145. package/dist/types/apps/corporate/index.d.ts +1040 -304
  146. package/dist/types/apps/corporate/state-machines/corp-board.d.ts +188 -52
  147. package/dist/types/apps/corporate/state-machines/corp-entity.d.ts +267 -62
  148. package/dist/types/apps/corporate/state-machines/corp-securities.d.ts +355 -131
  149. package/dist/types/apps/corporate/state-machines/corp-shareholders.d.ts +225 -53
  150. package/dist/types/apps/governance/index.d.ts +296 -398
  151. package/dist/types/apps/governance/state-machines/dao-multisig.d.ts +77 -92
  152. package/dist/types/apps/governance/state-machines/dao-reputation.d.ts +42 -66
  153. package/dist/types/apps/governance/state-machines/dao-single.d.ts +25 -47
  154. package/dist/types/apps/governance/state-machines/dao-token.d.ts +60 -49
  155. package/dist/types/apps/governance/state-machines/governance-simple.d.ts +87 -117
  156. package/dist/types/apps/governance/state-machines/governance-universal.d.ts +2 -2
  157. package/dist/types/apps/identity/constants.d.ts +32 -4
  158. package/dist/types/apps/identity/index.d.ts +378 -94
  159. package/dist/types/apps/identity/state-machines/identity-oracle.d.ts +16 -87
  160. package/dist/types/apps/identity/state-machines/identity-registry.d.ts +379 -0
  161. package/dist/types/apps/identity/state-machines/index.d.ts +1 -0
  162. package/dist/types/apps/index.d.ts +1 -0
  163. package/dist/types/apps/lending/assets.d.ts +258 -0
  164. package/dist/types/apps/lending/credit-scoring.d.ts +80 -0
  165. package/dist/types/apps/lending/eligibility.d.ts +83 -0
  166. package/dist/types/apps/lending/index.d.ts +548 -0
  167. package/dist/types/apps/lending/state-machines/index.d.ts +5 -0
  168. package/dist/types/apps/lending/state-machines/lending-zk-loan.d.ts +528 -0
  169. package/dist/types/apps/markets/index.d.ts +108 -203
  170. package/dist/types/apps/markets/state-machines/market-auction.d.ts +13 -37
  171. package/dist/types/apps/markets/state-machines/market-crowdfund.d.ts +16 -34
  172. package/dist/types/apps/markets/state-machines/market-group-buy.d.ts +17 -43
  173. package/dist/types/apps/markets/state-machines/market-prediction.d.ts +51 -72
  174. package/dist/types/apps/markets/state-machines/market-universal.d.ts +5 -5
  175. package/dist/types/generated/index.d.ts +5 -5
  176. package/dist/types/generated/openapi.d.ts +1257 -0
  177. package/dist/types/generated/ottochain/apps/contracts/v1/contract.d.ts +5 -5
  178. package/dist/types/generated/ottochain/apps/identity/v1/identity.d.ts +12 -12
  179. package/dist/types/generated/ottochain/apps/markets/v1/market.d.ts +11 -11
  180. package/dist/types/index.d.ts +6 -2
  181. package/dist/types/openapi.d.ts +22 -0
  182. package/dist/types/ottochain/genesis-manifest.d.ts +5 -5
  183. package/dist/types/ottochain/index.d.ts +5 -6
  184. package/dist/types/ottochain/metagraph-client.d.ts +49 -7
  185. package/dist/types/ottochain/snapshot.d.ts +6 -6
  186. package/dist/types/ottochain/transaction.d.ts +33 -1
  187. package/dist/types/ottochain/types.d.ts +335 -30
  188. package/dist/types/privacy/index.d.ts +6 -0
  189. package/dist/types/privacy/sealed-bid.d.ts +348 -0
  190. package/dist/types/privacy/shield-app.d.ts +48 -0
  191. package/dist/types/schema/effects.d.ts +34 -0
  192. package/dist/types/schema/fiber-app.d.ts +1 -2
  193. package/dist/types/schema/guard-lint.d.ts +111 -0
  194. package/dist/types/schema/guards.d.ts +134 -0
  195. package/dist/types/signing.d.ts +45 -0
  196. package/dist/types/validation.d.ts +22 -217
  197. package/dist/types/verify.d.ts +4 -0
  198. package/dist/types/zk/commit.d.ts +28 -0
  199. package/dist/types/zk/guard.d.ts +46 -0
  200. package/dist/types/zk/index.d.ts +19 -0
  201. package/dist/types/zk/preimage.d.ts +10 -0
  202. package/dist/types/zk/prover.d.ts +34 -0
  203. package/dist/types/zk/registry.d.ts +34 -0
  204. package/dist/types/zk/types.d.ts +33 -0
  205. package/dist/types/zk/witness.d.ts +40 -0
  206. package/package.json +27 -13
  207. package/dist/cjs/ottochain/normalize.js +0 -186
  208. package/dist/esm/ottochain/normalize.js +0 -179
  209. package/dist/types/ottochain/normalize.d.ts +0 -79
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.daoTokenDef = 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
  * Token-weighted voting. Voting power proportional to token holdings.
7
8
  */
@@ -172,10 +173,18 @@ exports.daoTokenDef = (0, fiber_app_js_1.defineFiberApp)({
172
173
  from: "ACTIVE",
173
174
  to: "VOTING",
174
175
  eventName: "propose",
176
+ // S1/A2 coupled fix: a CHAIN-VERIFIED signer must hold >= proposalThreshold
177
+ // tokens. Iterate proofs[].address and read each balance via `get` (getKey is
178
+ // not a JLVM opcode); never trust the forgeable event.agent for the lookup.
175
179
  guard: {
176
- ">=": [
177
- { getKey: [{ var: "state.balances" }, { var: "event.agent" }] },
178
- { var: "state.proposalThreshold" },
180
+ some: [
181
+ { map: [{ var: "proofs" }, { var: "address" }] },
182
+ {
183
+ ">=": [
184
+ { get: [{ var: "state.balances" }, { var: "" }] },
185
+ { var: "state.proposalThreshold" },
186
+ ],
187
+ },
179
188
  ],
180
189
  },
181
190
  effect: {
@@ -189,9 +198,9 @@ exports.daoTokenDef = (0, fiber_app_js_1.defineFiberApp)({
189
198
  actionType: { var: "event.actionType" },
190
199
  payload: { var: "event.payload" },
191
200
  proposer: { var: "event.agent" },
192
- proposedAt: { var: "$timestamp" },
201
+ proposedAt: { var: "$ordinal" },
193
202
  votingEndsAt: {
194
- "+": [{ var: "$timestamp" }, { var: "state.votingPeriodMs" }],
203
+ "+": [{ var: "$ordinal" }, { var: "state.votingPeriodMs" }],
195
204
  },
196
205
  snapshotBlock: { var: "event.snapshotBlock" },
197
206
  },
@@ -206,26 +215,28 @@ exports.daoTokenDef = (0, fiber_app_js_1.defineFiberApp)({
206
215
  from: "VOTING",
207
216
  to: "VOTING",
208
217
  eventName: "vote",
218
+ // S1+A2 coupled fix: bind event.agent to a verified signer (actorIsSigner) so the
219
+ // balance lookup, the no-double-vote check, and the voters write below all key on the
220
+ // CHAIN-VERIFIED actor — never a forgeable claim. getKey→get (value), getKey→has
221
+ // (presence), setKey→set are the rc.5 map opcodes (getKey/setKey do not exist).
209
222
  guard: {
210
223
  and: [
224
+ (0, guards_js_1.actorIsSigner)(),
211
225
  {
212
226
  ">": [
213
- { getKey: [{ var: "state.balances" }, { var: "event.agent" }] },
227
+ { get: [{ var: "state.balances" }, { var: "event.agent" }] },
214
228
  0,
215
229
  ],
216
230
  },
217
231
  {
218
232
  "!": [
219
233
  {
220
- getKey: [{ var: "state.votes.voters" }, { var: "event.agent" }],
234
+ has: [{ var: "state.votes.voters" }, { var: "event.agent" }],
221
235
  },
222
236
  ],
223
237
  },
224
238
  {
225
- "<=": [
226
- { var: "$timestamp" },
227
- { var: "state.proposal.votingEndsAt" },
228
- ],
239
+ "<=": [{ var: "$ordinal" }, { var: "state.proposal.votingEndsAt" }],
229
240
  },
230
241
  ],
231
242
  },
@@ -244,7 +255,7 @@ exports.daoTokenDef = (0, fiber_app_js_1.defineFiberApp)({
244
255
  "+": [
245
256
  { var: "state.votes.for" },
246
257
  {
247
- getKey: [
258
+ get: [
248
259
  { var: "state.balances" },
249
260
  { var: "event.agent" },
250
261
  ],
@@ -258,7 +269,7 @@ exports.daoTokenDef = (0, fiber_app_js_1.defineFiberApp)({
258
269
  "+": [
259
270
  { var: "state.votes.against" },
260
271
  {
261
- getKey: [
272
+ get: [
262
273
  { var: "state.balances" },
263
274
  { var: "event.agent" },
264
275
  ],
@@ -271,7 +282,7 @@ exports.daoTokenDef = (0, fiber_app_js_1.defineFiberApp)({
271
282
  "+": [
272
283
  { var: "state.votes.abstain" },
273
284
  {
274
- getKey: [
285
+ get: [
275
286
  { var: "state.balances" },
276
287
  { var: "event.agent" },
277
288
  ],
@@ -283,18 +294,18 @@ exports.daoTokenDef = (0, fiber_app_js_1.defineFiberApp)({
283
294
  },
284
295
  {
285
296
  voters: {
286
- setKey: [
297
+ set: [
287
298
  { var: "state.votes.voters" },
288
299
  { var: "event.agent" },
289
300
  {
290
301
  vote: { var: "event.vote" },
291
302
  weight: {
292
- getKey: [
303
+ get: [
293
304
  { var: "state.balances" },
294
305
  { var: "event.agent" },
295
306
  ],
296
307
  },
297
- votedAt: { var: "$timestamp" },
308
+ votedAt: { var: "$ordinal" },
298
309
  },
299
310
  ],
300
311
  },
@@ -314,10 +325,7 @@ exports.daoTokenDef = (0, fiber_app_js_1.defineFiberApp)({
314
325
  guard: {
315
326
  and: [
316
327
  {
317
- ">": [
318
- { var: "$timestamp" },
319
- { var: "state.proposal.votingEndsAt" },
320
- ],
328
+ ">": [{ var: "$ordinal" }, { var: "state.proposal.votingEndsAt" }],
321
329
  },
322
330
  { ">": [{ var: "state.votes.for" }, { var: "state.votes.against" }] },
323
331
  {
@@ -342,9 +350,9 @@ exports.daoTokenDef = (0, fiber_app_js_1.defineFiberApp)({
342
350
  merge: [
343
351
  { var: "state.proposal" },
344
352
  {
345
- queuedAt: { var: "$timestamp" },
353
+ queuedAt: { var: "$ordinal" },
346
354
  executableAt: {
347
- "+": [{ var: "$timestamp" }, { var: "state.timelockMs" }],
355
+ "+": [{ var: "$ordinal" }, { var: "state.timelockMs" }],
348
356
  },
349
357
  },
350
358
  ],
@@ -360,7 +368,7 @@ exports.daoTokenDef = (0, fiber_app_js_1.defineFiberApp)({
360
368
  to: "ACTIVE",
361
369
  eventName: "execute",
362
370
  guard: {
363
- ">=": [{ var: "$timestamp" }, { var: "state.proposal.executableAt" }],
371
+ ">=": [{ var: "$ordinal" }, { var: "state.proposal.executableAt" }],
364
372
  },
365
373
  effect: {
366
374
  merge: [
@@ -375,7 +383,7 @@ exports.daoTokenDef = (0, fiber_app_js_1.defineFiberApp)({
375
383
  { var: "state.proposal" },
376
384
  {
377
385
  votes: { var: "state.votes" },
378
- executedAt: { var: "$timestamp" },
386
+ executedAt: { var: "$ordinal" },
379
387
  },
380
388
  ],
381
389
  },
@@ -384,10 +392,18 @@ exports.daoTokenDef = (0, fiber_app_js_1.defineFiberApp)({
384
392
  },
385
393
  proposal: null,
386
394
  votes: null,
395
+ // A3 fix: transition-level `emits` is dropped by the chain; emit from INSIDE the effect
396
+ // under the reserved `_emit` key (extracted as an EmittedEvent, stripped from state).
397
+ _emit: [
398
+ {
399
+ name: "proposal_executed",
400
+ data: { proposalId: { var: "state.proposal.id" } },
401
+ destination: "external",
402
+ },
403
+ ],
387
404
  },
388
405
  ],
389
406
  },
390
- emits: [{ event: "proposal_executed", to: "external" }],
391
407
  dependencies: [],
392
408
  },
393
409
  // VOTING → ACTIVE: reject (voting ended, failed quorum or for <= against)
@@ -398,10 +414,7 @@ exports.daoTokenDef = (0, fiber_app_js_1.defineFiberApp)({
398
414
  guard: {
399
415
  and: [
400
416
  {
401
- ">": [
402
- { var: "$timestamp" },
403
- { var: "state.proposal.votingEndsAt" },
404
- ],
417
+ ">": [{ var: "$ordinal" }, { var: "state.proposal.votingEndsAt" }],
405
418
  },
406
419
  {
407
420
  or: [
@@ -440,7 +453,7 @@ exports.daoTokenDef = (0, fiber_app_js_1.defineFiberApp)({
440
453
  { var: "state.proposal" },
441
454
  {
442
455
  votes: { var: "state.votes" },
443
- rejectedAt: { var: "$timestamp" },
456
+ rejectedAt: { var: "$ordinal" },
444
457
  },
445
458
  ],
446
459
  },
@@ -459,9 +472,7 @@ exports.daoTokenDef = (0, fiber_app_js_1.defineFiberApp)({
459
472
  from: "QUEUED",
460
473
  to: "ACTIVE",
461
474
  eventName: "cancel",
462
- guard: {
463
- "===": [{ var: "event.agent" }, { var: "state.proposal.proposer" }],
464
- },
475
+ guard: (0, guards_js_1.signerIsParty)("state.proposal.proposer"),
465
476
  effect: {
466
477
  merge: [
467
478
  { var: "state" },
@@ -473,7 +484,7 @@ exports.daoTokenDef = (0, fiber_app_js_1.defineFiberApp)({
473
484
  {
474
485
  merge: [
475
486
  { var: "state.proposal" },
476
- { cancelledAt: { var: "$timestamp" } },
487
+ { cancelledAt: { var: "$ordinal" } },
477
488
  ],
478
489
  },
479
490
  ],
@@ -491,10 +502,17 @@ exports.daoTokenDef = (0, fiber_app_js_1.defineFiberApp)({
491
502
  from: "ACTIVE",
492
503
  to: "ACTIVE",
493
504
  eventName: "delegate",
505
+ // S1+A2: bind event.agent to a verified signer so the delegation is written under the
506
+ // CHAIN-VERIFIED delegator's key (set), keyed on the same actor whose balance is checked (get).
494
507
  guard: {
495
- ">": [
496
- { getKey: [{ var: "state.balances" }, { var: "event.agent" }] },
497
- 0,
508
+ and: [
509
+ (0, guards_js_1.actorIsSigner)(),
510
+ {
511
+ ">": [
512
+ { get: [{ var: "state.balances" }, { var: "event.agent" }] },
513
+ 0,
514
+ ],
515
+ },
498
516
  ],
499
517
  },
500
518
  effect: {
@@ -502,7 +520,7 @@ exports.daoTokenDef = (0, fiber_app_js_1.defineFiberApp)({
502
520
  { var: "state" },
503
521
  {
504
522
  delegations: {
505
- setKey: [
523
+ set: [
506
524
  { var: "state.delegations" },
507
525
  { var: "event.agent" },
508
526
  { var: "event.delegateTo" },
@@ -518,13 +536,21 @@ exports.daoTokenDef = (0, fiber_app_js_1.defineFiberApp)({
518
536
  from: "ACTIVE",
519
537
  to: "ACTIVE",
520
538
  eventName: "undelegate",
521
- guard: { getKey: [{ var: "state.delegations" }, { var: "event.agent" }] },
539
+ // S1+A2: bind event.agent to a verified signer; presence via has, removal via unset (the rc.5
540
+ // map opcodes — getKey/deleteKey do not exist). Only the verified delegator can clear their own
541
+ // delegation.
542
+ guard: {
543
+ and: [
544
+ (0, guards_js_1.actorIsSigner)(),
545
+ { has: [{ var: "state.delegations" }, { var: "event.agent" }] },
546
+ ],
547
+ },
522
548
  effect: {
523
549
  merge: [
524
550
  { var: "state" },
525
551
  {
526
552
  delegations: {
527
- deleteKey: [{ var: "state.delegations" }, { var: "event.agent" }],
553
+ unset: [{ var: "state.delegations" }, { var: "event.agent" }],
528
554
  },
529
555
  },
530
556
  ],
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.govSimpleDef = 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
  * Simple org governance: manage members, update rules, resolve disputes.
7
8
  */
@@ -92,11 +93,8 @@ exports.govSimpleDef = (0, fiber_app_js_1.defineFiberApp)({
92
93
  },
93
94
  },
94
95
  finalize: {
95
- description: "Finalize the voting period",
96
- required: ["forCount"],
97
- properties: {
98
- forCount: { type: "number" },
99
- },
96
+ description: "Finalize the voting period (for-count derived from recorded ballots)",
97
+ properties: {},
100
98
  },
101
99
  file_dispute: {
102
100
  description: "File a dispute against a member",
@@ -125,11 +123,8 @@ exports.govSimpleDef = (0, fiber_app_js_1.defineFiberApp)({
125
123
  },
126
124
  },
127
125
  dissolve: {
128
- description: "Dissolve the organization (requires 90% approval)",
129
- required: ["approvalCount"],
130
- properties: {
131
- approvalCount: { type: "number" },
132
- },
126
+ description: "Dissolve the organization (requires every member to sign this op — verified unanimity)",
127
+ properties: {},
133
128
  },
134
129
  },
135
130
  states: {
@@ -177,16 +172,16 @@ exports.govSimpleDef = (0, fiber_app_js_1.defineFiberApp)({
177
172
  from: "ACTIVE",
178
173
  to: "ACTIVE",
179
174
  eventName: "add_member",
180
- guard: { in: [{ var: "event.agent" }, { var: "state.admins" }] },
175
+ guard: (0, guards_js_1.signerInSet)("state.admins"),
181
176
  effect: {
182
177
  merge: [
183
178
  { var: "state" },
184
179
  {
185
180
  members: {
186
- setKey: [
181
+ set: [
187
182
  { var: "state.members" },
188
183
  { var: "event.member" },
189
- { role: { var: "event.role" }, addedAt: { var: "$timestamp" } },
184
+ { role: { var: "event.role" }, addedAt: { var: "$ordinal" } },
190
185
  ],
191
186
  },
192
187
  },
@@ -199,13 +194,13 @@ exports.govSimpleDef = (0, fiber_app_js_1.defineFiberApp)({
199
194
  from: "ACTIVE",
200
195
  to: "ACTIVE",
201
196
  eventName: "remove_member",
202
- guard: { in: [{ var: "event.agent" }, { var: "state.admins" }] },
197
+ guard: (0, guards_js_1.signerInSet)("state.admins"),
203
198
  effect: {
204
199
  merge: [
205
200
  { var: "state" },
206
201
  {
207
202
  members: {
208
- deleteKey: [{ var: "state.members" }, { var: "event.member" }],
203
+ unset: [{ var: "state.members" }, { var: "event.member" }],
209
204
  },
210
205
  },
211
206
  ],
@@ -217,7 +212,9 @@ exports.govSimpleDef = (0, fiber_app_js_1.defineFiberApp)({
217
212
  from: "ACTIVE",
218
213
  to: "VOTING",
219
214
  eventName: "propose",
220
- guard: { getKey: [{ var: "state.members" }, { var: "event.agent" }] },
215
+ // S1/A2 coupled fix: a CHAIN-VERIFIED signer must be a member (getKey is not a
216
+ // JLVM opcode; signerHasEntry checks signer ∈ keys(state.members) via `has`).
217
+ guard: (0, guards_js_1.signerHasEntry)("state.members"),
221
218
  effect: {
222
219
  merge: [
223
220
  { var: "state" },
@@ -227,9 +224,9 @@ exports.govSimpleDef = (0, fiber_app_js_1.defineFiberApp)({
227
224
  type: { var: "event.type" },
228
225
  changes: { var: "event.changes" },
229
226
  proposer: { var: "event.agent" },
230
- proposedAt: { var: "$timestamp" },
227
+ proposedAt: { var: "$ordinal" },
231
228
  deadline: {
232
- "+": [{ var: "$timestamp" }, { var: "state.votingPeriodMs" }],
229
+ "+": [{ var: "$ordinal" }, { var: "state.votingPeriodMs" }],
233
230
  },
234
231
  },
235
232
  votes: {},
@@ -243,12 +240,14 @@ exports.govSimpleDef = (0, fiber_app_js_1.defineFiberApp)({
243
240
  from: "VOTING",
244
241
  to: "VOTING",
245
242
  eventName: "vote",
243
+ // S1/A2 coupled fix: bind event.agent to a verified signer who is a member (actorHasEntry),
244
+ // and block a re-vote by that SAME bound actor — so the ballot is recorded under, and deduped
245
+ // on, the chain-verified voter. Without the binding, signerHasEntry only proves SOME signer is a
246
+ // member, letting one member stuff votes under arbitrary keys (set is the rc.5 map-write opcode).
246
247
  guard: {
247
248
  and: [
248
- { getKey: [{ var: "state.members" }, { var: "event.agent" }] },
249
- {
250
- "!": [{ getKey: [{ var: "state.votes" }, { var: "event.agent" }] }],
251
- },
249
+ (0, guards_js_1.actorHasEntry)("state.members"),
250
+ { "!": [{ has: [{ var: "state.votes" }, { var: "event.agent" }] }] },
252
251
  ],
253
252
  },
254
253
  effect: {
@@ -256,10 +255,10 @@ exports.govSimpleDef = (0, fiber_app_js_1.defineFiberApp)({
256
255
  { var: "state" },
257
256
  {
258
257
  votes: {
259
- setKey: [
258
+ set: [
260
259
  { var: "state.votes" },
261
260
  { var: "event.agent" },
262
- { vote: { var: "event.vote" }, votedAt: { var: "$timestamp" } },
261
+ { vote: { var: "event.vote" }, votedAt: { var: "$ordinal" } },
263
262
  ],
264
263
  },
265
264
  },
@@ -272,12 +271,24 @@ exports.govSimpleDef = (0, fiber_app_js_1.defineFiberApp)({
272
271
  from: "VOTING",
273
272
  to: "ACTIVE",
274
273
  eventName: "finalize",
274
+ // S2/A2 coupled fix: the for-count is DERIVED from recorded ballots in
275
+ // state.votes (length of the "for" entries), never read from the attacker's
276
+ // event.forCount. members is a Map so its count is length(keys(members)).
275
277
  guard: {
276
278
  ">=": [
277
- { var: "event.forCount" },
279
+ {
280
+ length: [
281
+ {
282
+ filter: [
283
+ { values: [{ var: "state.votes" }] },
284
+ { "===": [{ var: "vote" }, "for"] },
285
+ ],
286
+ },
287
+ ],
288
+ },
278
289
  {
279
290
  "*": [
280
- { size: { var: "state.members" } },
291
+ { length: [{ keys: [{ var: "state.members" }] }] },
281
292
  { var: "state.passingThreshold" },
282
293
  ],
283
294
  },
@@ -301,7 +312,7 @@ exports.govSimpleDef = (0, fiber_app_js_1.defineFiberApp)({
301
312
  type: "rule_change",
302
313
  proposal: { var: "state.proposal" },
303
314
  outcome: "passed",
304
- finalizedAt: { var: "$timestamp" },
315
+ finalizedAt: { var: "$ordinal" },
305
316
  },
306
317
  ],
307
318
  ],
@@ -318,12 +329,23 @@ exports.govSimpleDef = (0, fiber_app_js_1.defineFiberApp)({
318
329
  from: "VOTING",
319
330
  to: "ACTIVE",
320
331
  eventName: "finalize",
332
+ // S2/A2 coupled fix (failed arm): derive the for-count from recorded ballots in
333
+ // state.votes; never from event.forCount. members count = length(keys(members)).
321
334
  guard: {
322
335
  "<": [
323
- { var: "event.forCount" },
336
+ {
337
+ length: [
338
+ {
339
+ filter: [
340
+ { values: [{ var: "state.votes" }] },
341
+ { "===": [{ var: "vote" }, "for"] },
342
+ ],
343
+ },
344
+ ],
345
+ },
324
346
  {
325
347
  "*": [
326
- { size: { var: "state.members" } },
348
+ { length: [{ keys: [{ var: "state.members" }] }] },
327
349
  { var: "state.passingThreshold" },
328
350
  ],
329
351
  },
@@ -341,7 +363,7 @@ exports.govSimpleDef = (0, fiber_app_js_1.defineFiberApp)({
341
363
  type: "rule_change",
342
364
  proposal: { var: "state.proposal" },
343
365
  outcome: "failed",
344
- finalizedAt: { var: "$timestamp" },
366
+ finalizedAt: { var: "$ordinal" },
345
367
  },
346
368
  ],
347
369
  ],
@@ -358,7 +380,9 @@ exports.govSimpleDef = (0, fiber_app_js_1.defineFiberApp)({
358
380
  from: "ACTIVE",
359
381
  to: "DISPUTE",
360
382
  eventName: "file_dispute",
361
- guard: { getKey: [{ var: "state.members" }, { var: "event.agent" }] },
383
+ // S1/A2 coupled fix: only a CHAIN-VERIFIED member may file (getKey is not a JLVM
384
+ // opcode; signerHasEntry checks signer ∈ keys(state.members) via `has`).
385
+ guard: (0, guards_js_1.signerHasEntry)("state.members"),
362
386
  effect: {
363
387
  merge: [
364
388
  { var: "state" },
@@ -368,7 +392,7 @@ exports.govSimpleDef = (0, fiber_app_js_1.defineFiberApp)({
368
392
  plaintiff: { var: "event.agent" },
369
393
  defendant: { var: "event.defendant" },
370
394
  claim: { var: "event.claim" },
371
- filedAt: { var: "$timestamp" },
395
+ filedAt: { var: "$ordinal" },
372
396
  evidence: [],
373
397
  },
374
398
  votes: {},
@@ -382,16 +406,10 @@ exports.govSimpleDef = (0, fiber_app_js_1.defineFiberApp)({
382
406
  from: "DISPUTE",
383
407
  to: "DISPUTE",
384
408
  eventName: "submit_evidence",
385
- guard: {
386
- or: [
387
- {
388
- "===": [{ var: "event.agent" }, { var: "state.dispute.plaintiff" }],
389
- },
390
- {
391
- "===": [{ var: "event.agent" }, { var: "state.dispute.defendant" }],
392
- },
393
- ],
394
- },
409
+ guard: (0, guards_js_1.signerIsAnyParty)([
410
+ "state.dispute.plaintiff",
411
+ "state.dispute.defendant",
412
+ ]),
395
413
  effect: {
396
414
  merge: [
397
415
  { var: "state" },
@@ -407,7 +425,7 @@ exports.govSimpleDef = (0, fiber_app_js_1.defineFiberApp)({
407
425
  {
408
426
  from: { var: "event.agent" },
409
427
  content: { var: "event.content" },
410
- at: { var: "$timestamp" },
428
+ at: { var: "$ordinal" },
411
429
  },
412
430
  ],
413
431
  ],
@@ -425,18 +443,16 @@ exports.govSimpleDef = (0, fiber_app_js_1.defineFiberApp)({
425
443
  from: "DISPUTE",
426
444
  to: "DISPUTE",
427
445
  eventName: "vote",
446
+ // S1/A2 coupled fix: bind event.agent to a verified member (actorHasEntry), exclude the parties,
447
+ // and block a re-vote by that SAME bound actor — so the dispute ballot is recorded under, and
448
+ // deduped on, the chain-verified voter (set is the rc.5 map-write opcode; signerIsNotParty still
449
+ // excludes any signer who is a party, which covers the bound actor).
428
450
  guard: {
429
451
  and: [
430
- { getKey: [{ var: "state.members" }, { var: "event.agent" }] },
431
- {
432
- "!==": [{ var: "event.agent" }, { var: "state.dispute.plaintiff" }],
433
- },
434
- {
435
- "!==": [{ var: "event.agent" }, { var: "state.dispute.defendant" }],
436
- },
437
- {
438
- "!": [{ getKey: [{ var: "state.votes" }, { var: "event.agent" }] }],
439
- },
452
+ (0, guards_js_1.actorHasEntry)("state.members"),
453
+ (0, guards_js_1.signerIsNotParty)("state.dispute.plaintiff"),
454
+ (0, guards_js_1.signerIsNotParty)("state.dispute.defendant"),
455
+ { "!": [{ has: [{ var: "state.votes" }, { var: "event.agent" }] }] },
440
456
  ],
441
457
  },
442
458
  effect: {
@@ -444,12 +460,12 @@ exports.govSimpleDef = (0, fiber_app_js_1.defineFiberApp)({
444
460
  { var: "state" },
445
461
  {
446
462
  votes: {
447
- setKey: [
463
+ set: [
448
464
  { var: "state.votes" },
449
465
  { var: "event.agent" },
450
466
  {
451
467
  ruling: { var: "event.ruling" },
452
- votedAt: { var: "$timestamp" },
468
+ votedAt: { var: "$ordinal" },
453
469
  },
454
470
  ],
455
471
  },
@@ -463,9 +479,11 @@ exports.govSimpleDef = (0, fiber_app_js_1.defineFiberApp)({
463
479
  from: "DISPUTE",
464
480
  to: "ACTIVE",
465
481
  eventName: "resolve",
482
+ // A2 fix: count recorded ballots. votes is a Map, and `length` rejects Maps, so
483
+ // count its keys: length(keys(state.votes)). (size is not a JLVM opcode.)
466
484
  guard: {
467
485
  ">=": [
468
- { size: { var: "state.votes" } },
486
+ { length: [{ keys: [{ var: "state.votes" }] }] },
469
487
  { var: "state.disputeQuorum" },
470
488
  ],
471
489
  },
@@ -482,7 +500,7 @@ exports.govSimpleDef = (0, fiber_app_js_1.defineFiberApp)({
482
500
  dispute: { var: "state.dispute" },
483
501
  ruling: { var: "event.ruling" },
484
502
  remedy: { var: "event.remedy" },
485
- resolvedAt: { var: "$timestamp" },
503
+ resolvedAt: { var: "$ordinal" },
486
504
  },
487
505
  ],
488
506
  ],
@@ -499,14 +517,28 @@ exports.govSimpleDef = (0, fiber_app_js_1.defineFiberApp)({
499
517
  from: "ACTIVE",
500
518
  to: "DISSOLVED",
501
519
  eventName: "dissolve",
520
+ // S2/A2 coupled fix: dissolution must not trust an attacker-supplied
521
+ // approvalCount. Derive consent from the CHAIN-VERIFIED signers — every member
522
+ // (a key in state.members) must be among proofs[].address, with a non-empty
523
+ // belt. members is a Map, so iterate keys(members); size is not a JLVM opcode.
502
524
  guard: {
503
- ">=": [
504
- { var: "event.approvalCount" },
505
- { "*": [{ size: { var: "state.members" } }, 0.9] },
525
+ and: [
526
+ { ">": [{ length: [{ keys: [{ var: "state.members" }] }] }, 0] },
527
+ {
528
+ all: [
529
+ { keys: [{ var: "state.members" }] },
530
+ {
531
+ in: [
532
+ { var: "" },
533
+ { map: [{ var: "proofs" }, { var: "address" }] },
534
+ ],
535
+ },
536
+ ],
537
+ },
506
538
  ],
507
539
  },
508
540
  effect: {
509
- merge: [{ var: "state" }, { dissolvedAt: { var: "$timestamp" } }],
541
+ merge: [{ var: "state" }, { dissolvedAt: { var: "$ordinal" } }],
510
542
  },
511
543
  dependencies: [],
512
544
  },
@@ -93,7 +93,7 @@ exports.govUniversalDef = (0, fiber_app_js_1.defineFiberApp)({
93
93
  {
94
94
  status: "VOTING",
95
95
  proposal: { var: "event.proposal" },
96
- proposedAt: { var: "$timestamp" },
96
+ proposedAt: { var: "$ordinal" },
97
97
  votes: {},
98
98
  },
99
99
  ],
@@ -152,7 +152,7 @@ exports.govUniversalDef = (0, fiber_app_js_1.defineFiberApp)({
152
152
  { var: "state" },
153
153
  {
154
154
  status: "DISSOLVED",
155
- dissolvedAt: { var: "$timestamp" },
155
+ dissolvedAt: { var: "$ordinal" },
156
156
  },
157
157
  ],
158
158
  },