@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,189 +1,179 @@
1
- import { defineFiberApp } from "../../../schema/fiber-app.js";
1
+ import { defineFiberApp } from '../../../schema/fiber-app.js';
2
+ import { actorHasEntry, signerHasEntry, signerInSet, signerIsAnyParty, signerIsNotParty, } from '../../../schema/guards.js';
2
3
  /**
3
4
  * Simple org governance: manage members, update rules, resolve disputes.
4
5
  */
5
6
  export const govSimpleDef = defineFiberApp({
6
7
  metadata: {
7
- name: "Governance",
8
- app: "governance",
9
- type: "simple",
10
- version: "1.0.0",
11
- description: "Simple org governance: manage members, update rules, resolve disputes",
8
+ name: 'Governance',
9
+ app: 'governance',
10
+ type: 'simple',
11
+ version: '1.0.0',
12
+ description: 'Simple org governance: manage members, update rules, resolve disputes',
12
13
  },
13
14
  createSchema: {
14
- required: [
15
- "admins",
16
- "passingThreshold",
17
- "disputeQuorum",
18
- "votingPeriodMs",
19
- ],
15
+ required: ['admins', 'passingThreshold', 'disputeQuorum', 'votingPeriodMs'],
20
16
  properties: {
21
17
  admins: {
22
- type: "array",
23
- description: "Initial admin addresses",
18
+ type: 'array',
19
+ description: 'Initial admin addresses',
24
20
  immutable: false,
25
21
  },
26
22
  passingThreshold: {
27
- type: "number",
28
- description: "Fraction of members required to pass (0-1)",
23
+ type: 'number',
24
+ description: 'Fraction of members required to pass (0-1)',
29
25
  },
30
26
  disputeQuorum: {
31
- type: "number",
32
- description: "Min votes to resolve a dispute",
27
+ type: 'number',
28
+ description: 'Min votes to resolve a dispute',
33
29
  },
34
30
  votingPeriodMs: {
35
- type: "number",
36
- description: "Voting window in milliseconds",
31
+ type: 'number',
32
+ description: 'Voting window in milliseconds',
37
33
  },
38
34
  },
39
35
  },
40
36
  stateSchema: {
41
37
  properties: {
42
- admins: { type: "array", immutable: false },
43
- members: { type: "object", computed: true },
44
- rules: { type: "object", computed: true },
45
- history: { type: "array", computed: true },
46
- proposal: { type: "object" },
47
- votes: { type: "object", computed: true },
48
- dispute: { type: "object" },
49
- passingThreshold: { type: "number" },
50
- disputeQuorum: { type: "number" },
51
- votingPeriodMs: { type: "number" },
38
+ admins: { type: 'array', immutable: false },
39
+ members: { type: 'object', computed: true },
40
+ rules: { type: 'object', computed: true },
41
+ history: { type: 'array', computed: true },
42
+ proposal: { type: 'object' },
43
+ votes: { type: 'object', computed: true },
44
+ dispute: { type: 'object' },
45
+ passingThreshold: { type: 'number' },
46
+ disputeQuorum: { type: 'number' },
47
+ votingPeriodMs: { type: 'number' },
52
48
  },
53
49
  },
54
50
  eventSchemas: {
55
51
  add_member: {
56
- description: "Add a member (admin only)",
57
- required: ["member", "role"],
52
+ description: 'Add a member (admin only)',
53
+ required: ['member', 'role'],
58
54
  properties: {
59
- agent: { type: "address" },
60
- member: { type: "address" },
61
- role: { type: "string" },
55
+ agent: { type: 'address' },
56
+ member: { type: 'address' },
57
+ role: { type: 'string' },
62
58
  },
63
59
  },
64
60
  remove_member: {
65
- description: "Remove a member (admin only)",
66
- required: ["member"],
61
+ description: 'Remove a member (admin only)',
62
+ required: ['member'],
67
63
  properties: {
68
- agent: { type: "address" },
69
- member: { type: "address" },
64
+ agent: { type: 'address' },
65
+ member: { type: 'address' },
70
66
  },
71
67
  },
72
68
  propose: {
73
- description: "Submit a rule change proposal",
74
- required: ["proposalId", "type", "changes"],
69
+ description: 'Submit a rule change proposal',
70
+ required: ['proposalId', 'type', 'changes'],
75
71
  properties: {
76
- agent: { type: "address" },
77
- proposalId: { type: "string" },
78
- type: { type: "string" },
79
- changes: { type: "object" },
72
+ agent: { type: 'address' },
73
+ proposalId: { type: 'string' },
74
+ type: { type: 'string' },
75
+ changes: { type: 'object' },
80
76
  },
81
77
  },
82
78
  vote: {
83
- description: "Cast a vote on the active proposal or dispute",
84
- required: ["vote"],
79
+ description: 'Cast a vote on the active proposal or dispute',
80
+ required: ['vote'],
85
81
  properties: {
86
- agent: { type: "address" },
87
- vote: { type: "string" },
88
- ruling: { type: "string" },
82
+ agent: { type: 'address' },
83
+ vote: { type: 'string' },
84
+ ruling: { type: 'string' },
89
85
  },
90
86
  },
91
87
  finalize: {
92
- description: "Finalize the voting period",
93
- required: ["forCount"],
94
- properties: {
95
- forCount: { type: "number" },
96
- },
88
+ description: 'Finalize the voting period (for-count derived from recorded ballots)',
89
+ properties: {},
97
90
  },
98
91
  file_dispute: {
99
- description: "File a dispute against a member",
100
- required: ["disputeId", "defendant", "claim"],
92
+ description: 'File a dispute against a member',
93
+ required: ['disputeId', 'defendant', 'claim'],
101
94
  properties: {
102
- agent: { type: "address" },
103
- disputeId: { type: "string" },
104
- defendant: { type: "address" },
105
- claim: { type: "string" },
95
+ agent: { type: 'address' },
96
+ disputeId: { type: 'string' },
97
+ defendant: { type: 'address' },
98
+ claim: { type: 'string' },
106
99
  },
107
100
  },
108
101
  submit_evidence: {
109
- description: "Submit evidence in a dispute",
110
- required: ["content"],
102
+ description: 'Submit evidence in a dispute',
103
+ required: ['content'],
111
104
  properties: {
112
- agent: { type: "address" },
113
- content: { type: "string" },
105
+ agent: { type: 'address' },
106
+ content: { type: 'string' },
114
107
  },
115
108
  },
116
109
  resolve: {
117
- description: "Resolve the active dispute",
118
- required: ["ruling", "remedy"],
110
+ description: 'Resolve the active dispute',
111
+ required: ['ruling', 'remedy'],
119
112
  properties: {
120
- ruling: { type: "string" },
121
- remedy: { type: "string" },
113
+ ruling: { type: 'string' },
114
+ remedy: { type: 'string' },
122
115
  },
123
116
  },
124
117
  dissolve: {
125
- description: "Dissolve the organization (requires 90% approval)",
126
- required: ["approvalCount"],
127
- properties: {
128
- approvalCount: { type: "number" },
129
- },
118
+ description: 'Dissolve the organization (requires every member to sign this op — verified unanimity)',
119
+ properties: {},
130
120
  },
131
121
  },
132
122
  states: {
133
123
  ACTIVE: {
134
- id: "ACTIVE",
124
+ id: 'ACTIVE',
135
125
  isFinal: false,
136
126
  metadata: {
137
- label: "Active",
138
- description: "Governance is idle and ready to accept a proposal",
139
- category: "initial",
127
+ label: 'Active',
128
+ description: 'Governance is idle and ready to accept a proposal',
129
+ category: 'initial',
140
130
  },
141
131
  },
142
132
  VOTING: {
143
- id: "VOTING",
133
+ id: 'VOTING',
144
134
  isFinal: false,
145
135
  metadata: {
146
- label: "Voting",
147
- description: "A proposal is open for voting",
148
- category: "pending",
136
+ label: 'Voting',
137
+ description: 'A proposal is open for voting',
138
+ category: 'pending',
149
139
  },
150
140
  },
151
141
  DISPUTE: {
152
- id: "DISPUTE",
142
+ id: 'DISPUTE',
153
143
  isFinal: false,
154
144
  metadata: {
155
- label: "Dispute",
156
- description: "A proposal outcome is being disputed",
157
- category: "pending",
145
+ label: 'Dispute',
146
+ description: 'A proposal outcome is being disputed',
147
+ category: 'pending',
158
148
  },
159
149
  },
160
150
  DISSOLVED: {
161
- id: "DISSOLVED",
151
+ id: 'DISSOLVED',
162
152
  isFinal: true,
163
153
  metadata: {
164
- label: "Dissolved",
165
- description: "Governance entity dissolved (terminal)",
166
- category: "terminal",
154
+ label: 'Dissolved',
155
+ description: 'Governance entity dissolved (terminal)',
156
+ category: 'terminal',
167
157
  },
168
158
  },
169
159
  },
170
- initialState: "ACTIVE",
160
+ initialState: 'ACTIVE',
171
161
  transitions: [
172
162
  // ACTIVE → ACTIVE: add member (admin only)
173
163
  {
174
- from: "ACTIVE",
175
- to: "ACTIVE",
176
- eventName: "add_member",
177
- guard: { in: [{ var: "event.agent" }, { var: "state.admins" }] },
164
+ from: 'ACTIVE',
165
+ to: 'ACTIVE',
166
+ eventName: 'add_member',
167
+ guard: signerInSet('state.admins'),
178
168
  effect: {
179
169
  merge: [
180
- { var: "state" },
170
+ { var: 'state' },
181
171
  {
182
172
  members: {
183
- setKey: [
184
- { var: "state.members" },
185
- { var: "event.member" },
186
- { role: { var: "event.role" }, addedAt: { var: "$timestamp" } },
173
+ set: [
174
+ { var: 'state.members' },
175
+ { var: 'event.member' },
176
+ { role: { var: 'event.role' }, addedAt: { var: '$ordinal' } },
187
177
  ],
188
178
  },
189
179
  },
@@ -193,16 +183,16 @@ export const govSimpleDef = defineFiberApp({
193
183
  },
194
184
  // ACTIVE → ACTIVE: remove member (admin only)
195
185
  {
196
- from: "ACTIVE",
197
- to: "ACTIVE",
198
- eventName: "remove_member",
199
- guard: { in: [{ var: "event.agent" }, { var: "state.admins" }] },
186
+ from: 'ACTIVE',
187
+ to: 'ACTIVE',
188
+ eventName: 'remove_member',
189
+ guard: signerInSet('state.admins'),
200
190
  effect: {
201
191
  merge: [
202
- { var: "state" },
192
+ { var: 'state' },
203
193
  {
204
194
  members: {
205
- deleteKey: [{ var: "state.members" }, { var: "event.member" }],
195
+ unset: [{ var: 'state.members' }, { var: 'event.member' }],
206
196
  },
207
197
  },
208
198
  ],
@@ -211,22 +201,24 @@ export const govSimpleDef = defineFiberApp({
211
201
  },
212
202
  // ACTIVE → VOTING: propose
213
203
  {
214
- from: "ACTIVE",
215
- to: "VOTING",
216
- eventName: "propose",
217
- guard: { getKey: [{ var: "state.members" }, { var: "event.agent" }] },
204
+ from: 'ACTIVE',
205
+ to: 'VOTING',
206
+ eventName: 'propose',
207
+ // S1/A2 coupled fix: a CHAIN-VERIFIED signer must be a member (getKey is not a
208
+ // JLVM opcode; signerHasEntry checks signer ∈ keys(state.members) via `has`).
209
+ guard: signerHasEntry('state.members'),
218
210
  effect: {
219
211
  merge: [
220
- { var: "state" },
212
+ { var: 'state' },
221
213
  {
222
214
  proposal: {
223
- id: { var: "event.proposalId" },
224
- type: { var: "event.type" },
225
- changes: { var: "event.changes" },
226
- proposer: { var: "event.agent" },
227
- proposedAt: { var: "$timestamp" },
215
+ id: { var: 'event.proposalId' },
216
+ type: { var: 'event.type' },
217
+ changes: { var: 'event.changes' },
218
+ proposer: { var: 'event.agent' },
219
+ proposedAt: { var: '$ordinal' },
228
220
  deadline: {
229
- "+": [{ var: "$timestamp" }, { var: "state.votingPeriodMs" }],
221
+ '+': [{ var: '$ordinal' }, { var: 'state.votingPeriodMs' }],
230
222
  },
231
223
  },
232
224
  votes: {},
@@ -237,26 +229,25 @@ export const govSimpleDef = defineFiberApp({
237
229
  },
238
230
  // VOTING → VOTING: vote (member, no double-voting)
239
231
  {
240
- from: "VOTING",
241
- to: "VOTING",
242
- eventName: "vote",
232
+ from: 'VOTING',
233
+ to: 'VOTING',
234
+ eventName: 'vote',
235
+ // S1/A2 coupled fix: bind event.agent to a verified signer who is a member (actorHasEntry),
236
+ // and block a re-vote by that SAME bound actor — so the ballot is recorded under, and deduped
237
+ // on, the chain-verified voter. Without the binding, signerHasEntry only proves SOME signer is a
238
+ // member, letting one member stuff votes under arbitrary keys (set is the rc.5 map-write opcode).
243
239
  guard: {
244
- and: [
245
- { getKey: [{ var: "state.members" }, { var: "event.agent" }] },
246
- {
247
- "!": [{ getKey: [{ var: "state.votes" }, { var: "event.agent" }] }],
248
- },
249
- ],
240
+ and: [actorHasEntry('state.members'), { '!': [{ has: [{ var: 'state.votes' }, { var: 'event.agent' }] }] }],
250
241
  },
251
242
  effect: {
252
243
  merge: [
253
- { var: "state" },
244
+ { var: 'state' },
254
245
  {
255
246
  votes: {
256
- setKey: [
257
- { var: "state.votes" },
258
- { var: "event.agent" },
259
- { vote: { var: "event.vote" }, votedAt: { var: "$timestamp" } },
247
+ set: [
248
+ { var: 'state.votes' },
249
+ { var: 'event.agent' },
250
+ { vote: { var: 'event.vote' }, votedAt: { var: '$ordinal' } },
260
251
  ],
261
252
  },
262
253
  },
@@ -266,39 +257,42 @@ export const govSimpleDef = defineFiberApp({
266
257
  },
267
258
  // VOTING → ACTIVE: finalize (passed)
268
259
  {
269
- from: "VOTING",
270
- to: "ACTIVE",
271
- eventName: "finalize",
260
+ from: 'VOTING',
261
+ to: 'ACTIVE',
262
+ eventName: 'finalize',
263
+ // S2/A2 coupled fix: the for-count is DERIVED from recorded ballots in
264
+ // state.votes (length of the "for" entries), never read from the attacker's
265
+ // event.forCount. members is a Map so its count is length(keys(members)).
272
266
  guard: {
273
- ">=": [
274
- { var: "event.forCount" },
267
+ '>=': [
275
268
  {
276
- "*": [
277
- { size: { var: "state.members" } },
278
- { var: "state.passingThreshold" },
269
+ length: [
270
+ {
271
+ filter: [{ values: [{ var: 'state.votes' }] }, { '===': [{ var: 'vote' }, 'for'] }],
272
+ },
279
273
  ],
280
274
  },
275
+ {
276
+ '*': [{ length: [{ keys: [{ var: 'state.members' }] }] }, { var: 'state.passingThreshold' }],
277
+ },
281
278
  ],
282
279
  },
283
280
  effect: {
284
281
  merge: [
285
- { var: "state" },
282
+ { var: 'state' },
286
283
  {
287
284
  rules: {
288
- merge: [
289
- { var: "state.rules" },
290
- { var: "state.proposal.changes" },
291
- ],
285
+ merge: [{ var: 'state.rules' }, { var: 'state.proposal.changes' }],
292
286
  },
293
287
  history: {
294
288
  cat: [
295
- { var: "state.history" },
289
+ { var: 'state.history' },
296
290
  [
297
291
  {
298
- type: "rule_change",
299
- proposal: { var: "state.proposal" },
300
- outcome: "passed",
301
- finalizedAt: { var: "$timestamp" },
292
+ type: 'rule_change',
293
+ proposal: { var: 'state.proposal' },
294
+ outcome: 'passed',
295
+ finalizedAt: { var: '$ordinal' },
302
296
  },
303
297
  ],
304
298
  ],
@@ -312,33 +306,38 @@ export const govSimpleDef = defineFiberApp({
312
306
  },
313
307
  // VOTING → ACTIVE: finalize (failed)
314
308
  {
315
- from: "VOTING",
316
- to: "ACTIVE",
317
- eventName: "finalize",
309
+ from: 'VOTING',
310
+ to: 'ACTIVE',
311
+ eventName: 'finalize',
312
+ // S2/A2 coupled fix (failed arm): derive the for-count from recorded ballots in
313
+ // state.votes; never from event.forCount. members count = length(keys(members)).
318
314
  guard: {
319
- "<": [
320
- { var: "event.forCount" },
315
+ '<': [
321
316
  {
322
- "*": [
323
- { size: { var: "state.members" } },
324
- { var: "state.passingThreshold" },
317
+ length: [
318
+ {
319
+ filter: [{ values: [{ var: 'state.votes' }] }, { '===': [{ var: 'vote' }, 'for'] }],
320
+ },
325
321
  ],
326
322
  },
323
+ {
324
+ '*': [{ length: [{ keys: [{ var: 'state.members' }] }] }, { var: 'state.passingThreshold' }],
325
+ },
327
326
  ],
328
327
  },
329
328
  effect: {
330
329
  merge: [
331
- { var: "state" },
330
+ { var: 'state' },
332
331
  {
333
332
  history: {
334
333
  cat: [
335
- { var: "state.history" },
334
+ { var: 'state.history' },
336
335
  [
337
336
  {
338
- type: "rule_change",
339
- proposal: { var: "state.proposal" },
340
- outcome: "failed",
341
- finalizedAt: { var: "$timestamp" },
337
+ type: 'rule_change',
338
+ proposal: { var: 'state.proposal' },
339
+ outcome: 'failed',
340
+ finalizedAt: { var: '$ordinal' },
342
341
  },
343
342
  ],
344
343
  ],
@@ -352,20 +351,22 @@ export const govSimpleDef = defineFiberApp({
352
351
  },
353
352
  // ACTIVE → DISPUTE: file_dispute
354
353
  {
355
- from: "ACTIVE",
356
- to: "DISPUTE",
357
- eventName: "file_dispute",
358
- guard: { getKey: [{ var: "state.members" }, { var: "event.agent" }] },
354
+ from: 'ACTIVE',
355
+ to: 'DISPUTE',
356
+ eventName: 'file_dispute',
357
+ // S1/A2 coupled fix: only a CHAIN-VERIFIED member may file (getKey is not a JLVM
358
+ // opcode; signerHasEntry checks signer ∈ keys(state.members) via `has`).
359
+ guard: signerHasEntry('state.members'),
359
360
  effect: {
360
361
  merge: [
361
- { var: "state" },
362
+ { var: 'state' },
362
363
  {
363
364
  dispute: {
364
- id: { var: "event.disputeId" },
365
- plaintiff: { var: "event.agent" },
366
- defendant: { var: "event.defendant" },
367
- claim: { var: "event.claim" },
368
- filedAt: { var: "$timestamp" },
365
+ id: { var: 'event.disputeId' },
366
+ plaintiff: { var: 'event.agent' },
367
+ defendant: { var: 'event.defendant' },
368
+ claim: { var: 'event.claim' },
369
+ filedAt: { var: '$ordinal' },
369
370
  evidence: [],
370
371
  },
371
372
  votes: {},
@@ -376,35 +377,26 @@ export const govSimpleDef = defineFiberApp({
376
377
  },
377
378
  // DISPUTE → DISPUTE: submit_evidence (plaintiff or defendant)
378
379
  {
379
- from: "DISPUTE",
380
- to: "DISPUTE",
381
- eventName: "submit_evidence",
382
- guard: {
383
- or: [
384
- {
385
- "===": [{ var: "event.agent" }, { var: "state.dispute.plaintiff" }],
386
- },
387
- {
388
- "===": [{ var: "event.agent" }, { var: "state.dispute.defendant" }],
389
- },
390
- ],
391
- },
380
+ from: 'DISPUTE',
381
+ to: 'DISPUTE',
382
+ eventName: 'submit_evidence',
383
+ guard: signerIsAnyParty(['state.dispute.plaintiff', 'state.dispute.defendant']),
392
384
  effect: {
393
385
  merge: [
394
- { var: "state" },
386
+ { var: 'state' },
395
387
  {
396
388
  dispute: {
397
389
  merge: [
398
- { var: "state.dispute" },
390
+ { var: 'state.dispute' },
399
391
  {
400
392
  evidence: {
401
393
  cat: [
402
- { var: "state.dispute.evidence" },
394
+ { var: 'state.dispute.evidence' },
403
395
  [
404
396
  {
405
- from: { var: "event.agent" },
406
- content: { var: "event.content" },
407
- at: { var: "$timestamp" },
397
+ from: { var: 'event.agent' },
398
+ content: { var: 'event.content' },
399
+ at: { var: '$ordinal' },
408
400
  },
409
401
  ],
410
402
  ],
@@ -419,34 +411,32 @@ export const govSimpleDef = defineFiberApp({
419
411
  },
420
412
  // DISPUTE → DISPUTE: vote (member, not party, no double-vote)
421
413
  {
422
- from: "DISPUTE",
423
- to: "DISPUTE",
424
- eventName: "vote",
414
+ from: 'DISPUTE',
415
+ to: 'DISPUTE',
416
+ eventName: 'vote',
417
+ // S1/A2 coupled fix: bind event.agent to a verified member (actorHasEntry), exclude the parties,
418
+ // and block a re-vote by that SAME bound actor — so the dispute ballot is recorded under, and
419
+ // deduped on, the chain-verified voter (set is the rc.5 map-write opcode; signerIsNotParty still
420
+ // excludes any signer who is a party, which covers the bound actor).
425
421
  guard: {
426
422
  and: [
427
- { getKey: [{ var: "state.members" }, { var: "event.agent" }] },
428
- {
429
- "!==": [{ var: "event.agent" }, { var: "state.dispute.plaintiff" }],
430
- },
431
- {
432
- "!==": [{ var: "event.agent" }, { var: "state.dispute.defendant" }],
433
- },
434
- {
435
- "!": [{ getKey: [{ var: "state.votes" }, { var: "event.agent" }] }],
436
- },
423
+ actorHasEntry('state.members'),
424
+ signerIsNotParty('state.dispute.plaintiff'),
425
+ signerIsNotParty('state.dispute.defendant'),
426
+ { '!': [{ has: [{ var: 'state.votes' }, { var: 'event.agent' }] }] },
437
427
  ],
438
428
  },
439
429
  effect: {
440
430
  merge: [
441
- { var: "state" },
431
+ { var: 'state' },
442
432
  {
443
433
  votes: {
444
- setKey: [
445
- { var: "state.votes" },
446
- { var: "event.agent" },
434
+ set: [
435
+ { var: 'state.votes' },
436
+ { var: 'event.agent' },
447
437
  {
448
- ruling: { var: "event.ruling" },
449
- votedAt: { var: "$timestamp" },
438
+ ruling: { var: 'event.ruling' },
439
+ votedAt: { var: '$ordinal' },
450
440
  },
451
441
  ],
452
442
  },
@@ -457,29 +447,28 @@ export const govSimpleDef = defineFiberApp({
457
447
  },
458
448
  // DISPUTE → ACTIVE: resolve (quorum met)
459
449
  {
460
- from: "DISPUTE",
461
- to: "ACTIVE",
462
- eventName: "resolve",
450
+ from: 'DISPUTE',
451
+ to: 'ACTIVE',
452
+ eventName: 'resolve',
453
+ // A2 fix: count recorded ballots. votes is a Map, and `length` rejects Maps, so
454
+ // count its keys: length(keys(state.votes)). (size is not a JLVM opcode.)
463
455
  guard: {
464
- ">=": [
465
- { size: { var: "state.votes" } },
466
- { var: "state.disputeQuorum" },
467
- ],
456
+ '>=': [{ length: [{ keys: [{ var: 'state.votes' }] }] }, { var: 'state.disputeQuorum' }],
468
457
  },
469
458
  effect: {
470
459
  merge: [
471
- { var: "state" },
460
+ { var: 'state' },
472
461
  {
473
462
  history: {
474
463
  cat: [
475
- { var: "state.history" },
464
+ { var: 'state.history' },
476
465
  [
477
466
  {
478
- type: "dispute",
479
- dispute: { var: "state.dispute" },
480
- ruling: { var: "event.ruling" },
481
- remedy: { var: "event.remedy" },
482
- resolvedAt: { var: "$timestamp" },
467
+ type: 'dispute',
468
+ dispute: { var: 'state.dispute' },
469
+ ruling: { var: 'event.ruling' },
470
+ remedy: { var: 'event.remedy' },
471
+ resolvedAt: { var: '$ordinal' },
483
472
  },
484
473
  ],
485
474
  ],
@@ -493,17 +482,28 @@ export const govSimpleDef = defineFiberApp({
493
482
  },
494
483
  // ACTIVE → DISSOLVED: dissolve (90% approval)
495
484
  {
496
- from: "ACTIVE",
497
- to: "DISSOLVED",
498
- eventName: "dissolve",
485
+ from: 'ACTIVE',
486
+ to: 'DISSOLVED',
487
+ eventName: 'dissolve',
488
+ // S2/A2 coupled fix: dissolution must not trust an attacker-supplied
489
+ // approvalCount. Derive consent from the CHAIN-VERIFIED signers — every member
490
+ // (a key in state.members) must be among proofs[].address, with a non-empty
491
+ // belt. members is a Map, so iterate keys(members); size is not a JLVM opcode.
499
492
  guard: {
500
- ">=": [
501
- { var: "event.approvalCount" },
502
- { "*": [{ size: { var: "state.members" } }, 0.9] },
493
+ and: [
494
+ { '>': [{ length: [{ keys: [{ var: 'state.members' }] }] }, 0] },
495
+ {
496
+ all: [
497
+ { keys: [{ var: 'state.members' }] },
498
+ {
499
+ in: [{ var: '' }, { map: [{ var: 'proofs' }, { var: 'address' }] }],
500
+ },
501
+ ],
502
+ },
503
503
  ],
504
504
  },
505
505
  effect: {
506
- merge: [{ var: "state" }, { dissolvedAt: { var: "$timestamp" } }],
506
+ merge: [{ var: 'state' }, { dissolvedAt: { var: '$ordinal' } }],
507
507
  },
508
508
  dependencies: [],
509
509
  },