@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
|
@@ -8,180 +8,175 @@ const guards_js_1 = require("../../../schema/guards.js");
|
|
|
8
8
|
*/
|
|
9
9
|
exports.govSimpleDef = (0, fiber_app_js_1.defineFiberApp)({
|
|
10
10
|
metadata: {
|
|
11
|
-
name:
|
|
12
|
-
app:
|
|
13
|
-
type:
|
|
14
|
-
version:
|
|
15
|
-
description:
|
|
11
|
+
name: 'Governance',
|
|
12
|
+
app: 'governance',
|
|
13
|
+
type: 'simple',
|
|
14
|
+
version: '1.0.0',
|
|
15
|
+
description: 'Simple org governance: manage members, update rules, resolve disputes',
|
|
16
16
|
},
|
|
17
17
|
createSchema: {
|
|
18
|
-
required: [
|
|
19
|
-
"admins",
|
|
20
|
-
"passingThreshold",
|
|
21
|
-
"disputeQuorum",
|
|
22
|
-
"votingPeriodMs",
|
|
23
|
-
],
|
|
18
|
+
required: ['admins', 'passingThreshold', 'disputeQuorum', 'votingPeriodMs'],
|
|
24
19
|
properties: {
|
|
25
20
|
admins: {
|
|
26
|
-
type:
|
|
27
|
-
description:
|
|
21
|
+
type: 'array',
|
|
22
|
+
description: 'Initial admin addresses',
|
|
28
23
|
immutable: false,
|
|
29
24
|
},
|
|
30
25
|
passingThreshold: {
|
|
31
|
-
type:
|
|
32
|
-
description:
|
|
26
|
+
type: 'number',
|
|
27
|
+
description: 'Fraction of members required to pass (0-1)',
|
|
33
28
|
},
|
|
34
29
|
disputeQuorum: {
|
|
35
|
-
type:
|
|
36
|
-
description:
|
|
30
|
+
type: 'number',
|
|
31
|
+
description: 'Min votes to resolve a dispute',
|
|
37
32
|
},
|
|
38
33
|
votingPeriodMs: {
|
|
39
|
-
type:
|
|
40
|
-
description:
|
|
34
|
+
type: 'number',
|
|
35
|
+
description: 'Voting window in milliseconds',
|
|
41
36
|
},
|
|
42
37
|
},
|
|
43
38
|
},
|
|
44
39
|
stateSchema: {
|
|
45
40
|
properties: {
|
|
46
|
-
admins: { type:
|
|
47
|
-
members: { type:
|
|
48
|
-
rules: { type:
|
|
49
|
-
history: { type:
|
|
50
|
-
proposal: { type:
|
|
51
|
-
votes: { type:
|
|
52
|
-
dispute: { type:
|
|
53
|
-
passingThreshold: { type:
|
|
54
|
-
disputeQuorum: { type:
|
|
55
|
-
votingPeriodMs: { type:
|
|
41
|
+
admins: { type: 'array', immutable: false },
|
|
42
|
+
members: { type: 'object', computed: true },
|
|
43
|
+
rules: { type: 'object', computed: true },
|
|
44
|
+
history: { type: 'array', computed: true },
|
|
45
|
+
proposal: { type: 'object' },
|
|
46
|
+
votes: { type: 'object', computed: true },
|
|
47
|
+
dispute: { type: 'object' },
|
|
48
|
+
passingThreshold: { type: 'number' },
|
|
49
|
+
disputeQuorum: { type: 'number' },
|
|
50
|
+
votingPeriodMs: { type: 'number' },
|
|
56
51
|
},
|
|
57
52
|
},
|
|
58
53
|
eventSchemas: {
|
|
59
54
|
add_member: {
|
|
60
|
-
description:
|
|
61
|
-
required: [
|
|
55
|
+
description: 'Add a member (admin only)',
|
|
56
|
+
required: ['member', 'role'],
|
|
62
57
|
properties: {
|
|
63
|
-
agent: { type:
|
|
64
|
-
member: { type:
|
|
65
|
-
role: { type:
|
|
58
|
+
agent: { type: 'address' },
|
|
59
|
+
member: { type: 'address' },
|
|
60
|
+
role: { type: 'string' },
|
|
66
61
|
},
|
|
67
62
|
},
|
|
68
63
|
remove_member: {
|
|
69
|
-
description:
|
|
70
|
-
required: [
|
|
64
|
+
description: 'Remove a member (admin only)',
|
|
65
|
+
required: ['member'],
|
|
71
66
|
properties: {
|
|
72
|
-
agent: { type:
|
|
73
|
-
member: { type:
|
|
67
|
+
agent: { type: 'address' },
|
|
68
|
+
member: { type: 'address' },
|
|
74
69
|
},
|
|
75
70
|
},
|
|
76
71
|
propose: {
|
|
77
|
-
description:
|
|
78
|
-
required: [
|
|
72
|
+
description: 'Submit a rule change proposal',
|
|
73
|
+
required: ['proposalId', 'type', 'changes'],
|
|
79
74
|
properties: {
|
|
80
|
-
agent: { type:
|
|
81
|
-
proposalId: { type:
|
|
82
|
-
type: { type:
|
|
83
|
-
changes: { type:
|
|
75
|
+
agent: { type: 'address' },
|
|
76
|
+
proposalId: { type: 'string' },
|
|
77
|
+
type: { type: 'string' },
|
|
78
|
+
changes: { type: 'object' },
|
|
84
79
|
},
|
|
85
80
|
},
|
|
86
81
|
vote: {
|
|
87
|
-
description:
|
|
88
|
-
required: [
|
|
82
|
+
description: 'Cast a vote on the active proposal or dispute',
|
|
83
|
+
required: ['vote'],
|
|
89
84
|
properties: {
|
|
90
|
-
agent: { type:
|
|
91
|
-
vote: { type:
|
|
92
|
-
ruling: { type:
|
|
85
|
+
agent: { type: 'address' },
|
|
86
|
+
vote: { type: 'string' },
|
|
87
|
+
ruling: { type: 'string' },
|
|
93
88
|
},
|
|
94
89
|
},
|
|
95
90
|
finalize: {
|
|
96
|
-
description:
|
|
91
|
+
description: 'Finalize the voting period (for-count derived from recorded ballots)',
|
|
97
92
|
properties: {},
|
|
98
93
|
},
|
|
99
94
|
file_dispute: {
|
|
100
|
-
description:
|
|
101
|
-
required: [
|
|
95
|
+
description: 'File a dispute against a member',
|
|
96
|
+
required: ['disputeId', 'defendant', 'claim'],
|
|
102
97
|
properties: {
|
|
103
|
-
agent: { type:
|
|
104
|
-
disputeId: { type:
|
|
105
|
-
defendant: { type:
|
|
106
|
-
claim: { type:
|
|
98
|
+
agent: { type: 'address' },
|
|
99
|
+
disputeId: { type: 'string' },
|
|
100
|
+
defendant: { type: 'address' },
|
|
101
|
+
claim: { type: 'string' },
|
|
107
102
|
},
|
|
108
103
|
},
|
|
109
104
|
submit_evidence: {
|
|
110
|
-
description:
|
|
111
|
-
required: [
|
|
105
|
+
description: 'Submit evidence in a dispute',
|
|
106
|
+
required: ['content'],
|
|
112
107
|
properties: {
|
|
113
|
-
agent: { type:
|
|
114
|
-
content: { type:
|
|
108
|
+
agent: { type: 'address' },
|
|
109
|
+
content: { type: 'string' },
|
|
115
110
|
},
|
|
116
111
|
},
|
|
117
112
|
resolve: {
|
|
118
|
-
description:
|
|
119
|
-
required: [
|
|
113
|
+
description: 'Resolve the active dispute',
|
|
114
|
+
required: ['ruling', 'remedy'],
|
|
120
115
|
properties: {
|
|
121
|
-
ruling: { type:
|
|
122
|
-
remedy: { type:
|
|
116
|
+
ruling: { type: 'string' },
|
|
117
|
+
remedy: { type: 'string' },
|
|
123
118
|
},
|
|
124
119
|
},
|
|
125
120
|
dissolve: {
|
|
126
|
-
description:
|
|
121
|
+
description: 'Dissolve the organization (requires every member to sign this op — verified unanimity)',
|
|
127
122
|
properties: {},
|
|
128
123
|
},
|
|
129
124
|
},
|
|
130
125
|
states: {
|
|
131
126
|
ACTIVE: {
|
|
132
|
-
id:
|
|
127
|
+
id: 'ACTIVE',
|
|
133
128
|
isFinal: false,
|
|
134
129
|
metadata: {
|
|
135
|
-
label:
|
|
136
|
-
description:
|
|
137
|
-
category:
|
|
130
|
+
label: 'Active',
|
|
131
|
+
description: 'Governance is idle and ready to accept a proposal',
|
|
132
|
+
category: 'initial',
|
|
138
133
|
},
|
|
139
134
|
},
|
|
140
135
|
VOTING: {
|
|
141
|
-
id:
|
|
136
|
+
id: 'VOTING',
|
|
142
137
|
isFinal: false,
|
|
143
138
|
metadata: {
|
|
144
|
-
label:
|
|
145
|
-
description:
|
|
146
|
-
category:
|
|
139
|
+
label: 'Voting',
|
|
140
|
+
description: 'A proposal is open for voting',
|
|
141
|
+
category: 'pending',
|
|
147
142
|
},
|
|
148
143
|
},
|
|
149
144
|
DISPUTE: {
|
|
150
|
-
id:
|
|
145
|
+
id: 'DISPUTE',
|
|
151
146
|
isFinal: false,
|
|
152
147
|
metadata: {
|
|
153
|
-
label:
|
|
154
|
-
description:
|
|
155
|
-
category:
|
|
148
|
+
label: 'Dispute',
|
|
149
|
+
description: 'A proposal outcome is being disputed',
|
|
150
|
+
category: 'pending',
|
|
156
151
|
},
|
|
157
152
|
},
|
|
158
153
|
DISSOLVED: {
|
|
159
|
-
id:
|
|
154
|
+
id: 'DISSOLVED',
|
|
160
155
|
isFinal: true,
|
|
161
156
|
metadata: {
|
|
162
|
-
label:
|
|
163
|
-
description:
|
|
164
|
-
category:
|
|
157
|
+
label: 'Dissolved',
|
|
158
|
+
description: 'Governance entity dissolved (terminal)',
|
|
159
|
+
category: 'terminal',
|
|
165
160
|
},
|
|
166
161
|
},
|
|
167
162
|
},
|
|
168
|
-
initialState:
|
|
163
|
+
initialState: 'ACTIVE',
|
|
169
164
|
transitions: [
|
|
170
165
|
// ACTIVE → ACTIVE: add member (admin only)
|
|
171
166
|
{
|
|
172
|
-
from:
|
|
173
|
-
to:
|
|
174
|
-
eventName:
|
|
175
|
-
guard: (0, guards_js_1.signerInSet)(
|
|
167
|
+
from: 'ACTIVE',
|
|
168
|
+
to: 'ACTIVE',
|
|
169
|
+
eventName: 'add_member',
|
|
170
|
+
guard: (0, guards_js_1.signerInSet)('state.admins'),
|
|
176
171
|
effect: {
|
|
177
172
|
merge: [
|
|
178
|
-
{ var:
|
|
173
|
+
{ var: 'state' },
|
|
179
174
|
{
|
|
180
175
|
members: {
|
|
181
176
|
set: [
|
|
182
|
-
{ var:
|
|
183
|
-
{ var:
|
|
184
|
-
{ role: { var:
|
|
177
|
+
{ var: 'state.members' },
|
|
178
|
+
{ var: 'event.member' },
|
|
179
|
+
{ role: { var: 'event.role' }, addedAt: { var: '$ordinal' } },
|
|
185
180
|
],
|
|
186
181
|
},
|
|
187
182
|
},
|
|
@@ -191,16 +186,16 @@ exports.govSimpleDef = (0, fiber_app_js_1.defineFiberApp)({
|
|
|
191
186
|
},
|
|
192
187
|
// ACTIVE → ACTIVE: remove member (admin only)
|
|
193
188
|
{
|
|
194
|
-
from:
|
|
195
|
-
to:
|
|
196
|
-
eventName:
|
|
197
|
-
guard: (0, guards_js_1.signerInSet)(
|
|
189
|
+
from: 'ACTIVE',
|
|
190
|
+
to: 'ACTIVE',
|
|
191
|
+
eventName: 'remove_member',
|
|
192
|
+
guard: (0, guards_js_1.signerInSet)('state.admins'),
|
|
198
193
|
effect: {
|
|
199
194
|
merge: [
|
|
200
|
-
{ var:
|
|
195
|
+
{ var: 'state' },
|
|
201
196
|
{
|
|
202
197
|
members: {
|
|
203
|
-
unset: [{ var:
|
|
198
|
+
unset: [{ var: 'state.members' }, { var: 'event.member' }],
|
|
204
199
|
},
|
|
205
200
|
},
|
|
206
201
|
],
|
|
@@ -209,24 +204,24 @@ exports.govSimpleDef = (0, fiber_app_js_1.defineFiberApp)({
|
|
|
209
204
|
},
|
|
210
205
|
// ACTIVE → VOTING: propose
|
|
211
206
|
{
|
|
212
|
-
from:
|
|
213
|
-
to:
|
|
214
|
-
eventName:
|
|
207
|
+
from: 'ACTIVE',
|
|
208
|
+
to: 'VOTING',
|
|
209
|
+
eventName: 'propose',
|
|
215
210
|
// S1/A2 coupled fix: a CHAIN-VERIFIED signer must be a member (getKey is not a
|
|
216
211
|
// JLVM opcode; signerHasEntry checks signer ∈ keys(state.members) via `has`).
|
|
217
|
-
guard: (0, guards_js_1.signerHasEntry)(
|
|
212
|
+
guard: (0, guards_js_1.signerHasEntry)('state.members'),
|
|
218
213
|
effect: {
|
|
219
214
|
merge: [
|
|
220
|
-
{ var:
|
|
215
|
+
{ var: 'state' },
|
|
221
216
|
{
|
|
222
217
|
proposal: {
|
|
223
|
-
id: { var:
|
|
224
|
-
type: { var:
|
|
225
|
-
changes: { var:
|
|
226
|
-
proposer: { var:
|
|
227
|
-
proposedAt: { var:
|
|
218
|
+
id: { var: 'event.proposalId' },
|
|
219
|
+
type: { var: 'event.type' },
|
|
220
|
+
changes: { var: 'event.changes' },
|
|
221
|
+
proposer: { var: 'event.agent' },
|
|
222
|
+
proposedAt: { var: '$ordinal' },
|
|
228
223
|
deadline: {
|
|
229
|
-
|
|
224
|
+
'+': [{ var: '$ordinal' }, { var: 'state.votingPeriodMs' }],
|
|
230
225
|
},
|
|
231
226
|
},
|
|
232
227
|
votes: {},
|
|
@@ -237,28 +232,25 @@ exports.govSimpleDef = (0, fiber_app_js_1.defineFiberApp)({
|
|
|
237
232
|
},
|
|
238
233
|
// VOTING → VOTING: vote (member, no double-voting)
|
|
239
234
|
{
|
|
240
|
-
from:
|
|
241
|
-
to:
|
|
242
|
-
eventName:
|
|
235
|
+
from: 'VOTING',
|
|
236
|
+
to: 'VOTING',
|
|
237
|
+
eventName: 'vote',
|
|
243
238
|
// S1/A2 coupled fix: bind event.agent to a verified signer who is a member (actorHasEntry),
|
|
244
239
|
// and block a re-vote by that SAME bound actor — so the ballot is recorded under, and deduped
|
|
245
240
|
// on, the chain-verified voter. Without the binding, signerHasEntry only proves SOME signer is a
|
|
246
241
|
// member, letting one member stuff votes under arbitrary keys (set is the rc.5 map-write opcode).
|
|
247
242
|
guard: {
|
|
248
|
-
and: [
|
|
249
|
-
(0, guards_js_1.actorHasEntry)("state.members"),
|
|
250
|
-
{ "!": [{ has: [{ var: "state.votes" }, { var: "event.agent" }] }] },
|
|
251
|
-
],
|
|
243
|
+
and: [(0, guards_js_1.actorHasEntry)('state.members'), { '!': [{ has: [{ var: 'state.votes' }, { var: 'event.agent' }] }] }],
|
|
252
244
|
},
|
|
253
245
|
effect: {
|
|
254
246
|
merge: [
|
|
255
|
-
{ var:
|
|
247
|
+
{ var: 'state' },
|
|
256
248
|
{
|
|
257
249
|
votes: {
|
|
258
250
|
set: [
|
|
259
|
-
{ var:
|
|
260
|
-
{ var:
|
|
261
|
-
{ vote: { var:
|
|
251
|
+
{ var: 'state.votes' },
|
|
252
|
+
{ var: 'event.agent' },
|
|
253
|
+
{ vote: { var: 'event.vote' }, votedAt: { var: '$ordinal' } },
|
|
262
254
|
],
|
|
263
255
|
},
|
|
264
256
|
},
|
|
@@ -268,51 +260,42 @@ exports.govSimpleDef = (0, fiber_app_js_1.defineFiberApp)({
|
|
|
268
260
|
},
|
|
269
261
|
// VOTING → ACTIVE: finalize (passed)
|
|
270
262
|
{
|
|
271
|
-
from:
|
|
272
|
-
to:
|
|
273
|
-
eventName:
|
|
263
|
+
from: 'VOTING',
|
|
264
|
+
to: 'ACTIVE',
|
|
265
|
+
eventName: 'finalize',
|
|
274
266
|
// S2/A2 coupled fix: the for-count is DERIVED from recorded ballots in
|
|
275
267
|
// state.votes (length of the "for" entries), never read from the attacker's
|
|
276
268
|
// event.forCount. members is a Map so its count is length(keys(members)).
|
|
277
269
|
guard: {
|
|
278
|
-
|
|
270
|
+
'>=': [
|
|
279
271
|
{
|
|
280
272
|
length: [
|
|
281
273
|
{
|
|
282
|
-
filter: [
|
|
283
|
-
{ values: [{ var: "state.votes" }] },
|
|
284
|
-
{ "===": [{ var: "vote" }, "for"] },
|
|
285
|
-
],
|
|
274
|
+
filter: [{ values: [{ var: 'state.votes' }] }, { '===': [{ var: 'vote' }, 'for'] }],
|
|
286
275
|
},
|
|
287
276
|
],
|
|
288
277
|
},
|
|
289
278
|
{
|
|
290
|
-
|
|
291
|
-
{ length: [{ keys: [{ var: "state.members" }] }] },
|
|
292
|
-
{ var: "state.passingThreshold" },
|
|
293
|
-
],
|
|
279
|
+
'*': [{ length: [{ keys: [{ var: 'state.members' }] }] }, { var: 'state.passingThreshold' }],
|
|
294
280
|
},
|
|
295
281
|
],
|
|
296
282
|
},
|
|
297
283
|
effect: {
|
|
298
284
|
merge: [
|
|
299
|
-
{ var:
|
|
285
|
+
{ var: 'state' },
|
|
300
286
|
{
|
|
301
287
|
rules: {
|
|
302
|
-
merge: [
|
|
303
|
-
{ var: "state.rules" },
|
|
304
|
-
{ var: "state.proposal.changes" },
|
|
305
|
-
],
|
|
288
|
+
merge: [{ var: 'state.rules' }, { var: 'state.proposal.changes' }],
|
|
306
289
|
},
|
|
307
290
|
history: {
|
|
308
291
|
cat: [
|
|
309
|
-
{ var:
|
|
292
|
+
{ var: 'state.history' },
|
|
310
293
|
[
|
|
311
294
|
{
|
|
312
|
-
type:
|
|
313
|
-
proposal: { var:
|
|
314
|
-
outcome:
|
|
315
|
-
finalizedAt: { var:
|
|
295
|
+
type: 'rule_change',
|
|
296
|
+
proposal: { var: 'state.proposal' },
|
|
297
|
+
outcome: 'passed',
|
|
298
|
+
finalizedAt: { var: '$ordinal' },
|
|
316
299
|
},
|
|
317
300
|
],
|
|
318
301
|
],
|
|
@@ -326,44 +309,38 @@ exports.govSimpleDef = (0, fiber_app_js_1.defineFiberApp)({
|
|
|
326
309
|
},
|
|
327
310
|
// VOTING → ACTIVE: finalize (failed)
|
|
328
311
|
{
|
|
329
|
-
from:
|
|
330
|
-
to:
|
|
331
|
-
eventName:
|
|
312
|
+
from: 'VOTING',
|
|
313
|
+
to: 'ACTIVE',
|
|
314
|
+
eventName: 'finalize',
|
|
332
315
|
// S2/A2 coupled fix (failed arm): derive the for-count from recorded ballots in
|
|
333
316
|
// state.votes; never from event.forCount. members count = length(keys(members)).
|
|
334
317
|
guard: {
|
|
335
|
-
|
|
318
|
+
'<': [
|
|
336
319
|
{
|
|
337
320
|
length: [
|
|
338
321
|
{
|
|
339
|
-
filter: [
|
|
340
|
-
{ values: [{ var: "state.votes" }] },
|
|
341
|
-
{ "===": [{ var: "vote" }, "for"] },
|
|
342
|
-
],
|
|
322
|
+
filter: [{ values: [{ var: 'state.votes' }] }, { '===': [{ var: 'vote' }, 'for'] }],
|
|
343
323
|
},
|
|
344
324
|
],
|
|
345
325
|
},
|
|
346
326
|
{
|
|
347
|
-
|
|
348
|
-
{ length: [{ keys: [{ var: "state.members" }] }] },
|
|
349
|
-
{ var: "state.passingThreshold" },
|
|
350
|
-
],
|
|
327
|
+
'*': [{ length: [{ keys: [{ var: 'state.members' }] }] }, { var: 'state.passingThreshold' }],
|
|
351
328
|
},
|
|
352
329
|
],
|
|
353
330
|
},
|
|
354
331
|
effect: {
|
|
355
332
|
merge: [
|
|
356
|
-
{ var:
|
|
333
|
+
{ var: 'state' },
|
|
357
334
|
{
|
|
358
335
|
history: {
|
|
359
336
|
cat: [
|
|
360
|
-
{ var:
|
|
337
|
+
{ var: 'state.history' },
|
|
361
338
|
[
|
|
362
339
|
{
|
|
363
|
-
type:
|
|
364
|
-
proposal: { var:
|
|
365
|
-
outcome:
|
|
366
|
-
finalizedAt: { var:
|
|
340
|
+
type: 'rule_change',
|
|
341
|
+
proposal: { var: 'state.proposal' },
|
|
342
|
+
outcome: 'failed',
|
|
343
|
+
finalizedAt: { var: '$ordinal' },
|
|
367
344
|
},
|
|
368
345
|
],
|
|
369
346
|
],
|
|
@@ -377,22 +354,22 @@ exports.govSimpleDef = (0, fiber_app_js_1.defineFiberApp)({
|
|
|
377
354
|
},
|
|
378
355
|
// ACTIVE → DISPUTE: file_dispute
|
|
379
356
|
{
|
|
380
|
-
from:
|
|
381
|
-
to:
|
|
382
|
-
eventName:
|
|
357
|
+
from: 'ACTIVE',
|
|
358
|
+
to: 'DISPUTE',
|
|
359
|
+
eventName: 'file_dispute',
|
|
383
360
|
// S1/A2 coupled fix: only a CHAIN-VERIFIED member may file (getKey is not a JLVM
|
|
384
361
|
// opcode; signerHasEntry checks signer ∈ keys(state.members) via `has`).
|
|
385
|
-
guard: (0, guards_js_1.signerHasEntry)(
|
|
362
|
+
guard: (0, guards_js_1.signerHasEntry)('state.members'),
|
|
386
363
|
effect: {
|
|
387
364
|
merge: [
|
|
388
|
-
{ var:
|
|
365
|
+
{ var: 'state' },
|
|
389
366
|
{
|
|
390
367
|
dispute: {
|
|
391
|
-
id: { var:
|
|
392
|
-
plaintiff: { var:
|
|
393
|
-
defendant: { var:
|
|
394
|
-
claim: { var:
|
|
395
|
-
filedAt: { var:
|
|
368
|
+
id: { var: 'event.disputeId' },
|
|
369
|
+
plaintiff: { var: 'event.agent' },
|
|
370
|
+
defendant: { var: 'event.defendant' },
|
|
371
|
+
claim: { var: 'event.claim' },
|
|
372
|
+
filedAt: { var: '$ordinal' },
|
|
396
373
|
evidence: [],
|
|
397
374
|
},
|
|
398
375
|
votes: {},
|
|
@@ -403,29 +380,26 @@ exports.govSimpleDef = (0, fiber_app_js_1.defineFiberApp)({
|
|
|
403
380
|
},
|
|
404
381
|
// DISPUTE → DISPUTE: submit_evidence (plaintiff or defendant)
|
|
405
382
|
{
|
|
406
|
-
from:
|
|
407
|
-
to:
|
|
408
|
-
eventName:
|
|
409
|
-
guard: (0, guards_js_1.signerIsAnyParty)([
|
|
410
|
-
"state.dispute.plaintiff",
|
|
411
|
-
"state.dispute.defendant",
|
|
412
|
-
]),
|
|
383
|
+
from: 'DISPUTE',
|
|
384
|
+
to: 'DISPUTE',
|
|
385
|
+
eventName: 'submit_evidence',
|
|
386
|
+
guard: (0, guards_js_1.signerIsAnyParty)(['state.dispute.plaintiff', 'state.dispute.defendant']),
|
|
413
387
|
effect: {
|
|
414
388
|
merge: [
|
|
415
|
-
{ var:
|
|
389
|
+
{ var: 'state' },
|
|
416
390
|
{
|
|
417
391
|
dispute: {
|
|
418
392
|
merge: [
|
|
419
|
-
{ var:
|
|
393
|
+
{ var: 'state.dispute' },
|
|
420
394
|
{
|
|
421
395
|
evidence: {
|
|
422
396
|
cat: [
|
|
423
|
-
{ var:
|
|
397
|
+
{ var: 'state.dispute.evidence' },
|
|
424
398
|
[
|
|
425
399
|
{
|
|
426
|
-
from: { var:
|
|
427
|
-
content: { var:
|
|
428
|
-
at: { var:
|
|
400
|
+
from: { var: 'event.agent' },
|
|
401
|
+
content: { var: 'event.content' },
|
|
402
|
+
at: { var: '$ordinal' },
|
|
429
403
|
},
|
|
430
404
|
],
|
|
431
405
|
],
|
|
@@ -440,32 +414,32 @@ exports.govSimpleDef = (0, fiber_app_js_1.defineFiberApp)({
|
|
|
440
414
|
},
|
|
441
415
|
// DISPUTE → DISPUTE: vote (member, not party, no double-vote)
|
|
442
416
|
{
|
|
443
|
-
from:
|
|
444
|
-
to:
|
|
445
|
-
eventName:
|
|
417
|
+
from: 'DISPUTE',
|
|
418
|
+
to: 'DISPUTE',
|
|
419
|
+
eventName: 'vote',
|
|
446
420
|
// S1/A2 coupled fix: bind event.agent to a verified member (actorHasEntry), exclude the parties,
|
|
447
421
|
// and block a re-vote by that SAME bound actor — so the dispute ballot is recorded under, and
|
|
448
422
|
// deduped on, the chain-verified voter (set is the rc.5 map-write opcode; signerIsNotParty still
|
|
449
423
|
// excludes any signer who is a party, which covers the bound actor).
|
|
450
424
|
guard: {
|
|
451
425
|
and: [
|
|
452
|
-
(0, guards_js_1.actorHasEntry)(
|
|
453
|
-
(0, guards_js_1.signerIsNotParty)(
|
|
454
|
-
(0, guards_js_1.signerIsNotParty)(
|
|
455
|
-
{
|
|
426
|
+
(0, guards_js_1.actorHasEntry)('state.members'),
|
|
427
|
+
(0, guards_js_1.signerIsNotParty)('state.dispute.plaintiff'),
|
|
428
|
+
(0, guards_js_1.signerIsNotParty)('state.dispute.defendant'),
|
|
429
|
+
{ '!': [{ has: [{ var: 'state.votes' }, { var: 'event.agent' }] }] },
|
|
456
430
|
],
|
|
457
431
|
},
|
|
458
432
|
effect: {
|
|
459
433
|
merge: [
|
|
460
|
-
{ var:
|
|
434
|
+
{ var: 'state' },
|
|
461
435
|
{
|
|
462
436
|
votes: {
|
|
463
437
|
set: [
|
|
464
|
-
{ var:
|
|
465
|
-
{ var:
|
|
438
|
+
{ var: 'state.votes' },
|
|
439
|
+
{ var: 'event.agent' },
|
|
466
440
|
{
|
|
467
|
-
ruling: { var:
|
|
468
|
-
votedAt: { var:
|
|
441
|
+
ruling: { var: 'event.ruling' },
|
|
442
|
+
votedAt: { var: '$ordinal' },
|
|
469
443
|
},
|
|
470
444
|
],
|
|
471
445
|
},
|
|
@@ -476,31 +450,28 @@ exports.govSimpleDef = (0, fiber_app_js_1.defineFiberApp)({
|
|
|
476
450
|
},
|
|
477
451
|
// DISPUTE → ACTIVE: resolve (quorum met)
|
|
478
452
|
{
|
|
479
|
-
from:
|
|
480
|
-
to:
|
|
481
|
-
eventName:
|
|
453
|
+
from: 'DISPUTE',
|
|
454
|
+
to: 'ACTIVE',
|
|
455
|
+
eventName: 'resolve',
|
|
482
456
|
// A2 fix: count recorded ballots. votes is a Map, and `length` rejects Maps, so
|
|
483
457
|
// count its keys: length(keys(state.votes)). (size is not a JLVM opcode.)
|
|
484
458
|
guard: {
|
|
485
|
-
|
|
486
|
-
{ length: [{ keys: [{ var: "state.votes" }] }] },
|
|
487
|
-
{ var: "state.disputeQuorum" },
|
|
488
|
-
],
|
|
459
|
+
'>=': [{ length: [{ keys: [{ var: 'state.votes' }] }] }, { var: 'state.disputeQuorum' }],
|
|
489
460
|
},
|
|
490
461
|
effect: {
|
|
491
462
|
merge: [
|
|
492
|
-
{ var:
|
|
463
|
+
{ var: 'state' },
|
|
493
464
|
{
|
|
494
465
|
history: {
|
|
495
466
|
cat: [
|
|
496
|
-
{ var:
|
|
467
|
+
{ var: 'state.history' },
|
|
497
468
|
[
|
|
498
469
|
{
|
|
499
|
-
type:
|
|
500
|
-
dispute: { var:
|
|
501
|
-
ruling: { var:
|
|
502
|
-
remedy: { var:
|
|
503
|
-
resolvedAt: { var:
|
|
470
|
+
type: 'dispute',
|
|
471
|
+
dispute: { var: 'state.dispute' },
|
|
472
|
+
ruling: { var: 'event.ruling' },
|
|
473
|
+
remedy: { var: 'event.remedy' },
|
|
474
|
+
resolvedAt: { var: '$ordinal' },
|
|
504
475
|
},
|
|
505
476
|
],
|
|
506
477
|
],
|
|
@@ -514,31 +485,28 @@ exports.govSimpleDef = (0, fiber_app_js_1.defineFiberApp)({
|
|
|
514
485
|
},
|
|
515
486
|
// ACTIVE → DISSOLVED: dissolve (90% approval)
|
|
516
487
|
{
|
|
517
|
-
from:
|
|
518
|
-
to:
|
|
519
|
-
eventName:
|
|
488
|
+
from: 'ACTIVE',
|
|
489
|
+
to: 'DISSOLVED',
|
|
490
|
+
eventName: 'dissolve',
|
|
520
491
|
// S2/A2 coupled fix: dissolution must not trust an attacker-supplied
|
|
521
492
|
// approvalCount. Derive consent from the CHAIN-VERIFIED signers — every member
|
|
522
493
|
// (a key in state.members) must be among proofs[].address, with a non-empty
|
|
523
494
|
// belt. members is a Map, so iterate keys(members); size is not a JLVM opcode.
|
|
524
495
|
guard: {
|
|
525
496
|
and: [
|
|
526
|
-
{
|
|
497
|
+
{ '>': [{ length: [{ keys: [{ var: 'state.members' }] }] }, 0] },
|
|
527
498
|
{
|
|
528
499
|
all: [
|
|
529
|
-
{ keys: [{ var:
|
|
500
|
+
{ keys: [{ var: 'state.members' }] },
|
|
530
501
|
{
|
|
531
|
-
in: [
|
|
532
|
-
{ var: "" },
|
|
533
|
-
{ map: [{ var: "proofs" }, { var: "address" }] },
|
|
534
|
-
],
|
|
502
|
+
in: [{ var: '' }, { map: [{ var: 'proofs' }, { var: 'address' }] }],
|
|
535
503
|
},
|
|
536
504
|
],
|
|
537
505
|
},
|
|
538
506
|
],
|
|
539
507
|
},
|
|
540
508
|
effect: {
|
|
541
|
-
merge: [{ var:
|
|
509
|
+
merge: [{ var: 'state' }, { dissolvedAt: { var: '$ordinal' } }],
|
|
542
510
|
},
|
|
543
511
|
dependencies: [],
|
|
544
512
|
},
|