@ottochain/sdk 2.3.0 → 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 (209) hide show
  1. package/dist/cjs/apps/contracts/index.js +15 -8
  2. package/dist/cjs/apps/contracts/state-machines/contract-agreement.js +35 -40
  3. package/dist/cjs/apps/contracts/state-machines/contract-escrow.js +80 -37
  4. package/dist/cjs/apps/contracts/state-machines/contract-universal.js +4 -4
  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 +58 -40
  12. package/dist/cjs/apps/governance/state-machines/dao-reputation.js +46 -40
  13. package/dist/cjs/apps/governance/state-machines/dao-single.js +28 -11
  14. package/dist/cjs/apps/governance/state-machines/dao-token.js +67 -41
  15. package/dist/cjs/apps/governance/state-machines/governance-simple.js +93 -61
  16. package/dist/cjs/apps/governance/state-machines/governance-universal.js +2 -2
  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 +3 -3
  20. package/dist/cjs/apps/identity/state-machines/identity-oracle.js +25 -22
  21. package/dist/cjs/apps/identity/state-machines/identity-registry.js +288 -0
  22. package/dist/cjs/apps/identity/state-machines/identity-universal.js +3 -3
  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 +14 -13
  33. package/dist/cjs/apps/markets/state-machines/market-crowdfund.js +29 -24
  34. package/dist/cjs/apps/markets/state-machines/market-group-buy.js +24 -26
  35. package/dist/cjs/apps/markets/state-machines/market-prediction.js +80 -53
  36. package/dist/cjs/apps/markets/state-machines/market-universal.js +5 -5
  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 +4 -4
  49. package/dist/cjs/generated/ottochain/v1/fiber.js +4 -4
  50. package/dist/cjs/index.js +41 -7
  51. package/dist/cjs/openapi.js +2 -0
  52. package/dist/cjs/ottochain/drop-nulls.js +1 -2
  53. package/dist/cjs/ottochain/genesis-manifest.js +11 -11
  54. package/dist/cjs/ottochain/index.js +23 -13
  55. package/dist/cjs/ottochain/metagraph-client.js +65 -8
  56. package/dist/cjs/ottochain/snapshot.js +11 -12
  57. package/dist/cjs/ottochain/transaction.js +57 -14
  58. package/dist/cjs/ottochain/types.js +16 -2
  59. package/dist/cjs/privacy/index.js +14 -0
  60. package/dist/cjs/privacy/sealed-bid.js +210 -0
  61. package/dist/cjs/privacy/shield-app.js +131 -0
  62. package/dist/cjs/schema/effects.js +40 -0
  63. package/dist/cjs/schema/fiber-app.js +19 -13
  64. package/dist/cjs/schema/guard-lint.js +352 -0
  65. package/dist/cjs/schema/guards.js +246 -0
  66. package/dist/cjs/signing.js +80 -0
  67. package/dist/cjs/types.js +2 -3
  68. package/dist/cjs/validation.js +8 -8
  69. package/dist/cjs/verify.js +9 -4
  70. package/dist/cjs/zk/commit.js +53 -0
  71. package/dist/cjs/zk/guard.js +107 -0
  72. package/dist/cjs/zk/index.js +48 -0
  73. package/dist/cjs/zk/preimage.js +37 -0
  74. package/dist/cjs/zk/prover.js +87 -0
  75. package/dist/cjs/zk/registry.js +62 -0
  76. package/dist/cjs/zk/types.js +28 -0
  77. package/dist/cjs/zk/witness.js +19 -0
  78. package/dist/esm/apps/contracts/index.js +7 -3
  79. package/dist/esm/apps/contracts/state-machines/contract-agreement.js +35 -40
  80. package/dist/esm/apps/contracts/state-machines/contract-escrow.js +80 -37
  81. package/dist/esm/apps/contracts/state-machines/contract-universal.js +4 -4
  82. package/dist/esm/apps/corporate/state-machines/corp-board.js +169 -59
  83. package/dist/esm/apps/corporate/state-machines/corp-entity.js +245 -47
  84. package/dist/esm/apps/corporate/state-machines/corp-securities.js +407 -99
  85. package/dist/esm/apps/corporate/state-machines/corp-shareholders.js +151 -37
  86. package/dist/esm/apps/governance/state-machines/dao-multisig.js +58 -40
  87. package/dist/esm/apps/governance/state-machines/dao-reputation.js +46 -40
  88. package/dist/esm/apps/governance/state-machines/dao-single.js +28 -11
  89. package/dist/esm/apps/governance/state-machines/dao-token.js +67 -41
  90. package/dist/esm/apps/governance/state-machines/governance-simple.js +93 -61
  91. package/dist/esm/apps/governance/state-machines/governance-universal.js +2 -2
  92. package/dist/esm/apps/identity/constants.js +51 -12
  93. package/dist/esm/apps/identity/index.js +12 -7
  94. package/dist/esm/apps/identity/state-machines/identity-agent.js +3 -3
  95. package/dist/esm/apps/identity/state-machines/identity-oracle.js +25 -22
  96. package/dist/esm/apps/identity/state-machines/identity-registry.js +285 -0
  97. package/dist/esm/apps/identity/state-machines/identity-universal.js +3 -3
  98. package/dist/esm/apps/identity/state-machines/index.js +1 -0
  99. package/dist/esm/apps/index.js +1 -0
  100. package/dist/esm/apps/lending/assets.js +207 -0
  101. package/dist/esm/apps/lending/credit-scoring.js +81 -0
  102. package/dist/esm/apps/lending/eligibility.js +115 -0
  103. package/dist/esm/apps/lending/index.js +69 -0
  104. package/dist/esm/apps/lending/state-machines/index.js +5 -0
  105. package/dist/esm/apps/lending/state-machines/lending-zk-loan.js +409 -0
  106. package/dist/esm/apps/markets/index.js +8 -4
  107. package/dist/esm/apps/markets/state-machines/market-auction.js +14 -13
  108. package/dist/esm/apps/markets/state-machines/market-crowdfund.js +29 -24
  109. package/dist/esm/apps/markets/state-machines/market-group-buy.js +24 -26
  110. package/dist/esm/apps/markets/state-machines/market-prediction.js +80 -53
  111. package/dist/esm/apps/markets/state-machines/market-universal.js +5 -5
  112. package/dist/esm/generated/index.js +9 -5
  113. package/dist/esm/generated/openapi.js +5 -0
  114. package/dist/esm/generated/ottochain/apps/contracts/v1/contract.js +46 -46
  115. package/dist/esm/generated/ottochain/apps/identity/v1/identity.js +114 -120
  116. package/dist/esm/generated/ottochain/apps/markets/v1/market.js +100 -100
  117. package/dist/esm/index.js +21 -2
  118. package/dist/esm/openapi.js +1 -0
  119. package/dist/esm/ottochain/genesis-manifest.js +9 -9
  120. package/dist/esm/ottochain/index.js +2 -3
  121. package/dist/esm/ottochain/metagraph-client.js +65 -8
  122. package/dist/esm/ottochain/snapshot.js +4 -4
  123. package/dist/esm/ottochain/transaction.js +43 -3
  124. package/dist/esm/ottochain/types.js +15 -1
  125. package/dist/esm/privacy/index.js +6 -0
  126. package/dist/esm/privacy/sealed-bid.js +206 -0
  127. package/dist/esm/privacy/shield-app.js +127 -0
  128. package/dist/esm/schema/effects.js +35 -0
  129. package/dist/esm/schema/fiber-app.js +13 -6
  130. package/dist/esm/schema/guard-lint.js +346 -0
  131. package/dist/esm/schema/guards.js +229 -0
  132. package/dist/esm/signing.js +74 -0
  133. package/dist/esm/verify.js +8 -2
  134. package/dist/esm/zk/commit.js +44 -0
  135. package/dist/esm/zk/guard.js +99 -0
  136. package/dist/esm/zk/index.js +19 -0
  137. package/dist/esm/zk/preimage.js +30 -0
  138. package/dist/esm/zk/prover.js +82 -0
  139. package/dist/esm/zk/registry.js +55 -0
  140. package/dist/esm/zk/types.js +25 -0
  141. package/dist/esm/zk/witness.js +15 -0
  142. package/dist/types/apps/contracts/index.d.ts +69 -209
  143. package/dist/types/apps/contracts/state-machines/contract-agreement.d.ts +20 -95
  144. package/dist/types/apps/contracts/state-machines/contract-escrow.d.ts +46 -112
  145. package/dist/types/apps/corporate/index.d.ts +1040 -304
  146. package/dist/types/apps/corporate/state-machines/corp-board.d.ts +188 -52
  147. package/dist/types/apps/corporate/state-machines/corp-entity.d.ts +267 -62
  148. package/dist/types/apps/corporate/state-machines/corp-securities.d.ts +355 -131
  149. package/dist/types/apps/corporate/state-machines/corp-shareholders.d.ts +225 -53
  150. package/dist/types/apps/governance/index.d.ts +296 -398
  151. package/dist/types/apps/governance/state-machines/dao-multisig.d.ts +77 -92
  152. package/dist/types/apps/governance/state-machines/dao-reputation.d.ts +42 -66
  153. package/dist/types/apps/governance/state-machines/dao-single.d.ts +25 -47
  154. package/dist/types/apps/governance/state-machines/dao-token.d.ts +60 -49
  155. package/dist/types/apps/governance/state-machines/governance-simple.d.ts +87 -117
  156. package/dist/types/apps/governance/state-machines/governance-universal.d.ts +2 -2
  157. package/dist/types/apps/identity/constants.d.ts +32 -4
  158. package/dist/types/apps/identity/index.d.ts +378 -94
  159. package/dist/types/apps/identity/state-machines/identity-oracle.d.ts +16 -87
  160. package/dist/types/apps/identity/state-machines/identity-registry.d.ts +379 -0
  161. package/dist/types/apps/identity/state-machines/index.d.ts +1 -0
  162. package/dist/types/apps/index.d.ts +1 -0
  163. package/dist/types/apps/lending/assets.d.ts +258 -0
  164. package/dist/types/apps/lending/credit-scoring.d.ts +80 -0
  165. package/dist/types/apps/lending/eligibility.d.ts +83 -0
  166. package/dist/types/apps/lending/index.d.ts +548 -0
  167. package/dist/types/apps/lending/state-machines/index.d.ts +5 -0
  168. package/dist/types/apps/lending/state-machines/lending-zk-loan.d.ts +528 -0
  169. package/dist/types/apps/markets/index.d.ts +108 -203
  170. package/dist/types/apps/markets/state-machines/market-auction.d.ts +13 -37
  171. package/dist/types/apps/markets/state-machines/market-crowdfund.d.ts +16 -34
  172. package/dist/types/apps/markets/state-machines/market-group-buy.d.ts +17 -43
  173. package/dist/types/apps/markets/state-machines/market-prediction.d.ts +51 -72
  174. package/dist/types/apps/markets/state-machines/market-universal.d.ts +5 -5
  175. package/dist/types/generated/index.d.ts +5 -5
  176. package/dist/types/generated/openapi.d.ts +1257 -0
  177. package/dist/types/generated/ottochain/apps/contracts/v1/contract.d.ts +5 -5
  178. package/dist/types/generated/ottochain/apps/identity/v1/identity.d.ts +12 -12
  179. package/dist/types/generated/ottochain/apps/markets/v1/market.d.ts +11 -11
  180. package/dist/types/index.d.ts +6 -2
  181. package/dist/types/openapi.d.ts +22 -0
  182. package/dist/types/ottochain/genesis-manifest.d.ts +5 -5
  183. package/dist/types/ottochain/index.d.ts +5 -6
  184. package/dist/types/ottochain/metagraph-client.d.ts +49 -7
  185. package/dist/types/ottochain/snapshot.d.ts +6 -6
  186. package/dist/types/ottochain/transaction.d.ts +33 -1
  187. package/dist/types/ottochain/types.d.ts +335 -30
  188. package/dist/types/privacy/index.d.ts +6 -0
  189. package/dist/types/privacy/sealed-bid.d.ts +348 -0
  190. package/dist/types/privacy/shield-app.d.ts +48 -0
  191. package/dist/types/schema/effects.d.ts +34 -0
  192. package/dist/types/schema/fiber-app.d.ts +1 -2
  193. package/dist/types/schema/guard-lint.d.ts +111 -0
  194. package/dist/types/schema/guards.d.ts +134 -0
  195. package/dist/types/signing.d.ts +45 -0
  196. package/dist/types/validation.d.ts +22 -217
  197. package/dist/types/verify.d.ts +4 -0
  198. package/dist/types/zk/commit.d.ts +28 -0
  199. package/dist/types/zk/guard.d.ts +46 -0
  200. package/dist/types/zk/index.d.ts +19 -0
  201. package/dist/types/zk/preimage.d.ts +10 -0
  202. package/dist/types/zk/prover.d.ts +34 -0
  203. package/dist/types/zk/registry.d.ts +34 -0
  204. package/dist/types/zk/types.d.ts +33 -0
  205. package/dist/types/zk/witness.d.ts +40 -0
  206. package/package.json +27 -13
  207. package/dist/cjs/ottochain/normalize.js +0 -186
  208. package/dist/esm/ottochain/normalize.js +0 -179
  209. package/dist/types/ottochain/normalize.d.ts +0 -79
@@ -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,8 +18,12 @@
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
  // ---------------------------------------------------------------------------
@@ -1,4 +1,5 @@
1
1
  import { defineFiberApp } from "../../../schema/fiber-app.js";
2
+ import { signerIsParty, signerIsAnyParty } from "../../../schema/guards.js";
2
3
  /**
3
4
  * Two-party agreement with mutual completion attestation and dispute resolution.
4
5
  */
@@ -33,7 +34,7 @@ export const contractAgreementDef = defineFiberApp({
33
34
  },
34
35
  },
35
36
  createSchema: {
36
- required: ["proposer", "counterparty"],
37
+ required: ["proposer", "counterparty", "arbitrator"],
37
38
  properties: {
38
39
  proposer: {
39
40
  type: "address",
@@ -45,6 +46,11 @@ export const contractAgreementDef = defineFiberApp({
45
46
  description: "DAG address of the counterparty",
46
47
  immutable: true,
47
48
  },
49
+ arbitrator: {
50
+ type: "address",
51
+ description: "DAG address of the arbitrator authorized to resolve a dispute",
52
+ immutable: true,
53
+ },
48
54
  },
49
55
  },
50
56
  stateSchema: {
@@ -52,6 +58,7 @@ export const contractAgreementDef = defineFiberApp({
52
58
  status: { type: "string" },
53
59
  proposer: { type: "address" },
54
60
  counterparty: { type: "address" },
61
+ arbitrator: { type: "address", immutable: true },
55
62
  completions: { type: "array" },
56
63
  acceptedAt: { type: "integer", nullable: true },
57
64
  rejectedAt: { type: "integer", nullable: true },
@@ -75,9 +82,6 @@ export const contractAgreementDef = defineFiberApp({
75
82
  dispute: { properties: { reason: { type: "string" } } },
76
83
  resolve: {
77
84
  properties: {
78
- judicialRuling: { type: "boolean", nullable: true },
79
- proposerApproves: { type: "boolean", nullable: true },
80
- counterpartyApproves: { type: "boolean", nullable: true },
81
85
  resolution: { type: "string" },
82
86
  rulingId: { type: "string", nullable: true },
83
87
  },
@@ -145,11 +149,11 @@ export const contractAgreementDef = defineFiberApp({
145
149
  from: "PROPOSED",
146
150
  to: "ACTIVE",
147
151
  eventName: "accept",
148
- guard: { "===": [{ var: "event.agent" }, { var: "state.counterparty" }] },
152
+ guard: signerIsParty("state.counterparty"),
149
153
  effect: {
150
154
  merge: [
151
155
  { var: "state" },
152
- { status: "ACTIVE", acceptedAt: { var: "$timestamp" } },
156
+ { status: "ACTIVE", acceptedAt: { var: "$ordinal" } },
153
157
  ],
154
158
  },
155
159
  dependencies: [],
@@ -158,13 +162,13 @@ export const contractAgreementDef = defineFiberApp({
158
162
  from: "PROPOSED",
159
163
  to: "REJECTED",
160
164
  eventName: "reject",
161
- guard: { "===": [{ var: "event.agent" }, { var: "state.counterparty" }] },
165
+ guard: signerIsParty("state.counterparty"),
162
166
  effect: {
163
167
  merge: [
164
168
  { var: "state" },
165
169
  {
166
170
  status: "REJECTED",
167
- rejectedAt: { var: "$timestamp" },
171
+ rejectedAt: { var: "$ordinal" },
168
172
  rejectReason: { var: "event.reason" },
169
173
  },
170
174
  ],
@@ -175,11 +179,11 @@ export const contractAgreementDef = defineFiberApp({
175
179
  from: "PROPOSED",
176
180
  to: "CANCELLED",
177
181
  eventName: "cancel",
178
- guard: { "===": [{ var: "event.agent" }, { var: "state.proposer" }] },
182
+ guard: signerIsParty("state.proposer"),
179
183
  effect: {
180
184
  merge: [
181
185
  { var: "state" },
182
- { status: "CANCELLED", cancelledAt: { var: "$timestamp" } },
186
+ { status: "CANCELLED", cancelledAt: { var: "$ordinal" } },
183
187
  ],
184
188
  },
185
189
  dependencies: [],
@@ -190,14 +194,7 @@ export const contractAgreementDef = defineFiberApp({
190
194
  eventName: "submit_completion",
191
195
  guard: {
192
196
  and: [
193
- {
194
- or: [
195
- { "===": [{ var: "event.agent" }, { var: "state.proposer" }] },
196
- {
197
- "===": [{ var: "event.agent" }, { var: "state.counterparty" }],
198
- },
199
- ],
200
- },
197
+ signerIsAnyParty(["state.proposer", "state.counterparty"]),
201
198
  {
202
199
  "!": [
203
200
  {
@@ -221,7 +218,7 @@ export const contractAgreementDef = defineFiberApp({
221
218
  {
222
219
  agent: { var: "event.agent" },
223
220
  proof: { var: "event.proof" },
224
- submittedAt: { var: "$timestamp" },
221
+ submittedAt: { var: "$ordinal" },
225
222
  },
226
223
  ],
227
224
  ],
@@ -235,11 +232,11 @@ export const contractAgreementDef = defineFiberApp({
235
232
  from: "ACTIVE",
236
233
  to: "COMPLETED",
237
234
  eventName: "finalize",
238
- guard: { ">=": [{ size: { var: "state.completions" } }, 2] },
235
+ guard: { ">=": [{ length: [{ var: "state.completions" }] }, 2] },
239
236
  effect: {
240
237
  merge: [
241
238
  { var: "state" },
242
- { status: "COMPLETED", completedAt: { var: "$timestamp" } },
239
+ { status: "COMPLETED", completedAt: { var: "$ordinal" } },
243
240
  ],
244
241
  },
245
242
  dependencies: [],
@@ -248,18 +245,13 @@ export const contractAgreementDef = defineFiberApp({
248
245
  from: "ACTIVE",
249
246
  to: "DISPUTED",
250
247
  eventName: "dispute",
251
- guard: {
252
- or: [
253
- { "===": [{ var: "event.agent" }, { var: "state.proposer" }] },
254
- { "===": [{ var: "event.agent" }, { var: "state.counterparty" }] },
255
- ],
256
- },
248
+ guard: signerIsAnyParty(["state.proposer", "state.counterparty"]),
257
249
  effect: {
258
250
  merge: [
259
251
  { var: "state" },
260
252
  {
261
253
  status: "DISPUTED",
262
- disputedAt: { var: "$timestamp" },
254
+ disputedAt: { var: "$ordinal" },
263
255
  disputeReason: { var: "event.reason" },
264
256
  disputedBy: { var: "event.agent" },
265
257
  },
@@ -271,13 +263,14 @@ export const contractAgreementDef = defineFiberApp({
271
263
  from: "DISPUTED",
272
264
  to: "COMPLETED",
273
265
  eventName: "resolve",
266
+ // authority gate — an ARBITER/SLASHER attestation check layers on additively when the identity registry lands (see docs/design/app-hardening-identity-integration.md §4.2)
274
267
  guard: {
275
268
  or: [
276
- { var: "event.judicialRuling" },
269
+ signerIsParty("state.arbitrator"),
277
270
  {
278
271
  and: [
279
- { "===": [{ var: "event.proposerApproves" }, true] },
280
- { "===": [{ var: "event.counterpartyApproves" }, true] },
272
+ signerIsParty("state.proposer"),
273
+ signerIsParty("state.counterparty"),
281
274
  ],
282
275
  },
283
276
  ],
@@ -287,9 +280,16 @@ export const contractAgreementDef = defineFiberApp({
287
280
  { var: "state" },
288
281
  {
289
282
  status: "COMPLETED",
290
- resolvedAt: { var: "$timestamp" },
283
+ resolvedAt: { var: "$ordinal" },
291
284
  resolution: { var: "event.resolution" },
292
- rulingId: { var: "event.rulingId" },
285
+ // rulingId is recorded only on the arbitrator-resolved path
286
+ rulingId: {
287
+ if: [
288
+ signerIsParty("state.arbitrator"),
289
+ { var: "event.rulingId" },
290
+ null,
291
+ ],
292
+ },
293
293
  },
294
294
  ],
295
295
  },
@@ -299,16 +299,11 @@ export const contractAgreementDef = defineFiberApp({
299
299
  from: "ACTIVE",
300
300
  to: "CANCELLED",
301
301
  eventName: "cancel",
302
- guard: {
303
- or: [
304
- { "===": [{ var: "event.agent" }, { var: "state.proposer" }] },
305
- { "===": [{ var: "event.agent" }, { var: "state.counterparty" }] },
306
- ],
307
- },
302
+ guard: signerIsAnyParty(["state.proposer", "state.counterparty"]),
308
303
  effect: {
309
304
  merge: [
310
305
  { var: "state" },
311
- { status: "CANCELLED", cancelledAt: { var: "$timestamp" } },
306
+ { status: "CANCELLED", cancelledAt: { var: "$ordinal" } },
312
307
  ],
313
308
  },
314
309
  dependencies: [],
@@ -1,4 +1,5 @@
1
1
  import { defineFiberApp } from "../../../schema/fiber-app.js";
2
+ import { signerIsParty } from "../../../schema/guards.js";
2
3
  /**
3
4
  * Asset custody with conditional release, dispute resolution, and split payments.
4
5
  */
@@ -38,7 +39,7 @@ export const contractEscrowDef = defineFiberApp({
38
39
  },
39
40
  },
40
41
  createSchema: {
41
- required: ["depositor", "beneficiary", "requiredAmount"],
42
+ required: ["depositor", "beneficiary", "requiredAmount", "arbiter"],
42
43
  properties: {
43
44
  depositor: {
44
45
  type: "address",
@@ -48,6 +49,11 @@ export const contractEscrowDef = defineFiberApp({
48
49
  type: "address",
49
50
  description: "DAG address of the beneficiary",
50
51
  },
52
+ arbiter: {
53
+ type: "address",
54
+ description: "DAG address of the arbiter authorized to rule on a dispute",
55
+ immutable: true,
56
+ },
51
57
  requiredAmount: {
52
58
  type: "number",
53
59
  minimum: 0,
@@ -74,6 +80,7 @@ export const contractEscrowDef = defineFiberApp({
74
80
  properties: {
75
81
  depositor: { type: "address" },
76
82
  beneficiary: { type: "address" },
83
+ arbiter: { type: "address", immutable: true },
77
84
  requiredAmount: { type: "number" },
78
85
  balance: { type: "number" },
79
86
  fundedAt: { type: "integer", nullable: true },
@@ -108,16 +115,11 @@ export const contractEscrowDef = defineFiberApp({
108
115
  dispute: {},
109
116
  ruling: {
110
117
  properties: {
111
- judicialRuling: { type: "boolean" },
112
118
  splits: { type: "array" },
113
119
  rulingId: { type: "string" },
114
120
  },
115
121
  },
116
- refund: {
117
- properties: {
118
- mutualConsent: { type: "boolean", nullable: true },
119
- },
120
- },
122
+ refund: {},
121
123
  cancel: {},
122
124
  },
123
125
  states: {
@@ -202,14 +204,14 @@ export const contractEscrowDef = defineFiberApp({
202
204
  eventName: "deposit",
203
205
  guard: {
204
206
  and: [
205
- { "===": [{ var: "event.agent" }, { var: "state.depositor" }] },
207
+ signerIsParty("state.depositor"),
206
208
  { ">=": [{ var: "event.amount" }, { var: "state.requiredAmount" }] },
207
209
  ],
208
210
  },
209
211
  effect: {
210
212
  merge: [
211
213
  { var: "state" },
212
- { balance: { var: "event.amount" }, fundedAt: { var: "$timestamp" } },
214
+ { balance: { var: "event.amount" }, fundedAt: { var: "$ordinal" } },
213
215
  ],
214
216
  },
215
217
  dependencies: [],
@@ -220,12 +222,12 @@ export const contractEscrowDef = defineFiberApp({
220
222
  eventName: "activate",
221
223
  guard: {
222
224
  or: [
223
- { "===": [{ var: "event.agent" }, { var: "state.beneficiary" }] },
225
+ signerIsParty("state.beneficiary"),
224
226
  { var: "state.autoActivate" },
225
227
  ],
226
228
  },
227
229
  effect: {
228
- merge: [{ var: "state" }, { activatedAt: { var: "$timestamp" } }],
230
+ merge: [{ var: "state" }, { activatedAt: { var: "$ordinal" } }],
229
231
  },
230
232
  dependencies: [],
231
233
  },
@@ -233,7 +235,7 @@ export const contractEscrowDef = defineFiberApp({
233
235
  from: "ACTIVE",
234
236
  to: "RELEASING",
235
237
  eventName: "request_release",
236
- guard: { "===": [{ var: "event.agent" }, { var: "state.beneficiary" }] },
238
+ guard: signerIsParty("state.beneficiary"),
237
239
  effect: {
238
240
  merge: [
239
241
  { var: "state" },
@@ -242,10 +244,10 @@ export const contractEscrowDef = defineFiberApp({
242
244
  requestedBy: { var: "event.agent" },
243
245
  amount: { var: "event.amount" },
244
246
  reason: { var: "event.reason" },
245
- requestedAt: { var: "$timestamp" },
247
+ requestedAt: { var: "$ordinal" },
246
248
  },
247
249
  releaseDeadline: {
248
- "+": [{ var: "$timestamp" }, { var: "state.releaseWindowMs" }],
250
+ "+": [{ var: "$ordinal" }, { var: "state.releaseWindowMs" }],
249
251
  },
250
252
  },
251
253
  ],
@@ -258,15 +260,15 @@ export const contractEscrowDef = defineFiberApp({
258
260
  eventName: "approve_release",
259
261
  guard: {
260
262
  or: [
261
- { "===": [{ var: "event.agent" }, { var: "state.depositor" }] },
262
- { ">=": [{ var: "$timestamp" }, { var: "state.releaseDeadline" }] },
263
+ signerIsParty("state.depositor"),
264
+ { ">=": [{ var: "$ordinal" }, { var: "state.releaseDeadline" }] },
263
265
  ],
264
266
  },
265
267
  effect: {
266
268
  merge: [
267
269
  { var: "state" },
268
270
  {
269
- releasedAt: { var: "$timestamp" },
271
+ releasedAt: { var: "$ordinal" },
270
272
  releasedTo: { var: "state.beneficiary" },
271
273
  },
272
274
  ],
@@ -279,24 +281,37 @@ export const contractEscrowDef = defineFiberApp({
279
281
  eventName: "dispute",
280
282
  guard: {
281
283
  and: [
282
- { "===": [{ var: "event.agent" }, { var: "state.depositor" }] },
283
- { "<": [{ var: "$timestamp" }, { var: "state.releaseDeadline" }] },
284
+ signerIsParty("state.depositor"),
285
+ { "<": [{ var: "$ordinal" }, { var: "state.releaseDeadline" }] },
284
286
  ],
285
287
  },
286
288
  effect: {
287
- merge: [{ var: "state" }, { disputedAt: { var: "$timestamp" } }],
288
- },
289
- spawns: {
290
- sm: "Judiciary",
291
- initialData: {
292
- caseType: "escrow_dispute",
293
- plaintiff: { var: "state.depositor" },
294
- defendant: { var: "state.beneficiary" },
295
- claim: {
296
- escrowId: { var: "fiberId" },
297
- amount: { var: "state.balance" },
289
+ merge: [
290
+ { var: "state" },
291
+ { disputedAt: { var: "$ordinal" } },
292
+ {
293
+ // A3 fix: transition-level `spawns` is dropped by the chain. No Judiciary state machine is
294
+ // defined to inline under `_spawn`, and escrow already resolves disputes via its own pinned
295
+ // `arbiter` (the `ruling` transition) — the spawned Judiciary was fire-and-forget (never read
296
+ // by escrow). So the dispute case is surfaced to the judiciary subsystem as an `_emit`
297
+ // notification instead of a child fiber.
298
+ _emit: [
299
+ {
300
+ name: "dispute_opened",
301
+ data: {
302
+ caseType: "escrow_dispute",
303
+ plaintiff: { var: "state.depositor" },
304
+ defendant: { var: "state.beneficiary" },
305
+ claim: {
306
+ escrowId: { var: "machineId" },
307
+ amount: { var: "state.balance" },
308
+ },
309
+ },
310
+ destination: "Judiciary",
311
+ },
312
+ ],
298
313
  },
299
- },
314
+ ],
300
315
  },
301
316
  dependencies: [],
302
317
  },
@@ -304,7 +319,29 @@ export const contractEscrowDef = defineFiberApp({
304
319
  from: "DISPUTED",
305
320
  to: "SPLIT",
306
321
  eventName: "ruling",
307
- guard: { var: "event.judicialRuling" },
322
+ // authority gate — an ARBITER/SLASHER attestation check layers on additively when the identity registry lands (see docs/design/app-hardening-identity-integration.md §4.2)
323
+ guard: {
324
+ and: [
325
+ signerIsParty("state.arbiter"),
326
+ {
327
+ "===": [
328
+ {
329
+ reduce: [
330
+ { var: "event.splits" },
331
+ {
332
+ "+": [
333
+ { var: "accumulator" },
334
+ { var: "current.amount" },
335
+ ],
336
+ },
337
+ 0,
338
+ ],
339
+ },
340
+ { var: "state.balance" },
341
+ ],
342
+ },
343
+ ],
344
+ },
308
345
  effect: {
309
346
  merge: [
310
347
  { var: "state" },
@@ -320,14 +357,20 @@ export const contractEscrowDef = defineFiberApp({
320
357
  from: "ACTIVE",
321
358
  to: "REFUNDED",
322
359
  eventName: "refund",
360
+ // authority gate — an ARBITER/SLASHER attestation check layers on additively when the identity registry lands (see docs/design/app-hardening-identity-integration.md §4.2)
323
361
  guard: {
324
362
  or: [
325
- { var: "event.mutualConsent" },
326
- { ">=": [{ var: "$timestamp" }, { var: "state.expiresAt" }] },
363
+ {
364
+ and: [
365
+ signerIsParty("state.depositor"),
366
+ signerIsParty("state.beneficiary"),
367
+ ],
368
+ },
369
+ { ">=": [{ var: "$ordinal" }, { var: "state.expiresAt" }] },
327
370
  ],
328
371
  },
329
372
  effect: {
330
- merge: [{ var: "state" }, { refundedAt: { var: "$timestamp" } }],
373
+ merge: [{ var: "state" }, { refundedAt: { var: "$ordinal" } }],
331
374
  },
332
375
  dependencies: [],
333
376
  },
@@ -335,9 +378,9 @@ export const contractEscrowDef = defineFiberApp({
335
378
  from: "CREATED",
336
379
  to: "REFUNDED",
337
380
  eventName: "cancel",
338
- guard: { "===": [{ var: "event.agent" }, { var: "state.depositor" }] },
381
+ guard: signerIsParty("state.depositor"),
339
382
  effect: {
340
- merge: [{ var: "state" }, { refundedAt: { var: "$timestamp" } }],
383
+ merge: [{ var: "state" }, { refundedAt: { var: "$ordinal" } }],
341
384
  },
342
385
  dependencies: [],
343
386
  },
@@ -74,7 +74,7 @@ export const contractUniversalDef = defineFiberApp({
74
74
  effect: {
75
75
  merge: [
76
76
  { var: "state" },
77
- { status: "ACTIVE", acceptedAt: { var: "$timestamp" } },
77
+ { status: "ACTIVE", acceptedAt: { var: "$ordinal" } },
78
78
  ],
79
79
  },
80
80
  dependencies: [],
@@ -87,7 +87,7 @@ export const contractUniversalDef = defineFiberApp({
87
87
  effect: {
88
88
  merge: [
89
89
  { var: "state" },
90
- { status: "CANCELLED", cancelledAt: { var: "$timestamp" } },
90
+ { status: "CANCELLED", cancelledAt: { var: "$ordinal" } },
91
91
  ],
92
92
  },
93
93
  dependencies: [],
@@ -100,7 +100,7 @@ export const contractUniversalDef = defineFiberApp({
100
100
  effect: {
101
101
  merge: [
102
102
  { var: "state" },
103
- { status: "COMPLETED", completedAt: { var: "$timestamp" } },
103
+ { status: "COMPLETED", completedAt: { var: "$ordinal" } },
104
104
  ],
105
105
  },
106
106
  dependencies: [],
@@ -113,7 +113,7 @@ export const contractUniversalDef = defineFiberApp({
113
113
  effect: {
114
114
  merge: [
115
115
  { var: "state" },
116
- { status: "CANCELLED", cancelledAt: { var: "$timestamp" } },
116
+ { status: "CANCELLED", cancelledAt: { var: "$ordinal" } },
117
117
  ],
118
118
  },
119
119
  dependencies: [],