@ottochain/sdk 2.4.0 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/apps/compute/index.js +33 -0
- package/dist/cjs/apps/compute/state-machines/compute-rule110.js +164 -0
- package/dist/cjs/apps/compute/state-machines/index.js +9 -0
- package/dist/cjs/apps/contracts/index.js +1 -1
- package/dist/cjs/apps/contracts/state-machines/contract-agreement.js +126 -148
- package/dist/cjs/apps/contracts/state-machines/contract-escrow.js +153 -174
- package/dist/cjs/apps/contracts/state-machines/contract-universal.js +46 -58
- package/dist/cjs/apps/corporate/state-machines/corp-board.js +415 -481
- package/dist/cjs/apps/corporate/state-machines/corp-entity.js +368 -440
- package/dist/cjs/apps/corporate/state-machines/corp-securities.js +532 -647
- package/dist/cjs/apps/corporate/state-machines/corp-shareholders.js +499 -603
- package/dist/cjs/apps/governance/index.js +7 -7
- package/dist/cjs/apps/governance/state-machines/dao-multisig.js +170 -209
- package/dist/cjs/apps/governance/state-machines/dao-reputation.js +161 -214
- package/dist/cjs/apps/governance/state-machines/dao-single.js +92 -92
- package/dist/cjs/apps/governance/state-machines/dao-token.js +169 -223
- package/dist/cjs/apps/governance/state-machines/governance-simple.js +185 -217
- package/dist/cjs/apps/governance/state-machines/governance-universal.js +64 -64
- package/dist/cjs/apps/identity/constants.js +16 -24
- package/dist/cjs/apps/identity/index.js +1 -1
- package/dist/cjs/apps/identity/state-machines/identity-agent.js +124 -158
- package/dist/cjs/apps/identity/state-machines/identity-oracle.js +151 -169
- package/dist/cjs/apps/identity/state-machines/identity-registry.js +89 -115
- package/dist/cjs/apps/identity/state-machines/identity-universal.js +51 -57
- package/dist/cjs/apps/index.js +4 -1
- package/dist/cjs/apps/lending/assets.js +41 -17
- package/dist/cjs/apps/lending/credit-scoring.js +4 -4
- package/dist/cjs/apps/lending/eligibility.js +9 -25
- package/dist/cjs/apps/lending/index.js +1 -1
- package/dist/cjs/apps/lending/state-machines/lending-zk-loan.js +177 -156
- package/dist/cjs/apps/markets/index.js +1 -1
- package/dist/cjs/apps/markets/state-machines/market-auction.js +115 -134
- package/dist/cjs/apps/markets/state-machines/market-crowdfund.js +122 -137
- package/dist/cjs/apps/markets/state-machines/market-group-buy.js +158 -177
- package/dist/cjs/apps/markets/state-machines/market-prediction.js +193 -227
- package/dist/cjs/apps/markets/state-machines/market-universal.js +65 -80
- package/dist/cjs/apps/oracles/index.js +1 -1
- package/dist/cjs/apps/privacy/index.js +67 -0
- package/dist/cjs/apps/privacy/state-machines/index.js +17 -0
- package/dist/cjs/apps/privacy/state-machines/mixer-ddhRing.js +286 -0
- package/dist/cjs/apps/privacy/state-machines/note-pool.js +476 -0
- package/dist/cjs/apps/staked-pool/assets.js +103 -0
- package/dist/cjs/apps/staked-pool/base.js +498 -0
- package/dist/cjs/apps/staked-pool/consumer.js +55 -0
- package/dist/cjs/apps/staked-pool/index.js +83 -0
- package/dist/cjs/apps/staked-pool/state-machines/index.js +12 -0
- package/dist/cjs/apps/staked-pool/state-machines/staked-pool-base.js +49 -0
- package/dist/cjs/apps/staked-pool/state-machines/staked-pool-oracle.js +131 -0
- package/dist/cjs/generated/google/protobuf/struct.js +1 -1
- package/dist/cjs/generated/google/protobuf/timestamp.js +1 -1
- package/dist/cjs/generated/ottochain/apps/contracts/v1/contract.js +1 -1
- package/dist/cjs/generated/ottochain/apps/corporate/v1/corporate.js +1 -1
- package/dist/cjs/generated/ottochain/apps/governance/v1/governance.js +1 -1
- package/dist/cjs/generated/ottochain/apps/identity/v1/attestation.js +1 -1
- package/dist/cjs/generated/ottochain/apps/identity/v1/identity.js +1 -1
- package/dist/cjs/generated/ottochain/apps/markets/v1/market.js +1 -1
- package/dist/cjs/generated/ottochain/v1/common.js +1 -1
- package/dist/cjs/generated/ottochain/v1/fiber.js +40 -2
- package/dist/cjs/generated/ottochain/v1/messages.js +1 -1
- package/dist/cjs/generated/ottochain/v1/records.js +1 -1
- package/dist/cjs/index.js +20 -3
- package/dist/cjs/ottochain/genesis-manifest.js +6 -0
- package/dist/cjs/ottochain/metagraph-client.js +16 -8
- package/dist/cjs/ottochain/snapshot.js +2 -4
- package/dist/cjs/ottochain/transaction.js +10 -0
- package/dist/cjs/privacy/sealed-bid.js +85 -82
- package/dist/cjs/privacy/shield-app.js +32 -32
- package/dist/cjs/schema/effects.js +117 -1
- package/dist/cjs/schema/fiber-app.js +132 -3
- package/dist/cjs/schema/guard-lint.js +3 -12
- package/dist/cjs/schema/guards.js +38 -38
- package/dist/cjs/templates/asset-policy.js +190 -0
- package/dist/cjs/templates/index.js +86 -0
- package/dist/cjs/templates/machine.js +130 -0
- package/dist/cjs/templates/migration.js +39 -0
- package/dist/cjs/templates/state-shape.js +38 -0
- package/dist/cjs/validation.js +1 -3
- package/dist/esm/apps/compute/index.js +29 -0
- package/dist/esm/apps/compute/state-machines/compute-rule110.js +161 -0
- package/dist/esm/apps/compute/state-machines/index.js +5 -0
- package/dist/esm/apps/contracts/index.js +4 -4
- package/dist/esm/apps/contracts/state-machines/contract-agreement.js +128 -150
- package/dist/esm/apps/contracts/state-machines/contract-escrow.js +155 -176
- package/dist/esm/apps/contracts/state-machines/contract-universal.js +47 -59
- package/dist/esm/apps/corporate/index.js +2 -2
- package/dist/esm/apps/corporate/state-machines/corp-board.js +418 -484
- package/dist/esm/apps/corporate/state-machines/corp-entity.js +371 -443
- package/dist/esm/apps/corporate/state-machines/corp-securities.js +535 -650
- package/dist/esm/apps/corporate/state-machines/corp-shareholders.js +502 -606
- package/dist/esm/apps/governance/index.js +10 -10
- package/dist/esm/apps/governance/state-machines/dao-multisig.js +172 -211
- package/dist/esm/apps/governance/state-machines/dao-reputation.js +163 -216
- package/dist/esm/apps/governance/state-machines/dao-single.js +94 -94
- package/dist/esm/apps/governance/state-machines/dao-token.js +171 -225
- package/dist/esm/apps/governance/state-machines/governance-simple.js +187 -219
- package/dist/esm/apps/governance/state-machines/governance-universal.js +65 -65
- package/dist/esm/apps/identity/constants.js +18 -26
- package/dist/esm/apps/identity/index.js +8 -8
- package/dist/esm/apps/identity/state-machines/identity-agent.js +125 -159
- package/dist/esm/apps/identity/state-machines/identity-oracle.js +153 -171
- package/dist/esm/apps/identity/state-machines/identity-registry.js +91 -117
- package/dist/esm/apps/identity/state-machines/identity-universal.js +52 -58
- package/dist/esm/apps/index.js +9 -6
- package/dist/esm/apps/lending/assets.js +41 -17
- package/dist/esm/apps/lending/credit-scoring.js +6 -6
- package/dist/esm/apps/lending/eligibility.js +10 -26
- package/dist/esm/apps/lending/index.js +5 -5
- package/dist/esm/apps/lending/state-machines/lending-zk-loan.js +178 -157
- package/dist/esm/apps/markets/index.js +5 -5
- package/dist/esm/apps/markets/state-machines/market-auction.js +117 -136
- package/dist/esm/apps/markets/state-machines/market-crowdfund.js +124 -139
- package/dist/esm/apps/markets/state-machines/market-group-buy.js +160 -179
- package/dist/esm/apps/markets/state-machines/market-prediction.js +195 -229
- package/dist/esm/apps/markets/state-machines/market-universal.js +66 -81
- package/dist/esm/apps/oracles/index.js +3 -3
- package/dist/esm/apps/privacy/index.js +56 -0
- package/dist/esm/apps/privacy/state-machines/index.js +6 -0
- package/dist/esm/apps/privacy/state-machines/mixer-ddhRing.js +282 -0
- package/dist/esm/apps/privacy/state-machines/note-pool.js +470 -0
- package/dist/esm/apps/staked-pool/assets.js +91 -0
- package/dist/esm/apps/staked-pool/base.js +493 -0
- package/dist/esm/apps/staked-pool/consumer.js +49 -0
- package/dist/esm/apps/staked-pool/index.js +60 -0
- package/dist/esm/apps/staked-pool/state-machines/index.js +6 -0
- package/dist/esm/apps/staked-pool/state-machines/staked-pool-base.js +46 -0
- package/dist/esm/apps/staked-pool/state-machines/staked-pool-oracle.js +127 -0
- package/dist/esm/generated/google/protobuf/struct.js +1 -1
- package/dist/esm/generated/google/protobuf/timestamp.js +1 -1
- package/dist/esm/generated/ottochain/apps/contracts/v1/contract.js +1 -1
- package/dist/esm/generated/ottochain/apps/corporate/v1/corporate.js +1 -1
- package/dist/esm/generated/ottochain/apps/governance/v1/governance.js +1 -1
- package/dist/esm/generated/ottochain/apps/identity/v1/attestation.js +1 -1
- package/dist/esm/generated/ottochain/apps/identity/v1/identity.js +1 -1
- package/dist/esm/generated/ottochain/apps/markets/v1/market.js +1 -1
- package/dist/esm/generated/ottochain/v1/common.js +1 -1
- package/dist/esm/generated/ottochain/v1/fiber.js +40 -2
- package/dist/esm/generated/ottochain/v1/messages.js +1 -1
- package/dist/esm/generated/ottochain/v1/records.js +1 -1
- package/dist/esm/index.js +10 -4
- package/dist/esm/ottochain/genesis-manifest.js +6 -0
- package/dist/esm/ottochain/metagraph-client.js +16 -8
- package/dist/esm/ottochain/snapshot.js +2 -4
- package/dist/esm/ottochain/transaction.js +8 -0
- package/dist/esm/privacy/index.js +2 -2
- package/dist/esm/privacy/sealed-bid.js +87 -84
- package/dist/esm/privacy/shield-app.js +33 -33
- package/dist/esm/schema/effects.js +110 -0
- package/dist/esm/schema/fiber-app.js +127 -3
- package/dist/esm/schema/guard-lint.js +3 -12
- package/dist/esm/schema/guards.js +36 -37
- package/dist/esm/templates/asset-policy.js +182 -0
- package/dist/esm/templates/index.js +41 -0
- package/dist/esm/templates/machine.js +125 -0
- package/dist/esm/templates/migration.js +34 -0
- package/dist/esm/templates/state-shape.js +34 -0
- package/dist/esm/validation.js +1 -3
- package/dist/esm/zk/index.js +4 -4
- package/dist/types/apps/compute/index.d.ts +176 -0
- package/dist/types/apps/compute/state-machines/compute-rule110.d.ts +157 -0
- package/dist/types/apps/compute/state-machines/index.d.ts +5 -0
- package/dist/types/apps/contracts/index.d.ts +14 -14
- package/dist/types/apps/contracts/state-machines/contract-agreement.d.ts +3 -3
- package/dist/types/apps/contracts/state-machines/contract-escrow.d.ts +3 -3
- package/dist/types/apps/contracts/state-machines/contract-universal.d.ts +4 -4
- package/dist/types/apps/corporate/index.d.ts +162 -162
- package/dist/types/apps/corporate/state-machines/corp-board.d.ts +88 -88
- package/dist/types/apps/corporate/state-machines/corp-entity.d.ts +14 -14
- package/dist/types/apps/corporate/state-machines/corp-securities.d.ts +18 -18
- package/dist/types/apps/corporate/state-machines/corp-shareholders.d.ts +43 -43
- package/dist/types/apps/governance/index.d.ts +81 -81
- package/dist/types/apps/governance/state-machines/dao-multisig.d.ts +16 -16
- package/dist/types/apps/governance/state-machines/dao-reputation.d.ts +22 -22
- package/dist/types/apps/governance/state-machines/dao-token.d.ts +21 -21
- package/dist/types/apps/governance/state-machines/governance-simple.d.ts +11 -11
- package/dist/types/apps/governance/state-machines/governance-universal.d.ts +4 -4
- package/dist/types/apps/identity/constants.d.ts +2 -2
- package/dist/types/apps/identity/index.d.ts +70 -70
- package/dist/types/apps/identity/state-machines/identity-agent.d.ts +23 -23
- package/dist/types/apps/identity/state-machines/identity-oracle.d.ts +11 -11
- package/dist/types/apps/identity/state-machines/identity-registry.d.ts +27 -27
- package/dist/types/apps/identity/state-machines/identity-universal.d.ts +4 -4
- package/dist/types/apps/index.d.ts +9 -6
- package/dist/types/apps/lending/assets.d.ts +2 -2
- package/dist/types/apps/lending/credit-scoring.d.ts +5 -5
- package/dist/types/apps/lending/eligibility.d.ts +2 -2
- package/dist/types/apps/lending/index.d.ts +20 -12
- package/dist/types/apps/lending/state-machines/lending-zk-loan.d.ts +15 -7
- package/dist/types/apps/markets/index.d.ts +76 -76
- package/dist/types/apps/markets/state-machines/market-auction.d.ts +12 -12
- package/dist/types/apps/markets/state-machines/market-crowdfund.d.ts +19 -19
- package/dist/types/apps/markets/state-machines/market-group-buy.d.ts +18 -18
- package/dist/types/apps/markets/state-machines/market-prediction.d.ts +15 -15
- package/dist/types/apps/markets/state-machines/market-universal.d.ts +7 -7
- package/dist/types/apps/oracles/index.d.ts +1 -1
- package/dist/types/apps/privacy/index.d.ts +328 -0
- package/dist/types/apps/privacy/state-machines/index.d.ts +6 -0
- package/dist/types/apps/privacy/state-machines/mixer-ddhRing.d.ts +337 -0
- package/dist/types/apps/privacy/state-machines/note-pool.d.ts +196 -0
- package/dist/types/apps/staked-pool/assets.d.ts +53 -0
- package/dist/types/apps/staked-pool/base.d.ts +80 -0
- package/dist/types/apps/staked-pool/consumer.d.ts +29 -0
- package/dist/types/apps/staked-pool/index.d.ts +51 -0
- package/dist/types/apps/staked-pool/state-machines/index.d.ts +6 -0
- package/dist/types/apps/staked-pool/state-machines/staked-pool-base.d.ts +8 -0
- package/dist/types/apps/staked-pool/state-machines/staked-pool-oracle.d.ts +34 -0
- package/dist/types/generated/openapi.d.ts +13 -0
- package/dist/types/generated/ottochain/v1/fiber.d.ts +7 -0
- package/dist/types/index.d.ts +3 -3
- package/dist/types/openapi.d.ts +4 -2
- package/dist/types/ottochain/genesis-manifest.d.ts +6 -0
- package/dist/types/ottochain/transaction.d.ts +9 -1
- package/dist/types/ottochain/types.d.ts +1 -1
- package/dist/types/privacy/index.d.ts +2 -2
- package/dist/types/privacy/sealed-bid.d.ts +9 -9
- package/dist/types/privacy/shield-app.d.ts +1 -1
- package/dist/types/schema/effects.d.ts +107 -0
- package/dist/types/schema/fiber-app.d.ts +281 -0
- package/dist/types/schema/guards.d.ts +12 -0
- package/dist/types/templates/asset-policy.d.ts +119 -0
- package/dist/types/templates/index.d.ts +26 -0
- package/dist/types/templates/machine.d.ts +139 -0
- package/dist/types/templates/migration.d.ts +34 -0
- package/dist/types/templates/state-shape.d.ts +30 -0
- package/dist/types/zk/index.d.ts +4 -4
- package/package.json +31 -13
|
@@ -7,119 +7,113 @@ const fiber_app_js_1 = require("../../../schema/fiber-app.js");
|
|
|
7
7
|
*/
|
|
8
8
|
exports.marketUniversalDef = (0, fiber_app_js_1.defineFiberApp)({
|
|
9
9
|
metadata: {
|
|
10
|
-
name:
|
|
11
|
-
app:
|
|
12
|
-
type:
|
|
13
|
-
version:
|
|
14
|
-
description:
|
|
10
|
+
name: 'MarketUniversal',
|
|
11
|
+
app: 'markets',
|
|
12
|
+
type: 'universal',
|
|
13
|
+
version: '1.0.0',
|
|
14
|
+
description: 'Minimal market state machine - extend for custom use cases',
|
|
15
15
|
},
|
|
16
16
|
createSchema: {
|
|
17
17
|
properties: {},
|
|
18
18
|
},
|
|
19
19
|
stateSchema: {
|
|
20
20
|
properties: {
|
|
21
|
-
status: { type:
|
|
22
|
-
totalCommitted: { type:
|
|
21
|
+
status: { type: 'string' },
|
|
22
|
+
totalCommitted: { type: 'number', computed: true },
|
|
23
23
|
},
|
|
24
24
|
},
|
|
25
25
|
eventSchemas: {
|
|
26
|
-
open: { description:
|
|
27
|
-
cancel: { description:
|
|
26
|
+
open: { description: 'Open the market for participation' },
|
|
27
|
+
cancel: { description: 'Cancel the market' },
|
|
28
28
|
commit: {
|
|
29
|
-
description:
|
|
29
|
+
description: 'Commit funds to the market',
|
|
30
30
|
properties: {
|
|
31
|
-
amount: { type:
|
|
31
|
+
amount: { type: 'number', minimum: 0 },
|
|
32
32
|
},
|
|
33
33
|
},
|
|
34
|
-
close: { description:
|
|
35
|
-
settle: { description:
|
|
34
|
+
close: { description: 'Close the market to new commits' },
|
|
35
|
+
settle: { description: 'Settle the market' },
|
|
36
36
|
},
|
|
37
37
|
states: {
|
|
38
38
|
PROPOSED: {
|
|
39
|
-
id:
|
|
39
|
+
id: 'PROPOSED',
|
|
40
40
|
isFinal: false,
|
|
41
41
|
metadata: {
|
|
42
|
-
label:
|
|
43
|
-
description:
|
|
44
|
-
category:
|
|
42
|
+
label: 'Proposed',
|
|
43
|
+
description: 'Market created but not yet open',
|
|
44
|
+
category: 'initial',
|
|
45
45
|
},
|
|
46
46
|
},
|
|
47
47
|
OPEN: {
|
|
48
|
-
id:
|
|
48
|
+
id: 'OPEN',
|
|
49
49
|
isFinal: false,
|
|
50
50
|
metadata: {
|
|
51
|
-
label:
|
|
52
|
-
description:
|
|
53
|
-
category:
|
|
51
|
+
label: 'Open',
|
|
52
|
+
description: 'Market is open for participation',
|
|
53
|
+
category: 'active',
|
|
54
54
|
},
|
|
55
55
|
},
|
|
56
56
|
CLOSED: {
|
|
57
|
-
id:
|
|
57
|
+
id: 'CLOSED',
|
|
58
58
|
isFinal: false,
|
|
59
59
|
metadata: {
|
|
60
|
-
label:
|
|
61
|
-
description:
|
|
62
|
-
category:
|
|
60
|
+
label: 'Closed',
|
|
61
|
+
description: 'Participation closed; awaiting settlement',
|
|
62
|
+
category: 'pending',
|
|
63
63
|
},
|
|
64
64
|
},
|
|
65
65
|
SETTLED: {
|
|
66
|
-
id:
|
|
66
|
+
id: 'SETTLED',
|
|
67
67
|
isFinal: true,
|
|
68
68
|
metadata: {
|
|
69
|
-
label:
|
|
70
|
-
description:
|
|
71
|
-
category:
|
|
69
|
+
label: 'Settled',
|
|
70
|
+
description: 'Market settled and payouts available (terminal)',
|
|
71
|
+
category: 'terminal',
|
|
72
72
|
},
|
|
73
73
|
},
|
|
74
74
|
CANCELLED: {
|
|
75
|
-
id:
|
|
75
|
+
id: 'CANCELLED',
|
|
76
76
|
isFinal: true,
|
|
77
77
|
metadata: {
|
|
78
|
-
label:
|
|
79
|
-
description:
|
|
80
|
-
category:
|
|
78
|
+
label: 'Cancelled',
|
|
79
|
+
description: 'Market cancelled before settlement (terminal)',
|
|
80
|
+
category: 'terminal',
|
|
81
81
|
},
|
|
82
82
|
},
|
|
83
83
|
},
|
|
84
|
-
initialState:
|
|
84
|
+
initialState: 'PROPOSED',
|
|
85
85
|
transitions: [
|
|
86
86
|
{
|
|
87
|
-
from:
|
|
88
|
-
to:
|
|
89
|
-
eventName:
|
|
90
|
-
guard: {
|
|
87
|
+
from: 'PROPOSED',
|
|
88
|
+
to: 'OPEN',
|
|
89
|
+
eventName: 'open',
|
|
90
|
+
guard: { '==': [1, 1] },
|
|
91
91
|
effect: {
|
|
92
|
-
merge: [
|
|
93
|
-
{ var: "state" },
|
|
94
|
-
{ status: "OPEN", openedAt: { var: "$ordinal" } },
|
|
95
|
-
],
|
|
92
|
+
merge: [{ var: 'state' }, { status: 'OPEN', openedAt: { var: '$ordinal' } }],
|
|
96
93
|
},
|
|
97
94
|
dependencies: [],
|
|
98
95
|
},
|
|
99
96
|
{
|
|
100
|
-
from:
|
|
101
|
-
to:
|
|
102
|
-
eventName:
|
|
103
|
-
guard: {
|
|
97
|
+
from: 'PROPOSED',
|
|
98
|
+
to: 'CANCELLED',
|
|
99
|
+
eventName: 'cancel',
|
|
100
|
+
guard: { '==': [1, 1] },
|
|
104
101
|
effect: {
|
|
105
|
-
merge: [
|
|
106
|
-
{ var: "state" },
|
|
107
|
-
{ status: "CANCELLED", cancelledAt: { var: "$ordinal" } },
|
|
108
|
-
],
|
|
102
|
+
merge: [{ var: 'state' }, { status: 'CANCELLED', cancelledAt: { var: '$ordinal' } }],
|
|
109
103
|
},
|
|
110
104
|
dependencies: [],
|
|
111
105
|
},
|
|
112
106
|
{
|
|
113
|
-
from:
|
|
114
|
-
to:
|
|
115
|
-
eventName:
|
|
116
|
-
guard: {
|
|
107
|
+
from: 'OPEN',
|
|
108
|
+
to: 'OPEN',
|
|
109
|
+
eventName: 'commit',
|
|
110
|
+
guard: { '>': [{ var: 'event.amount' }, 0] },
|
|
117
111
|
effect: {
|
|
118
112
|
merge: [
|
|
119
|
-
{ var:
|
|
113
|
+
{ var: 'state' },
|
|
120
114
|
{
|
|
121
115
|
totalCommitted: {
|
|
122
|
-
|
|
116
|
+
'+': [{ var: 'state.totalCommitted' }, { var: 'event.amount' }],
|
|
123
117
|
},
|
|
124
118
|
},
|
|
125
119
|
],
|
|
@@ -127,41 +121,32 @@ exports.marketUniversalDef = (0, fiber_app_js_1.defineFiberApp)({
|
|
|
127
121
|
dependencies: [],
|
|
128
122
|
},
|
|
129
123
|
{
|
|
130
|
-
from:
|
|
131
|
-
to:
|
|
132
|
-
eventName:
|
|
133
|
-
guard: {
|
|
124
|
+
from: 'OPEN',
|
|
125
|
+
to: 'CLOSED',
|
|
126
|
+
eventName: 'close',
|
|
127
|
+
guard: { '==': [1, 1] },
|
|
134
128
|
effect: {
|
|
135
|
-
merge: [
|
|
136
|
-
{ var: "state" },
|
|
137
|
-
{ status: "CLOSED", closedAt: { var: "$ordinal" } },
|
|
138
|
-
],
|
|
129
|
+
merge: [{ var: 'state' }, { status: 'CLOSED', closedAt: { var: '$ordinal' } }],
|
|
139
130
|
},
|
|
140
131
|
dependencies: [],
|
|
141
132
|
},
|
|
142
133
|
{
|
|
143
|
-
from:
|
|
144
|
-
to:
|
|
145
|
-
eventName:
|
|
146
|
-
guard: {
|
|
134
|
+
from: 'CLOSED',
|
|
135
|
+
to: 'SETTLED',
|
|
136
|
+
eventName: 'settle',
|
|
137
|
+
guard: { '==': [1, 1] },
|
|
147
138
|
effect: {
|
|
148
|
-
merge: [
|
|
149
|
-
{ var: "state" },
|
|
150
|
-
{ status: "SETTLED", settledAt: { var: "$ordinal" } },
|
|
151
|
-
],
|
|
139
|
+
merge: [{ var: 'state' }, { status: 'SETTLED', settledAt: { var: '$ordinal' } }],
|
|
152
140
|
},
|
|
153
141
|
dependencies: [],
|
|
154
142
|
},
|
|
155
143
|
{
|
|
156
|
-
from:
|
|
157
|
-
to:
|
|
158
|
-
eventName:
|
|
159
|
-
guard: {
|
|
144
|
+
from: 'CLOSED',
|
|
145
|
+
to: 'CANCELLED',
|
|
146
|
+
eventName: 'cancel',
|
|
147
|
+
guard: { '==': [1, 1] },
|
|
160
148
|
effect: {
|
|
161
|
-
merge: [
|
|
162
|
-
{ var: "state" },
|
|
163
|
-
{ status: "CANCELLED", cancelledAt: { var: "$ordinal" } },
|
|
164
|
-
],
|
|
149
|
+
merge: [{ var: 'state' }, { status: 'CANCELLED', cancelledAt: { var: '$ordinal' } }],
|
|
165
150
|
},
|
|
166
151
|
dependencies: [],
|
|
167
152
|
},
|
|
@@ -26,7 +26,7 @@ Object.defineProperty(exports, "oracleStateToJSON", { enumerable: true, get: fun
|
|
|
26
26
|
const index_js_2 = require("../identity/index.js");
|
|
27
27
|
/** @deprecated Use `getIdentityDefinition('oracle')` from `@ottochain/sdk/apps/identity` */
|
|
28
28
|
function getOracleDefinition(_type) {
|
|
29
|
-
return (0, index_js_2.getIdentityDefinition)(
|
|
29
|
+
return (0, index_js_2.getIdentityDefinition)('oracle');
|
|
30
30
|
}
|
|
31
31
|
/** @deprecated Use `DEFAULT_REPUTATION_CONFIG` from `@ottochain/sdk/apps/identity` */
|
|
32
32
|
exports.DEFAULT_ORACLE_CONFIG = {
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Privacy Application — note-layer privacy primitives.
|
|
4
|
+
*
|
|
5
|
+
* Σ-protocol / ZK-backed fibers that carry real privacy on the OttoChain note
|
|
6
|
+
* layer. The flagship is `sigma-mixer`, a CDS OR-of-`dhtuple` ring mixer whose
|
|
7
|
+
* anonymity comes from a `sigma_verify` ring proof and whose double-spend safety
|
|
8
|
+
* comes from a witness-bound nullifier (`Nf = x_j·H`, `H` a NUMS base of unknown
|
|
9
|
+
* dlog w.r.t. `G`).
|
|
10
|
+
*
|
|
11
|
+
* The std-lib UTXO primitive is `shielded-note-pool` ({@link notePoolDef}): a
|
|
12
|
+
* fixed-denomination Tornado-style private asset pool over the `zk-shielded`
|
|
13
|
+
* Groth16 circuit. ⚠ UNAUDITED / TEST-ASSETS-ONLY (BN254 ~100-bit, single trusted
|
|
14
|
+
* relayer for root advancement) — see note-pool.ts.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* import { getPrivacyDefinition, PRIVACY_DEFINITIONS, sigmaDdhRingOf, notePoolDef } from '@ottochain/sdk/apps/privacy';
|
|
19
|
+
*
|
|
20
|
+
* const mixerDef = getPrivacyDefinition('sigma-mixer');
|
|
21
|
+
* // Build a custom n-member OR-of-dhtuple proposition for an audited H:
|
|
22
|
+
* const prop = sigmaDdhRingOf('state.points', 'event.nullifier', G_HEX, H_HEX, 8);
|
|
23
|
+
* // Instantiate a shielded note-pool (pin the circuit vkey + denomination + relayer):
|
|
24
|
+
* const pool = notePoolDef({ vkey, depth: 8, denom: 100, poolPolicyRef, feeAsset, relayer });
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* @packageDocumentation
|
|
28
|
+
*/
|
|
29
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
+
exports.PRIVACY_DEFINITIONS = exports.shieldedNotePoolDef = exports.pmtMembership = exports.pvField = exports.ZERO_WORD = exports.PV_LAYOUT = exports.NOTE_POOL_STATE = exports.notePoolDef = exports.sigmaDdhRingOf = exports.mixerDdhRingDef = void 0;
|
|
31
|
+
exports.getPrivacyDefinition = getPrivacyDefinition;
|
|
32
|
+
const index_js_1 = require("./state-machines/index.js");
|
|
33
|
+
Object.defineProperty(exports, "mixerDdhRingDef", { enumerable: true, get: function () { return index_js_1.mixerDdhRingDef; } });
|
|
34
|
+
Object.defineProperty(exports, "sigmaDdhRingOf", { enumerable: true, get: function () { return index_js_1.sigmaDdhRingOf; } });
|
|
35
|
+
Object.defineProperty(exports, "notePoolDef", { enumerable: true, get: function () { return index_js_1.notePoolDef; } });
|
|
36
|
+
Object.defineProperty(exports, "NOTE_POOL_STATE", { enumerable: true, get: function () { return index_js_1.NOTE_POOL_STATE; } });
|
|
37
|
+
Object.defineProperty(exports, "PV_LAYOUT", { enumerable: true, get: function () { return index_js_1.PV_LAYOUT; } });
|
|
38
|
+
Object.defineProperty(exports, "ZERO_WORD", { enumerable: true, get: function () { return index_js_1.ZERO_WORD; } });
|
|
39
|
+
Object.defineProperty(exports, "pvField", { enumerable: true, get: function () { return index_js_1.pvField; } });
|
|
40
|
+
Object.defineProperty(exports, "pmtMembership", { enumerable: true, get: function () { return index_js_1.pmtMembership; } });
|
|
41
|
+
/**
|
|
42
|
+
* A documented DEFAULT shielded-note-pool instance for the registry/lint surface, with PLACEHOLDER
|
|
43
|
+
* pin values (the real vkey comes from the SP1 `zk-shielded` toolchain; relayer/policy are
|
|
44
|
+
* deployment-specific). Downstream callers should build their own via {@link notePoolDef}; this
|
|
45
|
+
* instance exists so the privacy app group exposes a concrete `shielded-note-pool` definition.
|
|
46
|
+
* ⚠ UNAUDITED / TEST-ASSETS-ONLY.
|
|
47
|
+
*/
|
|
48
|
+
exports.shieldedNotePoolDef = (0, index_js_1.notePoolDef)({
|
|
49
|
+
vkey: index_js_1.ZERO_WORD,
|
|
50
|
+
depth: 8,
|
|
51
|
+
denom: 100,
|
|
52
|
+
poolPolicyRef: 'std.privacy.note-pool',
|
|
53
|
+
feeAsset: index_js_1.ZERO_WORD,
|
|
54
|
+
relayer: 'DAG0000000000000000000000000000000000000000',
|
|
55
|
+
});
|
|
56
|
+
/** All privacy (note-layer) state machine definitions. */
|
|
57
|
+
exports.PRIVACY_DEFINITIONS = {
|
|
58
|
+
'sigma-mixer': index_js_1.mixerDdhRingDef,
|
|
59
|
+
'shielded-note-pool': exports.shieldedNotePoolDef,
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Get a privacy state machine definition by type.
|
|
63
|
+
* @param type - 'sigma-mixer' (default) | 'shielded-note-pool'.
|
|
64
|
+
*/
|
|
65
|
+
function getPrivacyDefinition(type = 'sigma-mixer') {
|
|
66
|
+
return exports.PRIVACY_DEFINITIONS[type];
|
|
67
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Privacy (note-layer) state machine definitions.
|
|
4
|
+
* Re-exports from TypeScript definition files.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.pmtMembership = exports.pvField = exports.ZERO_WORD = exports.PV_LAYOUT = exports.NOTE_POOL_STATE = exports.notePoolDef = exports.sigmaDdhRingOf = exports.mixerDdhRingDef = void 0;
|
|
8
|
+
var mixer_ddhRing_js_1 = require("./mixer-ddhRing.js");
|
|
9
|
+
Object.defineProperty(exports, "mixerDdhRingDef", { enumerable: true, get: function () { return mixer_ddhRing_js_1.mixerDdhRingDef; } });
|
|
10
|
+
Object.defineProperty(exports, "sigmaDdhRingOf", { enumerable: true, get: function () { return mixer_ddhRing_js_1.sigmaDdhRingOf; } });
|
|
11
|
+
var note_pool_js_1 = require("./note-pool.js");
|
|
12
|
+
Object.defineProperty(exports, "notePoolDef", { enumerable: true, get: function () { return note_pool_js_1.notePoolDef; } });
|
|
13
|
+
Object.defineProperty(exports, "NOTE_POOL_STATE", { enumerable: true, get: function () { return note_pool_js_1.NOTE_POOL_STATE; } });
|
|
14
|
+
Object.defineProperty(exports, "PV_LAYOUT", { enumerable: true, get: function () { return note_pool_js_1.PV_LAYOUT; } });
|
|
15
|
+
Object.defineProperty(exports, "ZERO_WORD", { enumerable: true, get: function () { return note_pool_js_1.ZERO_WORD; } });
|
|
16
|
+
Object.defineProperty(exports, "pvField", { enumerable: true, get: function () { return note_pool_js_1.pvField; } });
|
|
17
|
+
Object.defineProperty(exports, "pmtMembership", { enumerable: true, get: function () { return note_pool_js_1.pmtMembership; } });
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mixerDdhRingDef = void 0;
|
|
4
|
+
exports.sigmaDdhRingOf = sigmaDdhRingOf;
|
|
5
|
+
const fiber_app_js_1 = require("../../../schema/fiber-app.js");
|
|
6
|
+
/**
|
|
7
|
+
* sigma-mixer — a CDS OR-of-`dhtuple` Σ-protocol ring mixer.
|
|
8
|
+
*
|
|
9
|
+
* Anonymity comes from a Cramer–Damgård–Schoenmakers OR-proof over the deposited
|
|
10
|
+
* ring, verified by the `sigma_verify` JLVM opcode; double-spend safety comes
|
|
11
|
+
* from a WITNESS-BOUND nullifier carried as the shared DDH point of an
|
|
12
|
+
* OR-of-`dhtuple` proposition.
|
|
13
|
+
*
|
|
14
|
+
* Each ring branch is a DDH tuple `dhtuple(G, H, P_i, Nf)`. A satisfied dhtuple
|
|
15
|
+
* proves knowledge of one `x` with `P_i = x·G` AND `Nf = x·H` (the verifier uses
|
|
16
|
+
* a SINGLE shared response `z` for both coordinate reconstructions
|
|
17
|
+
* `a1 = z·G − e·P_i`, `a2 = z·H − e·Nf`). The OR uses the SAME
|
|
18
|
+
* `v = event.nullifier` in every branch, so it hides which branch while forcing
|
|
19
|
+
* `event.nullifier = x_j·H` for the one real branch `j`. With `H` a NUMS base of
|
|
20
|
+
* unknown dlog w.r.t. `G`, the map `x ↦ x·H` is injective, so the nullifier is
|
|
21
|
+
* cryptographically bound to the proven secret — closing the
|
|
22
|
+
* witness-unbound-nullifier double-spend hole an OR-of-`dlog` ring leaves open.
|
|
23
|
+
*
|
|
24
|
+
* Verified against `@constellation-network/metagraph-sdk-jlvm@1.8.0-rc.5`: the
|
|
25
|
+
* `sigma_verify` dhtuple operands are exactly `["type","g","h","u","v"]` (each a
|
|
26
|
+
* 64-byte G1 hex), the OR child challenges XOR to the node challenge, and the
|
|
27
|
+
* strong-FS root challenge folds the bound message. Array append uses `merge`
|
|
28
|
+
* (`merge([arr,[item]])` flattens one level == append). All operators used
|
|
29
|
+
* (`sigma_verify`, `has`, `set`, `none`, `cat`, `substr`, `merge`) are in
|
|
30
|
+
* KNOWN_OPERATORS.
|
|
31
|
+
*
|
|
32
|
+
* SCOPE: this base definition is CRYPTO + LIFECYCLE. Production custody
|
|
33
|
+
* (`_transferAsset` in on deposit / out on withdraw), a signer-bound deposit-auth
|
|
34
|
+
* clause, and a `mixerId`-prefixed bound message are layered on by a downstream
|
|
35
|
+
* specialization (see the §8 production-hardening note in the design doc).
|
|
36
|
+
*/
|
|
37
|
+
// =============================================================================
|
|
38
|
+
// sigmaDdhRingOf — the OR-of-dhtuple proposition builder
|
|
39
|
+
// =============================================================================
|
|
40
|
+
/**
|
|
41
|
+
* Emit the `or`-of-`dhtuple` proposition for an `n`-member ring, unrolling
|
|
42
|
+
* `{"var":"<pointsVar>.k"}` for `k in 0..n-1` as the `u` (commitment) of each
|
|
43
|
+
* branch, with `g = gHex`, `h = hHex` (literal 64-byte G1 hex) and a shared
|
|
44
|
+
* `v = {"var":"<nullifierVar>"}` across ALL branches.
|
|
45
|
+
*
|
|
46
|
+
* `n` is FIXED at definition time (the proposition shape is closed). `u` and `v`
|
|
47
|
+
* are `{"var":...}` map-node values that the evaluator resolves element-wise.
|
|
48
|
+
*
|
|
49
|
+
* @param pointsVar state var holding the ordered ring points, e.g. `"state.points"`.
|
|
50
|
+
* @param nullifierVar event var holding the revealed nullifier, e.g. `"event.nullifier"`.
|
|
51
|
+
* @param gHex the verifier generator `G=(1,2)` as 64-byte `0x` hex.
|
|
52
|
+
* @param hHex the NUMS second base `H` as 64-byte `0x` hex (unknown dlog wrt G).
|
|
53
|
+
* @param n ring size (number of unrolled branches).
|
|
54
|
+
*/
|
|
55
|
+
function sigmaDdhRingOf(pointsVar, nullifierVar, gHex, hHex, n) {
|
|
56
|
+
const children = [];
|
|
57
|
+
for (let k = 0; k < n; k++) {
|
|
58
|
+
children.push({
|
|
59
|
+
type: 'dhtuple',
|
|
60
|
+
g: gHex,
|
|
61
|
+
h: hHex,
|
|
62
|
+
u: { var: `${pointsVar}.${k}` },
|
|
63
|
+
v: { var: nullifierVar },
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
return { type: 'or', children };
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* The shared withdraw verify clauses (ring proof ∧ freshness ∧ recipient-bind).
|
|
70
|
+
* The lifecycle clause (`→drained` vs `→open`) is appended per transition.
|
|
71
|
+
*/
|
|
72
|
+
function withdrawVerifyClauses(gHex, hHex, n) {
|
|
73
|
+
return [
|
|
74
|
+
{
|
|
75
|
+
sigma_verify: [
|
|
76
|
+
sigmaDdhRingOf('state.points', 'event.nullifier', gHex, hHex, n),
|
|
77
|
+
{ var: 'event.proof' },
|
|
78
|
+
{ var: 'event.message' },
|
|
79
|
+
],
|
|
80
|
+
},
|
|
81
|
+
// Double-withdraw prevention: the witness-bound nullifier must be unseen.
|
|
82
|
+
{ '!': { has: [{ var: 'state.spentNullifiers' }, { var: 'event.nullifier' }] } },
|
|
83
|
+
// Recipient binding (anti-front-run): message == Nf ‖ recipientHex.
|
|
84
|
+
{
|
|
85
|
+
'===': [
|
|
86
|
+
{ var: 'event.message' },
|
|
87
|
+
{
|
|
88
|
+
cat: ['0x', { substr: [{ var: 'event.nullifier' }, 2] }, { substr: [{ var: 'event.recipientHex' }, 2] }],
|
|
89
|
+
},
|
|
90
|
+
],
|
|
91
|
+
},
|
|
92
|
+
];
|
|
93
|
+
}
|
|
94
|
+
// The withdraw effect: record the nullifier, advance the counter (+ optional status).
|
|
95
|
+
function withdrawEffect(extra) {
|
|
96
|
+
return {
|
|
97
|
+
merge: [
|
|
98
|
+
{ var: 'state' },
|
|
99
|
+
{
|
|
100
|
+
spentNullifiers: {
|
|
101
|
+
set: [{ var: 'state.spentNullifiers' }, { var: 'event.nullifier' }, true],
|
|
102
|
+
},
|
|
103
|
+
withdrawCount: { '+': [{ var: 'state.withdrawCount' }, 1] },
|
|
104
|
+
...extra,
|
|
105
|
+
},
|
|
106
|
+
],
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
// G=(1,2) and the NUMS H are the e2e defaults (derived by scripts/gen-sigma-mixer-fixture.ts).
|
|
110
|
+
// Downstream apps pass their own audited H via the builder; these are the pinned-ring v1 demo values.
|
|
111
|
+
const G_HEX = '0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002';
|
|
112
|
+
const H_HEX = '0x039c846e3a79217fd140d094eec09fe4f398085d01dee70506edde1eb6a9d81608922722cc3a6c3a7ae4929e78e82dc5f25e91598a69f7f8b9b3adb95badb3d0';
|
|
113
|
+
const RING_N = 4;
|
|
114
|
+
/**
|
|
115
|
+
* sigma-mixer fiber definition (pinned-ring v1, n=4).
|
|
116
|
+
*
|
|
117
|
+
* Trust model: PUBLIC. Anyone may deposit a ring point or submit a withdrawal.
|
|
118
|
+
* Privacy = a CDS OR-proof hides which of the n branches is being spent;
|
|
119
|
+
* anonymity set = exactly n (the ring size is public). Double-spend safety =
|
|
120
|
+
* the witness-bound nullifier + spent-set. Replay/front-run safety = the
|
|
121
|
+
* message-bound recipient.
|
|
122
|
+
*/
|
|
123
|
+
exports.mixerDdhRingDef = (0, fiber_app_js_1.defineFiberApp)({
|
|
124
|
+
metadata: {
|
|
125
|
+
name: 'MixerDdhRing',
|
|
126
|
+
app: 'privacy',
|
|
127
|
+
type: 'sigma-mixer',
|
|
128
|
+
version: '1.0.0',
|
|
129
|
+
description: 'CDS OR-of-dhtuple Σ-protocol ring mixer. Anonymity via sigma_verify over an ' +
|
|
130
|
+
'OR of DDH tuples (G,H,P_i,nullifier); the revealed nullifier Nf=x_j·H is ' +
|
|
131
|
+
'witness-bound (H has unknown dlog wrt G), closing the ring-drain double-spend. ' +
|
|
132
|
+
'Frozen-ring lifecycle (filling→open→drained) + message-bound recipient.',
|
|
133
|
+
},
|
|
134
|
+
createSchema: {
|
|
135
|
+
required: ['mixerId', 'denomination', 'anonymityTarget'],
|
|
136
|
+
properties: {
|
|
137
|
+
mixerId: { type: 'string', immutable: true, description: 'Mixer instance id.' },
|
|
138
|
+
denomination: {
|
|
139
|
+
type: 'integer',
|
|
140
|
+
immutable: true,
|
|
141
|
+
description: 'Equal denomination per deposit/withdraw (production custody).',
|
|
142
|
+
},
|
|
143
|
+
nullifierBaseH: {
|
|
144
|
+
type: 'string',
|
|
145
|
+
immutable: true,
|
|
146
|
+
description: 'The NUMS second base H (64B G1 hex); informational — H is inlined in the proposition.',
|
|
147
|
+
},
|
|
148
|
+
anonymityTarget: {
|
|
149
|
+
type: 'integer',
|
|
150
|
+
immutable: true,
|
|
151
|
+
description: 'Ring size n; the ring opens once depositCount == anonymityTarget.',
|
|
152
|
+
},
|
|
153
|
+
points: {
|
|
154
|
+
type: 'array',
|
|
155
|
+
items: { type: 'string' },
|
|
156
|
+
default: [],
|
|
157
|
+
description: 'Ordered ring commitments P_i = x_i·G (64B G1 hex).',
|
|
158
|
+
},
|
|
159
|
+
spentNullifiers: {
|
|
160
|
+
type: 'object',
|
|
161
|
+
default: {},
|
|
162
|
+
description: 'FLAT map nullifierHex -> true. MUST be {} (never null): has/set throw on null.',
|
|
163
|
+
},
|
|
164
|
+
depositCount: { type: 'integer', default: 0 },
|
|
165
|
+
withdrawCount: { type: 'integer', default: 0 },
|
|
166
|
+
status: { type: 'string', default: 'filling', description: 'filling → open → drained.' },
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
stateSchema: {
|
|
170
|
+
properties: {
|
|
171
|
+
mixerId: { type: 'string', immutable: true },
|
|
172
|
+
denomination: { type: 'integer', immutable: true },
|
|
173
|
+
nullifierBaseH: { type: 'string', immutable: true },
|
|
174
|
+
anonymityTarget: { type: 'integer', immutable: true },
|
|
175
|
+
points: { type: 'array', items: { type: 'string' }, computed: true },
|
|
176
|
+
spentNullifiers: { type: 'object', computed: true },
|
|
177
|
+
depositCount: { type: 'integer', computed: true },
|
|
178
|
+
withdrawCount: { type: 'integer', computed: true },
|
|
179
|
+
status: { type: 'string', computed: true },
|
|
180
|
+
},
|
|
181
|
+
},
|
|
182
|
+
eventSchemas: {
|
|
183
|
+
deposit: { description: 'Register a ring commitment point P_i = x_i·G.' },
|
|
184
|
+
withdraw: {
|
|
185
|
+
description: 'Spend one ring slot: a CDS OR-of-dhtuple proof + witness-bound nullifier + bound recipient.',
|
|
186
|
+
},
|
|
187
|
+
},
|
|
188
|
+
states: {
|
|
189
|
+
filling: {
|
|
190
|
+
id: 'filling',
|
|
191
|
+
isFinal: false,
|
|
192
|
+
metadata: { label: 'Filling', description: 'Ring accepting deposits.', category: 'active' },
|
|
193
|
+
},
|
|
194
|
+
open: {
|
|
195
|
+
id: 'open',
|
|
196
|
+
isFinal: false,
|
|
197
|
+
metadata: { label: 'Open', description: 'Ring frozen; withdrawals allowed.', category: 'active' },
|
|
198
|
+
},
|
|
199
|
+
drained: {
|
|
200
|
+
id: 'drained',
|
|
201
|
+
isFinal: true,
|
|
202
|
+
metadata: { label: 'Drained', description: 'All slots withdrawn; one-shot.', category: 'terminal' },
|
|
203
|
+
},
|
|
204
|
+
},
|
|
205
|
+
initialState: 'filling',
|
|
206
|
+
// ORDER IS LOAD-BEARING: the open-flip deposit is declared FIRST (exact
|
|
207
|
+
// boundary), the drained-flip withdraw is declared FIRST (exact boundary).
|
|
208
|
+
transitions: [
|
|
209
|
+
// Deposit A — the LAST deposit: filling → open. Declared FIRST.
|
|
210
|
+
{
|
|
211
|
+
from: 'filling',
|
|
212
|
+
to: 'open',
|
|
213
|
+
eventName: 'deposit',
|
|
214
|
+
guard: {
|
|
215
|
+
and: [
|
|
216
|
+
{ '===': [{ '+': [{ var: 'state.depositCount' }, 1] }, { var: 'state.anonymityTarget' }] },
|
|
217
|
+
{ '!!': [{ var: 'event.point' }] },
|
|
218
|
+
{ none: [{ var: 'state.points' }, { '===': [{ var: '' }, { var: 'event.point' }] }] },
|
|
219
|
+
],
|
|
220
|
+
},
|
|
221
|
+
effect: {
|
|
222
|
+
merge: [
|
|
223
|
+
{ var: 'state' },
|
|
224
|
+
{
|
|
225
|
+
// Array append = merge([arr,[item]]) (verified: opMerge flattens one level).
|
|
226
|
+
points: { merge: [{ var: 'state.points' }, [{ var: 'event.point' }]] },
|
|
227
|
+
depositCount: { '+': [{ var: 'state.depositCount' }, 1] },
|
|
228
|
+
status: 'open',
|
|
229
|
+
},
|
|
230
|
+
],
|
|
231
|
+
},
|
|
232
|
+
dependencies: [],
|
|
233
|
+
},
|
|
234
|
+
// Deposit B — not-yet-last: filling → filling. Declared SECOND.
|
|
235
|
+
{
|
|
236
|
+
from: 'filling',
|
|
237
|
+
to: 'filling',
|
|
238
|
+
eventName: 'deposit',
|
|
239
|
+
guard: {
|
|
240
|
+
and: [
|
|
241
|
+
{ '<': [{ '+': [{ var: 'state.depositCount' }, 1] }, { var: 'state.anonymityTarget' }] },
|
|
242
|
+
{ '!!': [{ var: 'event.point' }] },
|
|
243
|
+
{ none: [{ var: 'state.points' }, { '===': [{ var: '' }, { var: 'event.point' }] }] },
|
|
244
|
+
],
|
|
245
|
+
},
|
|
246
|
+
effect: {
|
|
247
|
+
merge: [
|
|
248
|
+
{ var: 'state' },
|
|
249
|
+
{
|
|
250
|
+
points: { merge: [{ var: 'state.points' }, [{ var: 'event.point' }]] },
|
|
251
|
+
depositCount: { '+': [{ var: 'state.depositCount' }, 1] },
|
|
252
|
+
},
|
|
253
|
+
],
|
|
254
|
+
},
|
|
255
|
+
dependencies: [],
|
|
256
|
+
},
|
|
257
|
+
// Withdraw → drained (the LAST withdrawal). Declared FIRST.
|
|
258
|
+
{
|
|
259
|
+
from: 'open',
|
|
260
|
+
to: 'drained',
|
|
261
|
+
eventName: 'withdraw',
|
|
262
|
+
guard: {
|
|
263
|
+
and: [
|
|
264
|
+
...withdrawVerifyClauses(G_HEX, H_HEX, RING_N),
|
|
265
|
+
{ '===': [{ '+': [{ var: 'state.withdrawCount' }, 1] }, { var: 'state.anonymityTarget' }] },
|
|
266
|
+
],
|
|
267
|
+
},
|
|
268
|
+
effect: withdrawEffect({ status: 'drained' }),
|
|
269
|
+
dependencies: [],
|
|
270
|
+
},
|
|
271
|
+
// Withdraw → open (not-yet-last). Declared SECOND.
|
|
272
|
+
{
|
|
273
|
+
from: 'open',
|
|
274
|
+
to: 'open',
|
|
275
|
+
eventName: 'withdraw',
|
|
276
|
+
guard: {
|
|
277
|
+
and: [
|
|
278
|
+
...withdrawVerifyClauses(G_HEX, H_HEX, RING_N),
|
|
279
|
+
{ '<': [{ '+': [{ var: 'state.withdrawCount' }, 1] }, { var: 'state.anonymityTarget' }] },
|
|
280
|
+
],
|
|
281
|
+
},
|
|
282
|
+
effect: withdrawEffect({}),
|
|
283
|
+
dependencies: [],
|
|
284
|
+
},
|
|
285
|
+
],
|
|
286
|
+
});
|