@ottochain/sdk 2.2.5 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/apps/contracts/index.js +15 -8
- package/dist/cjs/apps/contracts/state-machines/contract-agreement.js +89 -46
- package/dist/cjs/apps/contracts/state-machines/contract-escrow.js +152 -45
- package/dist/cjs/apps/contracts/state-machines/contract-universal.js +40 -8
- package/dist/cjs/apps/corporate/index.js +2 -2
- package/dist/cjs/apps/corporate/state-machines/corp-board.js +169 -59
- package/dist/cjs/apps/corporate/state-machines/corp-entity.js +245 -47
- package/dist/cjs/apps/corporate/state-machines/corp-securities.js +407 -99
- package/dist/cjs/apps/corporate/state-machines/corp-shareholders.js +151 -37
- package/dist/cjs/apps/governance/index.js +14 -14
- package/dist/cjs/apps/governance/state-machines/dao-multisig.js +85 -43
- package/dist/cjs/apps/governance/state-machines/dao-reputation.js +73 -43
- package/dist/cjs/apps/governance/state-machines/dao-single.js +55 -14
- package/dist/cjs/apps/governance/state-machines/dao-token.js +103 -45
- package/dist/cjs/apps/governance/state-machines/governance-simple.js +129 -65
- package/dist/cjs/apps/governance/state-machines/governance-universal.js +29 -5
- package/dist/cjs/apps/identity/constants.js +55 -14
- package/dist/cjs/apps/identity/index.js +27 -11
- package/dist/cjs/apps/identity/state-machines/identity-agent.js +57 -9
- package/dist/cjs/apps/identity/state-machines/identity-oracle.js +70 -27
- package/dist/cjs/apps/identity/state-machines/identity-registry.js +288 -0
- package/dist/cjs/apps/identity/state-machines/identity-universal.js +30 -6
- package/dist/cjs/apps/identity/state-machines/index.js +3 -1
- package/dist/cjs/apps/index.js +19 -8
- package/dist/cjs/apps/lending/assets.js +223 -0
- package/dist/cjs/apps/lending/credit-scoring.js +87 -0
- package/dist/cjs/apps/lending/eligibility.js +121 -0
- package/dist/cjs/apps/lending/index.js +91 -0
- package/dist/cjs/apps/lending/state-machines/index.js +9 -0
- package/dist/cjs/apps/lending/state-machines/lending-zk-loan.js +412 -0
- package/dist/cjs/apps/markets/index.js +21 -11
- package/dist/cjs/apps/markets/state-machines/market-auction.js +44 -19
- package/dist/cjs/apps/markets/state-machines/market-crowdfund.js +54 -29
- package/dist/cjs/apps/markets/state-machines/market-group-buy.js +53 -31
- package/dist/cjs/apps/markets/state-machines/market-prediction.js +120 -61
- package/dist/cjs/apps/markets/state-machines/market-universal.js +50 -10
- package/dist/cjs/apps/oracles/index.js +2 -2
- package/dist/cjs/errors.js +3 -3
- package/dist/cjs/generated/google/protobuf/struct.js +4 -4
- package/dist/cjs/generated/index.js +11 -7
- package/dist/cjs/generated/openapi.js +6 -0
- package/dist/cjs/generated/ottochain/apps/contracts/v1/contract.js +50 -50
- package/dist/cjs/generated/ottochain/apps/corporate/v1/corporate.js +19 -20
- package/dist/cjs/generated/ottochain/apps/governance/v1/governance.js +13 -13
- package/dist/cjs/generated/ottochain/apps/identity/v1/attestation.js +4 -4
- package/dist/cjs/generated/ottochain/apps/identity/v1/identity.js +124 -130
- package/dist/cjs/generated/ottochain/apps/markets/v1/market.js +107 -107
- package/dist/cjs/generated/ottochain/v1/common.js +1722 -1
- package/dist/cjs/generated/ottochain/v1/fiber.js +355 -5
- package/dist/cjs/generated/ottochain/v1/messages.js +775 -3
- package/dist/cjs/generated/ottochain/v1/records.js +350 -3
- package/dist/cjs/index.js +45 -7
- package/dist/cjs/openapi.js +2 -0
- package/dist/cjs/ottochain/drop-nulls.js +1 -2
- package/dist/cjs/ottochain/genesis-manifest.js +193 -0
- package/dist/cjs/ottochain/index.js +27 -13
- package/dist/cjs/ottochain/metagraph-client.js +65 -8
- package/dist/cjs/ottochain/snapshot.js +11 -12
- package/dist/cjs/ottochain/transaction.js +57 -14
- package/dist/cjs/ottochain/types.js +19 -1
- package/dist/cjs/privacy/index.js +14 -0
- package/dist/cjs/privacy/sealed-bid.js +210 -0
- package/dist/cjs/privacy/shield-app.js +131 -0
- package/dist/cjs/schema/effects.js +40 -0
- package/dist/cjs/schema/fiber-app.js +19 -13
- package/dist/cjs/schema/guard-lint.js +352 -0
- package/dist/cjs/schema/guards.js +246 -0
- package/dist/cjs/signing.js +80 -0
- package/dist/cjs/types.js +2 -3
- package/dist/cjs/validation.js +8 -8
- package/dist/cjs/verify.js +9 -4
- package/dist/cjs/zk/commit.js +53 -0
- package/dist/cjs/zk/guard.js +107 -0
- package/dist/cjs/zk/index.js +48 -0
- package/dist/cjs/zk/preimage.js +37 -0
- package/dist/cjs/zk/prover.js +87 -0
- package/dist/cjs/zk/registry.js +62 -0
- package/dist/cjs/zk/types.js +28 -0
- package/dist/cjs/zk/witness.js +19 -0
- package/dist/esm/apps/contracts/index.js +7 -3
- package/dist/esm/apps/contracts/state-machines/contract-agreement.js +89 -46
- package/dist/esm/apps/contracts/state-machines/contract-escrow.js +152 -45
- package/dist/esm/apps/contracts/state-machines/contract-universal.js +40 -8
- package/dist/esm/apps/corporate/state-machines/corp-board.js +169 -59
- package/dist/esm/apps/corporate/state-machines/corp-entity.js +245 -47
- package/dist/esm/apps/corporate/state-machines/corp-securities.js +407 -99
- package/dist/esm/apps/corporate/state-machines/corp-shareholders.js +151 -37
- package/dist/esm/apps/governance/state-machines/dao-multisig.js +85 -43
- package/dist/esm/apps/governance/state-machines/dao-reputation.js +73 -43
- package/dist/esm/apps/governance/state-machines/dao-single.js +55 -14
- package/dist/esm/apps/governance/state-machines/dao-token.js +103 -45
- package/dist/esm/apps/governance/state-machines/governance-simple.js +129 -65
- package/dist/esm/apps/governance/state-machines/governance-universal.js +29 -5
- package/dist/esm/apps/identity/constants.js +51 -12
- package/dist/esm/apps/identity/index.js +12 -7
- package/dist/esm/apps/identity/state-machines/identity-agent.js +57 -9
- package/dist/esm/apps/identity/state-machines/identity-oracle.js +70 -27
- package/dist/esm/apps/identity/state-machines/identity-registry.js +285 -0
- package/dist/esm/apps/identity/state-machines/identity-universal.js +30 -6
- package/dist/esm/apps/identity/state-machines/index.js +1 -0
- package/dist/esm/apps/index.js +1 -0
- package/dist/esm/apps/lending/assets.js +207 -0
- package/dist/esm/apps/lending/credit-scoring.js +81 -0
- package/dist/esm/apps/lending/eligibility.js +115 -0
- package/dist/esm/apps/lending/index.js +69 -0
- package/dist/esm/apps/lending/state-machines/index.js +5 -0
- package/dist/esm/apps/lending/state-machines/lending-zk-loan.js +409 -0
- package/dist/esm/apps/markets/index.js +8 -4
- package/dist/esm/apps/markets/state-machines/market-auction.js +44 -19
- package/dist/esm/apps/markets/state-machines/market-crowdfund.js +54 -29
- package/dist/esm/apps/markets/state-machines/market-group-buy.js +53 -31
- package/dist/esm/apps/markets/state-machines/market-prediction.js +120 -61
- package/dist/esm/apps/markets/state-machines/market-universal.js +50 -10
- package/dist/esm/generated/index.js +9 -5
- package/dist/esm/generated/openapi.js +5 -0
- package/dist/esm/generated/ottochain/apps/contracts/v1/contract.js +46 -46
- package/dist/esm/generated/ottochain/apps/identity/v1/identity.js +114 -120
- package/dist/esm/generated/ottochain/apps/markets/v1/market.js +100 -100
- package/dist/esm/generated/ottochain/v1/common.js +1718 -0
- package/dist/esm/generated/ottochain/v1/fiber.js +351 -1
- package/dist/esm/generated/ottochain/v1/messages.js +774 -2
- package/dist/esm/generated/ottochain/v1/records.js +349 -2
- package/dist/esm/index.js +23 -2
- package/dist/esm/openapi.js +1 -0
- package/dist/esm/ottochain/genesis-manifest.js +189 -0
- package/dist/esm/ottochain/index.js +4 -3
- package/dist/esm/ottochain/metagraph-client.js +65 -8
- package/dist/esm/ottochain/snapshot.js +4 -4
- package/dist/esm/ottochain/transaction.js +43 -3
- package/dist/esm/ottochain/types.js +18 -0
- package/dist/esm/privacy/index.js +6 -0
- package/dist/esm/privacy/sealed-bid.js +206 -0
- package/dist/esm/privacy/shield-app.js +127 -0
- package/dist/esm/schema/effects.js +35 -0
- package/dist/esm/schema/fiber-app.js +13 -6
- package/dist/esm/schema/guard-lint.js +346 -0
- package/dist/esm/schema/guards.js +229 -0
- package/dist/esm/signing.js +74 -0
- package/dist/esm/verify.js +8 -2
- package/dist/esm/zk/commit.js +44 -0
- package/dist/esm/zk/guard.js +99 -0
- package/dist/esm/zk/index.js +19 -0
- package/dist/esm/zk/preimage.js +30 -0
- package/dist/esm/zk/prover.js +82 -0
- package/dist/esm/zk/registry.js +55 -0
- package/dist/esm/zk/types.js +25 -0
- package/dist/esm/zk/witness.js +15 -0
- package/dist/types/apps/contracts/index.d.ts +159 -227
- package/dist/types/apps/contracts/state-machines/contract-agreement.d.ts +50 -101
- package/dist/types/apps/contracts/state-machines/contract-escrow.d.ts +86 -120
- package/dist/types/apps/contracts/state-machines/contract-universal.d.ts +20 -4
- package/dist/types/apps/corporate/index.d.ts +1040 -304
- package/dist/types/apps/corporate/state-machines/corp-board.d.ts +188 -52
- package/dist/types/apps/corporate/state-machines/corp-entity.d.ts +267 -62
- package/dist/types/apps/corporate/state-machines/corp-securities.d.ts +355 -131
- package/dist/types/apps/corporate/state-machines/corp-shareholders.d.ts +225 -53
- package/dist/types/apps/governance/index.d.ts +396 -417
- package/dist/types/apps/governance/state-machines/dao-multisig.d.ts +92 -95
- package/dist/types/apps/governance/state-machines/dao-reputation.d.ts +57 -69
- package/dist/types/apps/governance/state-machines/dao-single.d.ts +40 -50
- package/dist/types/apps/governance/state-machines/dao-token.d.ts +80 -53
- package/dist/types/apps/governance/state-machines/governance-simple.d.ts +107 -121
- package/dist/types/apps/governance/state-machines/governance-universal.d.ts +17 -5
- package/dist/types/apps/identity/constants.d.ts +32 -4
- package/dist/types/apps/identity/index.d.ts +449 -100
- package/dist/types/apps/identity/state-machines/identity-agent.d.ts +30 -0
- package/dist/types/apps/identity/state-machines/identity-oracle.d.ts +41 -87
- package/dist/types/apps/identity/state-machines/identity-registry.d.ts +379 -0
- package/dist/types/apps/identity/state-machines/identity-universal.d.ts +15 -0
- package/dist/types/apps/identity/state-machines/index.d.ts +1 -0
- package/dist/types/apps/index.d.ts +1 -0
- package/dist/types/apps/lending/assets.d.ts +258 -0
- package/dist/types/apps/lending/credit-scoring.d.ts +80 -0
- package/dist/types/apps/lending/eligibility.d.ts +83 -0
- package/dist/types/apps/lending/index.d.ts +548 -0
- package/dist/types/apps/lending/state-machines/index.d.ts +5 -0
- package/dist/types/apps/lending/state-machines/lending-zk-loan.d.ts +528 -0
- package/dist/types/apps/markets/index.d.ts +184 -204
- package/dist/types/apps/markets/state-machines/market-auction.d.ts +25 -37
- package/dist/types/apps/markets/state-machines/market-crowdfund.d.ts +26 -34
- package/dist/types/apps/markets/state-machines/market-group-buy.d.ts +31 -43
- package/dist/types/apps/markets/state-machines/market-prediction.d.ts +67 -72
- package/dist/types/apps/markets/state-machines/market-universal.d.ts +30 -10
- package/dist/types/generated/index.d.ts +5 -5
- package/dist/types/generated/openapi.d.ts +1257 -0
- package/dist/types/generated/ottochain/apps/contracts/v1/contract.d.ts +5 -5
- package/dist/types/generated/ottochain/apps/identity/v1/identity.d.ts +12 -12
- package/dist/types/generated/ottochain/apps/markets/v1/market.d.ts +11 -11
- package/dist/types/generated/ottochain/v1/common.d.ts +228 -0
- package/dist/types/generated/ottochain/v1/fiber.d.ts +32 -1
- package/dist/types/generated/ottochain/v1/messages.d.ts +84 -0
- package/dist/types/generated/ottochain/v1/records.d.ts +34 -0
- package/dist/types/index.d.ts +8 -2
- package/dist/types/openapi.d.ts +22 -0
- package/dist/types/ottochain/genesis-manifest.d.ts +130 -0
- package/dist/types/ottochain/index.d.ts +6 -5
- package/dist/types/ottochain/metagraph-client.d.ts +49 -7
- package/dist/types/ottochain/snapshot.d.ts +6 -6
- package/dist/types/ottochain/transaction.d.ts +33 -1
- package/dist/types/ottochain/types.d.ts +602 -11
- package/dist/types/privacy/index.d.ts +6 -0
- package/dist/types/privacy/sealed-bid.d.ts +348 -0
- package/dist/types/privacy/shield-app.d.ts +48 -0
- package/dist/types/schema/effects.d.ts +34 -0
- package/dist/types/schema/fiber-app.d.ts +41 -3
- package/dist/types/schema/guard-lint.d.ts +111 -0
- package/dist/types/schema/guards.d.ts +134 -0
- package/dist/types/signing.d.ts +45 -0
- package/dist/types/validation.d.ts +22 -217
- package/dist/types/verify.d.ts +4 -0
- package/dist/types/zk/commit.d.ts +28 -0
- package/dist/types/zk/guard.d.ts +46 -0
- package/dist/types/zk/index.d.ts +19 -0
- package/dist/types/zk/preimage.d.ts +10 -0
- package/dist/types/zk/prover.d.ts +34 -0
- package/dist/types/zk/registry.d.ts +34 -0
- package/dist/types/zk/types.d.ts +33 -0
- package/dist/types/zk/witness.d.ts +40 -0
- package/package.json +52 -35
- package/dist/cjs/ottochain/normalize.js +0 -186
- package/dist/esm/ottochain/normalize.js +0 -179
- package/dist/types/ottochain/normalize.d.ts +0 -79
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { defineFiberApp } from "../../../schema/fiber-app.js";
|
|
2
|
+
import { actorInSet, signerIsParty } from "../../../schema/guards.js";
|
|
2
3
|
/**
|
|
3
4
|
* N-of-M multisig governance. Requires threshold signatures for actions.
|
|
4
5
|
*/
|
|
@@ -110,16 +111,38 @@ export const daoMultisigDef = defineFiberApp({
|
|
|
110
111
|
},
|
|
111
112
|
},
|
|
112
113
|
dissolve: {
|
|
113
|
-
description: "Dissolve the DAO (requires
|
|
114
|
-
properties: {
|
|
115
|
-
signatureCount: { type: "number" },
|
|
116
|
-
},
|
|
114
|
+
description: "Dissolve the DAO (requires every signer to sign this op — verified unanimity)",
|
|
115
|
+
properties: {},
|
|
117
116
|
},
|
|
118
117
|
},
|
|
119
118
|
states: {
|
|
120
|
-
ACTIVE: {
|
|
121
|
-
|
|
122
|
-
|
|
119
|
+
ACTIVE: {
|
|
120
|
+
id: "ACTIVE",
|
|
121
|
+
isFinal: false,
|
|
122
|
+
metadata: {
|
|
123
|
+
label: "Active",
|
|
124
|
+
description: "Multisig is idle and ready to propose an action",
|
|
125
|
+
category: "initial",
|
|
126
|
+
},
|
|
127
|
+
},
|
|
128
|
+
PENDING: {
|
|
129
|
+
id: "PENDING",
|
|
130
|
+
isFinal: false,
|
|
131
|
+
metadata: {
|
|
132
|
+
label: "Pending",
|
|
133
|
+
description: "An action is awaiting the required signature threshold",
|
|
134
|
+
category: "pending",
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
DISSOLVED: {
|
|
138
|
+
id: "DISSOLVED",
|
|
139
|
+
isFinal: true,
|
|
140
|
+
metadata: {
|
|
141
|
+
label: "Dissolved",
|
|
142
|
+
description: "Multisig DAO dissolved (terminal)",
|
|
143
|
+
category: "terminal",
|
|
144
|
+
},
|
|
145
|
+
},
|
|
123
146
|
},
|
|
124
147
|
initialState: "ACTIVE",
|
|
125
148
|
transitions: [
|
|
@@ -128,7 +151,7 @@ export const daoMultisigDef = defineFiberApp({
|
|
|
128
151
|
from: "ACTIVE",
|
|
129
152
|
to: "PENDING",
|
|
130
153
|
eventName: "propose",
|
|
131
|
-
guard:
|
|
154
|
+
guard: actorInSet("state.signers"),
|
|
132
155
|
effect: {
|
|
133
156
|
merge: [
|
|
134
157
|
{ var: "state" },
|
|
@@ -138,13 +161,13 @@ export const daoMultisigDef = defineFiberApp({
|
|
|
138
161
|
actionType: { var: "event.actionType" },
|
|
139
162
|
payload: { var: "event.payload" },
|
|
140
163
|
proposer: { var: "event.agent" },
|
|
141
|
-
proposedAt: { var: "$
|
|
164
|
+
proposedAt: { var: "$ordinal" },
|
|
142
165
|
expiresAt: {
|
|
143
|
-
"+": [{ var: "$
|
|
166
|
+
"+": [{ var: "$ordinal" }, { var: "state.proposalTTLMs" }],
|
|
144
167
|
},
|
|
145
168
|
},
|
|
146
169
|
signatures: {
|
|
147
|
-
|
|
170
|
+
set: [{}, { var: "event.agent" }, { var: "$ordinal" }],
|
|
148
171
|
},
|
|
149
172
|
},
|
|
150
173
|
],
|
|
@@ -158,15 +181,15 @@ export const daoMultisigDef = defineFiberApp({
|
|
|
158
181
|
eventName: "sign",
|
|
159
182
|
guard: {
|
|
160
183
|
and: [
|
|
161
|
-
|
|
184
|
+
actorInSet("state.signers"),
|
|
162
185
|
{
|
|
163
186
|
"!": [
|
|
164
|
-
{
|
|
187
|
+
{ has: [{ var: "state.signatures" }, { var: "event.agent" }] },
|
|
165
188
|
],
|
|
166
189
|
},
|
|
167
190
|
{
|
|
168
191
|
"<": [
|
|
169
|
-
{
|
|
192
|
+
{ length: [{ keys: [{ var: "state.signatures" }] }] },
|
|
170
193
|
{ var: "state.threshold" },
|
|
171
194
|
],
|
|
172
195
|
},
|
|
@@ -177,10 +200,10 @@ export const daoMultisigDef = defineFiberApp({
|
|
|
177
200
|
{ var: "state" },
|
|
178
201
|
{
|
|
179
202
|
signatures: {
|
|
180
|
-
|
|
203
|
+
set: [
|
|
181
204
|
{ var: "state.signatures" },
|
|
182
205
|
{ var: "event.agent" },
|
|
183
|
-
{ var: "$
|
|
206
|
+
{ var: "$ordinal" },
|
|
184
207
|
],
|
|
185
208
|
},
|
|
186
209
|
},
|
|
@@ -195,7 +218,7 @@ export const daoMultisigDef = defineFiberApp({
|
|
|
195
218
|
eventName: "execute",
|
|
196
219
|
guard: {
|
|
197
220
|
">=": [
|
|
198
|
-
{
|
|
221
|
+
{ length: [{ keys: [{ var: "state.signatures" }] }] },
|
|
199
222
|
{ var: "state.threshold" },
|
|
200
223
|
],
|
|
201
224
|
},
|
|
@@ -212,17 +235,25 @@ export const daoMultisigDef = defineFiberApp({
|
|
|
212
235
|
type: { var: "state.proposal.actionType" },
|
|
213
236
|
payload: { var: "state.proposal.payload" },
|
|
214
237
|
signatures: { var: "state.signatures" },
|
|
215
|
-
executedAt: { var: "$
|
|
238
|
+
executedAt: { var: "$ordinal" },
|
|
216
239
|
},
|
|
217
240
|
],
|
|
218
241
|
],
|
|
219
242
|
},
|
|
220
243
|
proposal: null,
|
|
221
244
|
signatures: {},
|
|
245
|
+
// A3 fix: transition-level `emits` is dropped by the chain; emit from INSIDE the effect
|
|
246
|
+
// under the reserved `_emit` key (extracted as an EmittedEvent, stripped from state).
|
|
247
|
+
_emit: [
|
|
248
|
+
{
|
|
249
|
+
name: "multisig_executed",
|
|
250
|
+
data: { proposalId: { var: "state.proposal.id" } },
|
|
251
|
+
destination: "external",
|
|
252
|
+
},
|
|
253
|
+
],
|
|
222
254
|
},
|
|
223
255
|
],
|
|
224
256
|
},
|
|
225
|
-
emits: [{ event: "multisig_executed", to: "external" }],
|
|
226
257
|
dependencies: [],
|
|
227
258
|
},
|
|
228
259
|
// PENDING → ACTIVE: cancel (expired or proposer)
|
|
@@ -232,10 +263,8 @@ export const daoMultisigDef = defineFiberApp({
|
|
|
232
263
|
eventName: "cancel",
|
|
233
264
|
guard: {
|
|
234
265
|
or: [
|
|
235
|
-
{ ">": [{ var: "$
|
|
236
|
-
|
|
237
|
-
"===": [{ var: "event.agent" }, { var: "state.proposal.proposer" }],
|
|
238
|
-
},
|
|
266
|
+
{ ">": [{ var: "$ordinal" }, { var: "state.proposal.expiresAt" }] },
|
|
267
|
+
signerIsParty("state.proposal.proposer"),
|
|
239
268
|
],
|
|
240
269
|
},
|
|
241
270
|
effect: {
|
|
@@ -249,7 +278,7 @@ export const daoMultisigDef = defineFiberApp({
|
|
|
249
278
|
{
|
|
250
279
|
merge: [
|
|
251
280
|
{ var: "state.proposal" },
|
|
252
|
-
{ cancelledAt: { var: "$
|
|
281
|
+
{ cancelledAt: { var: "$ordinal" } },
|
|
253
282
|
],
|
|
254
283
|
},
|
|
255
284
|
],
|
|
@@ -267,7 +296,7 @@ export const daoMultisigDef = defineFiberApp({
|
|
|
267
296
|
from: "ACTIVE",
|
|
268
297
|
to: "PENDING",
|
|
269
298
|
eventName: "propose_add_signer",
|
|
270
|
-
guard:
|
|
299
|
+
guard: actorInSet("state.signers"),
|
|
271
300
|
effect: {
|
|
272
301
|
merge: [
|
|
273
302
|
{ var: "state" },
|
|
@@ -277,13 +306,13 @@ export const daoMultisigDef = defineFiberApp({
|
|
|
277
306
|
actionType: "add_signer",
|
|
278
307
|
payload: { newSigner: { var: "event.newSigner" } },
|
|
279
308
|
proposer: { var: "event.agent" },
|
|
280
|
-
proposedAt: { var: "$
|
|
309
|
+
proposedAt: { var: "$ordinal" },
|
|
281
310
|
expiresAt: {
|
|
282
|
-
"+": [{ var: "$
|
|
311
|
+
"+": [{ var: "$ordinal" }, { var: "state.proposalTTLMs" }],
|
|
283
312
|
},
|
|
284
313
|
},
|
|
285
314
|
signatures: {
|
|
286
|
-
|
|
315
|
+
set: [{}, { var: "event.agent" }, { var: "$ordinal" }],
|
|
287
316
|
},
|
|
288
317
|
},
|
|
289
318
|
],
|
|
@@ -297,10 +326,10 @@ export const daoMultisigDef = defineFiberApp({
|
|
|
297
326
|
eventName: "propose_remove_signer",
|
|
298
327
|
guard: {
|
|
299
328
|
and: [
|
|
300
|
-
|
|
329
|
+
actorInSet("state.signers"),
|
|
301
330
|
{
|
|
302
331
|
">": [
|
|
303
|
-
{
|
|
332
|
+
{ length: [{ var: "state.signers" }] },
|
|
304
333
|
{ var: "state.threshold" },
|
|
305
334
|
],
|
|
306
335
|
},
|
|
@@ -315,13 +344,13 @@ export const daoMultisigDef = defineFiberApp({
|
|
|
315
344
|
actionType: "remove_signer",
|
|
316
345
|
payload: { removeSigner: { var: "event.removeSigner" } },
|
|
317
346
|
proposer: { var: "event.agent" },
|
|
318
|
-
proposedAt: { var: "$
|
|
347
|
+
proposedAt: { var: "$ordinal" },
|
|
319
348
|
expiresAt: {
|
|
320
|
-
"+": [{ var: "$
|
|
349
|
+
"+": [{ var: "$ordinal" }, { var: "state.proposalTTLMs" }],
|
|
321
350
|
},
|
|
322
351
|
},
|
|
323
352
|
signatures: {
|
|
324
|
-
|
|
353
|
+
set: [{}, { var: "event.agent" }, { var: "$ordinal" }],
|
|
325
354
|
},
|
|
326
355
|
},
|
|
327
356
|
],
|
|
@@ -335,12 +364,12 @@ export const daoMultisigDef = defineFiberApp({
|
|
|
335
364
|
eventName: "propose_change_threshold",
|
|
336
365
|
guard: {
|
|
337
366
|
and: [
|
|
338
|
-
|
|
367
|
+
actorInSet("state.signers"),
|
|
339
368
|
{ ">=": [{ var: "event.newThreshold" }, 1] },
|
|
340
369
|
{
|
|
341
370
|
"<=": [
|
|
342
371
|
{ var: "event.newThreshold" },
|
|
343
|
-
{
|
|
372
|
+
{ length: [{ var: "state.signers" }] },
|
|
344
373
|
],
|
|
345
374
|
},
|
|
346
375
|
],
|
|
@@ -354,13 +383,13 @@ export const daoMultisigDef = defineFiberApp({
|
|
|
354
383
|
actionType: "change_threshold",
|
|
355
384
|
payload: { newThreshold: { var: "event.newThreshold" } },
|
|
356
385
|
proposer: { var: "event.agent" },
|
|
357
|
-
proposedAt: { var: "$
|
|
386
|
+
proposedAt: { var: "$ordinal" },
|
|
358
387
|
expiresAt: {
|
|
359
|
-
"+": [{ var: "$
|
|
388
|
+
"+": [{ var: "$ordinal" }, { var: "state.proposalTTLMs" }],
|
|
360
389
|
},
|
|
361
390
|
},
|
|
362
391
|
signatures: {
|
|
363
|
-
|
|
392
|
+
set: [{}, { var: "event.agent" }, { var: "$ordinal" }],
|
|
364
393
|
},
|
|
365
394
|
},
|
|
366
395
|
],
|
|
@@ -376,7 +405,7 @@ export const daoMultisigDef = defineFiberApp({
|
|
|
376
405
|
and: [
|
|
377
406
|
{
|
|
378
407
|
">=": [
|
|
379
|
-
{
|
|
408
|
+
{ length: [{ keys: [{ var: "state.signatures" }] }] },
|
|
380
409
|
{ var: "state.threshold" },
|
|
381
410
|
],
|
|
382
411
|
},
|
|
@@ -446,16 +475,29 @@ export const daoMultisigDef = defineFiberApp({
|
|
|
446
475
|
from: "ACTIVE",
|
|
447
476
|
to: "DISSOLVED",
|
|
448
477
|
eventName: "dissolve",
|
|
478
|
+
// S2 fix: dissolution must not trust an attacker-supplied count. Derive
|
|
479
|
+
// unanimity from the CHAIN-VERIFIED signers — every signer in state.signers
|
|
480
|
+
// must be among proofs[].address (with a non-empty belt). signers is an array.
|
|
449
481
|
guard: {
|
|
450
|
-
|
|
451
|
-
{ var: "
|
|
452
|
-
{
|
|
482
|
+
and: [
|
|
483
|
+
{ ">": [{ length: [{ var: "state.signers" }] }, 0] },
|
|
484
|
+
{
|
|
485
|
+
all: [
|
|
486
|
+
{ var: "state.signers" },
|
|
487
|
+
{
|
|
488
|
+
in: [
|
|
489
|
+
{ var: "" },
|
|
490
|
+
{ map: [{ var: "proofs" }, { var: "address" }] },
|
|
491
|
+
],
|
|
492
|
+
},
|
|
493
|
+
],
|
|
494
|
+
},
|
|
453
495
|
],
|
|
454
496
|
},
|
|
455
497
|
effect: {
|
|
456
498
|
merge: [
|
|
457
499
|
{ var: "state" },
|
|
458
|
-
{ dissolvedAt: { var: "$
|
|
500
|
+
{ dissolvedAt: { var: "$ordinal" }, status: "DISSOLVED" },
|
|
459
501
|
],
|
|
460
502
|
},
|
|
461
503
|
dependencies: [],
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { defineFiberApp } from "../../../schema/fiber-app.js";
|
|
2
|
+
import { actorIsSigner, signerInSet } from "../../../schema/guards.js";
|
|
2
3
|
/**
|
|
3
4
|
* Reputation-based governance. Minimum reputation required for participation.
|
|
4
5
|
*/
|
|
@@ -124,9 +125,33 @@ export const daoReputationDef = defineFiberApp({
|
|
|
124
125
|
},
|
|
125
126
|
},
|
|
126
127
|
states: {
|
|
127
|
-
ACTIVE: {
|
|
128
|
-
|
|
129
|
-
|
|
128
|
+
ACTIVE: {
|
|
129
|
+
id: "ACTIVE",
|
|
130
|
+
isFinal: false,
|
|
131
|
+
metadata: {
|
|
132
|
+
label: "Active",
|
|
133
|
+
description: "DAO is idle and ready to accept a proposal",
|
|
134
|
+
category: "initial",
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
VOTING: {
|
|
138
|
+
id: "VOTING",
|
|
139
|
+
isFinal: false,
|
|
140
|
+
metadata: {
|
|
141
|
+
label: "Voting",
|
|
142
|
+
description: "Members vote with reputation-weighted power",
|
|
143
|
+
category: "pending",
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
DISSOLVED: {
|
|
147
|
+
id: "DISSOLVED",
|
|
148
|
+
isFinal: true,
|
|
149
|
+
metadata: {
|
|
150
|
+
label: "Dissolved",
|
|
151
|
+
description: "Reputation DAO dissolved (terminal)",
|
|
152
|
+
category: "terminal",
|
|
153
|
+
},
|
|
154
|
+
},
|
|
130
155
|
},
|
|
131
156
|
initialState: "ACTIVE",
|
|
132
157
|
transitions: [
|
|
@@ -152,9 +177,9 @@ export const daoReputationDef = defineFiberApp({
|
|
|
152
177
|
actionType: { var: "event.actionType" },
|
|
153
178
|
payload: { var: "event.payload" },
|
|
154
179
|
proposer: { var: "event.agent" },
|
|
155
|
-
proposedAt: { var: "$
|
|
180
|
+
proposedAt: { var: "$ordinal" },
|
|
156
181
|
deadline: {
|
|
157
|
-
"+": [{ var: "$
|
|
182
|
+
"+": [{ var: "$ordinal" }, { var: "state.votingPeriodMs" }],
|
|
158
183
|
},
|
|
159
184
|
},
|
|
160
185
|
votes: { for: [], against: [], abstain: [] },
|
|
@@ -176,20 +201,10 @@ export const daoReputationDef = defineFiberApp({
|
|
|
176
201
|
{ var: "state.voteThreshold" },
|
|
177
202
|
],
|
|
178
203
|
},
|
|
179
|
-
{
|
|
180
|
-
|
|
181
|
-
},
|
|
182
|
-
{
|
|
183
|
-
"!": [
|
|
184
|
-
{ in: [{ var: "event.agent" }, { var: "state.votes.against" }] },
|
|
185
|
-
],
|
|
186
|
-
},
|
|
187
|
-
{
|
|
188
|
-
"!": [
|
|
189
|
-
{ in: [{ var: "event.agent" }, { var: "state.votes.abstain" }] },
|
|
190
|
-
],
|
|
191
|
-
},
|
|
192
|
-
{ "<=": [{ var: "$timestamp" }, { var: "state.proposal.deadline" }] },
|
|
204
|
+
{ "!": [signerInSet("state.votes.for")] },
|
|
205
|
+
{ "!": [signerInSet("state.votes.against")] },
|
|
206
|
+
{ "!": [signerInSet("state.votes.abstain")] },
|
|
207
|
+
{ "<=": [{ var: "$ordinal" }, { var: "state.proposal.deadline" }] },
|
|
193
208
|
],
|
|
194
209
|
},
|
|
195
210
|
effect: {
|
|
@@ -251,21 +266,23 @@ export const daoReputationDef = defineFiberApp({
|
|
|
251
266
|
from: "VOTING",
|
|
252
267
|
to: "ACTIVE",
|
|
253
268
|
eventName: "execute",
|
|
269
|
+
// A2 fix: votes.for/against/abstain are arrays of voter addresses; count with
|
|
270
|
+
// `length` (size is not a JLVM opcode).
|
|
254
271
|
guard: {
|
|
255
272
|
and: [
|
|
256
|
-
{ ">": [{ var: "$
|
|
273
|
+
{ ">": [{ var: "$ordinal" }, { var: "state.proposal.deadline" }] },
|
|
257
274
|
{
|
|
258
275
|
">": [
|
|
259
|
-
{
|
|
260
|
-
{
|
|
276
|
+
{ length: [{ var: "state.votes.for" }] },
|
|
277
|
+
{ length: [{ var: "state.votes.against" }] },
|
|
261
278
|
],
|
|
262
279
|
},
|
|
263
280
|
{
|
|
264
281
|
">=": [
|
|
265
282
|
{
|
|
266
283
|
"+": [
|
|
267
|
-
{
|
|
268
|
-
{
|
|
284
|
+
{ length: [{ var: "state.votes.for" }] },
|
|
285
|
+
{ length: [{ var: "state.votes.against" }] },
|
|
269
286
|
],
|
|
270
287
|
},
|
|
271
288
|
{ var: "state.quorum" },
|
|
@@ -285,23 +302,25 @@ export const daoReputationDef = defineFiberApp({
|
|
|
285
302
|
type: "executed",
|
|
286
303
|
proposal: { var: "state.proposal" },
|
|
287
304
|
votes: { var: "state.votes" },
|
|
288
|
-
at: { var: "$
|
|
305
|
+
at: { var: "$ordinal" },
|
|
289
306
|
},
|
|
290
307
|
],
|
|
291
308
|
],
|
|
292
309
|
},
|
|
293
310
|
proposal: null,
|
|
294
311
|
votes: null,
|
|
312
|
+
// A3 fix: transition-level `emits` is dropped by the chain; emit from INSIDE the effect
|
|
313
|
+
// under the reserved `_emit` key (extracted as an EmittedEvent, stripped from state).
|
|
314
|
+
_emit: [
|
|
315
|
+
{
|
|
316
|
+
name: "proposal_executed",
|
|
317
|
+
data: { action: "increase", agents: { var: "state.votes.for" } },
|
|
318
|
+
destination: "Reputation",
|
|
319
|
+
},
|
|
320
|
+
],
|
|
295
321
|
},
|
|
296
322
|
],
|
|
297
323
|
},
|
|
298
|
-
emits: [
|
|
299
|
-
{
|
|
300
|
-
event: "proposal_executed",
|
|
301
|
-
to: "Reputation",
|
|
302
|
-
payload: { action: "increase", agents: { var: "state.votes.for" } },
|
|
303
|
-
},
|
|
304
|
-
],
|
|
305
324
|
dependencies: [],
|
|
306
325
|
},
|
|
307
326
|
// VOTING → ACTIVE: reject (voting ended, for <= against or quorum not met)
|
|
@@ -309,23 +328,25 @@ export const daoReputationDef = defineFiberApp({
|
|
|
309
328
|
from: "VOTING",
|
|
310
329
|
to: "ACTIVE",
|
|
311
330
|
eventName: "reject",
|
|
331
|
+
// A2 fix: count the array-shaped vote tallies with `length` (size is not a JLVM
|
|
332
|
+
// opcode).
|
|
312
333
|
guard: {
|
|
313
334
|
and: [
|
|
314
|
-
{ ">": [{ var: "$
|
|
335
|
+
{ ">": [{ var: "$ordinal" }, { var: "state.proposal.deadline" }] },
|
|
315
336
|
{
|
|
316
337
|
or: [
|
|
317
338
|
{
|
|
318
339
|
"<=": [
|
|
319
|
-
{
|
|
320
|
-
{
|
|
340
|
+
{ length: [{ var: "state.votes.for" }] },
|
|
341
|
+
{ length: [{ var: "state.votes.against" }] },
|
|
321
342
|
],
|
|
322
343
|
},
|
|
323
344
|
{
|
|
324
345
|
"<": [
|
|
325
346
|
{
|
|
326
347
|
"+": [
|
|
327
|
-
{
|
|
328
|
-
{
|
|
348
|
+
{ length: [{ var: "state.votes.for" }] },
|
|
349
|
+
{ length: [{ var: "state.votes.against" }] },
|
|
329
350
|
],
|
|
330
351
|
},
|
|
331
352
|
{ var: "state.quorum" },
|
|
@@ -347,7 +368,7 @@ export const daoReputationDef = defineFiberApp({
|
|
|
347
368
|
type: "rejected",
|
|
348
369
|
proposal: { var: "state.proposal" },
|
|
349
370
|
votes: { var: "state.votes" },
|
|
350
|
-
at: { var: "$
|
|
371
|
+
at: { var: "$ordinal" },
|
|
351
372
|
},
|
|
352
373
|
],
|
|
353
374
|
],
|
|
@@ -364,8 +385,17 @@ export const daoReputationDef = defineFiberApp({
|
|
|
364
385
|
from: "ACTIVE",
|
|
365
386
|
to: "ACTIVE",
|
|
366
387
|
eventName: "join",
|
|
388
|
+
// S1/A2: bind event.agent to a verified signer (actorIsSigner) so the member is appended to the
|
|
389
|
+
// array and keyed into memberJoinedAt under a CHAIN-VERIFIED address (set is the rc.5 map-write
|
|
390
|
+
// opcode), and dedup on that bound actor.
|
|
391
|
+
// TODO(#24): event.agentReputation is self-asserted. Replace the reputation clause with
|
|
392
|
+
// signerHasReputation(registryReputationPath(<registryDep>), "state.memberThreshold") once
|
|
393
|
+
// runtime-updatable dependencies (#24) let a std-app bind the identity-registry instance — the
|
|
394
|
+
// same gate as corp-board's removal-resolution. The registry foundation + read helper already
|
|
395
|
+
// exist (src/apps/identity/state-machines/identity-registry.ts, guards.signerHasReputation).
|
|
367
396
|
guard: {
|
|
368
397
|
and: [
|
|
398
|
+
actorIsSigner(),
|
|
369
399
|
{
|
|
370
400
|
">=": [
|
|
371
401
|
{ var: "event.agentReputation" },
|
|
@@ -383,10 +413,10 @@ export const daoReputationDef = defineFiberApp({
|
|
|
383
413
|
cat: [{ var: "state.members" }, [{ var: "event.agent" }]],
|
|
384
414
|
},
|
|
385
415
|
memberJoinedAt: {
|
|
386
|
-
|
|
416
|
+
set: [
|
|
387
417
|
{ var: "state.memberJoinedAt" },
|
|
388
418
|
{ var: "event.agent" },
|
|
389
|
-
{ var: "$
|
|
419
|
+
{ var: "$ordinal" },
|
|
390
420
|
],
|
|
391
421
|
},
|
|
392
422
|
},
|
|
@@ -399,7 +429,7 @@ export const daoReputationDef = defineFiberApp({
|
|
|
399
429
|
from: "ACTIVE",
|
|
400
430
|
to: "ACTIVE",
|
|
401
431
|
eventName: "leave",
|
|
402
|
-
guard:
|
|
432
|
+
guard: signerInSet("state.members"),
|
|
403
433
|
effect: {
|
|
404
434
|
merge: [
|
|
405
435
|
{ var: "state" },
|
|
@@ -440,9 +470,9 @@ export const daoReputationDef = defineFiberApp({
|
|
|
440
470
|
proposeThreshold: { var: "event.proposeThreshold" },
|
|
441
471
|
},
|
|
442
472
|
proposer: { var: "event.agent" },
|
|
443
|
-
proposedAt: { var: "$
|
|
473
|
+
proposedAt: { var: "$ordinal" },
|
|
444
474
|
deadline: {
|
|
445
|
-
"+": [{ var: "$
|
|
475
|
+
"+": [{ var: "$ordinal" }, { var: "state.votingPeriodMs" }],
|
|
446
476
|
},
|
|
447
477
|
},
|
|
448
478
|
votes: { for: [], against: [], abstain: [] },
|