@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
@@ -7,119 +7,113 @@ const fiber_app_js_1 = require("../../../schema/fiber-app.js");
7
7
  */
8
8
  exports.marketUniversalDef = (0, fiber_app_js_1.defineFiberApp)({
9
9
  metadata: {
10
- name: "MarketUniversal",
11
- app: "markets",
12
- type: "universal",
13
- version: "1.0.0",
14
- description: "Minimal market state machine - extend for custom use cases",
10
+ name: 'MarketUniversal',
11
+ app: 'markets',
12
+ type: 'universal',
13
+ version: '1.0.0',
14
+ description: 'Minimal market state machine - extend for custom use cases',
15
15
  },
16
16
  createSchema: {
17
17
  properties: {},
18
18
  },
19
19
  stateSchema: {
20
20
  properties: {
21
- status: { type: "string" },
22
- totalCommitted: { type: "number", computed: true },
21
+ status: { type: 'string' },
22
+ totalCommitted: { type: 'number', computed: true },
23
23
  },
24
24
  },
25
25
  eventSchemas: {
26
- open: { description: "Open the market for participation" },
27
- cancel: { description: "Cancel the market" },
26
+ open: { description: 'Open the market for participation' },
27
+ cancel: { description: 'Cancel the market' },
28
28
  commit: {
29
- description: "Commit funds to the market",
29
+ description: 'Commit funds to the market',
30
30
  properties: {
31
- amount: { type: "number", minimum: 0 },
31
+ amount: { type: 'number', minimum: 0 },
32
32
  },
33
33
  },
34
- close: { description: "Close the market to new commits" },
35
- settle: { description: "Settle the market" },
34
+ close: { description: 'Close the market to new commits' },
35
+ settle: { description: 'Settle the market' },
36
36
  },
37
37
  states: {
38
38
  PROPOSED: {
39
- id: "PROPOSED",
39
+ id: 'PROPOSED',
40
40
  isFinal: false,
41
41
  metadata: {
42
- label: "Proposed",
43
- description: "Market created but not yet open",
44
- category: "initial",
42
+ label: 'Proposed',
43
+ description: 'Market created but not yet open',
44
+ category: 'initial',
45
45
  },
46
46
  },
47
47
  OPEN: {
48
- id: "OPEN",
48
+ id: 'OPEN',
49
49
  isFinal: false,
50
50
  metadata: {
51
- label: "Open",
52
- description: "Market is open for participation",
53
- category: "active",
51
+ label: 'Open',
52
+ description: 'Market is open for participation',
53
+ category: 'active',
54
54
  },
55
55
  },
56
56
  CLOSED: {
57
- id: "CLOSED",
57
+ id: 'CLOSED',
58
58
  isFinal: false,
59
59
  metadata: {
60
- label: "Closed",
61
- description: "Participation closed; awaiting settlement",
62
- category: "pending",
60
+ label: 'Closed',
61
+ description: 'Participation closed; awaiting settlement',
62
+ category: 'pending',
63
63
  },
64
64
  },
65
65
  SETTLED: {
66
- id: "SETTLED",
66
+ id: 'SETTLED',
67
67
  isFinal: true,
68
68
  metadata: {
69
- label: "Settled",
70
- description: "Market settled and payouts available (terminal)",
71
- category: "terminal",
69
+ label: 'Settled',
70
+ description: 'Market settled and payouts available (terminal)',
71
+ category: 'terminal',
72
72
  },
73
73
  },
74
74
  CANCELLED: {
75
- id: "CANCELLED",
75
+ id: 'CANCELLED',
76
76
  isFinal: true,
77
77
  metadata: {
78
- label: "Cancelled",
79
- description: "Market cancelled before settlement (terminal)",
80
- category: "terminal",
78
+ label: 'Cancelled',
79
+ description: 'Market cancelled before settlement (terminal)',
80
+ category: 'terminal',
81
81
  },
82
82
  },
83
83
  },
84
- initialState: "PROPOSED",
84
+ initialState: 'PROPOSED',
85
85
  transitions: [
86
86
  {
87
- from: "PROPOSED",
88
- to: "OPEN",
89
- eventName: "open",
90
- guard: { "==": [1, 1] },
87
+ from: 'PROPOSED',
88
+ to: 'OPEN',
89
+ eventName: 'open',
90
+ guard: { '==': [1, 1] },
91
91
  effect: {
92
- merge: [
93
- { var: "state" },
94
- { status: "OPEN", openedAt: { var: "$timestamp" } },
95
- ],
92
+ merge: [{ var: 'state' }, { status: 'OPEN', openedAt: { var: '$ordinal' } }],
96
93
  },
97
94
  dependencies: [],
98
95
  },
99
96
  {
100
- from: "PROPOSED",
101
- to: "CANCELLED",
102
- eventName: "cancel",
103
- guard: { "==": [1, 1] },
97
+ from: 'PROPOSED',
98
+ to: 'CANCELLED',
99
+ eventName: 'cancel',
100
+ guard: { '==': [1, 1] },
104
101
  effect: {
105
- merge: [
106
- { var: "state" },
107
- { status: "CANCELLED", cancelledAt: { var: "$timestamp" } },
108
- ],
102
+ merge: [{ var: 'state' }, { status: 'CANCELLED', cancelledAt: { var: '$ordinal' } }],
109
103
  },
110
104
  dependencies: [],
111
105
  },
112
106
  {
113
- from: "OPEN",
114
- to: "OPEN",
115
- eventName: "commit",
116
- guard: { ">": [{ var: "event.amount" }, 0] },
107
+ from: 'OPEN',
108
+ to: 'OPEN',
109
+ eventName: 'commit',
110
+ guard: { '>': [{ var: 'event.amount' }, 0] },
117
111
  effect: {
118
112
  merge: [
119
- { var: "state" },
113
+ { var: 'state' },
120
114
  {
121
115
  totalCommitted: {
122
- "+": [{ var: "state.totalCommitted" }, { var: "event.amount" }],
116
+ '+': [{ var: 'state.totalCommitted' }, { var: 'event.amount' }],
123
117
  },
124
118
  },
125
119
  ],
@@ -127,41 +121,32 @@ exports.marketUniversalDef = (0, fiber_app_js_1.defineFiberApp)({
127
121
  dependencies: [],
128
122
  },
129
123
  {
130
- from: "OPEN",
131
- to: "CLOSED",
132
- eventName: "close",
133
- guard: { "==": [1, 1] },
124
+ from: 'OPEN',
125
+ to: 'CLOSED',
126
+ eventName: 'close',
127
+ guard: { '==': [1, 1] },
134
128
  effect: {
135
- merge: [
136
- { var: "state" },
137
- { status: "CLOSED", closedAt: { var: "$timestamp" } },
138
- ],
129
+ merge: [{ var: 'state' }, { status: 'CLOSED', closedAt: { var: '$ordinal' } }],
139
130
  },
140
131
  dependencies: [],
141
132
  },
142
133
  {
143
- from: "CLOSED",
144
- to: "SETTLED",
145
- eventName: "settle",
146
- guard: { "==": [1, 1] },
134
+ from: 'CLOSED',
135
+ to: 'SETTLED',
136
+ eventName: 'settle',
137
+ guard: { '==': [1, 1] },
147
138
  effect: {
148
- merge: [
149
- { var: "state" },
150
- { status: "SETTLED", settledAt: { var: "$timestamp" } },
151
- ],
139
+ merge: [{ var: 'state' }, { status: 'SETTLED', settledAt: { var: '$ordinal' } }],
152
140
  },
153
141
  dependencies: [],
154
142
  },
155
143
  {
156
- from: "CLOSED",
157
- to: "CANCELLED",
158
- eventName: "cancel",
159
- guard: { "==": [1, 1] },
144
+ from: 'CLOSED',
145
+ to: 'CANCELLED',
146
+ eventName: 'cancel',
147
+ guard: { '==': [1, 1] },
160
148
  effect: {
161
- merge: [
162
- { var: "state" },
163
- { status: "CANCELLED", cancelledAt: { var: "$timestamp" } },
164
- ],
149
+ merge: [{ var: 'state' }, { status: 'CANCELLED', cancelledAt: { var: '$ordinal' } }],
165
150
  },
166
151
  dependencies: [],
167
152
  },
@@ -9,7 +9,8 @@
9
9
  * @packageDocumentation
10
10
  */
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.DEFAULT_ORACLE_CONFIG = exports.getOracleDefinition = exports.oracleStateToJSON = exports.oracleStateFromJSON = exports.OracleDefinition = exports.WithdrawOracleRequest = exports.AddStakeRequest = exports.ActivateOracleRequest = exports.RegisterOracleRequest = exports.Oracle = exports.SlashingEvent = exports.OracleReputation = exports.OracleState = void 0;
12
+ exports.DEFAULT_ORACLE_CONFIG = exports.oracleStateToJSON = exports.oracleStateFromJSON = exports.OracleDefinition = exports.WithdrawOracleRequest = exports.AddStakeRequest = exports.ActivateOracleRequest = exports.RegisterOracleRequest = exports.Oracle = exports.SlashingEvent = exports.OracleReputation = exports.OracleState = void 0;
13
+ exports.getOracleDefinition = getOracleDefinition;
13
14
  var index_js_1 = require("../identity/index.js");
14
15
  Object.defineProperty(exports, "OracleState", { enumerable: true, get: function () { return index_js_1.IdentityState; } });
15
16
  Object.defineProperty(exports, "OracleReputation", { enumerable: true, get: function () { return index_js_1.Reputation; } });
@@ -25,9 +26,8 @@ Object.defineProperty(exports, "oracleStateToJSON", { enumerable: true, get: fun
25
26
  const index_js_2 = require("../identity/index.js");
26
27
  /** @deprecated Use `getIdentityDefinition('oracle')` from `@ottochain/sdk/apps/identity` */
27
28
  function getOracleDefinition(_type) {
28
- return (0, index_js_2.getIdentityDefinition)("oracle");
29
+ return (0, index_js_2.getIdentityDefinition)('oracle');
29
30
  }
30
- exports.getOracleDefinition = getOracleDefinition;
31
31
  /** @deprecated Use `DEFAULT_REPUTATION_CONFIG` from `@ottochain/sdk/apps/identity` */
32
32
  exports.DEFAULT_ORACLE_CONFIG = {
33
33
  minStake: 100,
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ /**
3
+ * Privacy Application — note-layer privacy primitives.
4
+ *
5
+ * Σ-protocol / ZK-backed fibers that carry real privacy on the OttoChain note
6
+ * layer. The flagship is `sigma-mixer`, a CDS OR-of-`dhtuple` ring mixer whose
7
+ * anonymity comes from a `sigma_verify` ring proof and whose double-spend safety
8
+ * comes from a witness-bound nullifier (`Nf = x_j·H`, `H` a NUMS base of unknown
9
+ * dlog w.r.t. `G`).
10
+ *
11
+ * The std-lib UTXO primitive is `shielded-note-pool` ({@link notePoolDef}): a
12
+ * fixed-denomination Tornado-style private asset pool over the `zk-shielded`
13
+ * Groth16 circuit. ⚠ UNAUDITED / TEST-ASSETS-ONLY (BN254 ~100-bit, single trusted
14
+ * relayer for root advancement) — see note-pool.ts.
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * import { getPrivacyDefinition, PRIVACY_DEFINITIONS, sigmaDdhRingOf, notePoolDef } from '@ottochain/sdk/apps/privacy';
19
+ *
20
+ * const mixerDef = getPrivacyDefinition('sigma-mixer');
21
+ * // Build a custom n-member OR-of-dhtuple proposition for an audited H:
22
+ * const prop = sigmaDdhRingOf('state.points', 'event.nullifier', G_HEX, H_HEX, 8);
23
+ * // Instantiate a shielded note-pool (pin the circuit vkey + denomination + relayer):
24
+ * const pool = notePoolDef({ vkey, depth: 8, denom: 100, poolPolicyRef, feeAsset, relayer });
25
+ * ```
26
+ *
27
+ * @packageDocumentation
28
+ */
29
+ Object.defineProperty(exports, "__esModule", { value: true });
30
+ exports.PRIVACY_DEFINITIONS = exports.shieldedNotePoolDef = exports.pmtMembership = exports.pvField = exports.ZERO_WORD = exports.PV_LAYOUT = exports.NOTE_POOL_STATE = exports.notePoolDef = exports.sigmaDdhRingOf = exports.mixerDdhRingDef = void 0;
31
+ exports.getPrivacyDefinition = getPrivacyDefinition;
32
+ const index_js_1 = require("./state-machines/index.js");
33
+ Object.defineProperty(exports, "mixerDdhRingDef", { enumerable: true, get: function () { return index_js_1.mixerDdhRingDef; } });
34
+ Object.defineProperty(exports, "sigmaDdhRingOf", { enumerable: true, get: function () { return index_js_1.sigmaDdhRingOf; } });
35
+ Object.defineProperty(exports, "notePoolDef", { enumerable: true, get: function () { return index_js_1.notePoolDef; } });
36
+ Object.defineProperty(exports, "NOTE_POOL_STATE", { enumerable: true, get: function () { return index_js_1.NOTE_POOL_STATE; } });
37
+ Object.defineProperty(exports, "PV_LAYOUT", { enumerable: true, get: function () { return index_js_1.PV_LAYOUT; } });
38
+ Object.defineProperty(exports, "ZERO_WORD", { enumerable: true, get: function () { return index_js_1.ZERO_WORD; } });
39
+ Object.defineProperty(exports, "pvField", { enumerable: true, get: function () { return index_js_1.pvField; } });
40
+ Object.defineProperty(exports, "pmtMembership", { enumerable: true, get: function () { return index_js_1.pmtMembership; } });
41
+ /**
42
+ * A documented DEFAULT shielded-note-pool instance for the registry/lint surface, with PLACEHOLDER
43
+ * pin values (the real vkey comes from the SP1 `zk-shielded` toolchain; relayer/policy are
44
+ * deployment-specific). Downstream callers should build their own via {@link notePoolDef}; this
45
+ * instance exists so the privacy app group exposes a concrete `shielded-note-pool` definition.
46
+ * ⚠ UNAUDITED / TEST-ASSETS-ONLY.
47
+ */
48
+ exports.shieldedNotePoolDef = (0, index_js_1.notePoolDef)({
49
+ vkey: index_js_1.ZERO_WORD,
50
+ depth: 8,
51
+ denom: 100,
52
+ poolPolicyRef: 'std.privacy.note-pool',
53
+ feeAsset: index_js_1.ZERO_WORD,
54
+ relayer: 'DAG0000000000000000000000000000000000000000',
55
+ });
56
+ /** All privacy (note-layer) state machine definitions. */
57
+ exports.PRIVACY_DEFINITIONS = {
58
+ 'sigma-mixer': index_js_1.mixerDdhRingDef,
59
+ 'shielded-note-pool': exports.shieldedNotePoolDef,
60
+ };
61
+ /**
62
+ * Get a privacy state machine definition by type.
63
+ * @param type - 'sigma-mixer' (default) | 'shielded-note-pool'.
64
+ */
65
+ function getPrivacyDefinition(type = 'sigma-mixer') {
66
+ return exports.PRIVACY_DEFINITIONS[type];
67
+ }
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ /**
3
+ * Privacy (note-layer) state machine definitions.
4
+ * Re-exports from TypeScript definition files.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.pmtMembership = exports.pvField = exports.ZERO_WORD = exports.PV_LAYOUT = exports.NOTE_POOL_STATE = exports.notePoolDef = exports.sigmaDdhRingOf = exports.mixerDdhRingDef = void 0;
8
+ var mixer_ddhRing_js_1 = require("./mixer-ddhRing.js");
9
+ Object.defineProperty(exports, "mixerDdhRingDef", { enumerable: true, get: function () { return mixer_ddhRing_js_1.mixerDdhRingDef; } });
10
+ Object.defineProperty(exports, "sigmaDdhRingOf", { enumerable: true, get: function () { return mixer_ddhRing_js_1.sigmaDdhRingOf; } });
11
+ var note_pool_js_1 = require("./note-pool.js");
12
+ Object.defineProperty(exports, "notePoolDef", { enumerable: true, get: function () { return note_pool_js_1.notePoolDef; } });
13
+ Object.defineProperty(exports, "NOTE_POOL_STATE", { enumerable: true, get: function () { return note_pool_js_1.NOTE_POOL_STATE; } });
14
+ Object.defineProperty(exports, "PV_LAYOUT", { enumerable: true, get: function () { return note_pool_js_1.PV_LAYOUT; } });
15
+ Object.defineProperty(exports, "ZERO_WORD", { enumerable: true, get: function () { return note_pool_js_1.ZERO_WORD; } });
16
+ Object.defineProperty(exports, "pvField", { enumerable: true, get: function () { return note_pool_js_1.pvField; } });
17
+ Object.defineProperty(exports, "pmtMembership", { enumerable: true, get: function () { return note_pool_js_1.pmtMembership; } });
@@ -0,0 +1,286 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mixerDdhRingDef = void 0;
4
+ exports.sigmaDdhRingOf = sigmaDdhRingOf;
5
+ const fiber_app_js_1 = require("../../../schema/fiber-app.js");
6
+ /**
7
+ * sigma-mixer — a CDS OR-of-`dhtuple` Σ-protocol ring mixer.
8
+ *
9
+ * Anonymity comes from a Cramer–Damgård–Schoenmakers OR-proof over the deposited
10
+ * ring, verified by the `sigma_verify` JLVM opcode; double-spend safety comes
11
+ * from a WITNESS-BOUND nullifier carried as the shared DDH point of an
12
+ * OR-of-`dhtuple` proposition.
13
+ *
14
+ * Each ring branch is a DDH tuple `dhtuple(G, H, P_i, Nf)`. A satisfied dhtuple
15
+ * proves knowledge of one `x` with `P_i = x·G` AND `Nf = x·H` (the verifier uses
16
+ * a SINGLE shared response `z` for both coordinate reconstructions
17
+ * `a1 = z·G − e·P_i`, `a2 = z·H − e·Nf`). The OR uses the SAME
18
+ * `v = event.nullifier` in every branch, so it hides which branch while forcing
19
+ * `event.nullifier = x_j·H` for the one real branch `j`. With `H` a NUMS base of
20
+ * unknown dlog w.r.t. `G`, the map `x ↦ x·H` is injective, so the nullifier is
21
+ * cryptographically bound to the proven secret — closing the
22
+ * witness-unbound-nullifier double-spend hole an OR-of-`dlog` ring leaves open.
23
+ *
24
+ * Verified against `@constellation-network/metagraph-sdk-jlvm@1.8.0-rc.5`: the
25
+ * `sigma_verify` dhtuple operands are exactly `["type","g","h","u","v"]` (each a
26
+ * 64-byte G1 hex), the OR child challenges XOR to the node challenge, and the
27
+ * strong-FS root challenge folds the bound message. Array append uses `merge`
28
+ * (`merge([arr,[item]])` flattens one level == append). All operators used
29
+ * (`sigma_verify`, `has`, `set`, `none`, `cat`, `substr`, `merge`) are in
30
+ * KNOWN_OPERATORS.
31
+ *
32
+ * SCOPE: this base definition is CRYPTO + LIFECYCLE. Production custody
33
+ * (`_transferAsset` in on deposit / out on withdraw), a signer-bound deposit-auth
34
+ * clause, and a `mixerId`-prefixed bound message are layered on by a downstream
35
+ * specialization (see the §8 production-hardening note in the design doc).
36
+ */
37
+ // =============================================================================
38
+ // sigmaDdhRingOf — the OR-of-dhtuple proposition builder
39
+ // =============================================================================
40
+ /**
41
+ * Emit the `or`-of-`dhtuple` proposition for an `n`-member ring, unrolling
42
+ * `{"var":"<pointsVar>.k"}` for `k in 0..n-1` as the `u` (commitment) of each
43
+ * branch, with `g = gHex`, `h = hHex` (literal 64-byte G1 hex) and a shared
44
+ * `v = {"var":"<nullifierVar>"}` across ALL branches.
45
+ *
46
+ * `n` is FIXED at definition time (the proposition shape is closed). `u` and `v`
47
+ * are `{"var":...}` map-node values that the evaluator resolves element-wise.
48
+ *
49
+ * @param pointsVar state var holding the ordered ring points, e.g. `"state.points"`.
50
+ * @param nullifierVar event var holding the revealed nullifier, e.g. `"event.nullifier"`.
51
+ * @param gHex the verifier generator `G=(1,2)` as 64-byte `0x` hex.
52
+ * @param hHex the NUMS second base `H` as 64-byte `0x` hex (unknown dlog wrt G).
53
+ * @param n ring size (number of unrolled branches).
54
+ */
55
+ function sigmaDdhRingOf(pointsVar, nullifierVar, gHex, hHex, n) {
56
+ const children = [];
57
+ for (let k = 0; k < n; k++) {
58
+ children.push({
59
+ type: 'dhtuple',
60
+ g: gHex,
61
+ h: hHex,
62
+ u: { var: `${pointsVar}.${k}` },
63
+ v: { var: nullifierVar },
64
+ });
65
+ }
66
+ return { type: 'or', children };
67
+ }
68
+ /**
69
+ * The shared withdraw verify clauses (ring proof ∧ freshness ∧ recipient-bind).
70
+ * The lifecycle clause (`→drained` vs `→open`) is appended per transition.
71
+ */
72
+ function withdrawVerifyClauses(gHex, hHex, n) {
73
+ return [
74
+ {
75
+ sigma_verify: [
76
+ sigmaDdhRingOf('state.points', 'event.nullifier', gHex, hHex, n),
77
+ { var: 'event.proof' },
78
+ { var: 'event.message' },
79
+ ],
80
+ },
81
+ // Double-withdraw prevention: the witness-bound nullifier must be unseen.
82
+ { '!': { has: [{ var: 'state.spentNullifiers' }, { var: 'event.nullifier' }] } },
83
+ // Recipient binding (anti-front-run): message == Nf ‖ recipientHex.
84
+ {
85
+ '===': [
86
+ { var: 'event.message' },
87
+ {
88
+ cat: ['0x', { substr: [{ var: 'event.nullifier' }, 2] }, { substr: [{ var: 'event.recipientHex' }, 2] }],
89
+ },
90
+ ],
91
+ },
92
+ ];
93
+ }
94
+ // The withdraw effect: record the nullifier, advance the counter (+ optional status).
95
+ function withdrawEffect(extra) {
96
+ return {
97
+ merge: [
98
+ { var: 'state' },
99
+ {
100
+ spentNullifiers: {
101
+ set: [{ var: 'state.spentNullifiers' }, { var: 'event.nullifier' }, true],
102
+ },
103
+ withdrawCount: { '+': [{ var: 'state.withdrawCount' }, 1] },
104
+ ...extra,
105
+ },
106
+ ],
107
+ };
108
+ }
109
+ // G=(1,2) and the NUMS H are the e2e defaults (derived by scripts/gen-sigma-mixer-fixture.ts).
110
+ // Downstream apps pass their own audited H via the builder; these are the pinned-ring v1 demo values.
111
+ const G_HEX = '0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002';
112
+ const H_HEX = '0x039c846e3a79217fd140d094eec09fe4f398085d01dee70506edde1eb6a9d81608922722cc3a6c3a7ae4929e78e82dc5f25e91598a69f7f8b9b3adb95badb3d0';
113
+ const RING_N = 4;
114
+ /**
115
+ * sigma-mixer fiber definition (pinned-ring v1, n=4).
116
+ *
117
+ * Trust model: PUBLIC. Anyone may deposit a ring point or submit a withdrawal.
118
+ * Privacy = a CDS OR-proof hides which of the n branches is being spent;
119
+ * anonymity set = exactly n (the ring size is public). Double-spend safety =
120
+ * the witness-bound nullifier + spent-set. Replay/front-run safety = the
121
+ * message-bound recipient.
122
+ */
123
+ exports.mixerDdhRingDef = (0, fiber_app_js_1.defineFiberApp)({
124
+ metadata: {
125
+ name: 'MixerDdhRing',
126
+ app: 'privacy',
127
+ type: 'sigma-mixer',
128
+ version: '1.0.0',
129
+ description: 'CDS OR-of-dhtuple Σ-protocol ring mixer. Anonymity via sigma_verify over an ' +
130
+ 'OR of DDH tuples (G,H,P_i,nullifier); the revealed nullifier Nf=x_j·H is ' +
131
+ 'witness-bound (H has unknown dlog wrt G), closing the ring-drain double-spend. ' +
132
+ 'Frozen-ring lifecycle (filling→open→drained) + message-bound recipient.',
133
+ },
134
+ createSchema: {
135
+ required: ['mixerId', 'denomination', 'anonymityTarget'],
136
+ properties: {
137
+ mixerId: { type: 'string', immutable: true, description: 'Mixer instance id.' },
138
+ denomination: {
139
+ type: 'integer',
140
+ immutable: true,
141
+ description: 'Equal denomination per deposit/withdraw (production custody).',
142
+ },
143
+ nullifierBaseH: {
144
+ type: 'string',
145
+ immutable: true,
146
+ description: 'The NUMS second base H (64B G1 hex); informational — H is inlined in the proposition.',
147
+ },
148
+ anonymityTarget: {
149
+ type: 'integer',
150
+ immutable: true,
151
+ description: 'Ring size n; the ring opens once depositCount == anonymityTarget.',
152
+ },
153
+ points: {
154
+ type: 'array',
155
+ items: { type: 'string' },
156
+ default: [],
157
+ description: 'Ordered ring commitments P_i = x_i·G (64B G1 hex).',
158
+ },
159
+ spentNullifiers: {
160
+ type: 'object',
161
+ default: {},
162
+ description: 'FLAT map nullifierHex -> true. MUST be {} (never null): has/set throw on null.',
163
+ },
164
+ depositCount: { type: 'integer', default: 0 },
165
+ withdrawCount: { type: 'integer', default: 0 },
166
+ status: { type: 'string', default: 'filling', description: 'filling → open → drained.' },
167
+ },
168
+ },
169
+ stateSchema: {
170
+ properties: {
171
+ mixerId: { type: 'string', immutable: true },
172
+ denomination: { type: 'integer', immutable: true },
173
+ nullifierBaseH: { type: 'string', immutable: true },
174
+ anonymityTarget: { type: 'integer', immutable: true },
175
+ points: { type: 'array', items: { type: 'string' }, computed: true },
176
+ spentNullifiers: { type: 'object', computed: true },
177
+ depositCount: { type: 'integer', computed: true },
178
+ withdrawCount: { type: 'integer', computed: true },
179
+ status: { type: 'string', computed: true },
180
+ },
181
+ },
182
+ eventSchemas: {
183
+ deposit: { description: 'Register a ring commitment point P_i = x_i·G.' },
184
+ withdraw: {
185
+ description: 'Spend one ring slot: a CDS OR-of-dhtuple proof + witness-bound nullifier + bound recipient.',
186
+ },
187
+ },
188
+ states: {
189
+ filling: {
190
+ id: 'filling',
191
+ isFinal: false,
192
+ metadata: { label: 'Filling', description: 'Ring accepting deposits.', category: 'active' },
193
+ },
194
+ open: {
195
+ id: 'open',
196
+ isFinal: false,
197
+ metadata: { label: 'Open', description: 'Ring frozen; withdrawals allowed.', category: 'active' },
198
+ },
199
+ drained: {
200
+ id: 'drained',
201
+ isFinal: true,
202
+ metadata: { label: 'Drained', description: 'All slots withdrawn; one-shot.', category: 'terminal' },
203
+ },
204
+ },
205
+ initialState: 'filling',
206
+ // ORDER IS LOAD-BEARING: the open-flip deposit is declared FIRST (exact
207
+ // boundary), the drained-flip withdraw is declared FIRST (exact boundary).
208
+ transitions: [
209
+ // Deposit A — the LAST deposit: filling → open. Declared FIRST.
210
+ {
211
+ from: 'filling',
212
+ to: 'open',
213
+ eventName: 'deposit',
214
+ guard: {
215
+ and: [
216
+ { '===': [{ '+': [{ var: 'state.depositCount' }, 1] }, { var: 'state.anonymityTarget' }] },
217
+ { '!!': [{ var: 'event.point' }] },
218
+ { none: [{ var: 'state.points' }, { '===': [{ var: '' }, { var: 'event.point' }] }] },
219
+ ],
220
+ },
221
+ effect: {
222
+ merge: [
223
+ { var: 'state' },
224
+ {
225
+ // Array append = merge([arr,[item]]) (verified: opMerge flattens one level).
226
+ points: { merge: [{ var: 'state.points' }, [{ var: 'event.point' }]] },
227
+ depositCount: { '+': [{ var: 'state.depositCount' }, 1] },
228
+ status: 'open',
229
+ },
230
+ ],
231
+ },
232
+ dependencies: [],
233
+ },
234
+ // Deposit B — not-yet-last: filling → filling. Declared SECOND.
235
+ {
236
+ from: 'filling',
237
+ to: 'filling',
238
+ eventName: 'deposit',
239
+ guard: {
240
+ and: [
241
+ { '<': [{ '+': [{ var: 'state.depositCount' }, 1] }, { var: 'state.anonymityTarget' }] },
242
+ { '!!': [{ var: 'event.point' }] },
243
+ { none: [{ var: 'state.points' }, { '===': [{ var: '' }, { var: 'event.point' }] }] },
244
+ ],
245
+ },
246
+ effect: {
247
+ merge: [
248
+ { var: 'state' },
249
+ {
250
+ points: { merge: [{ var: 'state.points' }, [{ var: 'event.point' }]] },
251
+ depositCount: { '+': [{ var: 'state.depositCount' }, 1] },
252
+ },
253
+ ],
254
+ },
255
+ dependencies: [],
256
+ },
257
+ // Withdraw → drained (the LAST withdrawal). Declared FIRST.
258
+ {
259
+ from: 'open',
260
+ to: 'drained',
261
+ eventName: 'withdraw',
262
+ guard: {
263
+ and: [
264
+ ...withdrawVerifyClauses(G_HEX, H_HEX, RING_N),
265
+ { '===': [{ '+': [{ var: 'state.withdrawCount' }, 1] }, { var: 'state.anonymityTarget' }] },
266
+ ],
267
+ },
268
+ effect: withdrawEffect({ status: 'drained' }),
269
+ dependencies: [],
270
+ },
271
+ // Withdraw → open (not-yet-last). Declared SECOND.
272
+ {
273
+ from: 'open',
274
+ to: 'open',
275
+ eventName: 'withdraw',
276
+ guard: {
277
+ and: [
278
+ ...withdrawVerifyClauses(G_HEX, H_HEX, RING_N),
279
+ { '<': [{ '+': [{ var: 'state.withdrawCount' }, 1] }, { var: 'state.anonymityTarget' }] },
280
+ ],
281
+ },
282
+ effect: withdrawEffect({}),
283
+ dependencies: [],
284
+ },
285
+ ],
286
+ });