@ottochain/sdk 2.2.5 → 2.4.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 (222) hide show
  1. package/dist/cjs/apps/contracts/index.js +15 -8
  2. package/dist/cjs/apps/contracts/state-machines/contract-agreement.js +89 -46
  3. package/dist/cjs/apps/contracts/state-machines/contract-escrow.js +152 -45
  4. package/dist/cjs/apps/contracts/state-machines/contract-universal.js +40 -8
  5. package/dist/cjs/apps/corporate/index.js +2 -2
  6. package/dist/cjs/apps/corporate/state-machines/corp-board.js +169 -59
  7. package/dist/cjs/apps/corporate/state-machines/corp-entity.js +245 -47
  8. package/dist/cjs/apps/corporate/state-machines/corp-securities.js +407 -99
  9. package/dist/cjs/apps/corporate/state-machines/corp-shareholders.js +151 -37
  10. package/dist/cjs/apps/governance/index.js +14 -14
  11. package/dist/cjs/apps/governance/state-machines/dao-multisig.js +85 -43
  12. package/dist/cjs/apps/governance/state-machines/dao-reputation.js +73 -43
  13. package/dist/cjs/apps/governance/state-machines/dao-single.js +55 -14
  14. package/dist/cjs/apps/governance/state-machines/dao-token.js +103 -45
  15. package/dist/cjs/apps/governance/state-machines/governance-simple.js +129 -65
  16. package/dist/cjs/apps/governance/state-machines/governance-universal.js +29 -5
  17. package/dist/cjs/apps/identity/constants.js +55 -14
  18. package/dist/cjs/apps/identity/index.js +27 -11
  19. package/dist/cjs/apps/identity/state-machines/identity-agent.js +57 -9
  20. package/dist/cjs/apps/identity/state-machines/identity-oracle.js +70 -27
  21. package/dist/cjs/apps/identity/state-machines/identity-registry.js +288 -0
  22. package/dist/cjs/apps/identity/state-machines/identity-universal.js +30 -6
  23. package/dist/cjs/apps/identity/state-machines/index.js +3 -1
  24. package/dist/cjs/apps/index.js +19 -8
  25. package/dist/cjs/apps/lending/assets.js +223 -0
  26. package/dist/cjs/apps/lending/credit-scoring.js +87 -0
  27. package/dist/cjs/apps/lending/eligibility.js +121 -0
  28. package/dist/cjs/apps/lending/index.js +91 -0
  29. package/dist/cjs/apps/lending/state-machines/index.js +9 -0
  30. package/dist/cjs/apps/lending/state-machines/lending-zk-loan.js +412 -0
  31. package/dist/cjs/apps/markets/index.js +21 -11
  32. package/dist/cjs/apps/markets/state-machines/market-auction.js +44 -19
  33. package/dist/cjs/apps/markets/state-machines/market-crowdfund.js +54 -29
  34. package/dist/cjs/apps/markets/state-machines/market-group-buy.js +53 -31
  35. package/dist/cjs/apps/markets/state-machines/market-prediction.js +120 -61
  36. package/dist/cjs/apps/markets/state-machines/market-universal.js +50 -10
  37. package/dist/cjs/apps/oracles/index.js +2 -2
  38. package/dist/cjs/errors.js +3 -3
  39. package/dist/cjs/generated/google/protobuf/struct.js +4 -4
  40. package/dist/cjs/generated/index.js +11 -7
  41. package/dist/cjs/generated/openapi.js +6 -0
  42. package/dist/cjs/generated/ottochain/apps/contracts/v1/contract.js +50 -50
  43. package/dist/cjs/generated/ottochain/apps/corporate/v1/corporate.js +19 -20
  44. package/dist/cjs/generated/ottochain/apps/governance/v1/governance.js +13 -13
  45. package/dist/cjs/generated/ottochain/apps/identity/v1/attestation.js +4 -4
  46. package/dist/cjs/generated/ottochain/apps/identity/v1/identity.js +124 -130
  47. package/dist/cjs/generated/ottochain/apps/markets/v1/market.js +107 -107
  48. package/dist/cjs/generated/ottochain/v1/common.js +1722 -1
  49. package/dist/cjs/generated/ottochain/v1/fiber.js +355 -5
  50. package/dist/cjs/generated/ottochain/v1/messages.js +775 -3
  51. package/dist/cjs/generated/ottochain/v1/records.js +350 -3
  52. package/dist/cjs/index.js +45 -7
  53. package/dist/cjs/openapi.js +2 -0
  54. package/dist/cjs/ottochain/drop-nulls.js +1 -2
  55. package/dist/cjs/ottochain/genesis-manifest.js +193 -0
  56. package/dist/cjs/ottochain/index.js +27 -13
  57. package/dist/cjs/ottochain/metagraph-client.js +65 -8
  58. package/dist/cjs/ottochain/snapshot.js +11 -12
  59. package/dist/cjs/ottochain/transaction.js +57 -14
  60. package/dist/cjs/ottochain/types.js +19 -1
  61. package/dist/cjs/privacy/index.js +14 -0
  62. package/dist/cjs/privacy/sealed-bid.js +210 -0
  63. package/dist/cjs/privacy/shield-app.js +131 -0
  64. package/dist/cjs/schema/effects.js +40 -0
  65. package/dist/cjs/schema/fiber-app.js +19 -13
  66. package/dist/cjs/schema/guard-lint.js +352 -0
  67. package/dist/cjs/schema/guards.js +246 -0
  68. package/dist/cjs/signing.js +80 -0
  69. package/dist/cjs/types.js +2 -3
  70. package/dist/cjs/validation.js +8 -8
  71. package/dist/cjs/verify.js +9 -4
  72. package/dist/cjs/zk/commit.js +53 -0
  73. package/dist/cjs/zk/guard.js +107 -0
  74. package/dist/cjs/zk/index.js +48 -0
  75. package/dist/cjs/zk/preimage.js +37 -0
  76. package/dist/cjs/zk/prover.js +87 -0
  77. package/dist/cjs/zk/registry.js +62 -0
  78. package/dist/cjs/zk/types.js +28 -0
  79. package/dist/cjs/zk/witness.js +19 -0
  80. package/dist/esm/apps/contracts/index.js +7 -3
  81. package/dist/esm/apps/contracts/state-machines/contract-agreement.js +89 -46
  82. package/dist/esm/apps/contracts/state-machines/contract-escrow.js +152 -45
  83. package/dist/esm/apps/contracts/state-machines/contract-universal.js +40 -8
  84. package/dist/esm/apps/corporate/state-machines/corp-board.js +169 -59
  85. package/dist/esm/apps/corporate/state-machines/corp-entity.js +245 -47
  86. package/dist/esm/apps/corporate/state-machines/corp-securities.js +407 -99
  87. package/dist/esm/apps/corporate/state-machines/corp-shareholders.js +151 -37
  88. package/dist/esm/apps/governance/state-machines/dao-multisig.js +85 -43
  89. package/dist/esm/apps/governance/state-machines/dao-reputation.js +73 -43
  90. package/dist/esm/apps/governance/state-machines/dao-single.js +55 -14
  91. package/dist/esm/apps/governance/state-machines/dao-token.js +103 -45
  92. package/dist/esm/apps/governance/state-machines/governance-simple.js +129 -65
  93. package/dist/esm/apps/governance/state-machines/governance-universal.js +29 -5
  94. package/dist/esm/apps/identity/constants.js +51 -12
  95. package/dist/esm/apps/identity/index.js +12 -7
  96. package/dist/esm/apps/identity/state-machines/identity-agent.js +57 -9
  97. package/dist/esm/apps/identity/state-machines/identity-oracle.js +70 -27
  98. package/dist/esm/apps/identity/state-machines/identity-registry.js +285 -0
  99. package/dist/esm/apps/identity/state-machines/identity-universal.js +30 -6
  100. package/dist/esm/apps/identity/state-machines/index.js +1 -0
  101. package/dist/esm/apps/index.js +1 -0
  102. package/dist/esm/apps/lending/assets.js +207 -0
  103. package/dist/esm/apps/lending/credit-scoring.js +81 -0
  104. package/dist/esm/apps/lending/eligibility.js +115 -0
  105. package/dist/esm/apps/lending/index.js +69 -0
  106. package/dist/esm/apps/lending/state-machines/index.js +5 -0
  107. package/dist/esm/apps/lending/state-machines/lending-zk-loan.js +409 -0
  108. package/dist/esm/apps/markets/index.js +8 -4
  109. package/dist/esm/apps/markets/state-machines/market-auction.js +44 -19
  110. package/dist/esm/apps/markets/state-machines/market-crowdfund.js +54 -29
  111. package/dist/esm/apps/markets/state-machines/market-group-buy.js +53 -31
  112. package/dist/esm/apps/markets/state-machines/market-prediction.js +120 -61
  113. package/dist/esm/apps/markets/state-machines/market-universal.js +50 -10
  114. package/dist/esm/generated/index.js +9 -5
  115. package/dist/esm/generated/openapi.js +5 -0
  116. package/dist/esm/generated/ottochain/apps/contracts/v1/contract.js +46 -46
  117. package/dist/esm/generated/ottochain/apps/identity/v1/identity.js +114 -120
  118. package/dist/esm/generated/ottochain/apps/markets/v1/market.js +100 -100
  119. package/dist/esm/generated/ottochain/v1/common.js +1718 -0
  120. package/dist/esm/generated/ottochain/v1/fiber.js +351 -1
  121. package/dist/esm/generated/ottochain/v1/messages.js +774 -2
  122. package/dist/esm/generated/ottochain/v1/records.js +349 -2
  123. package/dist/esm/index.js +23 -2
  124. package/dist/esm/openapi.js +1 -0
  125. package/dist/esm/ottochain/genesis-manifest.js +189 -0
  126. package/dist/esm/ottochain/index.js +4 -3
  127. package/dist/esm/ottochain/metagraph-client.js +65 -8
  128. package/dist/esm/ottochain/snapshot.js +4 -4
  129. package/dist/esm/ottochain/transaction.js +43 -3
  130. package/dist/esm/ottochain/types.js +18 -0
  131. package/dist/esm/privacy/index.js +6 -0
  132. package/dist/esm/privacy/sealed-bid.js +206 -0
  133. package/dist/esm/privacy/shield-app.js +127 -0
  134. package/dist/esm/schema/effects.js +35 -0
  135. package/dist/esm/schema/fiber-app.js +13 -6
  136. package/dist/esm/schema/guard-lint.js +346 -0
  137. package/dist/esm/schema/guards.js +229 -0
  138. package/dist/esm/signing.js +74 -0
  139. package/dist/esm/verify.js +8 -2
  140. package/dist/esm/zk/commit.js +44 -0
  141. package/dist/esm/zk/guard.js +99 -0
  142. package/dist/esm/zk/index.js +19 -0
  143. package/dist/esm/zk/preimage.js +30 -0
  144. package/dist/esm/zk/prover.js +82 -0
  145. package/dist/esm/zk/registry.js +55 -0
  146. package/dist/esm/zk/types.js +25 -0
  147. package/dist/esm/zk/witness.js +15 -0
  148. package/dist/types/apps/contracts/index.d.ts +159 -227
  149. package/dist/types/apps/contracts/state-machines/contract-agreement.d.ts +50 -101
  150. package/dist/types/apps/contracts/state-machines/contract-escrow.d.ts +86 -120
  151. package/dist/types/apps/contracts/state-machines/contract-universal.d.ts +20 -4
  152. package/dist/types/apps/corporate/index.d.ts +1040 -304
  153. package/dist/types/apps/corporate/state-machines/corp-board.d.ts +188 -52
  154. package/dist/types/apps/corporate/state-machines/corp-entity.d.ts +267 -62
  155. package/dist/types/apps/corporate/state-machines/corp-securities.d.ts +355 -131
  156. package/dist/types/apps/corporate/state-machines/corp-shareholders.d.ts +225 -53
  157. package/dist/types/apps/governance/index.d.ts +396 -417
  158. package/dist/types/apps/governance/state-machines/dao-multisig.d.ts +92 -95
  159. package/dist/types/apps/governance/state-machines/dao-reputation.d.ts +57 -69
  160. package/dist/types/apps/governance/state-machines/dao-single.d.ts +40 -50
  161. package/dist/types/apps/governance/state-machines/dao-token.d.ts +80 -53
  162. package/dist/types/apps/governance/state-machines/governance-simple.d.ts +107 -121
  163. package/dist/types/apps/governance/state-machines/governance-universal.d.ts +17 -5
  164. package/dist/types/apps/identity/constants.d.ts +32 -4
  165. package/dist/types/apps/identity/index.d.ts +449 -100
  166. package/dist/types/apps/identity/state-machines/identity-agent.d.ts +30 -0
  167. package/dist/types/apps/identity/state-machines/identity-oracle.d.ts +41 -87
  168. package/dist/types/apps/identity/state-machines/identity-registry.d.ts +379 -0
  169. package/dist/types/apps/identity/state-machines/identity-universal.d.ts +15 -0
  170. package/dist/types/apps/identity/state-machines/index.d.ts +1 -0
  171. package/dist/types/apps/index.d.ts +1 -0
  172. package/dist/types/apps/lending/assets.d.ts +258 -0
  173. package/dist/types/apps/lending/credit-scoring.d.ts +80 -0
  174. package/dist/types/apps/lending/eligibility.d.ts +83 -0
  175. package/dist/types/apps/lending/index.d.ts +548 -0
  176. package/dist/types/apps/lending/state-machines/index.d.ts +5 -0
  177. package/dist/types/apps/lending/state-machines/lending-zk-loan.d.ts +528 -0
  178. package/dist/types/apps/markets/index.d.ts +184 -204
  179. package/dist/types/apps/markets/state-machines/market-auction.d.ts +25 -37
  180. package/dist/types/apps/markets/state-machines/market-crowdfund.d.ts +26 -34
  181. package/dist/types/apps/markets/state-machines/market-group-buy.d.ts +31 -43
  182. package/dist/types/apps/markets/state-machines/market-prediction.d.ts +67 -72
  183. package/dist/types/apps/markets/state-machines/market-universal.d.ts +30 -10
  184. package/dist/types/generated/index.d.ts +5 -5
  185. package/dist/types/generated/openapi.d.ts +1257 -0
  186. package/dist/types/generated/ottochain/apps/contracts/v1/contract.d.ts +5 -5
  187. package/dist/types/generated/ottochain/apps/identity/v1/identity.d.ts +12 -12
  188. package/dist/types/generated/ottochain/apps/markets/v1/market.d.ts +11 -11
  189. package/dist/types/generated/ottochain/v1/common.d.ts +228 -0
  190. package/dist/types/generated/ottochain/v1/fiber.d.ts +32 -1
  191. package/dist/types/generated/ottochain/v1/messages.d.ts +84 -0
  192. package/dist/types/generated/ottochain/v1/records.d.ts +34 -0
  193. package/dist/types/index.d.ts +8 -2
  194. package/dist/types/openapi.d.ts +22 -0
  195. package/dist/types/ottochain/genesis-manifest.d.ts +130 -0
  196. package/dist/types/ottochain/index.d.ts +6 -5
  197. package/dist/types/ottochain/metagraph-client.d.ts +49 -7
  198. package/dist/types/ottochain/snapshot.d.ts +6 -6
  199. package/dist/types/ottochain/transaction.d.ts +33 -1
  200. package/dist/types/ottochain/types.d.ts +602 -11
  201. package/dist/types/privacy/index.d.ts +6 -0
  202. package/dist/types/privacy/sealed-bid.d.ts +348 -0
  203. package/dist/types/privacy/shield-app.d.ts +48 -0
  204. package/dist/types/schema/effects.d.ts +34 -0
  205. package/dist/types/schema/fiber-app.d.ts +41 -3
  206. package/dist/types/schema/guard-lint.d.ts +111 -0
  207. package/dist/types/schema/guards.d.ts +134 -0
  208. package/dist/types/signing.d.ts +45 -0
  209. package/dist/types/validation.d.ts +22 -217
  210. package/dist/types/verify.d.ts +4 -0
  211. package/dist/types/zk/commit.d.ts +28 -0
  212. package/dist/types/zk/guard.d.ts +46 -0
  213. package/dist/types/zk/index.d.ts +19 -0
  214. package/dist/types/zk/preimage.d.ts +10 -0
  215. package/dist/types/zk/prover.d.ts +34 -0
  216. package/dist/types/zk/registry.d.ts +34 -0
  217. package/dist/types/zk/types.d.ts +33 -0
  218. package/dist/types/zk/witness.d.ts +40 -0
  219. package/package.json +52 -35
  220. package/dist/cjs/ottochain/normalize.js +0 -186
  221. package/dist/esm/ottochain/normalize.js +0 -179
  222. package/dist/types/ottochain/normalize.d.ts +0 -79
@@ -0,0 +1,412 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.lendingZkLoanDef = void 0;
4
+ const fiber_app_js_1 = require("../../../schema/fiber-app.js");
5
+ /**
6
+ * Privacy-preserving zk-loan — a private-finance lending fiber modeled on Midnight's
7
+ * zkLoan example, integrated with OttoChain's asset subsystem.
8
+ *
9
+ * The borrower proves, in zero-knowledge, that their PRIVATE financials satisfy the
10
+ * PUBLIC lending rule (collateral coverage and/or a credit-score floor) WITHOUT
11
+ * revealing the financials. The lender originates the loan. The collateral, principal,
12
+ * and repayment are ASSETS, driven through typed morphisms by the loan lifecycle.
13
+ *
14
+ * Privacy boundary (see docs/design/zk-loan-app.md):
15
+ * - PRIVATE (witness only): collateralValue, credit/income financials (income, score),
16
+ * outstanding debt, and the blinding salts. Never on-chain, never in the event.
17
+ * - PUBLIC (revealed): the loan principal amount, the collateral asset id (a locked
18
+ * handle, not its private valuation), the lending-rule logicHash, loan status, and
19
+ * the boolean "eligible" outcome — the chain learns *whether* the borrower qualifies,
20
+ * never *why*.
21
+ *
22
+ * The ORIGINATION guard (`originate`, COLLATERAL_LOCKED -> ACTIVE) is the semi-private
23
+ * gate: it verifies an SP1-Groth16 eligibility proof over `witness.{publicValues,proof}`
24
+ * with the lender's pinned verifying key, AND binds the proof's committed public values
25
+ * (parsed out of the opaque `publicValues` blob with native JLVM `cat`/`substr`) to the
26
+ * PUBLIC lending rule — `exprHash == $lendingRuleLogicHash`, `outputHash == $keccakTrue`,
27
+ * and the `ok` bit — so a proof can only originate a loan if it proves THE pinned rule
28
+ * evaluated to `true` on the borrower's hidden data. A missing/garbage witness makes the
29
+ * guard false and the transition is gracefully rejected (state untouched).
30
+ *
31
+ * The pinned public constants ($lendingRuleVKey, $lendingRuleLogicHash, $keccakTrue) live
32
+ * on the loan's create-state so the guard is a closed expression. They are produced
33
+ * client-side by `src/apps/lending` helpers (`buildOriginationGuard`, `pinLendingRule`)
34
+ * over `src/zk` (`exprHash`, `KECCAK_TRUE`).
35
+ */
36
+ exports.lendingZkLoanDef = (0, fiber_app_js_1.defineFiberApp)({
37
+ metadata: {
38
+ name: "LendingZkLoan",
39
+ app: "lending",
40
+ type: "zkLoan",
41
+ version: "1.0.0",
42
+ description: "Privacy-preserving collateralized loan: the borrower proves loan eligibility (collateral coverage / credit-score floor) in zero-knowledge without revealing the financials; collateral, principal and repayment are asset-subsystem tokens driven by the loan lifecycle.",
43
+ crossReferences: {
44
+ borrowerIdentityId: "Links to the borrower's IdentityAgent",
45
+ lenderIdentityId: "Links to the lender's IdentityAgent (loan originator)",
46
+ collateralAssetId: "Asset instance locked as collateral (held by the loan's escrow fiber)",
47
+ debtAssetId: "Asset instance representing the outstanding loan principal/debt minted to the borrower",
48
+ },
49
+ },
50
+ createSchema: {
51
+ required: [
52
+ "borrower",
53
+ "lender",
54
+ "principalAmount",
55
+ "collateralAssetId",
56
+ "collateralPolicy",
57
+ "debtPolicy",
58
+ "lendingRuleVKey",
59
+ "lendingRuleLogicHash",
60
+ "keccakTrue",
61
+ ],
62
+ properties: {
63
+ borrower: {
64
+ type: "address",
65
+ description: "DAG address of the borrower",
66
+ immutable: true,
67
+ },
68
+ lender: {
69
+ type: "address",
70
+ description: "DAG address of the lender / loan originator",
71
+ immutable: true,
72
+ },
73
+ principalAmount: {
74
+ type: "integer",
75
+ description: "PUBLIC loan principal (asset minor-units). The financials backing eligibility stay private.",
76
+ minimum: 1,
77
+ immutable: true,
78
+ },
79
+ collateralAssetId: {
80
+ type: "uuid",
81
+ description: "Asset instance id pledged as collateral (its private valuation is never revealed).",
82
+ immutable: true,
83
+ },
84
+ collateralPolicy: {
85
+ type: "string",
86
+ description: "Collateral asset policy name (e.g. 'collateral-vault-v1.asset').",
87
+ immutable: true,
88
+ },
89
+ debtPolicy: {
90
+ type: "string",
91
+ description: "Debt/loan-token asset policy name (e.g. 'loan-debt-v1.asset').",
92
+ immutable: true,
93
+ },
94
+ escrowFiberId: {
95
+ type: "uuid",
96
+ description: "Fiber that custodies the locked collateral (AssetHolder.Fiber). Defaults to this loan fiber.",
97
+ },
98
+ lendingRuleVKey: {
99
+ type: "hash",
100
+ description: "PINNED SP1 program verifying key (bytes32, 0x-hex) for the eligibility circuit.",
101
+ immutable: true,
102
+ },
103
+ lendingRuleLogicHash: {
104
+ type: "hash",
105
+ description: "PINNED logicHash of the public lending rule = keccak256(canonicalize(rule)). The proof's committed exprHash must equal this.",
106
+ immutable: true,
107
+ },
108
+ keccakTrue: {
109
+ type: "hash",
110
+ description: "PINNED keccak256(canonicalize(true)) — the outputHash a 'rule returned true' proof must commit.",
111
+ immutable: true,
112
+ },
113
+ dueOrdinal: {
114
+ type: "integer",
115
+ description: "Optional snapshot ordinal by which repayment is due.",
116
+ minimum: 0,
117
+ },
118
+ },
119
+ },
120
+ stateSchema: {
121
+ properties: {
122
+ status: { type: "string", computed: true },
123
+ borrower: { type: "address", immutable: true },
124
+ lender: { type: "address", immutable: true },
125
+ principalAmount: { type: "integer", immutable: true },
126
+ collateralAssetId: { type: "uuid", immutable: true },
127
+ collateralPolicy: { type: "string", immutable: true },
128
+ debtPolicy: { type: "string", immutable: true },
129
+ escrowFiberId: { type: "uuid" },
130
+ debtAssetId: { type: "uuid", computed: true },
131
+ lendingRuleVKey: { type: "hash", immutable: true },
132
+ lendingRuleLogicHash: { type: "hash", immutable: true },
133
+ keccakTrue: { type: "hash", immutable: true },
134
+ dueOrdinal: { type: "integer" },
135
+ lockedAt: { type: "integer", computed: true },
136
+ originatedAt: { type: "integer", computed: true },
137
+ repaidAt: { type: "integer", computed: true },
138
+ defaultedAt: { type: "integer", computed: true },
139
+ liquidatedAt: { type: "integer", computed: true },
140
+ },
141
+ },
142
+ eventSchemas: {
143
+ lock_collateral: {
144
+ description: "Borrower locks the pledged collateral asset into the loan escrow fiber (drives an asset Transfer/Mint into AssetHolder.Fiber).",
145
+ },
146
+ originate: {
147
+ description: "Lender originates the loan after the borrower's zk eligibility proof verifies. The witness carries the SP1-Groth16 {publicValues, proof}; the guard binds them to the pinned public lending rule. The effect mints the debt/principal asset to the borrower.",
148
+ required: ["witness", "debtAssetId"],
149
+ properties: {
150
+ witness: {
151
+ type: "object",
152
+ description: "Eligibility-proof witness: { publicValues: 0x-hex, proof: 0x-hex }. Exposed to the guard under the reserved `witness` key.",
153
+ properties: {
154
+ publicValues: { type: "string", description: "abi_encode(JlvmPublicValues), 0x-hex." },
155
+ proof: { type: "string", description: "SP1-Groth16 proof bytes, 0x-hex." },
156
+ },
157
+ required: ["publicValues", "proof"],
158
+ },
159
+ debtAssetId: {
160
+ type: "uuid",
161
+ description: "Asset instance id for the debt/principal token minted to the borrower.",
162
+ },
163
+ },
164
+ },
165
+ repay: {
166
+ description: "Borrower repays the principal (drives a Burn of the debt token); on success the collateral is released back to the borrower via the escrow fiber.",
167
+ },
168
+ default_loan: {
169
+ description: "Mark the loan defaulted once past due (drives the collateral toward liquidation).",
170
+ },
171
+ liquidate: {
172
+ description: "Lender liquidates a defaulted loan: the locked collateral is transferred to the lender via the escrow fiber.",
173
+ },
174
+ cancel: {
175
+ description: "Cancel a loan request before collateral is locked.",
176
+ properties: { reason: { type: "string" } },
177
+ },
178
+ },
179
+ states: {
180
+ REQUESTED: {
181
+ id: "REQUESTED",
182
+ isFinal: false,
183
+ metadata: {
184
+ label: "Requested",
185
+ description: "Loan requested; collateral not yet locked, eligibility not yet proven.",
186
+ category: "initial",
187
+ },
188
+ },
189
+ COLLATERAL_LOCKED: {
190
+ id: "COLLATERAL_LOCKED",
191
+ isFinal: false,
192
+ metadata: {
193
+ label: "Collateral Locked",
194
+ description: "Collateral asset escrowed in the loan fiber; awaiting the lender's zk-gated origination.",
195
+ category: "pending",
196
+ },
197
+ },
198
+ ACTIVE: {
199
+ id: "ACTIVE",
200
+ isFinal: false,
201
+ metadata: {
202
+ label: "Active",
203
+ description: "Loan originated (eligibility proven in zk); principal minted to the borrower.",
204
+ category: "active",
205
+ },
206
+ },
207
+ DEFAULTED: {
208
+ id: "DEFAULTED",
209
+ isFinal: false,
210
+ metadata: {
211
+ label: "Defaulted",
212
+ description: "Loan past due and unpaid; collateral pending liquidation.",
213
+ category: "pending",
214
+ },
215
+ },
216
+ REPAID: {
217
+ id: "REPAID",
218
+ isFinal: true,
219
+ metadata: {
220
+ label: "Repaid",
221
+ description: "Principal repaid (debt burned) and collateral released to the borrower.",
222
+ category: "terminal",
223
+ },
224
+ },
225
+ LIQUIDATED: {
226
+ id: "LIQUIDATED",
227
+ isFinal: true,
228
+ metadata: {
229
+ label: "Liquidated",
230
+ description: "Defaulted loan settled by transferring the collateral to the lender.",
231
+ category: "terminal",
232
+ },
233
+ },
234
+ CANCELLED: {
235
+ id: "CANCELLED",
236
+ isFinal: true,
237
+ metadata: {
238
+ label: "Cancelled",
239
+ description: "Loan request cancelled before any collateral was locked.",
240
+ category: "terminal",
241
+ },
242
+ },
243
+ },
244
+ initialState: "REQUESTED",
245
+ transitions: [
246
+ // Borrower locks collateral into the escrow fiber.
247
+ {
248
+ from: "REQUESTED",
249
+ to: "COLLATERAL_LOCKED",
250
+ eventName: "lock_collateral",
251
+ guard: {
252
+ and: [
253
+ { in: [{ var: "state.borrower" }, { map: [{ var: "proofs" }, { var: "address" }] }] },
254
+ { "===": [{ var: "event.assetId" }, { var: "state.collateralAssetId" }] },
255
+ ],
256
+ },
257
+ effect: {
258
+ merge: [
259
+ { var: "state" },
260
+ { status: "COLLATERAL_LOCKED", lockedAt: { var: "$ordinal" } },
261
+ ],
262
+ },
263
+ dependencies: [],
264
+ },
265
+ // Cancel a request before any collateral is locked.
266
+ {
267
+ from: "REQUESTED",
268
+ to: "CANCELLED",
269
+ eventName: "cancel",
270
+ guard: {
271
+ or: [
272
+ { in: [{ var: "state.borrower" }, { map: [{ var: "proofs" }, { var: "address" }] }] },
273
+ { in: [{ var: "state.lender" }, { map: [{ var: "proofs" }, { var: "address" }] }] },
274
+ ],
275
+ },
276
+ effect: {
277
+ merge: [
278
+ { var: "state" },
279
+ {
280
+ status: "CANCELLED",
281
+ cancelledAt: { var: "$ordinal" },
282
+ reason: { var: "event.reason" },
283
+ },
284
+ ],
285
+ },
286
+ dependencies: [],
287
+ },
288
+ // ─── ORIGINATION: the zk eligibility gate ─────────────────────────────────
289
+ // The lender originates iff the borrower's SP1-Groth16 eligibility proof verifies
290
+ // against the pinned vkey AND its committed public values bind to the pinned PUBLIC
291
+ // lending rule. publicValues = abi_encode(JlvmPublicValues{exprHash|dataHash|outputHash|ok}):
292
+ // four 32-byte words, so as a 0x-hex string each word is 64 hex chars at offset
293
+ // 2 + 64*i. We slice with native JLVM `substr` (start, len) and re-`cat` the `0x`
294
+ // prefix to compare to the pinned hashes — there is no jlvm_pv_decode opcode by design.
295
+ // The clauses, in order:
296
+ // 1. agent == lender — only the lender originates
297
+ // 2. groth16_verify(vkey, publicValues, proof) — the proof is valid
298
+ // 3. exprHash == lendingRuleLogicHash — it proved THE pinned rule
299
+ // 4. outputHash == keccakTrue — the rule evaluated to true
300
+ // 5. ok bit (last hex pair of word 3) == "01" — the JLVM run did not error
301
+ {
302
+ from: "COLLATERAL_LOCKED",
303
+ to: "ACTIVE",
304
+ eventName: "originate",
305
+ guard: {
306
+ and: [
307
+ { in: [{ var: "state.lender" }, { map: [{ var: "proofs" }, { var: "address" }] }] },
308
+ {
309
+ groth16_verify: [
310
+ { var: "state.lendingRuleVKey" },
311
+ { var: "event.witness.publicValues" },
312
+ { var: "event.witness.proof" },
313
+ ],
314
+ },
315
+ {
316
+ "===": [
317
+ { cat: ["0x", { substr: [{ var: "event.witness.publicValues" }, 2, 64] }] },
318
+ { var: "state.lendingRuleLogicHash" },
319
+ ],
320
+ },
321
+ {
322
+ "===": [
323
+ { cat: ["0x", { substr: [{ var: "event.witness.publicValues" }, 130, 64] }] },
324
+ { var: "state.keccakTrue" },
325
+ ],
326
+ },
327
+ {
328
+ "===": [{ substr: [{ var: "event.witness.publicValues" }, 256, 2] }, "01"],
329
+ },
330
+ ],
331
+ },
332
+ // Effect mints the loan principal/debt to the borrower (asset Mint), records the
333
+ // debt asset id, and activates the loan.
334
+ effect: {
335
+ merge: [
336
+ { var: "state" },
337
+ {
338
+ status: "ACTIVE",
339
+ originatedAt: { var: "$ordinal" },
340
+ debtAssetId: { var: "event.debtAssetId" },
341
+ },
342
+ ],
343
+ },
344
+ dependencies: [],
345
+ },
346
+ // Borrower repays — debt is burned, collateral released back to the borrower.
347
+ {
348
+ from: "ACTIVE",
349
+ to: "REPAID",
350
+ eventName: "repay",
351
+ guard: { in: [{ var: "state.borrower" }, { map: [{ var: "proofs" }, { var: "address" }] }] },
352
+ // Release the escrowed collateral back to the borrower. The loan fiber HOLDS the collateral
353
+ // (locked as AssetHolder.Fiber), so it emits the reserved `_transferAsset` directive from inside
354
+ // the effect — the engine extracts `_`-prefixed keys (it is NOT merged into state). A transition-
355
+ // level `emits` block is silently dropped by toProtoDefinition, which would strand the collateral.
356
+ effect: {
357
+ merge: [
358
+ { var: "state" },
359
+ {
360
+ status: "REPAID",
361
+ repaidAt: { var: "$ordinal" },
362
+ _transferAsset: [
363
+ { assetId: { var: "state.collateralAssetId" }, recipient: { var: "state.borrower" } },
364
+ ],
365
+ },
366
+ ],
367
+ },
368
+ dependencies: [],
369
+ },
370
+ // Loan goes past due → defaulted.
371
+ {
372
+ from: "ACTIVE",
373
+ to: "DEFAULTED",
374
+ eventName: "default_loan",
375
+ guard: {
376
+ and: [
377
+ { var: "state.dueOrdinal" },
378
+ { ">=": [{ var: "$ordinal" }, { var: "state.dueOrdinal" }] },
379
+ ],
380
+ },
381
+ effect: {
382
+ merge: [
383
+ { var: "state" },
384
+ { status: "DEFAULTED", defaultedAt: { var: "$ordinal" } },
385
+ ],
386
+ },
387
+ dependencies: [],
388
+ },
389
+ // Lender liquidates a defaulted loan — collateral transferred to the lender.
390
+ {
391
+ from: "DEFAULTED",
392
+ to: "LIQUIDATED",
393
+ eventName: "liquidate",
394
+ guard: { in: [{ var: "state.lender" }, { map: [{ var: "proofs" }, { var: "address" }] }] },
395
+ // Transfer the escrowed collateral to the lender via the reserved `_transferAsset` directive
396
+ // inside the effect (the loan fiber holds it). A transition-level `emits` block is dropped by the engine.
397
+ effect: {
398
+ merge: [
399
+ { var: "state" },
400
+ {
401
+ status: "LIQUIDATED",
402
+ liquidatedAt: { var: "$ordinal" },
403
+ _transferAsset: [
404
+ { assetId: { var: "state.collateralAssetId" }, recipient: { var: "state.lender" } },
405
+ ],
406
+ },
407
+ ],
408
+ },
409
+ dependencies: [],
410
+ },
411
+ ],
412
+ });
@@ -7,8 +7,8 @@
7
7
  * @example
8
8
  * ```typescript
9
9
  * import {
10
- * MarketType,
11
- * MarketState,
10
+ * Type,
11
+ * State,
12
12
  * Market,
13
13
  * getMarketDefinition,
14
14
  * MARKETS_DEFINITIONS
@@ -21,11 +21,14 @@
21
21
  * @packageDocumentation
22
22
  */
23
23
  Object.defineProperty(exports, "__esModule", { value: true });
24
- exports.getMarketDefinition = exports.MARKETS_DEFINITIONS = exports.marketGroupBuyDef = exports.marketCrowdfundDef = exports.marketAuctionDef = exports.marketPredictionDef = exports.marketUniversalDef = exports.marketStateToJSON = exports.marketStateFromJSON = exports.marketTypeToJSON = exports.marketTypeFromJSON = exports.MarketDefinition = exports.CancelMarketRequest = exports.SubmitResolutionRequest = exports.CommitToMarketRequest = exports.CreateMarketRequest = exports.Market = exports.Resolution = exports.Commitment = exports.MarketState = exports.MarketType = void 0;
25
- // Re-export generated protobuf types (source of truth)
24
+ exports.MARKETS_DEFINITIONS = exports.marketGroupBuyDef = exports.marketCrowdfundDef = exports.marketAuctionDef = exports.marketPredictionDef = exports.marketUniversalDef = exports.marketStateToJSON = exports.marketStateFromJSON = exports.marketTypeToJSON = exports.marketTypeFromJSON = exports.MarketState = exports.MarketType = exports.stateToJSON = exports.stateFromJSON = exports.typeToJSON = exports.typeFromJSON = exports.MarketDefinition = exports.CancelMarketRequest = exports.SubmitResolutionRequest = exports.CommitToMarketRequest = exports.CreateMarketRequest = exports.Market = exports.Resolution = exports.Commitment = exports.State = exports.Type = void 0;
25
+ exports.getMarketDefinition = getMarketDefinition;
26
+ // Re-export generated protobuf types (source of truth).
27
+ // The nested lifecycle/kind enums dropped their app prefix in the proto; under
28
+ // this app-scoped entrypoint they are unambiguously Type / State.
26
29
  var market_js_1 = require("../../generated/ottochain/apps/markets/v1/market.js");
27
- Object.defineProperty(exports, "MarketType", { enumerable: true, get: function () { return market_js_1.MarketType; } });
28
- Object.defineProperty(exports, "MarketState", { enumerable: true, get: function () { return market_js_1.MarketState; } });
30
+ Object.defineProperty(exports, "Type", { enumerable: true, get: function () { return market_js_1.Type; } });
31
+ Object.defineProperty(exports, "State", { enumerable: true, get: function () { return market_js_1.State; } });
29
32
  Object.defineProperty(exports, "Commitment", { enumerable: true, get: function () { return market_js_1.Commitment; } });
30
33
  Object.defineProperty(exports, "Resolution", { enumerable: true, get: function () { return market_js_1.Resolution; } });
31
34
  Object.defineProperty(exports, "Market", { enumerable: true, get: function () { return market_js_1.Market; } });
@@ -34,10 +37,18 @@ Object.defineProperty(exports, "CommitToMarketRequest", { enumerable: true, get:
34
37
  Object.defineProperty(exports, "SubmitResolutionRequest", { enumerable: true, get: function () { return market_js_1.SubmitResolutionRequest; } });
35
38
  Object.defineProperty(exports, "CancelMarketRequest", { enumerable: true, get: function () { return market_js_1.CancelMarketRequest; } });
36
39
  Object.defineProperty(exports, "MarketDefinition", { enumerable: true, get: function () { return market_js_1.MarketDefinition; } });
37
- Object.defineProperty(exports, "marketTypeFromJSON", { enumerable: true, get: function () { return market_js_1.marketTypeFromJSON; } });
38
- Object.defineProperty(exports, "marketTypeToJSON", { enumerable: true, get: function () { return market_js_1.marketTypeToJSON; } });
39
- Object.defineProperty(exports, "marketStateFromJSON", { enumerable: true, get: function () { return market_js_1.marketStateFromJSON; } });
40
- Object.defineProperty(exports, "marketStateToJSON", { enumerable: true, get: function () { return market_js_1.marketStateToJSON; } });
40
+ Object.defineProperty(exports, "typeFromJSON", { enumerable: true, get: function () { return market_js_1.typeFromJSON; } });
41
+ Object.defineProperty(exports, "typeToJSON", { enumerable: true, get: function () { return market_js_1.typeToJSON; } });
42
+ Object.defineProperty(exports, "stateFromJSON", { enumerable: true, get: function () { return market_js_1.stateFromJSON; } });
43
+ Object.defineProperty(exports, "stateToJSON", { enumerable: true, get: function () { return market_js_1.stateToJSON; } });
44
+ // Deprecated app-prefixed aliases (renamed to Type / State); kept for compat.
45
+ var market_js_2 = require("../../generated/ottochain/apps/markets/v1/market.js");
46
+ Object.defineProperty(exports, "MarketType", { enumerable: true, get: function () { return market_js_2.Type; } });
47
+ Object.defineProperty(exports, "MarketState", { enumerable: true, get: function () { return market_js_2.State; } });
48
+ Object.defineProperty(exports, "marketTypeFromJSON", { enumerable: true, get: function () { return market_js_2.typeFromJSON; } });
49
+ Object.defineProperty(exports, "marketTypeToJSON", { enumerable: true, get: function () { return market_js_2.typeToJSON; } });
50
+ Object.defineProperty(exports, "marketStateFromJSON", { enumerable: true, get: function () { return market_js_2.stateFromJSON; } });
51
+ Object.defineProperty(exports, "marketStateToJSON", { enumerable: true, get: function () { return market_js_2.stateToJSON; } });
41
52
  // ---------------------------------------------------------------------------
42
53
  // State Machine Definitions (generated from JSON at build time)
43
54
  // ---------------------------------------------------------------------------
@@ -62,4 +73,3 @@ exports.MARKETS_DEFINITIONS = {
62
73
  function getMarketDefinition(type = "universal") {
63
74
  return exports.MARKETS_DEFINITIONS[type];
64
75
  }
65
- exports.getMarketDefinition = getMarketDefinition;
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.marketAuctionDef = void 0;
4
4
  const fiber_app_js_1 = require("../../../schema/fiber-app.js");
5
+ const guards_js_1 = require("../../../schema/guards.js");
5
6
  /**
6
7
  * Auction market supporting English, Dutch, and sealed-bid variants.
7
8
  */
@@ -73,32 +74,56 @@ exports.marketAuctionDef = (0, fiber_app_js_1.defineFiberApp)({
73
74
  PROPOSED: {
74
75
  id: "PROPOSED",
75
76
  isFinal: false,
76
- metadata: { description: "Auction created but not yet open" },
77
+ metadata: {
78
+ label: "Proposed",
79
+ description: "Auction created but not yet open",
80
+ category: "initial",
81
+ },
77
82
  },
78
83
  OPEN: {
79
84
  id: "OPEN",
80
85
  isFinal: false,
81
- metadata: { description: "Accepting bids" },
86
+ metadata: {
87
+ label: "Open",
88
+ description: "Accepting bids",
89
+ category: "active",
90
+ },
82
91
  },
83
92
  CLOSING: {
84
93
  id: "CLOSING",
85
94
  isFinal: false,
86
- metadata: { description: "Bid period ended, determining winner" },
95
+ metadata: {
96
+ label: "Closing",
97
+ description: "Bid period ended, determining winner",
98
+ category: "pending",
99
+ },
87
100
  },
88
101
  SETTLED: {
89
102
  id: "SETTLED",
90
103
  isFinal: true,
91
- metadata: { description: "Winner determined, transfer complete" },
104
+ metadata: {
105
+ label: "Settled",
106
+ description: "Winner determined, transfer complete",
107
+ category: "terminal",
108
+ },
92
109
  },
93
110
  NO_SALE: {
94
111
  id: "NO_SALE",
95
112
  isFinal: true,
96
- metadata: { description: "Reserve not met or no valid bids" },
113
+ metadata: {
114
+ label: "No sale",
115
+ description: "Reserve not met or no valid bids",
116
+ category: "terminal",
117
+ },
97
118
  },
98
119
  CANCELLED: {
99
120
  id: "CANCELLED",
100
121
  isFinal: true,
101
- metadata: { description: "Auction cancelled by seller" },
122
+ metadata: {
123
+ label: "Cancelled",
124
+ description: "Auction cancelled by seller",
125
+ category: "terminal",
126
+ },
102
127
  },
103
128
  },
104
129
  initialState: "PROPOSED",
@@ -107,13 +132,13 @@ exports.marketAuctionDef = (0, fiber_app_js_1.defineFiberApp)({
107
132
  from: "PROPOSED",
108
133
  to: "OPEN",
109
134
  eventName: "open",
110
- guard: { "===": [{ var: "event.agent" }, { var: "state.seller" }] },
135
+ guard: (0, guards_js_1.signerIsParty)("state.seller"),
111
136
  effect: {
112
137
  merge: [
113
138
  { var: "state" },
114
139
  {
115
140
  status: "OPEN",
116
- openedAt: { var: "$timestamp" },
141
+ openedAt: { var: "$ordinal" },
117
142
  bids: [],
118
143
  highBid: null,
119
144
  highBidder: null,
@@ -126,11 +151,11 @@ exports.marketAuctionDef = (0, fiber_app_js_1.defineFiberApp)({
126
151
  from: "PROPOSED",
127
152
  to: "CANCELLED",
128
153
  eventName: "cancel",
129
- guard: { "===": [{ var: "event.agent" }, { var: "state.seller" }] },
154
+ guard: (0, guards_js_1.signerIsParty)("state.seller"),
130
155
  effect: {
131
156
  merge: [
132
157
  { var: "state" },
133
- { status: "CANCELLED", cancelledAt: { var: "$timestamp" } },
158
+ { status: "CANCELLED", cancelledAt: { var: "$ordinal" } },
134
159
  ],
135
160
  },
136
161
  dependencies: [],
@@ -141,7 +166,7 @@ exports.marketAuctionDef = (0, fiber_app_js_1.defineFiberApp)({
141
166
  eventName: "bid",
142
167
  guard: {
143
168
  and: [
144
- { "!==": [{ var: "event.agent" }, { var: "state.seller" }] },
169
+ (0, guards_js_1.signerIsNotParty)("state.seller"),
145
170
  { ">=": [{ var: "event.amount" }, { var: "state.minBid" }] },
146
171
  {
147
172
  or: [
@@ -162,7 +187,7 @@ exports.marketAuctionDef = (0, fiber_app_js_1.defineFiberApp)({
162
187
  {
163
188
  or: [
164
189
  { "!": [{ var: "state.deadline" }] },
165
- { "<=": [{ var: "$timestamp" }, { var: "state.deadline" }] },
190
+ { "<=": [{ var: "$ordinal" }, { var: "state.deadline" }] },
166
191
  ],
167
192
  },
168
193
  ],
@@ -178,14 +203,14 @@ exports.marketAuctionDef = (0, fiber_app_js_1.defineFiberApp)({
178
203
  {
179
204
  bidder: { var: "event.agent" },
180
205
  amount: { var: "event.amount" },
181
- bidAt: { var: "$timestamp" },
206
+ bidAt: { var: "$ordinal" },
182
207
  },
183
208
  ],
184
209
  ],
185
210
  },
186
211
  highBid: { var: "event.amount" },
187
212
  highBidder: { var: "event.agent" },
188
- lastBidAt: { var: "$timestamp" },
213
+ lastBidAt: { var: "$ordinal" },
189
214
  },
190
215
  ],
191
216
  },
@@ -197,11 +222,11 @@ exports.marketAuctionDef = (0, fiber_app_js_1.defineFiberApp)({
197
222
  eventName: "close",
198
223
  guard: {
199
224
  or: [
200
- { "===": [{ var: "event.agent" }, { var: "state.seller" }] },
225
+ (0, guards_js_1.signerIsParty)("state.seller"),
201
226
  {
202
227
  and: [
203
228
  { var: "state.deadline" },
204
- { ">=": [{ var: "$timestamp" }, { var: "state.deadline" }] },
229
+ { ">=": [{ var: "$ordinal" }, { var: "state.deadline" }] },
205
230
  ],
206
231
  },
207
232
  ],
@@ -209,7 +234,7 @@ exports.marketAuctionDef = (0, fiber_app_js_1.defineFiberApp)({
209
234
  effect: {
210
235
  merge: [
211
236
  { var: "state" },
212
- { status: "CLOSING", closedAt: { var: "$timestamp" } },
237
+ { status: "CLOSING", closedAt: { var: "$ordinal" } },
213
238
  ],
214
239
  },
215
240
  dependencies: [],
@@ -236,7 +261,7 @@ exports.marketAuctionDef = (0, fiber_app_js_1.defineFiberApp)({
236
261
  { var: "state" },
237
262
  {
238
263
  status: "SETTLED",
239
- settledAt: { var: "$timestamp" },
264
+ settledAt: { var: "$ordinal" },
240
265
  winner: { var: "state.highBidder" },
241
266
  finalPrice: { var: "state.highBid" },
242
267
  },
@@ -266,7 +291,7 @@ exports.marketAuctionDef = (0, fiber_app_js_1.defineFiberApp)({
266
291
  { var: "state" },
267
292
  {
268
293
  status: "NO_SALE",
269
- closedAt: { var: "$timestamp" },
294
+ closedAt: { var: "$ordinal" },
270
295
  reason: {
271
296
  if: [
272
297
  { "!": [{ var: "state.highBidder" }] },