@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
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.wordOffset = void 0;
4
+ exports.semiPrivateGuard = semiPrivateGuard;
5
+ exports.verifyGroth16Bundle = verifyGroth16Bundle;
6
+ exports.checkSemiPrivateBinding = checkSemiPrivateBinding;
7
+ exports.verifySemiPrivate = verifySemiPrivate;
8
+ /**
9
+ * The semi-private guard: the JLVM predicate a policy embeds, and its client-side mirror.
10
+ *
11
+ * The guard pins THREE facts about the witness the holder carries, using only opcodes metakit
12
+ * already gas-meters — no new `jlvm_pv_decode`, the public-values blob is parsed with native
13
+ * `substr`/`cat`:
14
+ * 1. `groth16_verify[vkey, witness.publicValues, witness.proof]` — the SP1 proof is valid.
15
+ * 2. the `exprHash` word of the public values == the policy's `logicHash` — the proof ran the
16
+ * INTENDED rule (the pinned, legible predicate).
17
+ * 3. the `outputHash` word == `keccak256("true")` — that rule evaluated to TRUE on the hidden data.
18
+ *
19
+ * `publicValues` rides as a `0x` + 256-hex-char string (`0x` | exprHash | dataHash | outputHash | ok),
20
+ * so word w begins at char `2 + 64*w` and is 64 chars wide. `cat("0x", substr(pv, off, 64))` lifts a
21
+ * word back to a `0x`-hex value comparable with a `bytes32` literal. These offsets are the on-chain
22
+ * guard's contract; the Scala policy mirrors this exact shape.
23
+ */
24
+ const metagraph_sdk_jlvm_1 = require("@constellation-network/metagraph-sdk-jlvm");
25
+ const preimage_1 = require("./preimage");
26
+ const types_1 = require("./types");
27
+ const HEX_PREFIX = 2; // "0x"
28
+ const WORD_HEX = 64; // 32-byte ABI word as hex chars
29
+ /** Char offset of public-values word `w` (0=exprHash, 1=dataHash, 2=outputHash, 3=ok) in the `0x` string. */
30
+ const wordOffset = (w) => HEX_PREFIX + WORD_HEX * w;
31
+ exports.wordOffset = wordOffset;
32
+ /** Lift public-values word `w` back to a `0x`-hex value (`cat("0x", substr(pv, off, 64))`). */
33
+ const pvWord = (w) => ({
34
+ cat: ['0x', { substr: [{ var: 'witness.publicValues' }, (0, exports.wordOffset)(w), WORD_HEX] }],
35
+ });
36
+ /**
37
+ * Build the JLVM guard a `Governed` morphism / mint policy embeds. `vkey` is the zk-jlvm program
38
+ * verification key (a `bytes32` `0x`-hex literal); `logicHash` is the pinned rule's hash (from
39
+ * {@link ExprRegistry.logicHashOf}). Returns plain JSON — feed it into an ASSET policy's guard/mintPolicy
40
+ * (the asset combiner injects the reserved `witness`). In a fiber TRANSITION there is no `witness` key —
41
+ * the proof rides in the event payload, so read `event.witness.*` instead.
42
+ *
43
+ * REPLAY (audit zk-guards): the proven public values commit only {exprHash, dataHash, outputHash, ok} —
44
+ * nothing situational (no fiber / asset / `$ordinal` / nonce). A valid `{publicValues, proof}` is therefore
45
+ * a reusable bearer token, replayable across any action pinning the same vkey + logicHash. Bind the action
46
+ * INSIDE the proven rule (pin a spender/asset/subject, as `reputationCreditRule` pins `subject`) and/or gate
47
+ * with a one-time nonce ledger until the public values carry action context.
48
+ */
49
+ function semiPrivateGuard(vkey, logicHash, opts = {}) {
50
+ const { requireTrue = true } = opts;
51
+ const clauses = [
52
+ { groth16_verify: [vkey, { var: 'witness.publicValues' }, { var: 'witness.proof' }] },
53
+ { '==': [pvWord(0), logicHash] },
54
+ ];
55
+ if (requireTrue) {
56
+ clauses.push({ '==': [pvWord(2), preimage_1.KECCAK_TRUE] });
57
+ // ok bit: the final hex pair of word 3 (offset 256) must be "01" — the JLVM run did not error.
58
+ clauses.push({ '==': [{ substr: [{ var: 'witness.publicValues' }, (0, exports.wordOffset)(3) + 62, 2] }, '01'] });
59
+ }
60
+ return { and: clauses };
61
+ }
62
+ /**
63
+ * Locally run the SAME `groth16_verify` pairing the chain runs (the verifier opcode, not the prover).
64
+ * Returns `false` — never throws — on an invalid/garbage bundle, mirroring the guard's graceful deny.
65
+ */
66
+ function verifyGroth16Bundle(bundle) {
67
+ try {
68
+ return metagraph_sdk_jlvm_1.jsonLogic.apply({ groth16_verify: [bundle.vkey, bundle.publicValues, bundle.proof] }, {}) === true;
69
+ }
70
+ catch {
71
+ return false;
72
+ }
73
+ }
74
+ /**
75
+ * Check the binding words WITHOUT the pairing: `exprHash == expectedLogicHash`, `ok` set, and
76
+ * (when `requireTrue`) `outputHash == keccak256("true")`. Pair with {@link verifyGroth16Bundle} for
77
+ * the full client-side mirror of the on-chain guard (see {@link verifySemiPrivate}).
78
+ */
79
+ function checkSemiPrivateBinding(bundle, expectedLogicHash, opts = {}) {
80
+ const { requireTrue = true } = opts;
81
+ const decoded = (0, types_1.decodeJlvmPublicValues)(bundle.publicValues);
82
+ const eq = (a, b) => a.toLowerCase() === b.toLowerCase();
83
+ const reasons = [];
84
+ if (!eq(decoded.exprHash, expectedLogicHash))
85
+ reasons.push(`exprHash ${decoded.exprHash} != expected logicHash ${expectedLogicHash}`);
86
+ if (!decoded.ok)
87
+ reasons.push('ok bit is false (guest evaluation errored)');
88
+ if (requireTrue && !eq(decoded.outputHash, preimage_1.KECCAK_TRUE))
89
+ reasons.push(`outputHash ${decoded.outputHash} != keccak256("true") ${preimage_1.KECCAK_TRUE}`);
90
+ return { ok: reasons.length === 0, reasons, decoded };
91
+ }
92
+ /**
93
+ * The full client-side mirror of the on-chain guard: the proof verifies AND its words bind to the
94
+ * pinned rule (and, by default, to a `true` result). Run this before submitting to fail fast instead
95
+ * of paying for an on-chain rejection.
96
+ */
97
+ function verifySemiPrivate(bundle, expectedLogicHash, opts = {}) {
98
+ const binding = checkSemiPrivateBinding(bundle, expectedLogicHash, opts);
99
+ if (!verifyGroth16Bundle(bundle)) {
100
+ return {
101
+ ok: false,
102
+ reasons: ['groth16_verify failed (invalid proof for this vkey/publicValues)', ...binding.reasons],
103
+ decoded: binding.decoded,
104
+ };
105
+ }
106
+ return binding;
107
+ }
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseGroth16Stdout = exports.SubprocessProver = exports.verifySemiPrivate = exports.checkSemiPrivateBinding = exports.verifyGroth16Bundle = exports.semiPrivateGuard = exports.wordOffset = exports.atMost = exports.atLeast = exports.boundRule = exports.ExprRegistry = exports.pmtWitness = exports.groth16Witness = exports.decodeJlvmPublicValues = exports.openCommitment = exports.poseidonCommitN = exports.poseidonCommit = exports.randomSalt = exports.frToHex = exports.toFr = exports.R = exports.KECCAK_TRUE = exports.dataHash = exports.exprHash = exports.proverPreimage = exports.canonicalForSigning = void 0;
4
+ /**
5
+ * `@ottochain/sdk/zk` — the client-side semi-private tier.
6
+ *
7
+ * Public-by-default, private-by-opt-in: a holder proves (off-chain, via SP1 zk-jlvm) that some
8
+ * PRIVATE data satisfies a PUBLIC, pinned JLVM rule, and carries only `{publicValues, proof}` on a
9
+ * signed op. A policy's {@link semiPrivateGuard} re-verifies the proof and binds it to the pinned
10
+ * rule on-chain — the value stays hidden, the predicate stays legible.
11
+ *
12
+ * The ONE canonical invariant tying it together: the prover is fed `canonicalForSigning(expr)` /
13
+ * `canonicalForSigning(data)`, so a proof's `exprHash` word equals {@link exprHash}`(rule)` equals a
14
+ * policy's `logicHash` — see {@link proverPreimage} and docs/design/client-side-private-data.md §3.0.
15
+ */
16
+ var preimage_1 = require("./preimage");
17
+ Object.defineProperty(exports, "canonicalForSigning", { enumerable: true, get: function () { return preimage_1.canonicalForSigning; } });
18
+ Object.defineProperty(exports, "proverPreimage", { enumerable: true, get: function () { return preimage_1.proverPreimage; } });
19
+ Object.defineProperty(exports, "exprHash", { enumerable: true, get: function () { return preimage_1.exprHash; } });
20
+ Object.defineProperty(exports, "dataHash", { enumerable: true, get: function () { return preimage_1.dataHash; } });
21
+ Object.defineProperty(exports, "KECCAK_TRUE", { enumerable: true, get: function () { return preimage_1.KECCAK_TRUE; } });
22
+ var commit_1 = require("./commit");
23
+ Object.defineProperty(exports, "R", { enumerable: true, get: function () { return commit_1.R; } });
24
+ Object.defineProperty(exports, "toFr", { enumerable: true, get: function () { return commit_1.toFr; } });
25
+ Object.defineProperty(exports, "frToHex", { enumerable: true, get: function () { return commit_1.frToHex; } });
26
+ Object.defineProperty(exports, "randomSalt", { enumerable: true, get: function () { return commit_1.randomSalt; } });
27
+ Object.defineProperty(exports, "poseidonCommit", { enumerable: true, get: function () { return commit_1.poseidonCommit; } });
28
+ Object.defineProperty(exports, "poseidonCommitN", { enumerable: true, get: function () { return commit_1.poseidonCommitN; } });
29
+ Object.defineProperty(exports, "openCommitment", { enumerable: true, get: function () { return commit_1.openCommitment; } });
30
+ var types_1 = require("./types");
31
+ Object.defineProperty(exports, "decodeJlvmPublicValues", { enumerable: true, get: function () { return types_1.decodeJlvmPublicValues; } });
32
+ var witness_1 = require("./witness");
33
+ Object.defineProperty(exports, "groth16Witness", { enumerable: true, get: function () { return witness_1.groth16Witness; } });
34
+ Object.defineProperty(exports, "pmtWitness", { enumerable: true, get: function () { return witness_1.pmtWitness; } });
35
+ var registry_1 = require("./registry");
36
+ Object.defineProperty(exports, "ExprRegistry", { enumerable: true, get: function () { return registry_1.ExprRegistry; } });
37
+ Object.defineProperty(exports, "boundRule", { enumerable: true, get: function () { return registry_1.boundRule; } });
38
+ Object.defineProperty(exports, "atLeast", { enumerable: true, get: function () { return registry_1.atLeast; } });
39
+ Object.defineProperty(exports, "atMost", { enumerable: true, get: function () { return registry_1.atMost; } });
40
+ var guard_1 = require("./guard");
41
+ Object.defineProperty(exports, "wordOffset", { enumerable: true, get: function () { return guard_1.wordOffset; } });
42
+ Object.defineProperty(exports, "semiPrivateGuard", { enumerable: true, get: function () { return guard_1.semiPrivateGuard; } });
43
+ Object.defineProperty(exports, "verifyGroth16Bundle", { enumerable: true, get: function () { return guard_1.verifyGroth16Bundle; } });
44
+ Object.defineProperty(exports, "checkSemiPrivateBinding", { enumerable: true, get: function () { return guard_1.checkSemiPrivateBinding; } });
45
+ Object.defineProperty(exports, "verifySemiPrivate", { enumerable: true, get: function () { return guard_1.verifySemiPrivate; } });
46
+ var prover_1 = require("./prover");
47
+ Object.defineProperty(exports, "SubprocessProver", { enumerable: true, get: function () { return prover_1.SubprocessProver; } });
48
+ Object.defineProperty(exports, "parseGroth16Stdout", { enumerable: true, get: function () { return prover_1.parseGroth16Stdout; } });
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KECCAK_TRUE = exports.dataHash = exports.exprHash = void 0;
4
+ exports.canonicalForSigning = canonicalForSigning;
5
+ exports.proverPreimage = proverPreimage;
6
+ /**
7
+ * The ONE canonical path for the semi-private tier.
8
+ *
9
+ * metakit-sdk 1.8.x `canonicalize` = `serializeJcs(dropNullFields)` — it drops null object-fields
10
+ * before RFC 8785 (server-aligned), so it is the EXACT byte string the chain signs over. Feeding
11
+ * the zk-jlvm prover this same string makes the proof's keccak preimage equal the signature
12
+ * preimage — the determinism binding (see docs/design/client-side-private-data.md §3.0).
13
+ *
14
+ * Note the two hashes differ by design: signing is sha256 over the canonical bytes (+ Constellation
15
+ * prefix), the zk-jlvm guest is keccak256 over the canonical bytes — they bind the SAME canonical
16
+ * string, which is the load-bearing invariant.
17
+ */
18
+ const metagraph_sdk_1 = require("@constellation-network/metagraph-sdk");
19
+ const sha3_js_1 = require("@noble/hashes/sha3.js");
20
+ const utf8 = (s) => new TextEncoder().encode(s);
21
+ const toHex = (b) => Array.from(b, (x) => x.toString(16).padStart(2, '0')).join('');
22
+ /** The single canonical string both the signer and the prover-feed share (JCS ∘ dropNullFields). */
23
+ function canonicalForSigning(x) {
24
+ return (0, metagraph_sdk_1.canonicalize)(x);
25
+ }
26
+ /** keccak256 of the canonical bytes — the value the zk-jlvm guest commits as exprHash / dataHash. */
27
+ function proverPreimage(x) {
28
+ return `0x${toHex((0, sha3_js_1.keccak_256)(utf8(canonicalForSigning(x))))}`;
29
+ }
30
+ /** exprHash of a published JLVM rule (canonicalized + keccak'd). Equals the chain's `logicHash`. */
31
+ const exprHash = (rule) => proverPreimage(rule);
32
+ exports.exprHash = exprHash;
33
+ /** dataHash of a private data context — kept private; only its hash is public. */
34
+ const dataHash = (data) => proverPreimage(data);
35
+ exports.dataHash = dataHash;
36
+ /** `keccak256(canonicalize(true))` — the `outputHash` a guard binds for a "rule returned true" proof. */
37
+ exports.KECCAK_TRUE = proverPreimage(true);
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SubprocessProver = void 0;
4
+ exports.parseGroth16Stdout = parseGroth16Stdout;
5
+ /**
6
+ * Driving the SP1 zk-jlvm host (`rust/zk-jlvm/script`, `--mode groth16`) to produce a
7
+ * {@link Groth16Bundle} from a JLVM `expr` + `data`.
8
+ *
9
+ * THE load-bearing step: the host's guest hashes the RAW `--expr` / `--data` strings
10
+ * (`exprHash = keccak256(expr_bytes)`), so this driver feeds it `canonicalForSigning(expr)` /
11
+ * `canonicalForSigning(data)`. That makes a proof's `exprHash` word equal {@link exprHash}`(rule)`
12
+ * equal a policy's `logicHash` — without it the binding silently never matches.
13
+ *
14
+ * Proving is heavy (SP1; minutes, optionally `SP1_PROVER=cuda`) and needs the Rust toolchain, so this
15
+ * is an out-of-process driver, not an in-SDK prover. Point it at a prebuilt `binaryPath`, or at the
16
+ * crate via `cargoManifestPath`; configure either explicitly or through `ZK_JLVM_BIN` /
17
+ * `ZK_JLVM_MANIFEST` env vars.
18
+ */
19
+ const preimage_1 = require("./preimage");
20
+ const reLine = (label) => new RegExp(`^${label}:\\s*(0x[0-9a-fA-F]+)\\s*$`, 'm');
21
+ /** Parse the host's `vkey:` / `public values:` / `proof bytes:` stdout lines into a bundle. */
22
+ function parseGroth16Stdout(stdout) {
23
+ const grab = (label, key) => {
24
+ const m = stdout.match(reLine(label));
25
+ if (!m)
26
+ throw new Error(`zk-jlvm host produced no "${label}:" line (could not read ${key})`);
27
+ return m[1].toLowerCase();
28
+ };
29
+ return {
30
+ vkey: grab('vkey', 'vkey'),
31
+ publicValues: grab('public values', 'publicValues'),
32
+ proof: grab('proof bytes', 'proof'),
33
+ };
34
+ }
35
+ /** Drives the zk-jlvm host out-of-process. */
36
+ class SubprocessProver {
37
+ constructor(opts = {}) {
38
+ this.opts = opts;
39
+ }
40
+ async proveGroth16(req) {
41
+ // Canonicalize BEFORE proving so exprHash/dataHash bind the same bytes the chain signs over.
42
+ const expr = (0, preimage_1.canonicalForSigning)(req.expr);
43
+ const data = (0, preimage_1.canonicalForSigning)(req.data);
44
+ const modeArgs = ['--mode', 'groth16', '--expr', expr, '--data', data];
45
+ const binaryPath = this.opts.binaryPath ?? process.env.ZK_JLVM_BIN;
46
+ const manifest = this.opts.cargoManifestPath ?? process.env.ZK_JLVM_MANIFEST;
47
+ let command;
48
+ let args;
49
+ if (binaryPath) {
50
+ command = binaryPath;
51
+ args = modeArgs;
52
+ }
53
+ else if (manifest) {
54
+ command = 'cargo';
55
+ args = ['run', '--release', '--manifest-path', manifest, '--', ...modeArgs];
56
+ }
57
+ else {
58
+ throw new Error('SubprocessProver: set `binaryPath` (or ZK_JLVM_BIN), or `cargoManifestPath` (or ZK_JLVM_MANIFEST)');
59
+ }
60
+ const stdout = await this.run(command, args);
61
+ return parseGroth16Stdout(stdout);
62
+ }
63
+ run(command, args) {
64
+ const { env, cwd, timeoutMs = 1800000 } = this.opts;
65
+ // Lazy-load child_process so importing the zk slice stays light for non-proving consumers.
66
+ return import('node:child_process').then(({ spawn }) => new Promise((resolve, reject) => {
67
+ // argv (no shell) — `expr`/`data` are JSON with quotes/braces; never interpolate into a shell.
68
+ const child = spawn(command, args, {
69
+ cwd,
70
+ env: { ...process.env, ...env },
71
+ timeout: timeoutMs,
72
+ });
73
+ let out = '';
74
+ let err = '';
75
+ child.stdout.on('data', (d) => (out += d.toString()));
76
+ child.stderr.on('data', (d) => (err += d.toString()));
77
+ child.on('error', reject);
78
+ child.on('close', (code) => {
79
+ if (code === 0)
80
+ resolve(out);
81
+ else
82
+ reject(new Error(`zk-jlvm host exited ${code}: ${err.trim() || out.trim()}`));
83
+ });
84
+ }));
85
+ }
86
+ }
87
+ exports.SubprocessProver = SubprocessProver;
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.atMost = exports.atLeast = exports.ExprRegistry = void 0;
4
+ exports.boundRule = boundRule;
5
+ /**
6
+ * The expression registry binds a human name → a published JLVM rule → its `logicHash`
7
+ * (`keccak256(canonicalize(rule))`). The `logicHash` is the load-bearing public value: it equals the
8
+ * `exprHash` word a zk-jlvm proof commits AND the literal a semi-private guard pins. Registering a
9
+ * rule with a LITERAL bound ("pin the bound into the rule", e.g. `{">=":[{"var":"score"},700]}`)
10
+ * makes "the proof's exprHash == this logicHash" mean "the hidden value satisfies THIS public,
11
+ * legible rule" — privacy of the value, transparency of the predicate.
12
+ */
13
+ const preimage_1 = require("./preimage");
14
+ /** A client-side registry mapping rule names to their canonical `logicHash`. */
15
+ class ExprRegistry {
16
+ constructor() {
17
+ this.byName = new Map();
18
+ }
19
+ /** Register (or replace) a named rule; returns the entry with its computed `logicHash`. */
20
+ register(name, rule) {
21
+ const entry = { rule, logicHash: (0, preimage_1.exprHash)(rule) };
22
+ this.byName.set(name, entry);
23
+ return entry;
24
+ }
25
+ /** Whether a rule is registered under `name`. */
26
+ has(name) {
27
+ return this.byName.has(name);
28
+ }
29
+ /** The registered rule, or throw if unknown. */
30
+ ruleOf(name) {
31
+ return this.require(name).rule;
32
+ }
33
+ /** The registered rule's `logicHash`, or throw if unknown. */
34
+ logicHashOf(name) {
35
+ return this.require(name).logicHash;
36
+ }
37
+ /** All registered names, in insertion order. */
38
+ names() {
39
+ return [...this.byName.keys()];
40
+ }
41
+ require(name) {
42
+ const entry = this.byName.get(name);
43
+ if (!entry)
44
+ throw new Error(`ExprRegistry: no rule registered under "${name}"`);
45
+ return entry;
46
+ }
47
+ }
48
+ exports.ExprRegistry = ExprRegistry;
49
+ /**
50
+ * A single-bound predicate `{[op]:[{var:varName}, bound]}` — the "pinned bound" a proof binds to.
51
+ * `bound` stays a JSON primitive (number/string) so the canonical bytes the prover hashes match the
52
+ * canonical bytes the rule registers under (bigint is not JSON-serializable — pre-encode if needed).
53
+ */
54
+ function boundRule(varName, op, bound) {
55
+ return { [op]: [{ var: varName }, bound] };
56
+ }
57
+ /** `{">=":[{"var":varName}, bound]}` — "the hidden `varName` is at least `bound`". */
58
+ const atLeast = (varName, bound) => boundRule(varName, '>=', bound);
59
+ exports.atLeast = atLeast;
60
+ /** `{"<=":[{"var":varName}, bound]}` — "the hidden `varName` is at most `bound`". */
61
+ const atMost = (varName, bound) => boundRule(varName, '<=', bound);
62
+ exports.atMost = atMost;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ /**
3
+ * SP1 zk-jlvm public-values types + decode.
4
+ *
5
+ * The guest commits `abi_encode(JlvmPublicValues{ bytes32 exprHash, bytes32 dataHash,
6
+ * bytes32 outputHash, bool ok })` — four 32-byte words, the bool right-aligned in its word.
7
+ * There is no on-chain `jlvm_pv_decode` opcode: the chain guard parses the same blob with the
8
+ * native JLVM `cat`/`substr` ops. This decode mirrors that for client-side binding/inspection.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.decodeJlvmPublicValues = decodeJlvmPublicValues;
12
+ /**
13
+ * Decode `abi_encode(JlvmPublicValues)`: four 32-byte words `[exprHash | dataHash | outputHash | ok]`.
14
+ * The bool is right-aligned in its word (final byte `0x00`/`0x01`).
15
+ */
16
+ function decodeJlvmPublicValues(pv) {
17
+ const b = pv.startsWith('0x') ? pv.slice(2) : pv;
18
+ if (b.length < 4 * 64) {
19
+ throw new Error(`publicValues too short: ${b.length} hex chars (need >= 256)`);
20
+ }
21
+ const word = (i) => `0x${b.slice(i * 64, i * 64 + 64)}`;
22
+ return {
23
+ exprHash: word(0),
24
+ dataHash: word(1),
25
+ outputHash: word(2),
26
+ ok: b.slice(3 * 64 + 62, 3 * 64 + 64) !== '00',
27
+ };
28
+ }
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.groth16Witness = groth16Witness;
4
+ exports.pmtWitness = pmtWitness;
5
+ const types_1 = require("./types");
6
+ /**
7
+ * Shape a produced {@link Groth16Bundle} into the on-op witness map (`{publicValues, proof}`) and
8
+ * surface its decoded public values. The vkey rides in the guard, not the witness, so it is dropped.
9
+ */
10
+ function groth16Witness(bundle) {
11
+ return {
12
+ witness: { publicValues: bundle.publicValues, proof: bundle.proof },
13
+ decoded: (0, types_1.decodeJlvmPublicValues)(bundle.publicValues),
14
+ };
15
+ }
16
+ /** Shape a Poseidon-Merkle inclusion path into the on-op `pmt_verify` witness map. */
17
+ function pmtWitness(leaf, index, siblings) {
18
+ return { leaf, index, siblings };
19
+ }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Compute Application — bare computation substrates.
3
+ *
4
+ * Turing-complete JLVM substrates with no parties, assets, or governance: pure
5
+ * in-place state evolution. The flagship is `rule110`, an in-place Rule-110
6
+ * cellular automaton that proves the account layer is Turing-complete.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * import { getComputeDefinition, COMPUTE_DEFINITIONS } from '@ottochain/sdk/apps/compute';
11
+ *
12
+ * const rule110Def = getComputeDefinition('rule110');
13
+ * ```
14
+ *
15
+ * @packageDocumentation
16
+ */
17
+ import { computeRule110Def } from './state-machines/index.js';
18
+ export { computeRule110Def };
19
+ /** All compute (bare-computation) state machine definitions. */
20
+ export const COMPUTE_DEFINITIONS = {
21
+ rule110: computeRule110Def,
22
+ };
23
+ /**
24
+ * Get a compute state machine definition by type.
25
+ * @param type - 'rule110' (default).
26
+ */
27
+ export function getComputeDefinition(type = 'rule110') {
28
+ return COMPUTE_DEFINITIONS[type];
29
+ }
@@ -0,0 +1,161 @@
1
+ import { defineFiberApp } from '../../../schema/fiber-app.js';
2
+ /**
3
+ * Rule-110 cellular automaton — an in-place, Turing-complete JLVM substrate.
4
+ *
5
+ * Each `step` event advances ONE CA generation in place:
6
+ * next[i] = R110(tape[i-1], tape[i], tape[i+1])
7
+ * with fixed-0 boundaries, computed as a JLVM `map` over a STORED index array
8
+ * (`idx`) — no bitwise ops, no spawn, no zip. The fiber loops RUNNING → RUNNING;
9
+ * the chain of transitions IS the Turing-machine tape-head.
10
+ *
11
+ * Rule 110: out = 1 iff p ∈ {1,2,3,5,6}, where p = 4·left + 2·center + right.
12
+ *
13
+ * THE INLINED-CELL CONSTRAINT (do not "simplify" with `let`)
14
+ * ---------------------------------------------------------
15
+ * Inside `map`, a primitive element is overlaid into the eval context, so
16
+ * `{var:""}` coerces to the element int ONLY in arithmetic position. Opening a
17
+ * `let` scope over the element makes `{var:""}` resolve to the whole context
18
+ * object (`{"tag":"map"}`) and any `cat` on it throws `JsonLogicRuntimeError`.
19
+ * Therefore the per-cell predicate P is fully INLINED at each of the five `==`
20
+ * comparison sites (P appears 5×; each neighbour read `nb` reads the tape once
21
+ * per occurrence). This is the only form that works inside `map`. It is built
22
+ * programmatically below to avoid hand-duplicating P, but it expands to the
23
+ * inlined AST — NOT a `let`-form.
24
+ *
25
+ * Neighbour access uses a computed `var` PATH with a null-default boundary:
26
+ * nb(off) = { var: [ { cat: ["state.tape.", off] }, 0 ] }
27
+ * An out-of-bounds index (-1 or N) resolves to the default `0` (fixed-0
28
+ * boundary), so `tape`/`idx` stay exactly length N forever.
29
+ *
30
+ * Verified end-to-end against `@constellation-network/metagraph-sdk-jlvm@1.8.0-rc.5`:
31
+ * the effect reproduces the canonical left-growing Rule-110 fractal exactly,
32
+ * `idx` is byte-identical across every generation, and the unbounded/bounded
33
+ * guard halts at `gen == maxGen`.
34
+ */
35
+ // nb(off): read tape at element-relative offset, fixed-0 boundary via null-default.
36
+ const nb = (off) => ({
37
+ var: [{ cat: ['state.tape.', off] }, 0],
38
+ });
39
+ // P = 4·left + 2·center + right (element {var:""} is the cell index i).
40
+ const P = {
41
+ '+': [{ '*': [4, nb({ '-': [{ var: '' }, 1] })] }, { '*': [2, nb({ var: '' })] }, nb({ '+': [{ var: '' }, 1] })],
42
+ };
43
+ // CELL: 1 iff P ∈ {1,2,3,5,6}, else 0. P is INLINED at each `==` site (B1: never
44
+ // `let` over the map element). Built from the rule-110 truth set programmatically.
45
+ const CELL = {
46
+ if: [{ or: [1, 2, 3, 5, 6].map((k) => ({ '==': [P, k] })) }, 1, 0],
47
+ };
48
+ /**
49
+ * Rule-110 cellular-automaton fiber definition.
50
+ *
51
+ * Trust model: PUBLIC / PERMISSIONLESS / pure compute. No assets, no parties,
52
+ * no owner — anyone may submit `step`. The DoS surface is bounded by per-event
53
+ * gas/fee (~987 gas/cell) and the optional `maxGen` halt bound (absent ⇒
54
+ * unbounded; runs until fees stop).
55
+ */
56
+ export const computeRule110Def = defineFiberApp({
57
+ metadata: {
58
+ name: 'ComputeRule110',
59
+ app: 'compute',
60
+ type: 'rule110',
61
+ version: '1.0.0',
62
+ description: 'In-place Rule-110 cellular automaton — a Turing-complete substrate. Each ' +
63
+ '`step` advances one generation: next[i]=R110(tape[i-1],tape[i],tape[i+1]) ' +
64
+ 'with fixed-0 boundaries, as a JLVM map over a stored index array (no ' +
65
+ 'bitwise, no spawn, no zip).',
66
+ },
67
+ createSchema: {
68
+ // maxGen is NOT required: absent ⇒ unbounded (the step guard uses `missing`).
69
+ required: ['tape', 'idx'],
70
+ properties: {
71
+ tape: {
72
+ type: 'array',
73
+ items: { type: 'integer' },
74
+ description: '0/1 CA row (length N).',
75
+ },
76
+ idx: {
77
+ type: 'array',
78
+ items: { type: 'integer' },
79
+ immutable: true,
80
+ description: 'Monotone index array [0..N-1]; REQUIRED (no range/iota opcode). ' +
81
+ 'Never mutated — the effect preserves it across every generation.',
82
+ },
83
+ gen: {
84
+ type: 'integer',
85
+ default: 0,
86
+ description: 'Generation counter (TM step count).',
87
+ },
88
+ maxGen: {
89
+ type: 'integer',
90
+ description: 'Optional halt bound; absent ⇒ unbounded.',
91
+ },
92
+ },
93
+ },
94
+ stateSchema: {
95
+ properties: {
96
+ tape: { type: 'array', items: { type: 'integer' }, computed: true },
97
+ idx: { type: 'array', items: { type: 'integer' }, immutable: true },
98
+ gen: { type: 'integer', computed: true },
99
+ maxGen: { type: 'integer' },
100
+ status: { type: 'string', computed: true },
101
+ },
102
+ },
103
+ eventSchemas: {
104
+ step: { description: 'Advance one CA generation in place.' },
105
+ halt: { description: 'Terminate once maxGen is reached (gated by gen >= maxGen).' },
106
+ },
107
+ states: {
108
+ RUNNING: {
109
+ id: 'RUNNING',
110
+ isFinal: false,
111
+ metadata: {
112
+ label: 'Running',
113
+ description: 'CA evolving; each step = one generation.',
114
+ category: 'active',
115
+ },
116
+ },
117
+ HALTED: {
118
+ id: 'HALTED',
119
+ isFinal: true,
120
+ metadata: {
121
+ label: 'Halted',
122
+ description: 'maxGen reached; terminal.',
123
+ category: 'terminal',
124
+ },
125
+ },
126
+ },
127
+ initialState: 'RUNNING',
128
+ transitions: [
129
+ {
130
+ // One `step` = one generation. Loops in place (the TM tape-head).
131
+ from: 'RUNNING',
132
+ to: 'RUNNING',
133
+ eventName: 'step',
134
+ // Unbounded when maxGen is absent (`missing` → true); else gate on gen < maxGen.
135
+ guard: {
136
+ or: [{ missing: ['state.maxGen'] }, { '<': [{ var: 'state.gen' }, { var: 'state.maxGen' }] }],
137
+ },
138
+ // Effect result IS the new stateData: merge[state, overrides] preserves
139
+ // idx/maxGen and overwrites tape/gen.
140
+ effect: {
141
+ merge: [
142
+ { var: 'state' },
143
+ {
144
+ tape: { map: [{ var: 'state.idx' }, CELL] },
145
+ gen: { '+': [{ var: 'state.gen' }, 1] },
146
+ },
147
+ ],
148
+ },
149
+ dependencies: [],
150
+ },
151
+ {
152
+ // halt is rejected until exhaustion: gen >= maxGen.
153
+ from: 'RUNNING',
154
+ to: 'HALTED',
155
+ eventName: 'halt',
156
+ guard: { '>=': [{ var: 'state.gen' }, { var: 'state.maxGen' }] },
157
+ effect: { merge: [{ var: 'state' }, { status: 'halted' }] },
158
+ dependencies: [],
159
+ },
160
+ ],
161
+ });
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Compute (bare-computation) state machine definitions.
3
+ * Re-exports from TypeScript definition files.
4
+ */
5
+ export { computeRule110Def } from './compute-rule110.js';
@@ -6,7 +6,7 @@
6
6
  * @example
7
7
  * ```typescript
8
8
  * import {
9
- * ContractState,
9
+ * State,
10
10
  * Contract,
11
11
  * getContractDefinition,
12
12
  * CONTRACTS_DEFINITIONS
@@ -18,12 +18,16 @@
18
18
  *
19
19
  * @packageDocumentation
20
20
  */
21
- // Re-export generated protobuf types (source of truth)
22
- export { ContractState, Contract, ProposeContractRequest, AcceptContractRequest, CompleteContractRequest, RejectContractRequest, DisputeContractRequest, ContractDefinition, contractStateFromJSON, contractStateToJSON, } from "../../generated/ottochain/apps/contracts/v1/contract.js";
21
+ // Re-export generated protobuf types (source of truth).
22
+ // The nested lifecycle enum dropped its app prefix in the proto; under this
23
+ // app-scoped entrypoint it is unambiguously State.
24
+ export { State, Contract, ProposeContractRequest, AcceptContractRequest, CompleteContractRequest, RejectContractRequest, DisputeContractRequest, ContractDefinition, stateFromJSON, stateToJSON, } from '../../generated/ottochain/apps/contracts/v1/contract.js';
25
+ // Deprecated app-prefixed alias (renamed to State); kept for compat.
26
+ export { State as ContractState, stateFromJSON as contractStateFromJSON, stateToJSON as contractStateToJSON, } from '../../generated/ottochain/apps/contracts/v1/contract.js';
23
27
  // ---------------------------------------------------------------------------
24
28
  // State Machine Definitions (generated from JSON at build time)
25
29
  // ---------------------------------------------------------------------------
26
- import { contractUniversalDef, contractAgreementDef, contractEscrowDef, } from "./state-machines/index.js";
30
+ import { contractUniversalDef, contractAgreementDef, contractEscrowDef } from './state-machines/index.js';
27
31
  export { contractUniversalDef, contractAgreementDef, contractEscrowDef };
28
32
  /** All contract state machine definitions */
29
33
  export const CONTRACTS_DEFINITIONS = {
@@ -35,7 +39,7 @@ export const CONTRACTS_DEFINITIONS = {
35
39
  * Get a contract state machine definition by type.
36
40
  * @param type - 'universal' | 'agreement' | 'escrow' (default: 'agreement')
37
41
  */
38
- export function getContractDefinition(type = "agreement") {
42
+ export function getContractDefinition(type = 'agreement') {
39
43
  return CONTRACTS_DEFINITIONS[type];
40
44
  }
41
45
  /** @deprecated Use getContractDefinition('escrow') */