@ottochain/sdk 2.3.0 → 2.5.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 (287) hide show
  1. package/dist/cjs/apps/compute/index.js +33 -0
  2. package/dist/cjs/apps/compute/state-machines/compute-rule110.js +164 -0
  3. package/dist/cjs/apps/compute/state-machines/index.js +9 -0
  4. package/dist/cjs/apps/contracts/index.js +16 -9
  5. package/dist/cjs/apps/contracts/state-machines/contract-agreement.js +134 -161
  6. package/dist/cjs/apps/contracts/state-machines/contract-escrow.js +192 -170
  7. package/dist/cjs/apps/contracts/state-machines/contract-universal.js +46 -58
  8. package/dist/cjs/apps/corporate/index.js +2 -2
  9. package/dist/cjs/apps/corporate/state-machines/corp-board.js +500 -456
  10. package/dist/cjs/apps/corporate/state-machines/corp-entity.js +487 -361
  11. package/dist/cjs/apps/corporate/state-machines/corp-securities.js +769 -576
  12. package/dist/cjs/apps/corporate/state-machines/corp-shareholders.js +567 -557
  13. package/dist/cjs/apps/governance/index.js +21 -21
  14. package/dist/cjs/apps/governance/state-machines/dao-multisig.js +188 -209
  15. package/dist/cjs/apps/governance/state-machines/dao-reputation.js +181 -228
  16. package/dist/cjs/apps/governance/state-machines/dao-single.js +105 -88
  17. package/dist/cjs/apps/governance/state-machines/dao-token.js +199 -227
  18. package/dist/cjs/apps/governance/state-machines/governance-simple.js +231 -231
  19. package/dist/cjs/apps/governance/state-machines/governance-universal.js +64 -64
  20. package/dist/cjs/apps/identity/constants.js +55 -22
  21. package/dist/cjs/apps/identity/index.js +28 -12
  22. package/dist/cjs/apps/identity/state-machines/identity-agent.js +124 -158
  23. package/dist/cjs/apps/identity/state-machines/identity-oracle.js +158 -173
  24. package/dist/cjs/apps/identity/state-machines/identity-registry.js +262 -0
  25. package/dist/cjs/apps/identity/state-machines/identity-universal.js +51 -57
  26. package/dist/cjs/apps/identity/state-machines/index.js +3 -1
  27. package/dist/cjs/apps/index.js +22 -8
  28. package/dist/cjs/apps/lending/assets.js +247 -0
  29. package/dist/cjs/apps/lending/credit-scoring.js +87 -0
  30. package/dist/cjs/apps/lending/eligibility.js +105 -0
  31. package/dist/cjs/apps/lending/index.js +91 -0
  32. package/dist/cjs/apps/lending/state-machines/index.js +9 -0
  33. package/dist/cjs/apps/lending/state-machines/lending-zk-loan.js +433 -0
  34. package/dist/cjs/apps/markets/index.js +22 -12
  35. package/dist/cjs/apps/markets/state-machines/market-auction.js +116 -134
  36. package/dist/cjs/apps/markets/state-machines/market-crowdfund.js +131 -141
  37. package/dist/cjs/apps/markets/state-machines/market-group-buy.js +163 -184
  38. package/dist/cjs/apps/markets/state-machines/market-prediction.js +226 -233
  39. package/dist/cjs/apps/markets/state-machines/market-universal.js +65 -80
  40. package/dist/cjs/apps/oracles/index.js +3 -3
  41. package/dist/cjs/apps/privacy/index.js +67 -0
  42. package/dist/cjs/apps/privacy/state-machines/index.js +17 -0
  43. package/dist/cjs/apps/privacy/state-machines/mixer-ddhRing.js +286 -0
  44. package/dist/cjs/apps/privacy/state-machines/note-pool.js +476 -0
  45. package/dist/cjs/apps/staked-pool/assets.js +103 -0
  46. package/dist/cjs/apps/staked-pool/base.js +498 -0
  47. package/dist/cjs/apps/staked-pool/consumer.js +55 -0
  48. package/dist/cjs/apps/staked-pool/index.js +83 -0
  49. package/dist/cjs/apps/staked-pool/state-machines/index.js +12 -0
  50. package/dist/cjs/apps/staked-pool/state-machines/staked-pool-base.js +49 -0
  51. package/dist/cjs/apps/staked-pool/state-machines/staked-pool-oracle.js +131 -0
  52. package/dist/cjs/errors.js +3 -3
  53. package/dist/cjs/generated/google/protobuf/struct.js +5 -5
  54. package/dist/cjs/generated/google/protobuf/timestamp.js +1 -1
  55. package/dist/cjs/generated/index.js +11 -7
  56. package/dist/cjs/generated/openapi.js +6 -0
  57. package/dist/cjs/generated/ottochain/apps/contracts/v1/contract.js +51 -51
  58. package/dist/cjs/generated/ottochain/apps/corporate/v1/corporate.js +20 -21
  59. package/dist/cjs/generated/ottochain/apps/governance/v1/governance.js +14 -14
  60. package/dist/cjs/generated/ottochain/apps/identity/v1/attestation.js +5 -5
  61. package/dist/cjs/generated/ottochain/apps/identity/v1/identity.js +125 -131
  62. package/dist/cjs/generated/ottochain/apps/markets/v1/market.js +108 -108
  63. package/dist/cjs/generated/ottochain/v1/common.js +5 -5
  64. package/dist/cjs/generated/ottochain/v1/fiber.js +44 -6
  65. package/dist/cjs/generated/ottochain/v1/messages.js +1 -1
  66. package/dist/cjs/generated/ottochain/v1/records.js +1 -1
  67. package/dist/cjs/index.js +58 -7
  68. package/dist/cjs/openapi.js +2 -0
  69. package/dist/cjs/ottochain/drop-nulls.js +1 -2
  70. package/dist/cjs/ottochain/genesis-manifest.js +17 -11
  71. package/dist/cjs/ottochain/index.js +23 -13
  72. package/dist/cjs/ottochain/metagraph-client.js +81 -16
  73. package/dist/cjs/ottochain/snapshot.js +13 -16
  74. package/dist/cjs/ottochain/transaction.js +67 -14
  75. package/dist/cjs/ottochain/types.js +16 -2
  76. package/dist/cjs/privacy/index.js +14 -0
  77. package/dist/cjs/privacy/sealed-bid.js +213 -0
  78. package/dist/cjs/privacy/shield-app.js +131 -0
  79. package/dist/cjs/schema/effects.js +156 -0
  80. package/dist/cjs/schema/fiber-app.js +150 -15
  81. package/dist/cjs/schema/guard-lint.js +343 -0
  82. package/dist/cjs/schema/guards.js +246 -0
  83. package/dist/cjs/signing.js +80 -0
  84. package/dist/cjs/templates/asset-policy.js +190 -0
  85. package/dist/cjs/templates/index.js +86 -0
  86. package/dist/cjs/templates/machine.js +130 -0
  87. package/dist/cjs/templates/migration.js +39 -0
  88. package/dist/cjs/templates/state-shape.js +38 -0
  89. package/dist/cjs/types.js +2 -3
  90. package/dist/cjs/validation.js +9 -11
  91. package/dist/cjs/verify.js +9 -4
  92. package/dist/cjs/zk/commit.js +53 -0
  93. package/dist/cjs/zk/guard.js +107 -0
  94. package/dist/cjs/zk/index.js +48 -0
  95. package/dist/cjs/zk/preimage.js +37 -0
  96. package/dist/cjs/zk/prover.js +87 -0
  97. package/dist/cjs/zk/registry.js +62 -0
  98. package/dist/cjs/zk/types.js +28 -0
  99. package/dist/cjs/zk/witness.js +19 -0
  100. package/dist/esm/apps/compute/index.js +29 -0
  101. package/dist/esm/apps/compute/state-machines/compute-rule110.js +161 -0
  102. package/dist/esm/apps/compute/state-machines/index.js +5 -0
  103. package/dist/esm/apps/contracts/index.js +9 -5
  104. package/dist/esm/apps/contracts/state-machines/contract-agreement.js +135 -162
  105. package/dist/esm/apps/contracts/state-machines/contract-escrow.js +193 -171
  106. package/dist/esm/apps/contracts/state-machines/contract-universal.js +47 -59
  107. package/dist/esm/apps/corporate/index.js +2 -2
  108. package/dist/esm/apps/corporate/state-machines/corp-board.js +501 -457
  109. package/dist/esm/apps/corporate/state-machines/corp-entity.js +488 -362
  110. package/dist/esm/apps/corporate/state-machines/corp-securities.js +770 -577
  111. package/dist/esm/apps/corporate/state-machines/corp-shareholders.js +568 -558
  112. package/dist/esm/apps/governance/index.js +10 -10
  113. package/dist/esm/apps/governance/state-machines/dao-multisig.js +189 -210
  114. package/dist/esm/apps/governance/state-machines/dao-reputation.js +182 -229
  115. package/dist/esm/apps/governance/state-machines/dao-single.js +106 -89
  116. package/dist/esm/apps/governance/state-machines/dao-token.js +200 -228
  117. package/dist/esm/apps/governance/state-machines/governance-simple.js +232 -232
  118. package/dist/esm/apps/governance/state-machines/governance-universal.js +65 -65
  119. package/dist/esm/apps/identity/constants.js +52 -21
  120. package/dist/esm/apps/identity/index.js +14 -9
  121. package/dist/esm/apps/identity/state-machines/identity-agent.js +125 -159
  122. package/dist/esm/apps/identity/state-machines/identity-oracle.js +159 -174
  123. package/dist/esm/apps/identity/state-machines/identity-registry.js +259 -0
  124. package/dist/esm/apps/identity/state-machines/identity-universal.js +52 -58
  125. package/dist/esm/apps/identity/state-machines/index.js +1 -0
  126. package/dist/esm/apps/index.js +9 -5
  127. package/dist/esm/apps/lending/assets.js +231 -0
  128. package/dist/esm/apps/lending/credit-scoring.js +81 -0
  129. package/dist/esm/apps/lending/eligibility.js +99 -0
  130. package/dist/esm/apps/lending/index.js +69 -0
  131. package/dist/esm/apps/lending/state-machines/index.js +5 -0
  132. package/dist/esm/apps/lending/state-machines/lending-zk-loan.js +430 -0
  133. package/dist/esm/apps/markets/index.js +11 -7
  134. package/dist/esm/apps/markets/state-machines/market-auction.js +117 -135
  135. package/dist/esm/apps/markets/state-machines/market-crowdfund.js +132 -142
  136. package/dist/esm/apps/markets/state-machines/market-group-buy.js +164 -185
  137. package/dist/esm/apps/markets/state-machines/market-prediction.js +227 -234
  138. package/dist/esm/apps/markets/state-machines/market-universal.js +66 -81
  139. package/dist/esm/apps/oracles/index.js +3 -3
  140. package/dist/esm/apps/privacy/index.js +56 -0
  141. package/dist/esm/apps/privacy/state-machines/index.js +6 -0
  142. package/dist/esm/apps/privacy/state-machines/mixer-ddhRing.js +282 -0
  143. package/dist/esm/apps/privacy/state-machines/note-pool.js +470 -0
  144. package/dist/esm/apps/staked-pool/assets.js +91 -0
  145. package/dist/esm/apps/staked-pool/base.js +493 -0
  146. package/dist/esm/apps/staked-pool/consumer.js +49 -0
  147. package/dist/esm/apps/staked-pool/index.js +60 -0
  148. package/dist/esm/apps/staked-pool/state-machines/index.js +6 -0
  149. package/dist/esm/apps/staked-pool/state-machines/staked-pool-base.js +46 -0
  150. package/dist/esm/apps/staked-pool/state-machines/staked-pool-oracle.js +127 -0
  151. package/dist/esm/generated/google/protobuf/struct.js +1 -1
  152. package/dist/esm/generated/google/protobuf/timestamp.js +1 -1
  153. package/dist/esm/generated/index.js +9 -5
  154. package/dist/esm/generated/openapi.js +5 -0
  155. package/dist/esm/generated/ottochain/apps/contracts/v1/contract.js +47 -47
  156. package/dist/esm/generated/ottochain/apps/corporate/v1/corporate.js +1 -1
  157. package/dist/esm/generated/ottochain/apps/governance/v1/governance.js +1 -1
  158. package/dist/esm/generated/ottochain/apps/identity/v1/attestation.js +1 -1
  159. package/dist/esm/generated/ottochain/apps/identity/v1/identity.js +115 -121
  160. package/dist/esm/generated/ottochain/apps/markets/v1/market.js +101 -101
  161. package/dist/esm/generated/ottochain/v1/common.js +1 -1
  162. package/dist/esm/generated/ottochain/v1/fiber.js +40 -2
  163. package/dist/esm/generated/ottochain/v1/messages.js +1 -1
  164. package/dist/esm/generated/ottochain/v1/records.js +1 -1
  165. package/dist/esm/index.js +28 -3
  166. package/dist/esm/openapi.js +1 -0
  167. package/dist/esm/ottochain/genesis-manifest.js +15 -9
  168. package/dist/esm/ottochain/index.js +2 -3
  169. package/dist/esm/ottochain/metagraph-client.js +81 -16
  170. package/dist/esm/ottochain/snapshot.js +6 -8
  171. package/dist/esm/ottochain/transaction.js +51 -3
  172. package/dist/esm/ottochain/types.js +15 -1
  173. package/dist/esm/privacy/index.js +6 -0
  174. package/dist/esm/privacy/sealed-bid.js +209 -0
  175. package/dist/esm/privacy/shield-app.js +127 -0
  176. package/dist/esm/schema/effects.js +145 -0
  177. package/dist/esm/schema/fiber-app.js +139 -8
  178. package/dist/esm/schema/guard-lint.js +337 -0
  179. package/dist/esm/schema/guards.js +228 -0
  180. package/dist/esm/signing.js +74 -0
  181. package/dist/esm/templates/asset-policy.js +182 -0
  182. package/dist/esm/templates/index.js +41 -0
  183. package/dist/esm/templates/machine.js +125 -0
  184. package/dist/esm/templates/migration.js +34 -0
  185. package/dist/esm/templates/state-shape.js +34 -0
  186. package/dist/esm/validation.js +1 -3
  187. package/dist/esm/verify.js +8 -2
  188. package/dist/esm/zk/commit.js +44 -0
  189. package/dist/esm/zk/guard.js +99 -0
  190. package/dist/esm/zk/index.js +19 -0
  191. package/dist/esm/zk/preimage.js +30 -0
  192. package/dist/esm/zk/prover.js +82 -0
  193. package/dist/esm/zk/registry.js +55 -0
  194. package/dist/esm/zk/types.js +25 -0
  195. package/dist/esm/zk/witness.js +15 -0
  196. package/dist/types/apps/compute/index.d.ts +176 -0
  197. package/dist/types/apps/compute/state-machines/compute-rule110.d.ts +157 -0
  198. package/dist/types/apps/compute/state-machines/index.d.ts +5 -0
  199. package/dist/types/apps/contracts/index.d.ts +81 -221
  200. package/dist/types/apps/contracts/state-machines/contract-agreement.d.ts +23 -98
  201. package/dist/types/apps/contracts/state-machines/contract-escrow.d.ts +49 -115
  202. package/dist/types/apps/contracts/state-machines/contract-universal.d.ts +4 -4
  203. package/dist/types/apps/corporate/index.d.ts +1176 -440
  204. package/dist/types/apps/corporate/state-machines/corp-board.d.ts +271 -135
  205. package/dist/types/apps/corporate/state-machines/corp-entity.d.ts +279 -74
  206. package/dist/types/apps/corporate/state-machines/corp-securities.d.ts +373 -149
  207. package/dist/types/apps/corporate/state-machines/corp-shareholders.d.ts +252 -80
  208. package/dist/types/apps/governance/index.d.ts +368 -470
  209. package/dist/types/apps/governance/state-machines/dao-multisig.d.ts +92 -107
  210. package/dist/types/apps/governance/state-machines/dao-reputation.d.ts +61 -85
  211. package/dist/types/apps/governance/state-machines/dao-single.d.ts +25 -47
  212. package/dist/types/apps/governance/state-machines/dao-token.d.ts +79 -68
  213. package/dist/types/apps/governance/state-machines/governance-simple.d.ts +95 -125
  214. package/dist/types/apps/governance/state-machines/governance-universal.d.ts +6 -6
  215. package/dist/types/apps/identity/constants.d.ts +33 -5
  216. package/dist/types/apps/identity/index.d.ts +415 -131
  217. package/dist/types/apps/identity/state-machines/identity-agent.d.ts +23 -23
  218. package/dist/types/apps/identity/state-machines/identity-oracle.d.ts +27 -98
  219. package/dist/types/apps/identity/state-machines/identity-registry.d.ts +379 -0
  220. package/dist/types/apps/identity/state-machines/identity-universal.d.ts +4 -4
  221. package/dist/types/apps/identity/state-machines/index.d.ts +1 -0
  222. package/dist/types/apps/index.d.ts +9 -5
  223. package/dist/types/apps/lending/assets.d.ts +258 -0
  224. package/dist/types/apps/lending/credit-scoring.d.ts +80 -0
  225. package/dist/types/apps/lending/eligibility.d.ts +83 -0
  226. package/dist/types/apps/lending/index.d.ts +556 -0
  227. package/dist/types/apps/lending/state-machines/index.d.ts +5 -0
  228. package/dist/types/apps/lending/state-machines/lending-zk-loan.d.ts +536 -0
  229. package/dist/types/apps/markets/index.d.ts +181 -276
  230. package/dist/types/apps/markets/state-machines/market-auction.d.ts +25 -49
  231. package/dist/types/apps/markets/state-machines/market-crowdfund.d.ts +35 -53
  232. package/dist/types/apps/markets/state-machines/market-group-buy.d.ts +35 -61
  233. package/dist/types/apps/markets/state-machines/market-prediction.d.ts +65 -86
  234. package/dist/types/apps/markets/state-machines/market-universal.d.ts +12 -12
  235. package/dist/types/apps/oracles/index.d.ts +1 -1
  236. package/dist/types/apps/privacy/index.d.ts +328 -0
  237. package/dist/types/apps/privacy/state-machines/index.d.ts +6 -0
  238. package/dist/types/apps/privacy/state-machines/mixer-ddhRing.d.ts +337 -0
  239. package/dist/types/apps/privacy/state-machines/note-pool.d.ts +196 -0
  240. package/dist/types/apps/staked-pool/assets.d.ts +53 -0
  241. package/dist/types/apps/staked-pool/base.d.ts +80 -0
  242. package/dist/types/apps/staked-pool/consumer.d.ts +29 -0
  243. package/dist/types/apps/staked-pool/index.d.ts +51 -0
  244. package/dist/types/apps/staked-pool/state-machines/index.d.ts +6 -0
  245. package/dist/types/apps/staked-pool/state-machines/staked-pool-base.d.ts +8 -0
  246. package/dist/types/apps/staked-pool/state-machines/staked-pool-oracle.d.ts +34 -0
  247. package/dist/types/generated/index.d.ts +5 -5
  248. package/dist/types/generated/openapi.d.ts +1270 -0
  249. package/dist/types/generated/ottochain/apps/contracts/v1/contract.d.ts +5 -5
  250. package/dist/types/generated/ottochain/apps/identity/v1/identity.d.ts +12 -12
  251. package/dist/types/generated/ottochain/apps/markets/v1/market.d.ts +11 -11
  252. package/dist/types/generated/ottochain/v1/fiber.d.ts +7 -0
  253. package/dist/types/index.d.ts +7 -3
  254. package/dist/types/openapi.d.ts +24 -0
  255. package/dist/types/ottochain/genesis-manifest.d.ts +11 -5
  256. package/dist/types/ottochain/index.d.ts +5 -6
  257. package/dist/types/ottochain/metagraph-client.d.ts +49 -7
  258. package/dist/types/ottochain/snapshot.d.ts +6 -6
  259. package/dist/types/ottochain/transaction.d.ts +41 -1
  260. package/dist/types/ottochain/types.d.ts +336 -31
  261. package/dist/types/privacy/index.d.ts +6 -0
  262. package/dist/types/privacy/sealed-bid.d.ts +348 -0
  263. package/dist/types/privacy/shield-app.d.ts +48 -0
  264. package/dist/types/schema/effects.d.ts +141 -0
  265. package/dist/types/schema/fiber-app.d.ts +282 -2
  266. package/dist/types/schema/guard-lint.d.ts +111 -0
  267. package/dist/types/schema/guards.d.ts +146 -0
  268. package/dist/types/signing.d.ts +45 -0
  269. package/dist/types/templates/asset-policy.d.ts +119 -0
  270. package/dist/types/templates/index.d.ts +26 -0
  271. package/dist/types/templates/machine.d.ts +139 -0
  272. package/dist/types/templates/migration.d.ts +34 -0
  273. package/dist/types/templates/state-shape.d.ts +30 -0
  274. package/dist/types/validation.d.ts +22 -217
  275. package/dist/types/verify.d.ts +4 -0
  276. package/dist/types/zk/commit.d.ts +28 -0
  277. package/dist/types/zk/guard.d.ts +46 -0
  278. package/dist/types/zk/index.d.ts +19 -0
  279. package/dist/types/zk/preimage.d.ts +10 -0
  280. package/dist/types/zk/prover.d.ts +34 -0
  281. package/dist/types/zk/registry.d.ts +34 -0
  282. package/dist/types/zk/types.d.ts +33 -0
  283. package/dist/types/zk/witness.d.ts +40 -0
  284. package/package.json +47 -15
  285. package/dist/cjs/ottochain/normalize.js +0 -186
  286. package/dist/esm/ottochain/normalize.js +0 -179
  287. package/dist/types/ottochain/normalize.d.ts +0 -79
@@ -1,174 +1,173 @@
1
- import { defineFiberApp } from "../../../schema/fiber-app.js";
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
  */
5
6
  export const daoMultisigDef = defineFiberApp({
6
7
  metadata: {
7
- name: "MultisigDAO",
8
- app: "governance",
9
- type: "daoMultisig",
10
- version: "1.0.0",
11
- description: "N-of-M multisig governance. Requires threshold signatures for actions.",
12
- category: "governance/dao",
8
+ name: 'MultisigDAO',
9
+ app: 'governance',
10
+ type: 'daoMultisig',
11
+ version: '1.0.0',
12
+ description: 'N-of-M multisig governance. Requires threshold signatures for actions.',
13
+ category: 'governance/dao',
13
14
  crossReferences: {
14
- Identity: "signer verification",
15
- Contract: "action execution targets",
16
- Treasury: "fund management",
17
- Escrow: "controlled release",
15
+ Identity: 'signer verification',
16
+ Contract: 'action execution targets',
17
+ Treasury: 'fund management',
18
+ Escrow: 'controlled release',
18
19
  },
19
20
  },
20
21
  createSchema: {
21
- required: ["signers", "threshold", "proposalTTLMs"],
22
+ required: ['signers', 'threshold', 'proposalTTLMs'],
22
23
  properties: {
23
24
  signers: {
24
- type: "array",
25
- description: "Authorized signer addresses",
25
+ type: 'array',
26
+ description: 'Authorized signer addresses',
26
27
  immutable: false,
27
28
  },
28
29
  threshold: {
29
- type: "number",
30
- description: "Number of signatures required to execute",
30
+ type: 'number',
31
+ description: 'Number of signatures required to execute',
31
32
  },
32
33
  proposalTTLMs: {
33
- type: "number",
34
- description: "Proposal expiry window in milliseconds",
34
+ type: 'number',
35
+ description: 'Proposal expiry window in milliseconds',
35
36
  },
36
37
  },
37
38
  },
38
39
  stateSchema: {
39
40
  properties: {
40
- signers: { type: "array" },
41
- threshold: { type: "number" },
42
- proposalTTLMs: { type: "number" },
43
- proposal: { type: "object" },
44
- signatures: { type: "object", computed: true },
45
- actions: { type: "array", computed: true },
46
- cancelledProposals: { type: "array", computed: true },
47
- status: { type: "string", computed: true },
41
+ signers: { type: 'array' },
42
+ threshold: { type: 'number' },
43
+ proposalTTLMs: { type: 'number' },
44
+ proposal: { type: 'object' },
45
+ signatures: { type: 'object', computed: true },
46
+ actions: { type: 'array', computed: true },
47
+ cancelledProposals: { type: 'array', computed: true },
48
+ status: { type: 'string', computed: true },
48
49
  },
49
50
  },
50
51
  eventSchemas: {
51
52
  propose: {
52
- description: "Propose an action (signer only)",
53
- required: ["proposalId", "actionType", "payload"],
53
+ description: 'Propose an action (signer only)',
54
+ required: ['proposalId', 'actionType', 'payload'],
54
55
  properties: {
55
- agent: { type: "address" },
56
- proposalId: { type: "string" },
57
- actionType: { type: "string" },
58
- payload: { type: "object" },
56
+ agent: { type: 'address' },
57
+ proposalId: { type: 'string' },
58
+ actionType: { type: 'string' },
59
+ payload: { type: 'object' },
59
60
  },
60
61
  },
61
62
  sign: {
62
- description: "Sign the current proposal (signer only, no double-signing)",
63
+ description: 'Sign the current proposal (signer only, no double-signing)',
63
64
  properties: {
64
- agent: { type: "address" },
65
+ agent: { type: 'address' },
65
66
  },
66
67
  },
67
68
  execute: {
68
- description: "Execute once threshold signatures collected",
69
+ description: 'Execute once threshold signatures collected',
69
70
  properties: {
70
- agent: { type: "address" },
71
+ agent: { type: 'address' },
71
72
  },
72
73
  },
73
74
  cancel: {
74
- description: "Cancel proposal (expired or proposer)",
75
+ description: 'Cancel proposal (expired or proposer)',
75
76
  properties: {
76
- agent: { type: "address" },
77
+ agent: { type: 'address' },
77
78
  },
78
79
  },
79
80
  propose_add_signer: {
80
- description: "Propose adding a new signer (signer only)",
81
- required: ["proposalId", "newSigner"],
81
+ description: 'Propose adding a new signer (signer only)',
82
+ required: ['proposalId', 'newSigner'],
82
83
  properties: {
83
- agent: { type: "address" },
84
- proposalId: { type: "string" },
85
- newSigner: { type: "address" },
84
+ agent: { type: 'address' },
85
+ proposalId: { type: 'string' },
86
+ newSigner: { type: 'address' },
86
87
  },
87
88
  },
88
89
  propose_remove_signer: {
89
- description: "Propose removing a signer (signer only, must keep > threshold signers)",
90
- required: ["proposalId", "removeSigner"],
90
+ description: 'Propose removing a signer (signer only, must keep > threshold signers)',
91
+ required: ['proposalId', 'removeSigner'],
91
92
  properties: {
92
- agent: { type: "address" },
93
- proposalId: { type: "string" },
94
- removeSigner: { type: "address" },
93
+ agent: { type: 'address' },
94
+ proposalId: { type: 'string' },
95
+ removeSigner: { type: 'address' },
95
96
  },
96
97
  },
97
98
  propose_change_threshold: {
98
- description: "Propose changing the signature threshold",
99
- required: ["proposalId", "newThreshold"],
99
+ description: 'Propose changing the signature threshold',
100
+ required: ['proposalId', 'newThreshold'],
100
101
  properties: {
101
- agent: { type: "address" },
102
- proposalId: { type: "string" },
103
- newThreshold: { type: "number", minimum: 1 },
102
+ agent: { type: 'address' },
103
+ proposalId: { type: 'string' },
104
+ newThreshold: { type: 'number', minimum: 1 },
104
105
  },
105
106
  },
106
107
  apply_signer_change: {
107
- description: "Apply approved signer-set or threshold change",
108
+ description: 'Apply approved signer-set or threshold change',
108
109
  properties: {
109
- agent: { type: "address" },
110
+ agent: { type: 'address' },
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
119
  ACTIVE: {
121
- id: "ACTIVE",
120
+ id: 'ACTIVE',
122
121
  isFinal: false,
123
122
  metadata: {
124
- label: "Active",
125
- description: "Multisig is idle and ready to propose an action",
126
- category: "initial",
123
+ label: 'Active',
124
+ description: 'Multisig is idle and ready to propose an action',
125
+ category: 'initial',
127
126
  },
128
127
  },
129
128
  PENDING: {
130
- id: "PENDING",
129
+ id: 'PENDING',
131
130
  isFinal: false,
132
131
  metadata: {
133
- label: "Pending",
134
- description: "An action is awaiting the required signature threshold",
135
- category: "pending",
132
+ label: 'Pending',
133
+ description: 'An action is awaiting the required signature threshold',
134
+ category: 'pending',
136
135
  },
137
136
  },
138
137
  DISSOLVED: {
139
- id: "DISSOLVED",
138
+ id: 'DISSOLVED',
140
139
  isFinal: true,
141
140
  metadata: {
142
- label: "Dissolved",
143
- description: "Multisig DAO dissolved (terminal)",
144
- category: "terminal",
141
+ label: 'Dissolved',
142
+ description: 'Multisig DAO dissolved (terminal)',
143
+ category: 'terminal',
145
144
  },
146
145
  },
147
146
  },
148
- initialState: "ACTIVE",
147
+ initialState: 'ACTIVE',
149
148
  transitions: [
150
149
  // ACTIVE → PENDING: propose (signer only)
151
150
  {
152
- from: "ACTIVE",
153
- to: "PENDING",
154
- eventName: "propose",
155
- guard: { in: [{ var: "event.agent" }, { var: "state.signers" }] },
151
+ from: 'ACTIVE',
152
+ to: 'PENDING',
153
+ eventName: 'propose',
154
+ guard: actorInSet('state.signers'),
156
155
  effect: {
157
156
  merge: [
158
- { var: "state" },
157
+ { var: 'state' },
159
158
  {
160
159
  proposal: {
161
- id: { var: "event.proposalId" },
162
- actionType: { var: "event.actionType" },
163
- payload: { var: "event.payload" },
164
- proposer: { var: "event.agent" },
165
- proposedAt: { var: "$timestamp" },
160
+ id: { var: 'event.proposalId' },
161
+ actionType: { var: 'event.actionType' },
162
+ payload: { var: 'event.payload' },
163
+ proposer: { var: 'event.agent' },
164
+ proposedAt: { var: '$ordinal' },
166
165
  expiresAt: {
167
- "+": [{ var: "$timestamp" }, { var: "state.proposalTTLMs" }],
166
+ '+': [{ var: '$ordinal' }, { var: 'state.proposalTTLMs' }],
168
167
  },
169
168
  },
170
169
  signatures: {
171
- setKey: [{}, { var: "event.agent" }, { var: "$timestamp" }],
170
+ set: [{}, { var: 'event.agent' }, { var: '$ordinal' }],
172
171
  },
173
172
  },
174
173
  ],
@@ -177,35 +176,26 @@ export const daoMultisigDef = defineFiberApp({
177
176
  },
178
177
  // PENDING → PENDING: sign (signer, no double-sign, not yet at threshold)
179
178
  {
180
- from: "PENDING",
181
- to: "PENDING",
182
- eventName: "sign",
179
+ from: 'PENDING',
180
+ to: 'PENDING',
181
+ eventName: 'sign',
183
182
  guard: {
184
183
  and: [
185
- { in: [{ var: "event.agent" }, { var: "state.signers" }] },
184
+ actorInSet('state.signers'),
186
185
  {
187
- "!": [
188
- { getKey: [{ var: "state.signatures" }, { var: "event.agent" }] },
189
- ],
186
+ '!': [{ has: [{ var: 'state.signatures' }, { var: 'event.agent' }] }],
190
187
  },
191
188
  {
192
- "<": [
193
- { size: { var: "state.signatures" } },
194
- { var: "state.threshold" },
195
- ],
189
+ '<': [{ length: [{ keys: [{ var: 'state.signatures' }] }] }, { var: 'state.threshold' }],
196
190
  },
197
191
  ],
198
192
  },
199
193
  effect: {
200
194
  merge: [
201
- { var: "state" },
195
+ { var: 'state' },
202
196
  {
203
197
  signatures: {
204
- setKey: [
205
- { var: "state.signatures" },
206
- { var: "event.agent" },
207
- { var: "$timestamp" },
208
- ],
198
+ set: [{ var: 'state.signatures' }, { var: 'event.agent' }, { var: '$ordinal' }],
209
199
  },
210
200
  },
211
201
  ],
@@ -214,67 +204,67 @@ export const daoMultisigDef = defineFiberApp({
214
204
  },
215
205
  // PENDING → ACTIVE: execute (threshold met)
216
206
  {
217
- from: "PENDING",
218
- to: "ACTIVE",
219
- eventName: "execute",
207
+ from: 'PENDING',
208
+ to: 'ACTIVE',
209
+ eventName: 'execute',
220
210
  guard: {
221
- ">=": [
222
- { size: { var: "state.signatures" } },
223
- { var: "state.threshold" },
224
- ],
211
+ '>=': [{ length: [{ keys: [{ var: 'state.signatures' }] }] }, { var: 'state.threshold' }],
225
212
  },
226
213
  effect: {
227
214
  merge: [
228
- { var: "state" },
215
+ { var: 'state' },
229
216
  {
230
217
  actions: {
231
218
  cat: [
232
- { var: "state.actions" },
219
+ { var: 'state.actions' },
233
220
  [
234
221
  {
235
- id: { var: "state.proposal.id" },
236
- type: { var: "state.proposal.actionType" },
237
- payload: { var: "state.proposal.payload" },
238
- signatures: { var: "state.signatures" },
239
- executedAt: { var: "$timestamp" },
222
+ id: { var: 'state.proposal.id' },
223
+ type: { var: 'state.proposal.actionType' },
224
+ payload: { var: 'state.proposal.payload' },
225
+ signatures: { var: 'state.signatures' },
226
+ executedAt: { var: '$ordinal' },
240
227
  },
241
228
  ],
242
229
  ],
243
230
  },
244
231
  proposal: null,
245
232
  signatures: {},
233
+ // A3 fix: transition-level `emits` is dropped by the chain; emit from INSIDE the effect
234
+ // under the reserved `_emit` key (extracted as an EmittedEvent, stripped from state).
235
+ _emit: [
236
+ {
237
+ name: 'multisig_executed',
238
+ data: { proposalId: { var: 'state.proposal.id' } },
239
+ destination: 'external',
240
+ },
241
+ ],
246
242
  },
247
243
  ],
248
244
  },
249
- emits: [{ event: "multisig_executed", to: "external" }],
250
245
  dependencies: [],
251
246
  },
252
247
  // PENDING → ACTIVE: cancel (expired or proposer)
253
248
  {
254
- from: "PENDING",
255
- to: "ACTIVE",
256
- eventName: "cancel",
249
+ from: 'PENDING',
250
+ to: 'ACTIVE',
251
+ eventName: 'cancel',
257
252
  guard: {
258
253
  or: [
259
- { ">": [{ var: "$timestamp" }, { var: "state.proposal.expiresAt" }] },
260
- {
261
- "===": [{ var: "event.agent" }, { var: "state.proposal.proposer" }],
262
- },
254
+ { '>': [{ var: '$ordinal' }, { var: 'state.proposal.expiresAt' }] },
255
+ signerIsParty('state.proposal.proposer'),
263
256
  ],
264
257
  },
265
258
  effect: {
266
259
  merge: [
267
- { var: "state" },
260
+ { var: 'state' },
268
261
  {
269
262
  cancelledProposals: {
270
263
  cat: [
271
- { var: "state.cancelledProposals" },
264
+ { var: 'state.cancelledProposals' },
272
265
  [
273
266
  {
274
- merge: [
275
- { var: "state.proposal" },
276
- { cancelledAt: { var: "$timestamp" } },
277
- ],
267
+ merge: [{ var: 'state.proposal' }, { cancelledAt: { var: '$ordinal' } }],
278
268
  },
279
269
  ],
280
270
  ],
@@ -288,26 +278,26 @@ export const daoMultisigDef = defineFiberApp({
288
278
  },
289
279
  // ACTIVE → PENDING: propose_add_signer
290
280
  {
291
- from: "ACTIVE",
292
- to: "PENDING",
293
- eventName: "propose_add_signer",
294
- guard: { in: [{ var: "event.agent" }, { var: "state.signers" }] },
281
+ from: 'ACTIVE',
282
+ to: 'PENDING',
283
+ eventName: 'propose_add_signer',
284
+ guard: actorInSet('state.signers'),
295
285
  effect: {
296
286
  merge: [
297
- { var: "state" },
287
+ { var: 'state' },
298
288
  {
299
289
  proposal: {
300
- id: { var: "event.proposalId" },
301
- actionType: "add_signer",
302
- payload: { newSigner: { var: "event.newSigner" } },
303
- proposer: { var: "event.agent" },
304
- proposedAt: { var: "$timestamp" },
290
+ id: { var: 'event.proposalId' },
291
+ actionType: 'add_signer',
292
+ payload: { newSigner: { var: 'event.newSigner' } },
293
+ proposer: { var: 'event.agent' },
294
+ proposedAt: { var: '$ordinal' },
305
295
  expiresAt: {
306
- "+": [{ var: "$timestamp" }, { var: "state.proposalTTLMs" }],
296
+ '+': [{ var: '$ordinal' }, { var: 'state.proposalTTLMs' }],
307
297
  },
308
298
  },
309
299
  signatures: {
310
- setKey: [{}, { var: "event.agent" }, { var: "$timestamp" }],
300
+ set: [{}, { var: 'event.agent' }, { var: '$ordinal' }],
311
301
  },
312
302
  },
313
303
  ],
@@ -316,36 +306,33 @@ export const daoMultisigDef = defineFiberApp({
316
306
  },
317
307
  // ACTIVE → PENDING: propose_remove_signer (signers > threshold)
318
308
  {
319
- from: "ACTIVE",
320
- to: "PENDING",
321
- eventName: "propose_remove_signer",
309
+ from: 'ACTIVE',
310
+ to: 'PENDING',
311
+ eventName: 'propose_remove_signer',
322
312
  guard: {
323
313
  and: [
324
- { in: [{ var: "event.agent" }, { var: "state.signers" }] },
314
+ actorInSet('state.signers'),
325
315
  {
326
- ">": [
327
- { size: { var: "state.signers" } },
328
- { var: "state.threshold" },
329
- ],
316
+ '>': [{ length: [{ var: 'state.signers' }] }, { var: 'state.threshold' }],
330
317
  },
331
318
  ],
332
319
  },
333
320
  effect: {
334
321
  merge: [
335
- { var: "state" },
322
+ { var: 'state' },
336
323
  {
337
324
  proposal: {
338
- id: { var: "event.proposalId" },
339
- actionType: "remove_signer",
340
- payload: { removeSigner: { var: "event.removeSigner" } },
341
- proposer: { var: "event.agent" },
342
- proposedAt: { var: "$timestamp" },
325
+ id: { var: 'event.proposalId' },
326
+ actionType: 'remove_signer',
327
+ payload: { removeSigner: { var: 'event.removeSigner' } },
328
+ proposer: { var: 'event.agent' },
329
+ proposedAt: { var: '$ordinal' },
343
330
  expiresAt: {
344
- "+": [{ var: "$timestamp" }, { var: "state.proposalTTLMs" }],
331
+ '+': [{ var: '$ordinal' }, { var: 'state.proposalTTLMs' }],
345
332
  },
346
333
  },
347
334
  signatures: {
348
- setKey: [{}, { var: "event.agent" }, { var: "$timestamp" }],
335
+ set: [{}, { var: 'event.agent' }, { var: '$ordinal' }],
349
336
  },
350
337
  },
351
338
  ],
@@ -354,37 +341,34 @@ export const daoMultisigDef = defineFiberApp({
354
341
  },
355
342
  // ACTIVE → PENDING: propose_change_threshold (1 <= new <= signers count)
356
343
  {
357
- from: "ACTIVE",
358
- to: "PENDING",
359
- eventName: "propose_change_threshold",
344
+ from: 'ACTIVE',
345
+ to: 'PENDING',
346
+ eventName: 'propose_change_threshold',
360
347
  guard: {
361
348
  and: [
362
- { in: [{ var: "event.agent" }, { var: "state.signers" }] },
363
- { ">=": [{ var: "event.newThreshold" }, 1] },
349
+ actorInSet('state.signers'),
350
+ { '>=': [{ var: 'event.newThreshold' }, 1] },
364
351
  {
365
- "<=": [
366
- { var: "event.newThreshold" },
367
- { size: { var: "state.signers" } },
368
- ],
352
+ '<=': [{ var: 'event.newThreshold' }, { length: [{ var: 'state.signers' }] }],
369
353
  },
370
354
  ],
371
355
  },
372
356
  effect: {
373
357
  merge: [
374
- { var: "state" },
358
+ { var: 'state' },
375
359
  {
376
360
  proposal: {
377
- id: { var: "event.proposalId" },
378
- actionType: "change_threshold",
379
- payload: { newThreshold: { var: "event.newThreshold" } },
380
- proposer: { var: "event.agent" },
381
- proposedAt: { var: "$timestamp" },
361
+ id: { var: 'event.proposalId' },
362
+ actionType: 'change_threshold',
363
+ payload: { newThreshold: { var: 'event.newThreshold' } },
364
+ proposer: { var: 'event.agent' },
365
+ proposedAt: { var: '$ordinal' },
382
366
  expiresAt: {
383
- "+": [{ var: "$timestamp" }, { var: "state.proposalTTLMs" }],
367
+ '+': [{ var: '$ordinal' }, { var: 'state.proposalTTLMs' }],
384
368
  },
385
369
  },
386
370
  signatures: {
387
- setKey: [{}, { var: "event.agent" }, { var: "$timestamp" }],
371
+ set: [{}, { var: 'event.agent' }, { var: '$ordinal' }],
388
372
  },
389
373
  },
390
374
  ],
@@ -393,56 +377,44 @@ export const daoMultisigDef = defineFiberApp({
393
377
  },
394
378
  // PENDING → ACTIVE: apply_signer_change (threshold met, signer-type proposal)
395
379
  {
396
- from: "PENDING",
397
- to: "ACTIVE",
398
- eventName: "apply_signer_change",
380
+ from: 'PENDING',
381
+ to: 'ACTIVE',
382
+ eventName: 'apply_signer_change',
399
383
  guard: {
400
384
  and: [
401
385
  {
402
- ">=": [
403
- { size: { var: "state.signatures" } },
404
- { var: "state.threshold" },
405
- ],
386
+ '>=': [{ length: [{ keys: [{ var: 'state.signatures' }] }] }, { var: 'state.threshold' }],
406
387
  },
407
388
  {
408
- in: [
409
- { var: "state.proposal.actionType" },
410
- ["add_signer", "remove_signer", "change_threshold"],
411
- ],
389
+ in: [{ var: 'state.proposal.actionType' }, ['add_signer', 'remove_signer', 'change_threshold']],
412
390
  },
413
391
  ],
414
392
  },
415
393
  effect: {
416
394
  if: [
417
- { "===": [{ var: "state.proposal.actionType" }, "add_signer"] },
395
+ { '===': [{ var: 'state.proposal.actionType' }, 'add_signer'] },
418
396
  {
419
397
  merge: [
420
- { var: "state" },
398
+ { var: 'state' },
421
399
  {
422
400
  signers: {
423
- cat: [
424
- { var: "state.signers" },
425
- [{ var: "state.proposal.payload.newSigner" }],
426
- ],
401
+ cat: [{ var: 'state.signers' }, [{ var: 'state.proposal.payload.newSigner' }]],
427
402
  },
428
403
  proposal: null,
429
404
  signatures: {},
430
405
  },
431
406
  ],
432
407
  },
433
- { "===": [{ var: "state.proposal.actionType" }, "remove_signer"] },
408
+ { '===': [{ var: 'state.proposal.actionType' }, 'remove_signer'] },
434
409
  {
435
410
  merge: [
436
- { var: "state" },
411
+ { var: 'state' },
437
412
  {
438
413
  signers: {
439
414
  filter: [
440
- { var: "state.signers" },
415
+ { var: 'state.signers' },
441
416
  {
442
- "!==": [
443
- { var: "" },
444
- { var: "state.proposal.payload.removeSigner" },
445
- ],
417
+ '!==': [{ var: '' }, { var: 'state.proposal.payload.removeSigner' }],
446
418
  },
447
419
  ],
448
420
  },
@@ -453,9 +425,9 @@ export const daoMultisigDef = defineFiberApp({
453
425
  },
454
426
  {
455
427
  merge: [
456
- { var: "state" },
428
+ { var: 'state' },
457
429
  {
458
- threshold: { var: "state.proposal.payload.newThreshold" },
430
+ threshold: { var: 'state.proposal.payload.newThreshold' },
459
431
  proposal: null,
460
432
  signatures: {},
461
433
  },
@@ -467,20 +439,27 @@ export const daoMultisigDef = defineFiberApp({
467
439
  },
468
440
  // ACTIVE → DISSOLVED: dissolve (unanimous)
469
441
  {
470
- from: "ACTIVE",
471
- to: "DISSOLVED",
472
- eventName: "dissolve",
442
+ from: 'ACTIVE',
443
+ to: 'DISSOLVED',
444
+ eventName: 'dissolve',
445
+ // S2 fix: dissolution must not trust an attacker-supplied count. Derive
446
+ // unanimity from the CHAIN-VERIFIED signers — every signer in state.signers
447
+ // must be among proofs[].address (with a non-empty belt). signers is an array.
473
448
  guard: {
474
- "===": [
475
- { var: "event.signatureCount" },
476
- { size: { var: "state.signers" } },
449
+ and: [
450
+ { '>': [{ length: [{ var: 'state.signers' }] }, 0] },
451
+ {
452
+ all: [
453
+ { var: 'state.signers' },
454
+ {
455
+ in: [{ var: '' }, { map: [{ var: 'proofs' }, { var: 'address' }] }],
456
+ },
457
+ ],
458
+ },
477
459
  ],
478
460
  },
479
461
  effect: {
480
- merge: [
481
- { var: "state" },
482
- { dissolvedAt: { var: "$timestamp" }, status: "DISSOLVED" },
483
- ],
462
+ merge: [{ var: 'state' }, { dissolvedAt: { var: '$ordinal' }, status: 'DISSOLVED' }],
484
463
  },
485
464
  dependencies: [],
486
465
  },