@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.
- package/dist/cjs/apps/contracts/index.js +15 -8
- package/dist/cjs/apps/contracts/state-machines/contract-agreement.js +89 -46
- package/dist/cjs/apps/contracts/state-machines/contract-escrow.js +152 -45
- package/dist/cjs/apps/contracts/state-machines/contract-universal.js +40 -8
- package/dist/cjs/apps/corporate/index.js +2 -2
- package/dist/cjs/apps/corporate/state-machines/corp-board.js +169 -59
- package/dist/cjs/apps/corporate/state-machines/corp-entity.js +245 -47
- package/dist/cjs/apps/corporate/state-machines/corp-securities.js +407 -99
- package/dist/cjs/apps/corporate/state-machines/corp-shareholders.js +151 -37
- package/dist/cjs/apps/governance/index.js +14 -14
- package/dist/cjs/apps/governance/state-machines/dao-multisig.js +85 -43
- package/dist/cjs/apps/governance/state-machines/dao-reputation.js +73 -43
- package/dist/cjs/apps/governance/state-machines/dao-single.js +55 -14
- package/dist/cjs/apps/governance/state-machines/dao-token.js +103 -45
- package/dist/cjs/apps/governance/state-machines/governance-simple.js +129 -65
- package/dist/cjs/apps/governance/state-machines/governance-universal.js +29 -5
- package/dist/cjs/apps/identity/constants.js +55 -14
- package/dist/cjs/apps/identity/index.js +27 -11
- package/dist/cjs/apps/identity/state-machines/identity-agent.js +57 -9
- package/dist/cjs/apps/identity/state-machines/identity-oracle.js +70 -27
- package/dist/cjs/apps/identity/state-machines/identity-registry.js +288 -0
- package/dist/cjs/apps/identity/state-machines/identity-universal.js +30 -6
- package/dist/cjs/apps/identity/state-machines/index.js +3 -1
- package/dist/cjs/apps/index.js +19 -8
- package/dist/cjs/apps/lending/assets.js +223 -0
- package/dist/cjs/apps/lending/credit-scoring.js +87 -0
- package/dist/cjs/apps/lending/eligibility.js +121 -0
- package/dist/cjs/apps/lending/index.js +91 -0
- package/dist/cjs/apps/lending/state-machines/index.js +9 -0
- package/dist/cjs/apps/lending/state-machines/lending-zk-loan.js +412 -0
- package/dist/cjs/apps/markets/index.js +21 -11
- package/dist/cjs/apps/markets/state-machines/market-auction.js +44 -19
- package/dist/cjs/apps/markets/state-machines/market-crowdfund.js +54 -29
- package/dist/cjs/apps/markets/state-machines/market-group-buy.js +53 -31
- package/dist/cjs/apps/markets/state-machines/market-prediction.js +120 -61
- package/dist/cjs/apps/markets/state-machines/market-universal.js +50 -10
- package/dist/cjs/apps/oracles/index.js +2 -2
- package/dist/cjs/errors.js +3 -3
- package/dist/cjs/generated/google/protobuf/struct.js +4 -4
- package/dist/cjs/generated/index.js +11 -7
- package/dist/cjs/generated/openapi.js +6 -0
- package/dist/cjs/generated/ottochain/apps/contracts/v1/contract.js +50 -50
- package/dist/cjs/generated/ottochain/apps/corporate/v1/corporate.js +19 -20
- package/dist/cjs/generated/ottochain/apps/governance/v1/governance.js +13 -13
- package/dist/cjs/generated/ottochain/apps/identity/v1/attestation.js +4 -4
- package/dist/cjs/generated/ottochain/apps/identity/v1/identity.js +124 -130
- package/dist/cjs/generated/ottochain/apps/markets/v1/market.js +107 -107
- package/dist/cjs/generated/ottochain/v1/common.js +1722 -1
- package/dist/cjs/generated/ottochain/v1/fiber.js +355 -5
- package/dist/cjs/generated/ottochain/v1/messages.js +775 -3
- package/dist/cjs/generated/ottochain/v1/records.js +350 -3
- package/dist/cjs/index.js +45 -7
- package/dist/cjs/openapi.js +2 -0
- package/dist/cjs/ottochain/drop-nulls.js +1 -2
- package/dist/cjs/ottochain/genesis-manifest.js +193 -0
- package/dist/cjs/ottochain/index.js +27 -13
- package/dist/cjs/ottochain/metagraph-client.js +65 -8
- package/dist/cjs/ottochain/snapshot.js +11 -12
- package/dist/cjs/ottochain/transaction.js +57 -14
- package/dist/cjs/ottochain/types.js +19 -1
- package/dist/cjs/privacy/index.js +14 -0
- package/dist/cjs/privacy/sealed-bid.js +210 -0
- package/dist/cjs/privacy/shield-app.js +131 -0
- package/dist/cjs/schema/effects.js +40 -0
- package/dist/cjs/schema/fiber-app.js +19 -13
- package/dist/cjs/schema/guard-lint.js +352 -0
- package/dist/cjs/schema/guards.js +246 -0
- package/dist/cjs/signing.js +80 -0
- package/dist/cjs/types.js +2 -3
- package/dist/cjs/validation.js +8 -8
- package/dist/cjs/verify.js +9 -4
- package/dist/cjs/zk/commit.js +53 -0
- package/dist/cjs/zk/guard.js +107 -0
- package/dist/cjs/zk/index.js +48 -0
- package/dist/cjs/zk/preimage.js +37 -0
- package/dist/cjs/zk/prover.js +87 -0
- package/dist/cjs/zk/registry.js +62 -0
- package/dist/cjs/zk/types.js +28 -0
- package/dist/cjs/zk/witness.js +19 -0
- package/dist/esm/apps/contracts/index.js +7 -3
- package/dist/esm/apps/contracts/state-machines/contract-agreement.js +89 -46
- package/dist/esm/apps/contracts/state-machines/contract-escrow.js +152 -45
- package/dist/esm/apps/contracts/state-machines/contract-universal.js +40 -8
- package/dist/esm/apps/corporate/state-machines/corp-board.js +169 -59
- package/dist/esm/apps/corporate/state-machines/corp-entity.js +245 -47
- package/dist/esm/apps/corporate/state-machines/corp-securities.js +407 -99
- package/dist/esm/apps/corporate/state-machines/corp-shareholders.js +151 -37
- package/dist/esm/apps/governance/state-machines/dao-multisig.js +85 -43
- package/dist/esm/apps/governance/state-machines/dao-reputation.js +73 -43
- package/dist/esm/apps/governance/state-machines/dao-single.js +55 -14
- package/dist/esm/apps/governance/state-machines/dao-token.js +103 -45
- package/dist/esm/apps/governance/state-machines/governance-simple.js +129 -65
- package/dist/esm/apps/governance/state-machines/governance-universal.js +29 -5
- package/dist/esm/apps/identity/constants.js +51 -12
- package/dist/esm/apps/identity/index.js +12 -7
- package/dist/esm/apps/identity/state-machines/identity-agent.js +57 -9
- package/dist/esm/apps/identity/state-machines/identity-oracle.js +70 -27
- package/dist/esm/apps/identity/state-machines/identity-registry.js +285 -0
- package/dist/esm/apps/identity/state-machines/identity-universal.js +30 -6
- package/dist/esm/apps/identity/state-machines/index.js +1 -0
- package/dist/esm/apps/index.js +1 -0
- package/dist/esm/apps/lending/assets.js +207 -0
- package/dist/esm/apps/lending/credit-scoring.js +81 -0
- package/dist/esm/apps/lending/eligibility.js +115 -0
- package/dist/esm/apps/lending/index.js +69 -0
- package/dist/esm/apps/lending/state-machines/index.js +5 -0
- package/dist/esm/apps/lending/state-machines/lending-zk-loan.js +409 -0
- package/dist/esm/apps/markets/index.js +8 -4
- package/dist/esm/apps/markets/state-machines/market-auction.js +44 -19
- package/dist/esm/apps/markets/state-machines/market-crowdfund.js +54 -29
- package/dist/esm/apps/markets/state-machines/market-group-buy.js +53 -31
- package/dist/esm/apps/markets/state-machines/market-prediction.js +120 -61
- package/dist/esm/apps/markets/state-machines/market-universal.js +50 -10
- package/dist/esm/generated/index.js +9 -5
- package/dist/esm/generated/openapi.js +5 -0
- package/dist/esm/generated/ottochain/apps/contracts/v1/contract.js +46 -46
- package/dist/esm/generated/ottochain/apps/identity/v1/identity.js +114 -120
- package/dist/esm/generated/ottochain/apps/markets/v1/market.js +100 -100
- package/dist/esm/generated/ottochain/v1/common.js +1718 -0
- package/dist/esm/generated/ottochain/v1/fiber.js +351 -1
- package/dist/esm/generated/ottochain/v1/messages.js +774 -2
- package/dist/esm/generated/ottochain/v1/records.js +349 -2
- package/dist/esm/index.js +23 -2
- package/dist/esm/openapi.js +1 -0
- package/dist/esm/ottochain/genesis-manifest.js +189 -0
- package/dist/esm/ottochain/index.js +4 -3
- package/dist/esm/ottochain/metagraph-client.js +65 -8
- package/dist/esm/ottochain/snapshot.js +4 -4
- package/dist/esm/ottochain/transaction.js +43 -3
- package/dist/esm/ottochain/types.js +18 -0
- package/dist/esm/privacy/index.js +6 -0
- package/dist/esm/privacy/sealed-bid.js +206 -0
- package/dist/esm/privacy/shield-app.js +127 -0
- package/dist/esm/schema/effects.js +35 -0
- package/dist/esm/schema/fiber-app.js +13 -6
- package/dist/esm/schema/guard-lint.js +346 -0
- package/dist/esm/schema/guards.js +229 -0
- package/dist/esm/signing.js +74 -0
- package/dist/esm/verify.js +8 -2
- package/dist/esm/zk/commit.js +44 -0
- package/dist/esm/zk/guard.js +99 -0
- package/dist/esm/zk/index.js +19 -0
- package/dist/esm/zk/preimage.js +30 -0
- package/dist/esm/zk/prover.js +82 -0
- package/dist/esm/zk/registry.js +55 -0
- package/dist/esm/zk/types.js +25 -0
- package/dist/esm/zk/witness.js +15 -0
- package/dist/types/apps/contracts/index.d.ts +159 -227
- package/dist/types/apps/contracts/state-machines/contract-agreement.d.ts +50 -101
- package/dist/types/apps/contracts/state-machines/contract-escrow.d.ts +86 -120
- package/dist/types/apps/contracts/state-machines/contract-universal.d.ts +20 -4
- package/dist/types/apps/corporate/index.d.ts +1040 -304
- package/dist/types/apps/corporate/state-machines/corp-board.d.ts +188 -52
- package/dist/types/apps/corporate/state-machines/corp-entity.d.ts +267 -62
- package/dist/types/apps/corporate/state-machines/corp-securities.d.ts +355 -131
- package/dist/types/apps/corporate/state-machines/corp-shareholders.d.ts +225 -53
- package/dist/types/apps/governance/index.d.ts +396 -417
- package/dist/types/apps/governance/state-machines/dao-multisig.d.ts +92 -95
- package/dist/types/apps/governance/state-machines/dao-reputation.d.ts +57 -69
- package/dist/types/apps/governance/state-machines/dao-single.d.ts +40 -50
- package/dist/types/apps/governance/state-machines/dao-token.d.ts +80 -53
- package/dist/types/apps/governance/state-machines/governance-simple.d.ts +107 -121
- package/dist/types/apps/governance/state-machines/governance-universal.d.ts +17 -5
- package/dist/types/apps/identity/constants.d.ts +32 -4
- package/dist/types/apps/identity/index.d.ts +449 -100
- package/dist/types/apps/identity/state-machines/identity-agent.d.ts +30 -0
- package/dist/types/apps/identity/state-machines/identity-oracle.d.ts +41 -87
- package/dist/types/apps/identity/state-machines/identity-registry.d.ts +379 -0
- package/dist/types/apps/identity/state-machines/identity-universal.d.ts +15 -0
- package/dist/types/apps/identity/state-machines/index.d.ts +1 -0
- package/dist/types/apps/index.d.ts +1 -0
- package/dist/types/apps/lending/assets.d.ts +258 -0
- package/dist/types/apps/lending/credit-scoring.d.ts +80 -0
- package/dist/types/apps/lending/eligibility.d.ts +83 -0
- package/dist/types/apps/lending/index.d.ts +548 -0
- package/dist/types/apps/lending/state-machines/index.d.ts +5 -0
- package/dist/types/apps/lending/state-machines/lending-zk-loan.d.ts +528 -0
- package/dist/types/apps/markets/index.d.ts +184 -204
- package/dist/types/apps/markets/state-machines/market-auction.d.ts +25 -37
- package/dist/types/apps/markets/state-machines/market-crowdfund.d.ts +26 -34
- package/dist/types/apps/markets/state-machines/market-group-buy.d.ts +31 -43
- package/dist/types/apps/markets/state-machines/market-prediction.d.ts +67 -72
- package/dist/types/apps/markets/state-machines/market-universal.d.ts +30 -10
- package/dist/types/generated/index.d.ts +5 -5
- package/dist/types/generated/openapi.d.ts +1257 -0
- package/dist/types/generated/ottochain/apps/contracts/v1/contract.d.ts +5 -5
- package/dist/types/generated/ottochain/apps/identity/v1/identity.d.ts +12 -12
- package/dist/types/generated/ottochain/apps/markets/v1/market.d.ts +11 -11
- package/dist/types/generated/ottochain/v1/common.d.ts +228 -0
- package/dist/types/generated/ottochain/v1/fiber.d.ts +32 -1
- package/dist/types/generated/ottochain/v1/messages.d.ts +84 -0
- package/dist/types/generated/ottochain/v1/records.d.ts +34 -0
- package/dist/types/index.d.ts +8 -2
- package/dist/types/openapi.d.ts +22 -0
- package/dist/types/ottochain/genesis-manifest.d.ts +130 -0
- package/dist/types/ottochain/index.d.ts +6 -5
- package/dist/types/ottochain/metagraph-client.d.ts +49 -7
- package/dist/types/ottochain/snapshot.d.ts +6 -6
- package/dist/types/ottochain/transaction.d.ts +33 -1
- package/dist/types/ottochain/types.d.ts +602 -11
- package/dist/types/privacy/index.d.ts +6 -0
- package/dist/types/privacy/sealed-bid.d.ts +348 -0
- package/dist/types/privacy/shield-app.d.ts +48 -0
- package/dist/types/schema/effects.d.ts +34 -0
- package/dist/types/schema/fiber-app.d.ts +41 -3
- package/dist/types/schema/guard-lint.d.ts +111 -0
- package/dist/types/schema/guards.d.ts +134 -0
- package/dist/types/signing.d.ts +45 -0
- package/dist/types/validation.d.ts +22 -217
- package/dist/types/verify.d.ts +4 -0
- package/dist/types/zk/commit.d.ts +28 -0
- package/dist/types/zk/guard.d.ts +46 -0
- package/dist/types/zk/index.d.ts +19 -0
- package/dist/types/zk/preimage.d.ts +10 -0
- package/dist/types/zk/prover.d.ts +34 -0
- package/dist/types/zk/registry.d.ts +34 -0
- package/dist/types/zk/types.d.ts +33 -0
- package/dist/types/zk/witness.d.ts +40 -0
- package/package.json +52 -35
- package/dist/cjs/ottochain/normalize.js +0 -186
- package/dist/esm/ottochain/normalize.js +0 -179
- package/dist/types/ottochain/normalize.d.ts +0 -79
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* @example
|
|
7
7
|
* ```typescript
|
|
8
8
|
* import {
|
|
9
|
-
*
|
|
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
|
-
|
|
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: {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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:
|
|
152
|
+
guard: signerIsParty("state.counterparty"),
|
|
101
153
|
effect: {
|
|
102
154
|
merge: [
|
|
103
155
|
{ var: "state" },
|
|
104
|
-
{ status: "ACTIVE", acceptedAt: { var: "$
|
|
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:
|
|
165
|
+
guard: signerIsParty("state.counterparty"),
|
|
114
166
|
effect: {
|
|
115
167
|
merge: [
|
|
116
168
|
{ var: "state" },
|
|
117
169
|
{
|
|
118
170
|
status: "REJECTED",
|
|
119
|
-
rejectedAt: { var: "$
|
|
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:
|
|
182
|
+
guard: signerIsParty("state.proposer"),
|
|
131
183
|
effect: {
|
|
132
184
|
merge: [
|
|
133
185
|
{ var: "state" },
|
|
134
|
-
{ status: "CANCELLED", cancelledAt: { var: "$
|
|
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: "$
|
|
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: { ">=": [{
|
|
235
|
+
guard: { ">=": [{ length: [{ var: "state.completions" }] }, 2] },
|
|
191
236
|
effect: {
|
|
192
237
|
merge: [
|
|
193
238
|
{ var: "state" },
|
|
194
|
-
{ status: "COMPLETED", completedAt: { var: "$
|
|
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: "$
|
|
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
|
-
|
|
269
|
+
signerIsParty("state.arbitrator"),
|
|
229
270
|
{
|
|
230
271
|
and: [
|
|
231
|
-
|
|
232
|
-
|
|
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: "$
|
|
283
|
+
resolvedAt: { var: "$ordinal" },
|
|
243
284
|
resolution: { var: "event.resolution" },
|
|
244
|
-
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: "$
|
|
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: {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
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
|
-
|
|
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: "$
|
|
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
|
-
|
|
225
|
+
signerIsParty("state.beneficiary"),
|
|
160
226
|
{ var: "state.autoActivate" },
|
|
161
227
|
],
|
|
162
228
|
},
|
|
163
229
|
effect: {
|
|
164
|
-
merge: [{ var: "state" }, { activatedAt: { var: "$
|
|
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:
|
|
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: "$
|
|
247
|
+
requestedAt: { var: "$ordinal" },
|
|
182
248
|
},
|
|
183
249
|
releaseDeadline: {
|
|
184
|
-
"+": [{ var: "$
|
|
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
|
-
|
|
198
|
-
{ ">=": [{ var: "$
|
|
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: "$
|
|
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
|
-
|
|
219
|
-
{ "<": [{ var: "$
|
|
284
|
+
signerIsParty("state.depositor"),
|
|
285
|
+
{ "<": [{ var: "$ordinal" }, { var: "state.releaseDeadline" }] },
|
|
220
286
|
],
|
|
221
287
|
},
|
|
222
288
|
effect: {
|
|
223
|
-
merge: [
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
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
|
-
|
|
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
|
-
{
|
|
262
|
-
|
|
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: "$
|
|
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:
|
|
381
|
+
guard: signerIsParty("state.depositor"),
|
|
275
382
|
effect: {
|
|
276
|
-
merge: [{ var: "state" }, { refundedAt: { var: "$
|
|
383
|
+
merge: [{ var: "state" }, { refundedAt: { var: "$ordinal" } }],
|
|
277
384
|
},
|
|
278
385
|
dependencies: [],
|
|
279
386
|
},
|