@ottochain/sdk 2.4.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 (225) 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 +1 -1
  5. package/dist/cjs/apps/contracts/state-machines/contract-agreement.js +126 -148
  6. package/dist/cjs/apps/contracts/state-machines/contract-escrow.js +153 -174
  7. package/dist/cjs/apps/contracts/state-machines/contract-universal.js +46 -58
  8. package/dist/cjs/apps/corporate/state-machines/corp-board.js +415 -481
  9. package/dist/cjs/apps/corporate/state-machines/corp-entity.js +368 -440
  10. package/dist/cjs/apps/corporate/state-machines/corp-securities.js +532 -647
  11. package/dist/cjs/apps/corporate/state-machines/corp-shareholders.js +499 -603
  12. package/dist/cjs/apps/governance/index.js +7 -7
  13. package/dist/cjs/apps/governance/state-machines/dao-multisig.js +170 -209
  14. package/dist/cjs/apps/governance/state-machines/dao-reputation.js +161 -214
  15. package/dist/cjs/apps/governance/state-machines/dao-single.js +92 -92
  16. package/dist/cjs/apps/governance/state-machines/dao-token.js +169 -223
  17. package/dist/cjs/apps/governance/state-machines/governance-simple.js +185 -217
  18. package/dist/cjs/apps/governance/state-machines/governance-universal.js +64 -64
  19. package/dist/cjs/apps/identity/constants.js +16 -24
  20. package/dist/cjs/apps/identity/index.js +1 -1
  21. package/dist/cjs/apps/identity/state-machines/identity-agent.js +124 -158
  22. package/dist/cjs/apps/identity/state-machines/identity-oracle.js +151 -169
  23. package/dist/cjs/apps/identity/state-machines/identity-registry.js +89 -115
  24. package/dist/cjs/apps/identity/state-machines/identity-universal.js +51 -57
  25. package/dist/cjs/apps/index.js +4 -1
  26. package/dist/cjs/apps/lending/assets.js +41 -17
  27. package/dist/cjs/apps/lending/credit-scoring.js +4 -4
  28. package/dist/cjs/apps/lending/eligibility.js +9 -25
  29. package/dist/cjs/apps/lending/index.js +1 -1
  30. package/dist/cjs/apps/lending/state-machines/lending-zk-loan.js +177 -156
  31. package/dist/cjs/apps/markets/index.js +1 -1
  32. package/dist/cjs/apps/markets/state-machines/market-auction.js +115 -134
  33. package/dist/cjs/apps/markets/state-machines/market-crowdfund.js +122 -137
  34. package/dist/cjs/apps/markets/state-machines/market-group-buy.js +158 -177
  35. package/dist/cjs/apps/markets/state-machines/market-prediction.js +193 -227
  36. package/dist/cjs/apps/markets/state-machines/market-universal.js +65 -80
  37. package/dist/cjs/apps/oracles/index.js +1 -1
  38. package/dist/cjs/apps/privacy/index.js +67 -0
  39. package/dist/cjs/apps/privacy/state-machines/index.js +17 -0
  40. package/dist/cjs/apps/privacy/state-machines/mixer-ddhRing.js +286 -0
  41. package/dist/cjs/apps/privacy/state-machines/note-pool.js +476 -0
  42. package/dist/cjs/apps/staked-pool/assets.js +103 -0
  43. package/dist/cjs/apps/staked-pool/base.js +498 -0
  44. package/dist/cjs/apps/staked-pool/consumer.js +55 -0
  45. package/dist/cjs/apps/staked-pool/index.js +83 -0
  46. package/dist/cjs/apps/staked-pool/state-machines/index.js +12 -0
  47. package/dist/cjs/apps/staked-pool/state-machines/staked-pool-base.js +49 -0
  48. package/dist/cjs/apps/staked-pool/state-machines/staked-pool-oracle.js +131 -0
  49. package/dist/cjs/generated/google/protobuf/struct.js +1 -1
  50. package/dist/cjs/generated/google/protobuf/timestamp.js +1 -1
  51. package/dist/cjs/generated/ottochain/apps/contracts/v1/contract.js +1 -1
  52. package/dist/cjs/generated/ottochain/apps/corporate/v1/corporate.js +1 -1
  53. package/dist/cjs/generated/ottochain/apps/governance/v1/governance.js +1 -1
  54. package/dist/cjs/generated/ottochain/apps/identity/v1/attestation.js +1 -1
  55. package/dist/cjs/generated/ottochain/apps/identity/v1/identity.js +1 -1
  56. package/dist/cjs/generated/ottochain/apps/markets/v1/market.js +1 -1
  57. package/dist/cjs/generated/ottochain/v1/common.js +1 -1
  58. package/dist/cjs/generated/ottochain/v1/fiber.js +40 -2
  59. package/dist/cjs/generated/ottochain/v1/messages.js +1 -1
  60. package/dist/cjs/generated/ottochain/v1/records.js +1 -1
  61. package/dist/cjs/index.js +20 -3
  62. package/dist/cjs/ottochain/genesis-manifest.js +6 -0
  63. package/dist/cjs/ottochain/metagraph-client.js +16 -8
  64. package/dist/cjs/ottochain/snapshot.js +2 -4
  65. package/dist/cjs/ottochain/transaction.js +10 -0
  66. package/dist/cjs/privacy/sealed-bid.js +85 -82
  67. package/dist/cjs/privacy/shield-app.js +32 -32
  68. package/dist/cjs/schema/effects.js +117 -1
  69. package/dist/cjs/schema/fiber-app.js +132 -3
  70. package/dist/cjs/schema/guard-lint.js +3 -12
  71. package/dist/cjs/schema/guards.js +38 -38
  72. package/dist/cjs/templates/asset-policy.js +190 -0
  73. package/dist/cjs/templates/index.js +86 -0
  74. package/dist/cjs/templates/machine.js +130 -0
  75. package/dist/cjs/templates/migration.js +39 -0
  76. package/dist/cjs/templates/state-shape.js +38 -0
  77. package/dist/cjs/validation.js +1 -3
  78. package/dist/esm/apps/compute/index.js +29 -0
  79. package/dist/esm/apps/compute/state-machines/compute-rule110.js +161 -0
  80. package/dist/esm/apps/compute/state-machines/index.js +5 -0
  81. package/dist/esm/apps/contracts/index.js +4 -4
  82. package/dist/esm/apps/contracts/state-machines/contract-agreement.js +128 -150
  83. package/dist/esm/apps/contracts/state-machines/contract-escrow.js +155 -176
  84. package/dist/esm/apps/contracts/state-machines/contract-universal.js +47 -59
  85. package/dist/esm/apps/corporate/index.js +2 -2
  86. package/dist/esm/apps/corporate/state-machines/corp-board.js +418 -484
  87. package/dist/esm/apps/corporate/state-machines/corp-entity.js +371 -443
  88. package/dist/esm/apps/corporate/state-machines/corp-securities.js +535 -650
  89. package/dist/esm/apps/corporate/state-machines/corp-shareholders.js +502 -606
  90. package/dist/esm/apps/governance/index.js +10 -10
  91. package/dist/esm/apps/governance/state-machines/dao-multisig.js +172 -211
  92. package/dist/esm/apps/governance/state-machines/dao-reputation.js +163 -216
  93. package/dist/esm/apps/governance/state-machines/dao-single.js +94 -94
  94. package/dist/esm/apps/governance/state-machines/dao-token.js +171 -225
  95. package/dist/esm/apps/governance/state-machines/governance-simple.js +187 -219
  96. package/dist/esm/apps/governance/state-machines/governance-universal.js +65 -65
  97. package/dist/esm/apps/identity/constants.js +18 -26
  98. package/dist/esm/apps/identity/index.js +8 -8
  99. package/dist/esm/apps/identity/state-machines/identity-agent.js +125 -159
  100. package/dist/esm/apps/identity/state-machines/identity-oracle.js +153 -171
  101. package/dist/esm/apps/identity/state-machines/identity-registry.js +91 -117
  102. package/dist/esm/apps/identity/state-machines/identity-universal.js +52 -58
  103. package/dist/esm/apps/index.js +9 -6
  104. package/dist/esm/apps/lending/assets.js +41 -17
  105. package/dist/esm/apps/lending/credit-scoring.js +6 -6
  106. package/dist/esm/apps/lending/eligibility.js +10 -26
  107. package/dist/esm/apps/lending/index.js +5 -5
  108. package/dist/esm/apps/lending/state-machines/lending-zk-loan.js +178 -157
  109. package/dist/esm/apps/markets/index.js +5 -5
  110. package/dist/esm/apps/markets/state-machines/market-auction.js +117 -136
  111. package/dist/esm/apps/markets/state-machines/market-crowdfund.js +124 -139
  112. package/dist/esm/apps/markets/state-machines/market-group-buy.js +160 -179
  113. package/dist/esm/apps/markets/state-machines/market-prediction.js +195 -229
  114. package/dist/esm/apps/markets/state-machines/market-universal.js +66 -81
  115. package/dist/esm/apps/oracles/index.js +3 -3
  116. package/dist/esm/apps/privacy/index.js +56 -0
  117. package/dist/esm/apps/privacy/state-machines/index.js +6 -0
  118. package/dist/esm/apps/privacy/state-machines/mixer-ddhRing.js +282 -0
  119. package/dist/esm/apps/privacy/state-machines/note-pool.js +470 -0
  120. package/dist/esm/apps/staked-pool/assets.js +91 -0
  121. package/dist/esm/apps/staked-pool/base.js +493 -0
  122. package/dist/esm/apps/staked-pool/consumer.js +49 -0
  123. package/dist/esm/apps/staked-pool/index.js +60 -0
  124. package/dist/esm/apps/staked-pool/state-machines/index.js +6 -0
  125. package/dist/esm/apps/staked-pool/state-machines/staked-pool-base.js +46 -0
  126. package/dist/esm/apps/staked-pool/state-machines/staked-pool-oracle.js +127 -0
  127. package/dist/esm/generated/google/protobuf/struct.js +1 -1
  128. package/dist/esm/generated/google/protobuf/timestamp.js +1 -1
  129. package/dist/esm/generated/ottochain/apps/contracts/v1/contract.js +1 -1
  130. package/dist/esm/generated/ottochain/apps/corporate/v1/corporate.js +1 -1
  131. package/dist/esm/generated/ottochain/apps/governance/v1/governance.js +1 -1
  132. package/dist/esm/generated/ottochain/apps/identity/v1/attestation.js +1 -1
  133. package/dist/esm/generated/ottochain/apps/identity/v1/identity.js +1 -1
  134. package/dist/esm/generated/ottochain/apps/markets/v1/market.js +1 -1
  135. package/dist/esm/generated/ottochain/v1/common.js +1 -1
  136. package/dist/esm/generated/ottochain/v1/fiber.js +40 -2
  137. package/dist/esm/generated/ottochain/v1/messages.js +1 -1
  138. package/dist/esm/generated/ottochain/v1/records.js +1 -1
  139. package/dist/esm/index.js +10 -4
  140. package/dist/esm/ottochain/genesis-manifest.js +6 -0
  141. package/dist/esm/ottochain/metagraph-client.js +16 -8
  142. package/dist/esm/ottochain/snapshot.js +2 -4
  143. package/dist/esm/ottochain/transaction.js +8 -0
  144. package/dist/esm/privacy/index.js +2 -2
  145. package/dist/esm/privacy/sealed-bid.js +87 -84
  146. package/dist/esm/privacy/shield-app.js +33 -33
  147. package/dist/esm/schema/effects.js +110 -0
  148. package/dist/esm/schema/fiber-app.js +127 -3
  149. package/dist/esm/schema/guard-lint.js +3 -12
  150. package/dist/esm/schema/guards.js +36 -37
  151. package/dist/esm/templates/asset-policy.js +182 -0
  152. package/dist/esm/templates/index.js +41 -0
  153. package/dist/esm/templates/machine.js +125 -0
  154. package/dist/esm/templates/migration.js +34 -0
  155. package/dist/esm/templates/state-shape.js +34 -0
  156. package/dist/esm/validation.js +1 -3
  157. package/dist/esm/zk/index.js +4 -4
  158. package/dist/types/apps/compute/index.d.ts +176 -0
  159. package/dist/types/apps/compute/state-machines/compute-rule110.d.ts +157 -0
  160. package/dist/types/apps/compute/state-machines/index.d.ts +5 -0
  161. package/dist/types/apps/contracts/index.d.ts +14 -14
  162. package/dist/types/apps/contracts/state-machines/contract-agreement.d.ts +3 -3
  163. package/dist/types/apps/contracts/state-machines/contract-escrow.d.ts +3 -3
  164. package/dist/types/apps/contracts/state-machines/contract-universal.d.ts +4 -4
  165. package/dist/types/apps/corporate/index.d.ts +162 -162
  166. package/dist/types/apps/corporate/state-machines/corp-board.d.ts +88 -88
  167. package/dist/types/apps/corporate/state-machines/corp-entity.d.ts +14 -14
  168. package/dist/types/apps/corporate/state-machines/corp-securities.d.ts +18 -18
  169. package/dist/types/apps/corporate/state-machines/corp-shareholders.d.ts +43 -43
  170. package/dist/types/apps/governance/index.d.ts +81 -81
  171. package/dist/types/apps/governance/state-machines/dao-multisig.d.ts +16 -16
  172. package/dist/types/apps/governance/state-machines/dao-reputation.d.ts +22 -22
  173. package/dist/types/apps/governance/state-machines/dao-token.d.ts +21 -21
  174. package/dist/types/apps/governance/state-machines/governance-simple.d.ts +11 -11
  175. package/dist/types/apps/governance/state-machines/governance-universal.d.ts +4 -4
  176. package/dist/types/apps/identity/constants.d.ts +2 -2
  177. package/dist/types/apps/identity/index.d.ts +70 -70
  178. package/dist/types/apps/identity/state-machines/identity-agent.d.ts +23 -23
  179. package/dist/types/apps/identity/state-machines/identity-oracle.d.ts +11 -11
  180. package/dist/types/apps/identity/state-machines/identity-registry.d.ts +27 -27
  181. package/dist/types/apps/identity/state-machines/identity-universal.d.ts +4 -4
  182. package/dist/types/apps/index.d.ts +9 -6
  183. package/dist/types/apps/lending/assets.d.ts +2 -2
  184. package/dist/types/apps/lending/credit-scoring.d.ts +5 -5
  185. package/dist/types/apps/lending/eligibility.d.ts +2 -2
  186. package/dist/types/apps/lending/index.d.ts +20 -12
  187. package/dist/types/apps/lending/state-machines/lending-zk-loan.d.ts +15 -7
  188. package/dist/types/apps/markets/index.d.ts +76 -76
  189. package/dist/types/apps/markets/state-machines/market-auction.d.ts +12 -12
  190. package/dist/types/apps/markets/state-machines/market-crowdfund.d.ts +19 -19
  191. package/dist/types/apps/markets/state-machines/market-group-buy.d.ts +18 -18
  192. package/dist/types/apps/markets/state-machines/market-prediction.d.ts +15 -15
  193. package/dist/types/apps/markets/state-machines/market-universal.d.ts +7 -7
  194. package/dist/types/apps/oracles/index.d.ts +1 -1
  195. package/dist/types/apps/privacy/index.d.ts +328 -0
  196. package/dist/types/apps/privacy/state-machines/index.d.ts +6 -0
  197. package/dist/types/apps/privacy/state-machines/mixer-ddhRing.d.ts +337 -0
  198. package/dist/types/apps/privacy/state-machines/note-pool.d.ts +196 -0
  199. package/dist/types/apps/staked-pool/assets.d.ts +53 -0
  200. package/dist/types/apps/staked-pool/base.d.ts +80 -0
  201. package/dist/types/apps/staked-pool/consumer.d.ts +29 -0
  202. package/dist/types/apps/staked-pool/index.d.ts +51 -0
  203. package/dist/types/apps/staked-pool/state-machines/index.d.ts +6 -0
  204. package/dist/types/apps/staked-pool/state-machines/staked-pool-base.d.ts +8 -0
  205. package/dist/types/apps/staked-pool/state-machines/staked-pool-oracle.d.ts +34 -0
  206. package/dist/types/generated/openapi.d.ts +13 -0
  207. package/dist/types/generated/ottochain/v1/fiber.d.ts +7 -0
  208. package/dist/types/index.d.ts +3 -3
  209. package/dist/types/openapi.d.ts +4 -2
  210. package/dist/types/ottochain/genesis-manifest.d.ts +6 -0
  211. package/dist/types/ottochain/transaction.d.ts +9 -1
  212. package/dist/types/ottochain/types.d.ts +1 -1
  213. package/dist/types/privacy/index.d.ts +2 -2
  214. package/dist/types/privacy/sealed-bid.d.ts +9 -9
  215. package/dist/types/privacy/shield-app.d.ts +1 -1
  216. package/dist/types/schema/effects.d.ts +107 -0
  217. package/dist/types/schema/fiber-app.d.ts +281 -0
  218. package/dist/types/schema/guards.d.ts +12 -0
  219. package/dist/types/templates/asset-policy.d.ts +119 -0
  220. package/dist/types/templates/index.d.ts +26 -0
  221. package/dist/types/templates/machine.d.ts +139 -0
  222. package/dist/types/templates/migration.d.ts +34 -0
  223. package/dist/types/templates/state-shape.d.ts +30 -0
  224. package/dist/types/zk/index.d.ts +4 -4
  225. package/package.json +31 -13
@@ -21,39 +21,39 @@ const shield_app_js_1 = require("./shield-app.js");
21
21
  /** The per-bidder PRIVATE state: a bid note `{ amount, bidder, nonce }`. */
22
22
  exports.sealedBidAccountDef = (0, fiber_app_js_1.defineFiberApp)({
23
23
  metadata: {
24
- name: "SealedBidAccount",
25
- app: "markets",
26
- type: "sealed-bid-account",
27
- version: "1.0.0",
24
+ name: 'SealedBidAccount',
25
+ app: 'markets',
26
+ type: 'sealed-bid-account',
27
+ version: '1.0.0',
28
28
  description: "A single bidder's sealed bid (private amount). Shielded via shieldApp.",
29
29
  },
30
30
  stateSchema: {
31
31
  properties: {
32
- amount: { type: "number", description: "the (private) bid amount" },
33
- bidder: { type: "address" },
34
- nonce: { type: "number", description: "per-note randomness; keeps the commitment hiding" },
32
+ amount: { type: 'number', description: 'the (private) bid amount' },
33
+ bidder: { type: 'address' },
34
+ nonce: { type: 'number', description: 'per-note randomness; keeps the commitment hiding' },
35
35
  },
36
36
  },
37
37
  eventSchemas: {
38
38
  place_bid: {
39
- description: "Set the sealed bid amount",
40
- required: ["amount"],
41
- properties: { amount: { type: "number", minimum: 1 } },
39
+ description: 'Set the sealed bid amount',
40
+ required: ['amount'],
41
+ properties: { amount: { type: 'number', minimum: 1 } },
42
42
  },
43
43
  },
44
44
  states: {
45
- OPEN: { id: "OPEN", isFinal: false, metadata: { label: "Open", description: "No bid yet", category: "initial" } },
46
- BID: { id: "BID", isFinal: false, metadata: { label: "Bid", description: "Bid committed", category: "active" } },
45
+ OPEN: { id: 'OPEN', isFinal: false, metadata: { label: 'Open', description: 'No bid yet', category: 'initial' } },
46
+ BID: { id: 'BID', isFinal: false, metadata: { label: 'Bid', description: 'Bid committed', category: 'active' } },
47
47
  },
48
- initialState: "OPEN",
48
+ initialState: 'OPEN',
49
49
  transitions: [
50
50
  {
51
51
  // This effect is what the zk-jlvm-shielded circuit runs in-zkVM; `exprHash` pins it.
52
- from: "OPEN",
53
- to: "BID",
54
- eventName: "place_bid",
55
- guard: { ">": [{ var: "event.amount" }, 0] },
56
- effect: { merge: [{ var: "state" }, { amount: { var: "event.amount" } }] },
52
+ from: 'OPEN',
53
+ to: 'BID',
54
+ eventName: 'place_bid',
55
+ guard: { '>': [{ var: 'event.amount' }, 0] },
56
+ effect: { merge: [{ var: 'state' }, { amount: { var: 'event.amount' } }] },
57
57
  dependencies: [],
58
58
  },
59
59
  ],
@@ -74,60 +74,69 @@ function shieldedSealedBidDef(opts) {
74
74
  */
75
75
  exports.vickreyAuctionDef = (0, fiber_app_js_1.defineFiberApp)({
76
76
  metadata: {
77
- name: "VickreyAuction",
78
- app: "markets",
79
- type: "vickrey-auction",
80
- version: "1.0.0",
81
- description: "Sealed-bid second-price auction: public reveal-then-tally over shielded bids.",
82
- crossReferences: { bidPool: "the ShieldedSealedBidAccount pool holding the sealed bids" },
77
+ name: 'VickreyAuction',
78
+ app: 'markets',
79
+ type: 'vickrey-auction',
80
+ version: '1.0.0',
81
+ description: 'Sealed-bid second-price auction: public reveal-then-tally over shielded bids.',
82
+ crossReferences: { bidPool: 'the ShieldedSealedBidAccount pool holding the sealed bids' },
83
83
  },
84
84
  createSchema: {
85
- required: ["seller", "deadline"],
85
+ required: ['seller', 'deadline'],
86
86
  properties: {
87
- seller: { type: "address", immutable: true },
88
- deadline: { type: "timestamp", immutable: true },
87
+ seller: { type: 'address', immutable: true },
88
+ deadline: { type: 'timestamp', immutable: true },
89
89
  },
90
90
  },
91
91
  stateSchema: {
92
92
  properties: {
93
- seller: { type: "address", immutable: true },
94
- deadline: { type: "timestamp", immutable: true },
95
- status: { type: "string", computed: true },
96
- revealed: { type: "array", computed: true, description: "opened bids [{bidder, amount}]" },
97
- winner: { type: "address", computed: true },
98
- clearingPrice: { type: "number", computed: true, description: "second-highest bid (Vickrey)" },
93
+ seller: { type: 'address', immutable: true },
94
+ deadline: { type: 'timestamp', immutable: true },
95
+ status: { type: 'string', computed: true },
96
+ revealed: { type: 'array', computed: true, description: 'opened bids [{bidder, amount}]' },
97
+ winner: { type: 'address', computed: true },
98
+ clearingPrice: { type: 'number', computed: true, description: 'second-highest bid (Vickrey)' },
99
99
  },
100
100
  },
101
101
  eventSchemas: {
102
102
  reveal: {
103
- description: "Open a sealed bid after the deadline",
104
- required: ["bidder", "amount"],
105
- properties: { bidder: { type: "address" }, amount: { type: "number", minimum: 1 } },
103
+ description: 'Open a sealed bid after the deadline',
104
+ required: ['bidder', 'amount'],
105
+ properties: { bidder: { type: 'address' }, amount: { type: 'number', minimum: 1 } },
106
106
  },
107
- settle: { description: "Tally the revealed bids (winner + second price)" },
107
+ settle: { description: 'Tally the revealed bids (winner + second price)' },
108
108
  },
109
109
  states: {
110
- OPEN: { id: "OPEN", isFinal: false, metadata: { label: "Open", description: "Bidding (sealed)", category: "initial" } },
111
- REVEAL: { id: "REVEAL", isFinal: false, metadata: { label: "Reveal", description: "Opening bids", category: "active" } },
112
- SETTLED: { id: "SETTLED", isFinal: true, metadata: { label: "Settled", description: "Winner + price set", category: "terminal" } },
110
+ OPEN: {
111
+ id: 'OPEN',
112
+ isFinal: false,
113
+ metadata: { label: 'Open', description: 'Bidding (sealed)', category: 'initial' },
114
+ },
115
+ REVEAL: {
116
+ id: 'REVEAL',
117
+ isFinal: false,
118
+ metadata: { label: 'Reveal', description: 'Opening bids', category: 'active' },
119
+ },
120
+ SETTLED: {
121
+ id: 'SETTLED',
122
+ isFinal: true,
123
+ metadata: { label: 'Settled', description: 'Winner + price set', category: 'terminal' },
124
+ },
113
125
  },
114
- initialState: "OPEN",
126
+ initialState: 'OPEN',
115
127
  transitions: [
116
128
  {
117
- from: "OPEN",
118
- to: "REVEAL",
119
- eventName: "reveal",
120
- guard: { ">=": [{ var: "$timestamp" }, { var: "state.deadline" }] },
129
+ from: 'OPEN',
130
+ to: 'REVEAL',
131
+ eventName: 'reveal',
132
+ guard: { '>=': [{ var: '$timestamp' }, { var: 'state.deadline' }] },
121
133
  effect: {
122
134
  merge: [
123
- { var: "state" },
135
+ { var: 'state' },
124
136
  {
125
- status: "REVEAL",
137
+ status: 'REVEAL',
126
138
  revealed: {
127
- cat: [
128
- { var: "state.revealed" },
129
- [{ bidder: { var: "event.bidder" }, amount: { var: "event.amount" } }],
130
- ],
139
+ cat: [{ var: 'state.revealed' }, [{ bidder: { var: 'event.bidder' }, amount: { var: 'event.amount' } }]],
131
140
  },
132
141
  },
133
142
  ],
@@ -135,19 +144,16 @@ exports.vickreyAuctionDef = (0, fiber_app_js_1.defineFiberApp)({
135
144
  dependencies: [],
136
145
  },
137
146
  {
138
- from: "REVEAL",
139
- to: "REVEAL",
140
- eventName: "reveal",
141
- guard: { ">=": [{ var: "$timestamp" }, { var: "state.deadline" }] },
147
+ from: 'REVEAL',
148
+ to: 'REVEAL',
149
+ eventName: 'reveal',
150
+ guard: { '>=': [{ var: '$timestamp' }, { var: 'state.deadline' }] },
142
151
  effect: {
143
152
  merge: [
144
- { var: "state" },
153
+ { var: 'state' },
145
154
  {
146
155
  revealed: {
147
- cat: [
148
- { var: "state.revealed" },
149
- [{ bidder: { var: "event.bidder" }, amount: { var: "event.amount" } }],
150
- ],
156
+ cat: [{ var: 'state.revealed' }, [{ bidder: { var: 'event.bidder' }, amount: { var: 'event.amount' } }]],
151
157
  },
152
158
  },
153
159
  ],
@@ -156,44 +162,41 @@ exports.vickreyAuctionDef = (0, fiber_app_js_1.defineFiberApp)({
156
162
  },
157
163
  {
158
164
  // Vickrey tally: fold the revealed bids tracking (max, second, winner).
159
- from: "REVEAL",
160
- to: "SETTLED",
161
- eventName: "settle",
162
- guard: { ">": [{ reduce: [{ var: "state.revealed" }, { "+": [{ var: "accumulator" }, 1] }, 0] }, 0] },
165
+ from: 'REVEAL',
166
+ to: 'SETTLED',
167
+ eventName: 'settle',
168
+ guard: { '>': [{ reduce: [{ var: 'state.revealed' }, { '+': [{ var: 'accumulator' }, 1] }, 0] }, 0] },
163
169
  effect: {
164
170
  merge: [
165
- { var: "state" },
171
+ { var: 'state' },
166
172
  {
167
- status: "SETTLED",
168
- settledAt: { var: "$timestamp" },
173
+ status: 'SETTLED',
174
+ settledAt: { var: '$timestamp' },
169
175
  winner: {
170
- var: [
171
- "tally.winner",
172
- null,
173
- ],
176
+ var: ['tally.winner', null],
174
177
  },
175
- clearingPrice: { var: ["tally.second", 0] },
178
+ clearingPrice: { var: ['tally.second', 0] },
176
179
  // compute the tally once and expose it for the two fields above
177
180
  tally: {
178
181
  reduce: [
179
- { var: "state.revealed" },
182
+ { var: 'state.revealed' },
180
183
  {
181
184
  if: [
182
- { ">": [{ var: "current.amount" }, { var: "accumulator.max" }] },
185
+ { '>': [{ var: 'current.amount' }, { var: 'accumulator.max' }] },
183
186
  {
184
- max: { var: "current.amount" },
185
- second: { var: "accumulator.max" },
186
- winner: { var: "current.bidder" },
187
+ max: { var: 'current.amount' },
188
+ second: { var: 'accumulator.max' },
189
+ winner: { var: 'current.bidder' },
187
190
  },
188
191
  {
189
192
  if: [
190
- { ">": [{ var: "current.amount" }, { var: "accumulator.second" }] },
193
+ { '>': [{ var: 'current.amount' }, { var: 'accumulator.second' }] },
191
194
  {
192
- max: { var: "accumulator.max" },
193
- second: { var: "current.amount" },
194
- winner: { var: "accumulator.winner" },
195
+ max: { var: 'accumulator.max' },
196
+ second: { var: 'current.amount' },
197
+ winner: { var: 'accumulator.winner' },
195
198
  },
196
- { var: "accumulator" },
199
+ { var: 'accumulator' },
197
200
  ],
198
201
  },
199
202
  ],
@@ -40,15 +40,15 @@ const pvField = (publicValues, hexOffset) => ({
40
40
  });
41
41
  /** Standard public state every shielded pool carries (the rest of the app state is private/off-chain). */
42
42
  exports.SHIELDED_POOL_STATE = {
43
- vkey: { type: "hash", immutable: true },
44
- exprHash: { type: "hash", immutable: true },
45
- rootWindow: { type: "integer", immutable: true },
46
- currentRoot: { type: "hash", computed: true },
47
- knownRoots: { type: "array", computed: true, description: "rolling window of valid anchors (hex)" },
48
- nullifiers: { type: "array", computed: true, description: "spent set (hex); monotonic — see RFC §5.3" },
49
- commitments: { type: "array", computed: true, description: "append-only log of output commitments (hex)" },
50
- leafCount: { type: "integer", computed: true, default: 0 },
51
- transitions: { type: "integer", computed: true, default: 0 },
43
+ vkey: { type: 'hash', immutable: true },
44
+ exprHash: { type: 'hash', immutable: true },
45
+ rootWindow: { type: 'integer', immutable: true },
46
+ currentRoot: { type: 'hash', computed: true },
47
+ knownRoots: { type: 'array', computed: true, description: 'rolling window of valid anchors (hex)' },
48
+ nullifiers: { type: 'array', computed: true, description: 'spent set (hex); monotonic — see RFC §5.3' },
49
+ commitments: { type: 'array', computed: true, description: 'append-only log of output commitments (hex)' },
50
+ leafCount: { type: 'integer', computed: true, default: 0 },
51
+ transitions: { type: 'integer', computed: true, default: 0 },
52
52
  };
53
53
  /**
54
54
  * Build the shielded-pool variant of `base`.
@@ -57,7 +57,7 @@ exports.SHIELDED_POOL_STATE = {
57
57
  * @param opts the circuit vkey + the pinned `exprHash` + the anchor window.
58
58
  */
59
59
  function shieldApp(base, opts) {
60
- const publicValues = { var: "event.publicValues" };
60
+ const publicValues = { var: 'event.publicValues' };
61
61
  const anchor = pvField(publicValues, 2);
62
62
  const nullifier = pvField(publicValues, 66);
63
63
  const newCommitment = pvField(publicValues, 130);
@@ -66,13 +66,13 @@ function shieldApp(base, opts) {
66
66
  const guard = {
67
67
  and: [
68
68
  // 1. the proof verifies against the pool's pinned vkey over EXACTLY these public bytes
69
- { groth16_verify: [{ var: "state.vkey" }, publicValues, { var: "event.proof" }] },
69
+ { groth16_verify: [{ var: 'state.vkey' }, publicValues, { var: 'event.proof' }] },
70
70
  // 2. it ran the app logic this pool pins (binds which effect produced the transition)
71
- { "===": [exprHash, { var: "state.exprHash" }] },
71
+ { '===': [exprHash, { var: 'state.exprHash' }] },
72
72
  // 3. the spent note was proven under an anchor we still honor
73
- { in: [anchor, { var: "state.knownRoots" }] },
73
+ { in: [anchor, { var: 'state.knownRoots' }] },
74
74
  // 4. inter-transfer double-spend guard: the nullifier is not already spent
75
- { none: [{ var: "state.nullifiers" }, { "===": [{ var: "" }, nullifier] }] },
75
+ { none: [{ var: 'state.nullifiers' }, { '===': [{ var: '' }, nullifier] }] },
76
76
  ],
77
77
  };
78
78
  // EFFECT (combine): spend the nullifier, record the new commitment, advance counters.
@@ -80,52 +80,52 @@ function shieldApp(base, opts) {
80
80
  // per RFC §6.2 / §10; the chain records the commitment + nullifier here.
81
81
  const effect = {
82
82
  merge: [
83
- { var: "state" },
83
+ { var: 'state' },
84
84
  {
85
- nullifiers: { cat: [{ var: "state.nullifiers" }, [nullifier]] },
86
- commitments: { cat: [{ var: "state.commitments" }, [newCommitment]] },
87
- leafCount: { "+": [{ var: "state.leafCount" }, 1] },
88
- transitions: { "+": [{ var: "state.transitions" }, 1] },
89
- lastTransitionAt: { var: "$ordinal" },
85
+ nullifiers: { cat: [{ var: 'state.nullifiers' }, [nullifier]] },
86
+ commitments: { cat: [{ var: 'state.commitments' }, [newCommitment]] },
87
+ leafCount: { '+': [{ var: 'state.leafCount' }, 1] },
88
+ transitions: { '+': [{ var: 'state.transitions' }, 1] },
89
+ lastTransitionAt: { var: '$ordinal' },
90
90
  },
91
91
  ],
92
92
  };
93
93
  return (0, fiber_app_js_1.defineFiberApp)({
94
94
  metadata: {
95
95
  name: `Shielded${base.metadata.name}`,
96
- app: "privacy",
96
+ app: 'privacy',
97
97
  type: `shielded-${base.metadata.type}`,
98
98
  version: base.metadata.version,
99
99
  description: `Shielded (zk-jlvm-shielded) variant of ${base.metadata.name}: private state transitions ` +
100
100
  `verified by a Groth16 proof; the nullifier set + anchors are public pool state.`,
101
101
  },
102
102
  createSchema: {
103
- required: ["vkey", "exprHash"],
103
+ required: ['vkey', 'exprHash'],
104
104
  properties: {
105
- vkey: { type: "hash", immutable: true, default: opts.vkey },
106
- exprHash: { type: "hash", immutable: true, default: opts.exprHash },
107
- rootWindow: { type: "integer", immutable: true, default: opts.rootWindow ?? 64 },
105
+ vkey: { type: 'hash', immutable: true, default: opts.vkey },
106
+ exprHash: { type: 'hash', immutable: true, default: opts.exprHash },
107
+ rootWindow: { type: 'integer', immutable: true, default: opts.rootWindow ?? 64 },
108
108
  },
109
109
  },
110
110
  stateSchema: { properties: { ...exports.SHIELDED_POOL_STATE } },
111
111
  eventSchemas: {
112
112
  transition: {
113
113
  description: `A private state transition of ${base.metadata.name}, attested by a zk-jlvm-shielded Groth16 proof.`,
114
- required: ["proof", "publicValues"],
114
+ required: ['proof', 'publicValues'],
115
115
  properties: {
116
- proof: { type: "string", description: "Groth16 proof bytes (0x hex)" },
117
- publicValues: { type: "string", description: "abi-encoded JlvmTransitionPublicValues (4×bytes32, 0x hex)" },
116
+ proof: { type: 'string', description: 'Groth16 proof bytes (0x hex)' },
117
+ publicValues: { type: 'string', description: 'abi-encoded JlvmTransitionPublicValues (4×bytes32, 0x hex)' },
118
118
  },
119
119
  },
120
120
  },
121
121
  states: {
122
122
  ACTIVE: {
123
- id: "ACTIVE",
123
+ id: 'ACTIVE',
124
124
  isFinal: false,
125
- metadata: { label: "Active", description: "Pool accepts shielded transitions", category: "active" },
125
+ metadata: { label: 'Active', description: 'Pool accepts shielded transitions', category: 'active' },
126
126
  },
127
127
  },
128
- initialState: "ACTIVE",
129
- transitions: [{ from: "ACTIVE", to: "ACTIVE", eventName: "transition", guard, effect, dependencies: [] }],
128
+ initialState: 'ACTIVE',
129
+ transitions: [{ from: 'ACTIVE', to: 'ACTIVE', eventName: 'transition', guard, effect, dependencies: [] }],
130
130
  });
131
131
  }
@@ -16,7 +16,7 @@
16
16
  * ```
17
17
  */
18
18
  Object.defineProperty(exports, "__esModule", { value: true });
19
- exports.setDependencyActive = exports.addDependency = void 0;
19
+ exports.RESERVED_EFFECT_KEYS = exports.emit = exports.spawn = exports.triggers = exports.toWallet = exports.toFiber = exports.transferAsset = exports.setDependencyActive = exports.addDependency = void 0;
20
20
  /**
21
21
  * `_addDependency` (#24): add — or re-activate — a runtime DYNAMIC dependency on `fiberId`, so that
22
22
  * fiber's state appears in `machines.<fiberId>` for SUBSEQUENT transitions of this fiber. `fiberId` may
@@ -38,3 +38,119 @@ const setDependencyActive = (fiberId, active) => ({
38
38
  _setDependencyActive: [{ fiberId, active }],
39
39
  });
40
40
  exports.setDependencyActive = setDependencyActive;
41
+ /**
42
+ * `_transferAsset`: move one or more WHOLE asset instances the emitting fiber holds, each to a single
43
+ * recipient. The directive rides INSIDE a `merge` effect map (the engine extracts `_`-prefixed keys
44
+ * before merging into state); a transition-level `emits` block is silently stripped by
45
+ * `toProtoDefinition`, which would strand the asset.
46
+ *
47
+ * Each directive is `{ assetId, recipient }` ONLY — there is NO `amount` field. The combiner reassigns
48
+ * `holder := recipient` on the WHOLE asset record (`AssetCombiner.applyFiberTransfer`); value is moved
49
+ * one whole instance at a time, never split. `recipient` must resolve to the canonical `AssetHolder`
50
+ * OBJECT form — `{"Fiber":{"fiberId":..}}` / `{"Wallet":{"address":..}}` — built with {@link toFiber} /
51
+ * {@link toWallet}; the chain raises a graceful `CombineRejected` on a bare string or malformed object
52
+ * (`EffectExtractor.parseAssetTransfer`). `assetId` is a UUID; the holder id may be a literal or an
53
+ * expression (e.g. `{ var: "event.agent" }`).
54
+ *
55
+ * Combiner-side holder defense (R1) independently re-validates every directive: the asset must resolve,
56
+ * be held by `Fiber(self)`, be `behavior.transferable`, and (Fiber recipient) the recipient fiber must be
57
+ * live — else the whole transition is `CombineRejected`. There is a hard cap of 32 asset mutations per
58
+ * transition (all-or-nothing); keep emitting fibers at ≤1 transfer per transition for claim/withdraw/slash.
59
+ *
60
+ * @example
61
+ * effect: { merge: [ { var: "state" }, {
62
+ * status: "SETTLED",
63
+ * ...transferAsset([{ assetId: { var: "event.rewardAssetId" }, recipient: toWallet({ var: "event.agent" }) }]),
64
+ * } ] }
65
+ */
66
+ const transferAsset = (transfers) => ({ _transferAsset: transfers });
67
+ exports.transferAsset = transferAsset;
68
+ /**
69
+ * Build a `_transferAsset` `recipient` as the canonical `AssetHolder` OBJECT form. The chain requires the
70
+ * object form ONLY — `{"Fiber":{"fiberId":..}}` / `{"Wallet":{"address":..}}` — and raises a graceful
71
+ * `CombineRejected` on a bare string or a malformed object (`EffectExtractor.parseAssetTransfer`); the
72
+ * legacy bare-string UUID/DAG-address disambiguation has been removed. These mirror the typed
73
+ * {@link fiberHolder} / {@link walletHolder} `AssetHolder` builders (used for `MintAsset.holder` /
74
+ * `ApplyMorphism.recipient`) but accept a `JsonLogicValue`, so the id can be a runtime expression:
75
+ *
76
+ * ```ts
77
+ * transferAsset([{ assetId, recipient: toFiber({ var: "event.retailerId" }) }]); // → {"Fiber":{"fiberId":..}}
78
+ * transferAsset([{ assetId, recipient: toWallet({ var: "event.agent" }) }]); // → {"Wallet":{"address":..}}
79
+ * ```
80
+ */
81
+ const toFiber = (fiberId) => ({
82
+ Fiber: { fiberId },
83
+ });
84
+ exports.toFiber = toFiber;
85
+ /** See {@link toFiber}: a `transferAsset` recipient held by a wallet — `{"Wallet":{"address":..}}`. */
86
+ const toWallet = (address) => ({
87
+ Wallet: { address },
88
+ });
89
+ exports.toWallet = toWallet;
90
+ /**
91
+ * `_triggers` (F4): fire one or more CROSS-FIBER events. Each entry is projected to
92
+ * `{ targetMachineId, eventName, payload }` — the exact shape the chain's `EffectExtractor` reads
93
+ * (`ReservedKeys.scala`, `EffectExtractor.scala`). `target` is the recipient fiber id (a literal UUID
94
+ * or an expression, e.g. `{ var: "event.retailerId" }`); `event` is the event NAME to enqueue on it;
95
+ * `payload` is the event body — omit it and the builder emits `{}` (never `null`).
96
+ *
97
+ * Authoring this as a builder makes a typo'd `_trigger` / `triggres` a TypeScript error rather than a
98
+ * silently-merged state field (the F4 foot-gun). Place the fragment INSIDE the effect's state-update
99
+ * map so it rides in the evaluated result the extractor reads.
100
+ *
101
+ * @example
102
+ * effect: { merge: [ { var: "state" }, {
103
+ * status: "debt_current",
104
+ * ...triggers([{ target: { var: "event.retailerId" }, event: "process_sale",
105
+ * payload: { buyerId: { var: "machineId" }, quantity: { var: "event.quantity" } } }]),
106
+ * } ] }
107
+ */
108
+ const triggers = (ts) => ({
109
+ _triggers: ts.map((t) => ({
110
+ targetMachineId: t.target,
111
+ eventName: t.event,
112
+ payload: t.payload ?? {},
113
+ })),
114
+ });
115
+ exports.triggers = triggers;
116
+ /**
117
+ * `_spawn`: create one or more CHILD fibers, each from a literal machine `definition`. Each entry is
118
+ * `{ childId, definition, initialData, owners }` (`ReservedKeys.scala`, `EffectExtractor.scala`).
119
+ *
120
+ * The chain extracts `_spawn` from the effect EXPRESSION, not the evaluated result, so `definition`
121
+ * MUST be a literal {@link ProtoStateMachineDefinition} (e.g. a nested `machine().wireDefinition()` /
122
+ * `toProtoDefinition(child)` output) — NOT an expression the engine would evaluate at runtime.
123
+ *
124
+ * F8 gotcha — `owners` is load-bearing. A spawned child's transitions are gated by
125
+ * `owners ∪ authorizedSigners` (`riverdale-economy/README.md`), so EVERY party that will later drive
126
+ * the child (e.g. every bidder on a spawned auction) MUST be listed in `owners`, or their events are
127
+ * rejected. `owners` may be a literal id array or an expression (e.g. `{ var: "event.auctionOwners" }`);
128
+ * `childId` / `initialData` likewise accept literals or expressions.
129
+ */
130
+ const spawn = (ds) => ({ _spawn: ds });
131
+ exports.spawn = spawn;
132
+ /**
133
+ * `_emit`: emit one or more domain events to the fiber's outbox. Each entry is
134
+ * `{ name, data, destination? }` (`ReservedKeys.scala`, `EffectExtractor.scala`). `name` is the event
135
+ * name, `data` the body (a literal or an expression), and `destination` an OPTIONAL routing target —
136
+ * omit it when absent (callers never pass `null`, so it is simply absent on the wire).
137
+ */
138
+ const emit = (es) => ({
139
+ _emit: es,
140
+ });
141
+ exports.emit = emit;
142
+ /**
143
+ * The complete set of `_`-prefixed RESERVED effect keys the chain's `EffectExtractor` consumes and
144
+ * `StateMerger` strips from state (`ReservedKeys.scala:12-49`). Exported so a validator (Proposal 01)
145
+ * can reject an unknown `_`-prefixed key (a typo'd directive) instead of letting it silently leak into
146
+ * persisted state.
147
+ */
148
+ exports.RESERVED_EFFECT_KEYS = [
149
+ '_triggers',
150
+ '_spawn',
151
+ '_emit',
152
+ '_transferAsset',
153
+ '_scriptCall',
154
+ '_addDependency',
155
+ '_setDependencyActive',
156
+ ];