@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
@@ -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,21 +82,66 @@ 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
  },
84
88
  },
85
89
  },
86
90
  states: {
87
- PROPOSED: { id: "PROPOSED", isFinal: false, metadata: null },
88
- ACTIVE: { id: "ACTIVE", isFinal: false, metadata: null },
89
- COMPLETED: { id: "COMPLETED", isFinal: true, metadata: null },
90
- DISPUTED: { id: "DISPUTED", isFinal: false, metadata: null },
91
- REJECTED: { id: "REJECTED", isFinal: true, metadata: null },
92
- CANCELLED: { id: "CANCELLED", isFinal: true, metadata: null },
91
+ PROPOSED: {
92
+ id: "PROPOSED",
93
+ isFinal: false,
94
+ metadata: {
95
+ label: "Proposed",
96
+ description: "Agreement proposed; awaiting the counterparty",
97
+ category: "initial",
98
+ },
99
+ },
100
+ ACTIVE: {
101
+ id: "ACTIVE",
102
+ isFinal: false,
103
+ metadata: {
104
+ label: "Active",
105
+ description: "Agreement accepted and in effect",
106
+ category: "active",
107
+ },
108
+ },
109
+ COMPLETED: {
110
+ id: "COMPLETED",
111
+ isFinal: true,
112
+ metadata: {
113
+ label: "Completed",
114
+ description: "Agreement completed and attested (terminal)",
115
+ category: "terminal",
116
+ },
117
+ },
118
+ DISPUTED: {
119
+ id: "DISPUTED",
120
+ isFinal: false,
121
+ metadata: {
122
+ label: "Disputed",
123
+ description: "A party has raised a dispute; awaiting resolution",
124
+ category: "pending",
125
+ },
126
+ },
127
+ REJECTED: {
128
+ id: "REJECTED",
129
+ isFinal: true,
130
+ metadata: {
131
+ label: "Rejected",
132
+ description: "Proposal rejected by the counterparty (terminal)",
133
+ category: "terminal",
134
+ },
135
+ },
136
+ CANCELLED: {
137
+ id: "CANCELLED",
138
+ isFinal: true,
139
+ metadata: {
140
+ label: "Cancelled",
141
+ description: "Agreement cancelled before completion (terminal)",
142
+ category: "terminal",
143
+ },
144
+ },
93
145
  },
94
146
  initialState: "PROPOSED",
95
147
  transitions: [
@@ -97,11 +149,11 @@ export const contractAgreementDef = defineFiberApp({
97
149
  from: "PROPOSED",
98
150
  to: "ACTIVE",
99
151
  eventName: "accept",
100
- guard: { "===": [{ var: "event.agent" }, { var: "state.counterparty" }] },
152
+ guard: signerIsParty("state.counterparty"),
101
153
  effect: {
102
154
  merge: [
103
155
  { var: "state" },
104
- { status: "ACTIVE", acceptedAt: { var: "$timestamp" } },
156
+ { status: "ACTIVE", acceptedAt: { var: "$ordinal" } },
105
157
  ],
106
158
  },
107
159
  dependencies: [],
@@ -110,13 +162,13 @@ export const contractAgreementDef = defineFiberApp({
110
162
  from: "PROPOSED",
111
163
  to: "REJECTED",
112
164
  eventName: "reject",
113
- guard: { "===": [{ var: "event.agent" }, { var: "state.counterparty" }] },
165
+ guard: signerIsParty("state.counterparty"),
114
166
  effect: {
115
167
  merge: [
116
168
  { var: "state" },
117
169
  {
118
170
  status: "REJECTED",
119
- rejectedAt: { var: "$timestamp" },
171
+ rejectedAt: { var: "$ordinal" },
120
172
  rejectReason: { var: "event.reason" },
121
173
  },
122
174
  ],
@@ -127,11 +179,11 @@ export const contractAgreementDef = defineFiberApp({
127
179
  from: "PROPOSED",
128
180
  to: "CANCELLED",
129
181
  eventName: "cancel",
130
- guard: { "===": [{ var: "event.agent" }, { var: "state.proposer" }] },
182
+ guard: signerIsParty("state.proposer"),
131
183
  effect: {
132
184
  merge: [
133
185
  { var: "state" },
134
- { status: "CANCELLED", cancelledAt: { var: "$timestamp" } },
186
+ { status: "CANCELLED", cancelledAt: { var: "$ordinal" } },
135
187
  ],
136
188
  },
137
189
  dependencies: [],
@@ -142,14 +194,7 @@ export const contractAgreementDef = defineFiberApp({
142
194
  eventName: "submit_completion",
143
195
  guard: {
144
196
  and: [
145
- {
146
- or: [
147
- { "===": [{ var: "event.agent" }, { var: "state.proposer" }] },
148
- {
149
- "===": [{ var: "event.agent" }, { var: "state.counterparty" }],
150
- },
151
- ],
152
- },
197
+ signerIsAnyParty(["state.proposer", "state.counterparty"]),
153
198
  {
154
199
  "!": [
155
200
  {
@@ -173,7 +218,7 @@ export const contractAgreementDef = defineFiberApp({
173
218
  {
174
219
  agent: { var: "event.agent" },
175
220
  proof: { var: "event.proof" },
176
- submittedAt: { var: "$timestamp" },
221
+ submittedAt: { var: "$ordinal" },
177
222
  },
178
223
  ],
179
224
  ],
@@ -187,11 +232,11 @@ export const contractAgreementDef = defineFiberApp({
187
232
  from: "ACTIVE",
188
233
  to: "COMPLETED",
189
234
  eventName: "finalize",
190
- guard: { ">=": [{ size: { var: "state.completions" } }, 2] },
235
+ guard: { ">=": [{ length: [{ var: "state.completions" }] }, 2] },
191
236
  effect: {
192
237
  merge: [
193
238
  { var: "state" },
194
- { status: "COMPLETED", completedAt: { var: "$timestamp" } },
239
+ { status: "COMPLETED", completedAt: { var: "$ordinal" } },
195
240
  ],
196
241
  },
197
242
  dependencies: [],
@@ -200,18 +245,13 @@ export const contractAgreementDef = defineFiberApp({
200
245
  from: "ACTIVE",
201
246
  to: "DISPUTED",
202
247
  eventName: "dispute",
203
- guard: {
204
- or: [
205
- { "===": [{ var: "event.agent" }, { var: "state.proposer" }] },
206
- { "===": [{ var: "event.agent" }, { var: "state.counterparty" }] },
207
- ],
208
- },
248
+ guard: signerIsAnyParty(["state.proposer", "state.counterparty"]),
209
249
  effect: {
210
250
  merge: [
211
251
  { var: "state" },
212
252
  {
213
253
  status: "DISPUTED",
214
- disputedAt: { var: "$timestamp" },
254
+ disputedAt: { var: "$ordinal" },
215
255
  disputeReason: { var: "event.reason" },
216
256
  disputedBy: { var: "event.agent" },
217
257
  },
@@ -223,13 +263,14 @@ export const contractAgreementDef = defineFiberApp({
223
263
  from: "DISPUTED",
224
264
  to: "COMPLETED",
225
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)
226
267
  guard: {
227
268
  or: [
228
- { var: "event.judicialRuling" },
269
+ signerIsParty("state.arbitrator"),
229
270
  {
230
271
  and: [
231
- { "===": [{ var: "event.proposerApproves" }, true] },
232
- { "===": [{ var: "event.counterpartyApproves" }, true] },
272
+ signerIsParty("state.proposer"),
273
+ signerIsParty("state.counterparty"),
233
274
  ],
234
275
  },
235
276
  ],
@@ -239,9 +280,16 @@ export const contractAgreementDef = defineFiberApp({
239
280
  { var: "state" },
240
281
  {
241
282
  status: "COMPLETED",
242
- resolvedAt: { var: "$timestamp" },
283
+ resolvedAt: { var: "$ordinal" },
243
284
  resolution: { var: "event.resolution" },
244
- 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
+ },
245
293
  },
246
294
  ],
247
295
  },
@@ -251,16 +299,11 @@ export const contractAgreementDef = defineFiberApp({
251
299
  from: "ACTIVE",
252
300
  to: "CANCELLED",
253
301
  eventName: "cancel",
254
- guard: {
255
- or: [
256
- { "===": [{ var: "event.agent" }, { var: "state.proposer" }] },
257
- { "===": [{ var: "event.agent" }, { var: "state.counterparty" }] },
258
- ],
259
- },
302
+ guard: signerIsAnyParty(["state.proposer", "state.counterparty"]),
260
303
  effect: {
261
304
  merge: [
262
305
  { var: "state" },
263
- { status: "CANCELLED", cancelledAt: { var: "$timestamp" } },
306
+ { status: "CANCELLED", cancelledAt: { var: "$ordinal" } },
264
307
  ],
265
308
  },
266
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,27 +115,86 @@ 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: {
124
- CREATED: { id: "CREATED", isFinal: false, metadata: null },
125
- FUNDED: { id: "FUNDED", isFinal: false, metadata: null },
126
- ACTIVE: { id: "ACTIVE", isFinal: false, metadata: null },
127
- RELEASING: { id: "RELEASING", isFinal: false, metadata: null },
128
- DISPUTED: { id: "DISPUTED", isFinal: false, metadata: null },
129
- RELEASED: { id: "RELEASED", isFinal: true, metadata: null },
130
- REFUNDED: { id: "REFUNDED", isFinal: true, metadata: null },
131
- SPLIT: { id: "SPLIT", isFinal: true, metadata: null },
126
+ CREATED: {
127
+ id: "CREATED",
128
+ isFinal: false,
129
+ metadata: {
130
+ label: "Created",
131
+ description: "Escrow created; awaiting funding",
132
+ category: "initial",
133
+ },
134
+ },
135
+ FUNDED: {
136
+ id: "FUNDED",
137
+ isFinal: false,
138
+ metadata: {
139
+ label: "Funded",
140
+ description: "Funds deposited into escrow",
141
+ category: "active",
142
+ },
143
+ },
144
+ ACTIVE: {
145
+ id: "ACTIVE",
146
+ isFinal: false,
147
+ metadata: {
148
+ label: "Active",
149
+ description: "Escrow in effect while work is performed",
150
+ category: "active",
151
+ },
152
+ },
153
+ RELEASING: {
154
+ id: "RELEASING",
155
+ isFinal: false,
156
+ metadata: {
157
+ label: "Releasing",
158
+ description: "Release approved; payout in progress",
159
+ category: "pending",
160
+ },
161
+ },
162
+ DISPUTED: {
163
+ id: "DISPUTED",
164
+ isFinal: false,
165
+ metadata: {
166
+ label: "Disputed",
167
+ description: "A party disputed the escrow; awaiting arbitration",
168
+ category: "pending",
169
+ },
170
+ },
171
+ RELEASED: {
172
+ id: "RELEASED",
173
+ isFinal: true,
174
+ metadata: {
175
+ label: "Released",
176
+ description: "Funds released to the beneficiary (terminal)",
177
+ category: "terminal",
178
+ },
179
+ },
180
+ REFUNDED: {
181
+ id: "REFUNDED",
182
+ isFinal: true,
183
+ metadata: {
184
+ label: "Refunded",
185
+ description: "Funds refunded to the depositor (terminal)",
186
+ category: "terminal",
187
+ },
188
+ },
189
+ SPLIT: {
190
+ id: "SPLIT",
191
+ isFinal: true,
192
+ metadata: {
193
+ label: "Split",
194
+ description: "Funds split between parties per arbitration (terminal)",
195
+ category: "terminal",
196
+ },
197
+ },
132
198
  },
133
199
  initialState: "CREATED",
134
200
  transitions: [
@@ -138,14 +204,14 @@ export const contractEscrowDef = defineFiberApp({
138
204
  eventName: "deposit",
139
205
  guard: {
140
206
  and: [
141
- { "===": [{ var: "event.agent" }, { var: "state.depositor" }] },
207
+ signerIsParty("state.depositor"),
142
208
  { ">=": [{ var: "event.amount" }, { var: "state.requiredAmount" }] },
143
209
  ],
144
210
  },
145
211
  effect: {
146
212
  merge: [
147
213
  { var: "state" },
148
- { balance: { var: "event.amount" }, fundedAt: { var: "$timestamp" } },
214
+ { balance: { var: "event.amount" }, fundedAt: { var: "$ordinal" } },
149
215
  ],
150
216
  },
151
217
  dependencies: [],
@@ -156,12 +222,12 @@ export const contractEscrowDef = defineFiberApp({
156
222
  eventName: "activate",
157
223
  guard: {
158
224
  or: [
159
- { "===": [{ var: "event.agent" }, { var: "state.beneficiary" }] },
225
+ signerIsParty("state.beneficiary"),
160
226
  { var: "state.autoActivate" },
161
227
  ],
162
228
  },
163
229
  effect: {
164
- merge: [{ var: "state" }, { activatedAt: { var: "$timestamp" } }],
230
+ merge: [{ var: "state" }, { activatedAt: { var: "$ordinal" } }],
165
231
  },
166
232
  dependencies: [],
167
233
  },
@@ -169,7 +235,7 @@ export const contractEscrowDef = defineFiberApp({
169
235
  from: "ACTIVE",
170
236
  to: "RELEASING",
171
237
  eventName: "request_release",
172
- guard: { "===": [{ var: "event.agent" }, { var: "state.beneficiary" }] },
238
+ guard: signerIsParty("state.beneficiary"),
173
239
  effect: {
174
240
  merge: [
175
241
  { var: "state" },
@@ -178,10 +244,10 @@ export const contractEscrowDef = defineFiberApp({
178
244
  requestedBy: { var: "event.agent" },
179
245
  amount: { var: "event.amount" },
180
246
  reason: { var: "event.reason" },
181
- requestedAt: { var: "$timestamp" },
247
+ requestedAt: { var: "$ordinal" },
182
248
  },
183
249
  releaseDeadline: {
184
- "+": [{ var: "$timestamp" }, { var: "state.releaseWindowMs" }],
250
+ "+": [{ var: "$ordinal" }, { var: "state.releaseWindowMs" }],
185
251
  },
186
252
  },
187
253
  ],
@@ -194,15 +260,15 @@ export const contractEscrowDef = defineFiberApp({
194
260
  eventName: "approve_release",
195
261
  guard: {
196
262
  or: [
197
- { "===": [{ var: "event.agent" }, { var: "state.depositor" }] },
198
- { ">=": [{ var: "$timestamp" }, { var: "state.releaseDeadline" }] },
263
+ signerIsParty("state.depositor"),
264
+ { ">=": [{ var: "$ordinal" }, { var: "state.releaseDeadline" }] },
199
265
  ],
200
266
  },
201
267
  effect: {
202
268
  merge: [
203
269
  { var: "state" },
204
270
  {
205
- releasedAt: { var: "$timestamp" },
271
+ releasedAt: { var: "$ordinal" },
206
272
  releasedTo: { var: "state.beneficiary" },
207
273
  },
208
274
  ],
@@ -215,24 +281,37 @@ export const contractEscrowDef = defineFiberApp({
215
281
  eventName: "dispute",
216
282
  guard: {
217
283
  and: [
218
- { "===": [{ var: "event.agent" }, { var: "state.depositor" }] },
219
- { "<": [{ var: "$timestamp" }, { var: "state.releaseDeadline" }] },
284
+ signerIsParty("state.depositor"),
285
+ { "<": [{ var: "$ordinal" }, { var: "state.releaseDeadline" }] },
220
286
  ],
221
287
  },
222
288
  effect: {
223
- merge: [{ var: "state" }, { disputedAt: { var: "$timestamp" } }],
224
- },
225
- spawns: {
226
- sm: "Judiciary",
227
- initialData: {
228
- caseType: "escrow_dispute",
229
- plaintiff: { var: "state.depositor" },
230
- defendant: { var: "state.beneficiary" },
231
- claim: {
232
- escrowId: { var: "fiberId" },
233
- 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
+ ],
234
313
  },
235
- },
314
+ ],
236
315
  },
237
316
  dependencies: [],
238
317
  },
@@ -240,7 +319,29 @@ export const contractEscrowDef = defineFiberApp({
240
319
  from: "DISPUTED",
241
320
  to: "SPLIT",
242
321
  eventName: "ruling",
243
- 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
+ },
244
345
  effect: {
245
346
  merge: [
246
347
  { var: "state" },
@@ -256,14 +357,20 @@ export const contractEscrowDef = defineFiberApp({
256
357
  from: "ACTIVE",
257
358
  to: "REFUNDED",
258
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)
259
361
  guard: {
260
362
  or: [
261
- { var: "event.mutualConsent" },
262
- { ">=": [{ var: "$timestamp" }, { var: "state.expiresAt" }] },
363
+ {
364
+ and: [
365
+ signerIsParty("state.depositor"),
366
+ signerIsParty("state.beneficiary"),
367
+ ],
368
+ },
369
+ { ">=": [{ var: "$ordinal" }, { var: "state.expiresAt" }] },
263
370
  ],
264
371
  },
265
372
  effect: {
266
- merge: [{ var: "state" }, { refundedAt: { var: "$timestamp" } }],
373
+ merge: [{ var: "state" }, { refundedAt: { var: "$ordinal" } }],
267
374
  },
268
375
  dependencies: [],
269
376
  },
@@ -271,9 +378,9 @@ export const contractEscrowDef = defineFiberApp({
271
378
  from: "CREATED",
272
379
  to: "REFUNDED",
273
380
  eventName: "cancel",
274
- guard: { "===": [{ var: "event.agent" }, { var: "state.depositor" }] },
381
+ guard: signerIsParty("state.depositor"),
275
382
  effect: {
276
- merge: [{ var: "state" }, { refundedAt: { var: "$timestamp" } }],
383
+ merge: [{ var: "state" }, { refundedAt: { var: "$ordinal" } }],
277
384
  },
278
385
  dependencies: [],
279
386
  },