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