@ottochain/sdk 2.3.0 → 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 +35 -40
- package/dist/cjs/apps/contracts/state-machines/contract-escrow.js +80 -37
- package/dist/cjs/apps/contracts/state-machines/contract-universal.js +4 -4
- 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 +58 -40
- package/dist/cjs/apps/governance/state-machines/dao-reputation.js +46 -40
- package/dist/cjs/apps/governance/state-machines/dao-single.js +28 -11
- package/dist/cjs/apps/governance/state-machines/dao-token.js +67 -41
- package/dist/cjs/apps/governance/state-machines/governance-simple.js +93 -61
- package/dist/cjs/apps/governance/state-machines/governance-universal.js +2 -2
- 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 +3 -3
- package/dist/cjs/apps/identity/state-machines/identity-oracle.js +25 -22
- package/dist/cjs/apps/identity/state-machines/identity-registry.js +288 -0
- package/dist/cjs/apps/identity/state-machines/identity-universal.js +3 -3
- 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 +14 -13
- package/dist/cjs/apps/markets/state-machines/market-crowdfund.js +29 -24
- package/dist/cjs/apps/markets/state-machines/market-group-buy.js +24 -26
- package/dist/cjs/apps/markets/state-machines/market-prediction.js +80 -53
- package/dist/cjs/apps/markets/state-machines/market-universal.js +5 -5
- 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 +4 -4
- package/dist/cjs/generated/ottochain/v1/fiber.js +4 -4
- package/dist/cjs/index.js +41 -7
- package/dist/cjs/openapi.js +2 -0
- package/dist/cjs/ottochain/drop-nulls.js +1 -2
- package/dist/cjs/ottochain/genesis-manifest.js +11 -11
- package/dist/cjs/ottochain/index.js +23 -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 +16 -2
- 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 +35 -40
- package/dist/esm/apps/contracts/state-machines/contract-escrow.js +80 -37
- package/dist/esm/apps/contracts/state-machines/contract-universal.js +4 -4
- 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 +58 -40
- package/dist/esm/apps/governance/state-machines/dao-reputation.js +46 -40
- package/dist/esm/apps/governance/state-machines/dao-single.js +28 -11
- package/dist/esm/apps/governance/state-machines/dao-token.js +67 -41
- package/dist/esm/apps/governance/state-machines/governance-simple.js +93 -61
- package/dist/esm/apps/governance/state-machines/governance-universal.js +2 -2
- 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 +3 -3
- package/dist/esm/apps/identity/state-machines/identity-oracle.js +25 -22
- package/dist/esm/apps/identity/state-machines/identity-registry.js +285 -0
- package/dist/esm/apps/identity/state-machines/identity-universal.js +3 -3
- 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 +14 -13
- package/dist/esm/apps/markets/state-machines/market-crowdfund.js +29 -24
- package/dist/esm/apps/markets/state-machines/market-group-buy.js +24 -26
- package/dist/esm/apps/markets/state-machines/market-prediction.js +80 -53
- package/dist/esm/apps/markets/state-machines/market-universal.js +5 -5
- 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/index.js +21 -2
- package/dist/esm/openapi.js +1 -0
- package/dist/esm/ottochain/genesis-manifest.js +9 -9
- package/dist/esm/ottochain/index.js +2 -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 +15 -1
- 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 +69 -209
- package/dist/types/apps/contracts/state-machines/contract-agreement.d.ts +20 -95
- package/dist/types/apps/contracts/state-machines/contract-escrow.d.ts +46 -112
- 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 +296 -398
- package/dist/types/apps/governance/state-machines/dao-multisig.d.ts +77 -92
- package/dist/types/apps/governance/state-machines/dao-reputation.d.ts +42 -66
- package/dist/types/apps/governance/state-machines/dao-single.d.ts +25 -47
- package/dist/types/apps/governance/state-machines/dao-token.d.ts +60 -49
- package/dist/types/apps/governance/state-machines/governance-simple.d.ts +87 -117
- package/dist/types/apps/governance/state-machines/governance-universal.d.ts +2 -2
- package/dist/types/apps/identity/constants.d.ts +32 -4
- package/dist/types/apps/identity/index.d.ts +378 -94
- package/dist/types/apps/identity/state-machines/identity-oracle.d.ts +16 -87
- package/dist/types/apps/identity/state-machines/identity-registry.d.ts +379 -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 +108 -203
- package/dist/types/apps/markets/state-machines/market-auction.d.ts +13 -37
- package/dist/types/apps/markets/state-machines/market-crowdfund.d.ts +16 -34
- package/dist/types/apps/markets/state-machines/market-group-buy.d.ts +17 -43
- package/dist/types/apps/markets/state-machines/market-prediction.d.ts +51 -72
- package/dist/types/apps/markets/state-machines/market-universal.d.ts +5 -5
- 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/index.d.ts +6 -2
- package/dist/types/openapi.d.ts +22 -0
- package/dist/types/ottochain/genesis-manifest.d.ts +5 -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 +33 -1
- package/dist/types/ottochain/types.d.ts +335 -30
- 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 +1 -2
- 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 +27 -13
- 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,10 +111,8 @@ 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: {
|
|
@@ -152,7 +151,7 @@ export const daoMultisigDef = defineFiberApp({
|
|
|
152
151
|
from: "ACTIVE",
|
|
153
152
|
to: "PENDING",
|
|
154
153
|
eventName: "propose",
|
|
155
|
-
guard:
|
|
154
|
+
guard: actorInSet("state.signers"),
|
|
156
155
|
effect: {
|
|
157
156
|
merge: [
|
|
158
157
|
{ var: "state" },
|
|
@@ -162,13 +161,13 @@ export const daoMultisigDef = defineFiberApp({
|
|
|
162
161
|
actionType: { var: "event.actionType" },
|
|
163
162
|
payload: { var: "event.payload" },
|
|
164
163
|
proposer: { var: "event.agent" },
|
|
165
|
-
proposedAt: { var: "$
|
|
164
|
+
proposedAt: { var: "$ordinal" },
|
|
166
165
|
expiresAt: {
|
|
167
|
-
"+": [{ var: "$
|
|
166
|
+
"+": [{ var: "$ordinal" }, { var: "state.proposalTTLMs" }],
|
|
168
167
|
},
|
|
169
168
|
},
|
|
170
169
|
signatures: {
|
|
171
|
-
|
|
170
|
+
set: [{}, { var: "event.agent" }, { var: "$ordinal" }],
|
|
172
171
|
},
|
|
173
172
|
},
|
|
174
173
|
],
|
|
@@ -182,15 +181,15 @@ export const daoMultisigDef = defineFiberApp({
|
|
|
182
181
|
eventName: "sign",
|
|
183
182
|
guard: {
|
|
184
183
|
and: [
|
|
185
|
-
|
|
184
|
+
actorInSet("state.signers"),
|
|
186
185
|
{
|
|
187
186
|
"!": [
|
|
188
|
-
{
|
|
187
|
+
{ has: [{ var: "state.signatures" }, { var: "event.agent" }] },
|
|
189
188
|
],
|
|
190
189
|
},
|
|
191
190
|
{
|
|
192
191
|
"<": [
|
|
193
|
-
{
|
|
192
|
+
{ length: [{ keys: [{ var: "state.signatures" }] }] },
|
|
194
193
|
{ var: "state.threshold" },
|
|
195
194
|
],
|
|
196
195
|
},
|
|
@@ -201,10 +200,10 @@ export const daoMultisigDef = defineFiberApp({
|
|
|
201
200
|
{ var: "state" },
|
|
202
201
|
{
|
|
203
202
|
signatures: {
|
|
204
|
-
|
|
203
|
+
set: [
|
|
205
204
|
{ var: "state.signatures" },
|
|
206
205
|
{ var: "event.agent" },
|
|
207
|
-
{ var: "$
|
|
206
|
+
{ var: "$ordinal" },
|
|
208
207
|
],
|
|
209
208
|
},
|
|
210
209
|
},
|
|
@@ -219,7 +218,7 @@ export const daoMultisigDef = defineFiberApp({
|
|
|
219
218
|
eventName: "execute",
|
|
220
219
|
guard: {
|
|
221
220
|
">=": [
|
|
222
|
-
{
|
|
221
|
+
{ length: [{ keys: [{ var: "state.signatures" }] }] },
|
|
223
222
|
{ var: "state.threshold" },
|
|
224
223
|
],
|
|
225
224
|
},
|
|
@@ -236,17 +235,25 @@ export const daoMultisigDef = defineFiberApp({
|
|
|
236
235
|
type: { var: "state.proposal.actionType" },
|
|
237
236
|
payload: { var: "state.proposal.payload" },
|
|
238
237
|
signatures: { var: "state.signatures" },
|
|
239
|
-
executedAt: { var: "$
|
|
238
|
+
executedAt: { var: "$ordinal" },
|
|
240
239
|
},
|
|
241
240
|
],
|
|
242
241
|
],
|
|
243
242
|
},
|
|
244
243
|
proposal: null,
|
|
245
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
|
+
],
|
|
246
254
|
},
|
|
247
255
|
],
|
|
248
256
|
},
|
|
249
|
-
emits: [{ event: "multisig_executed", to: "external" }],
|
|
250
257
|
dependencies: [],
|
|
251
258
|
},
|
|
252
259
|
// PENDING → ACTIVE: cancel (expired or proposer)
|
|
@@ -256,10 +263,8 @@ export const daoMultisigDef = defineFiberApp({
|
|
|
256
263
|
eventName: "cancel",
|
|
257
264
|
guard: {
|
|
258
265
|
or: [
|
|
259
|
-
{ ">": [{ var: "$
|
|
260
|
-
|
|
261
|
-
"===": [{ var: "event.agent" }, { var: "state.proposal.proposer" }],
|
|
262
|
-
},
|
|
266
|
+
{ ">": [{ var: "$ordinal" }, { var: "state.proposal.expiresAt" }] },
|
|
267
|
+
signerIsParty("state.proposal.proposer"),
|
|
263
268
|
],
|
|
264
269
|
},
|
|
265
270
|
effect: {
|
|
@@ -273,7 +278,7 @@ export const daoMultisigDef = defineFiberApp({
|
|
|
273
278
|
{
|
|
274
279
|
merge: [
|
|
275
280
|
{ var: "state.proposal" },
|
|
276
|
-
{ cancelledAt: { var: "$
|
|
281
|
+
{ cancelledAt: { var: "$ordinal" } },
|
|
277
282
|
],
|
|
278
283
|
},
|
|
279
284
|
],
|
|
@@ -291,7 +296,7 @@ export const daoMultisigDef = defineFiberApp({
|
|
|
291
296
|
from: "ACTIVE",
|
|
292
297
|
to: "PENDING",
|
|
293
298
|
eventName: "propose_add_signer",
|
|
294
|
-
guard:
|
|
299
|
+
guard: actorInSet("state.signers"),
|
|
295
300
|
effect: {
|
|
296
301
|
merge: [
|
|
297
302
|
{ var: "state" },
|
|
@@ -301,13 +306,13 @@ export const daoMultisigDef = defineFiberApp({
|
|
|
301
306
|
actionType: "add_signer",
|
|
302
307
|
payload: { newSigner: { var: "event.newSigner" } },
|
|
303
308
|
proposer: { var: "event.agent" },
|
|
304
|
-
proposedAt: { var: "$
|
|
309
|
+
proposedAt: { var: "$ordinal" },
|
|
305
310
|
expiresAt: {
|
|
306
|
-
"+": [{ var: "$
|
|
311
|
+
"+": [{ var: "$ordinal" }, { var: "state.proposalTTLMs" }],
|
|
307
312
|
},
|
|
308
313
|
},
|
|
309
314
|
signatures: {
|
|
310
|
-
|
|
315
|
+
set: [{}, { var: "event.agent" }, { var: "$ordinal" }],
|
|
311
316
|
},
|
|
312
317
|
},
|
|
313
318
|
],
|
|
@@ -321,10 +326,10 @@ export const daoMultisigDef = defineFiberApp({
|
|
|
321
326
|
eventName: "propose_remove_signer",
|
|
322
327
|
guard: {
|
|
323
328
|
and: [
|
|
324
|
-
|
|
329
|
+
actorInSet("state.signers"),
|
|
325
330
|
{
|
|
326
331
|
">": [
|
|
327
|
-
{
|
|
332
|
+
{ length: [{ var: "state.signers" }] },
|
|
328
333
|
{ var: "state.threshold" },
|
|
329
334
|
],
|
|
330
335
|
},
|
|
@@ -339,13 +344,13 @@ export const daoMultisigDef = defineFiberApp({
|
|
|
339
344
|
actionType: "remove_signer",
|
|
340
345
|
payload: { removeSigner: { var: "event.removeSigner" } },
|
|
341
346
|
proposer: { var: "event.agent" },
|
|
342
|
-
proposedAt: { var: "$
|
|
347
|
+
proposedAt: { var: "$ordinal" },
|
|
343
348
|
expiresAt: {
|
|
344
|
-
"+": [{ var: "$
|
|
349
|
+
"+": [{ var: "$ordinal" }, { var: "state.proposalTTLMs" }],
|
|
345
350
|
},
|
|
346
351
|
},
|
|
347
352
|
signatures: {
|
|
348
|
-
|
|
353
|
+
set: [{}, { var: "event.agent" }, { var: "$ordinal" }],
|
|
349
354
|
},
|
|
350
355
|
},
|
|
351
356
|
],
|
|
@@ -359,12 +364,12 @@ export const daoMultisigDef = defineFiberApp({
|
|
|
359
364
|
eventName: "propose_change_threshold",
|
|
360
365
|
guard: {
|
|
361
366
|
and: [
|
|
362
|
-
|
|
367
|
+
actorInSet("state.signers"),
|
|
363
368
|
{ ">=": [{ var: "event.newThreshold" }, 1] },
|
|
364
369
|
{
|
|
365
370
|
"<=": [
|
|
366
371
|
{ var: "event.newThreshold" },
|
|
367
|
-
{
|
|
372
|
+
{ length: [{ var: "state.signers" }] },
|
|
368
373
|
],
|
|
369
374
|
},
|
|
370
375
|
],
|
|
@@ -378,13 +383,13 @@ export const daoMultisigDef = defineFiberApp({
|
|
|
378
383
|
actionType: "change_threshold",
|
|
379
384
|
payload: { newThreshold: { var: "event.newThreshold" } },
|
|
380
385
|
proposer: { var: "event.agent" },
|
|
381
|
-
proposedAt: { var: "$
|
|
386
|
+
proposedAt: { var: "$ordinal" },
|
|
382
387
|
expiresAt: {
|
|
383
|
-
"+": [{ var: "$
|
|
388
|
+
"+": [{ var: "$ordinal" }, { var: "state.proposalTTLMs" }],
|
|
384
389
|
},
|
|
385
390
|
},
|
|
386
391
|
signatures: {
|
|
387
|
-
|
|
392
|
+
set: [{}, { var: "event.agent" }, { var: "$ordinal" }],
|
|
388
393
|
},
|
|
389
394
|
},
|
|
390
395
|
],
|
|
@@ -400,7 +405,7 @@ export const daoMultisigDef = defineFiberApp({
|
|
|
400
405
|
and: [
|
|
401
406
|
{
|
|
402
407
|
">=": [
|
|
403
|
-
{
|
|
408
|
+
{ length: [{ keys: [{ var: "state.signatures" }] }] },
|
|
404
409
|
{ var: "state.threshold" },
|
|
405
410
|
],
|
|
406
411
|
},
|
|
@@ -470,16 +475,29 @@ export const daoMultisigDef = defineFiberApp({
|
|
|
470
475
|
from: "ACTIVE",
|
|
471
476
|
to: "DISSOLVED",
|
|
472
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.
|
|
473
481
|
guard: {
|
|
474
|
-
|
|
475
|
-
{ var: "
|
|
476
|
-
{
|
|
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
|
+
},
|
|
477
495
|
],
|
|
478
496
|
},
|
|
479
497
|
effect: {
|
|
480
498
|
merge: [
|
|
481
499
|
{ var: "state" },
|
|
482
|
-
{ dissolvedAt: { var: "$
|
|
500
|
+
{ dissolvedAt: { var: "$ordinal" }, status: "DISSOLVED" },
|
|
483
501
|
],
|
|
484
502
|
},
|
|
485
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
|
*/
|
|
@@ -176,9 +177,9 @@ export const daoReputationDef = defineFiberApp({
|
|
|
176
177
|
actionType: { var: "event.actionType" },
|
|
177
178
|
payload: { var: "event.payload" },
|
|
178
179
|
proposer: { var: "event.agent" },
|
|
179
|
-
proposedAt: { var: "$
|
|
180
|
+
proposedAt: { var: "$ordinal" },
|
|
180
181
|
deadline: {
|
|
181
|
-
"+": [{ var: "$
|
|
182
|
+
"+": [{ var: "$ordinal" }, { var: "state.votingPeriodMs" }],
|
|
182
183
|
},
|
|
183
184
|
},
|
|
184
185
|
votes: { for: [], against: [], abstain: [] },
|
|
@@ -200,20 +201,10 @@ export const daoReputationDef = defineFiberApp({
|
|
|
200
201
|
{ var: "state.voteThreshold" },
|
|
201
202
|
],
|
|
202
203
|
},
|
|
203
|
-
{
|
|
204
|
-
|
|
205
|
-
},
|
|
206
|
-
{
|
|
207
|
-
"!": [
|
|
208
|
-
{ in: [{ var: "event.agent" }, { var: "state.votes.against" }] },
|
|
209
|
-
],
|
|
210
|
-
},
|
|
211
|
-
{
|
|
212
|
-
"!": [
|
|
213
|
-
{ in: [{ var: "event.agent" }, { var: "state.votes.abstain" }] },
|
|
214
|
-
],
|
|
215
|
-
},
|
|
216
|
-
{ "<=": [{ 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" }] },
|
|
217
208
|
],
|
|
218
209
|
},
|
|
219
210
|
effect: {
|
|
@@ -275,21 +266,23 @@ export const daoReputationDef = defineFiberApp({
|
|
|
275
266
|
from: "VOTING",
|
|
276
267
|
to: "ACTIVE",
|
|
277
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).
|
|
278
271
|
guard: {
|
|
279
272
|
and: [
|
|
280
|
-
{ ">": [{ var: "$
|
|
273
|
+
{ ">": [{ var: "$ordinal" }, { var: "state.proposal.deadline" }] },
|
|
281
274
|
{
|
|
282
275
|
">": [
|
|
283
|
-
{
|
|
284
|
-
{
|
|
276
|
+
{ length: [{ var: "state.votes.for" }] },
|
|
277
|
+
{ length: [{ var: "state.votes.against" }] },
|
|
285
278
|
],
|
|
286
279
|
},
|
|
287
280
|
{
|
|
288
281
|
">=": [
|
|
289
282
|
{
|
|
290
283
|
"+": [
|
|
291
|
-
{
|
|
292
|
-
{
|
|
284
|
+
{ length: [{ var: "state.votes.for" }] },
|
|
285
|
+
{ length: [{ var: "state.votes.against" }] },
|
|
293
286
|
],
|
|
294
287
|
},
|
|
295
288
|
{ var: "state.quorum" },
|
|
@@ -309,23 +302,25 @@ export const daoReputationDef = defineFiberApp({
|
|
|
309
302
|
type: "executed",
|
|
310
303
|
proposal: { var: "state.proposal" },
|
|
311
304
|
votes: { var: "state.votes" },
|
|
312
|
-
at: { var: "$
|
|
305
|
+
at: { var: "$ordinal" },
|
|
313
306
|
},
|
|
314
307
|
],
|
|
315
308
|
],
|
|
316
309
|
},
|
|
317
310
|
proposal: null,
|
|
318
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
|
+
],
|
|
319
321
|
},
|
|
320
322
|
],
|
|
321
323
|
},
|
|
322
|
-
emits: [
|
|
323
|
-
{
|
|
324
|
-
event: "proposal_executed",
|
|
325
|
-
to: "Reputation",
|
|
326
|
-
payload: { action: "increase", agents: { var: "state.votes.for" } },
|
|
327
|
-
},
|
|
328
|
-
],
|
|
329
324
|
dependencies: [],
|
|
330
325
|
},
|
|
331
326
|
// VOTING → ACTIVE: reject (voting ended, for <= against or quorum not met)
|
|
@@ -333,23 +328,25 @@ export const daoReputationDef = defineFiberApp({
|
|
|
333
328
|
from: "VOTING",
|
|
334
329
|
to: "ACTIVE",
|
|
335
330
|
eventName: "reject",
|
|
331
|
+
// A2 fix: count the array-shaped vote tallies with `length` (size is not a JLVM
|
|
332
|
+
// opcode).
|
|
336
333
|
guard: {
|
|
337
334
|
and: [
|
|
338
|
-
{ ">": [{ var: "$
|
|
335
|
+
{ ">": [{ var: "$ordinal" }, { var: "state.proposal.deadline" }] },
|
|
339
336
|
{
|
|
340
337
|
or: [
|
|
341
338
|
{
|
|
342
339
|
"<=": [
|
|
343
|
-
{
|
|
344
|
-
{
|
|
340
|
+
{ length: [{ var: "state.votes.for" }] },
|
|
341
|
+
{ length: [{ var: "state.votes.against" }] },
|
|
345
342
|
],
|
|
346
343
|
},
|
|
347
344
|
{
|
|
348
345
|
"<": [
|
|
349
346
|
{
|
|
350
347
|
"+": [
|
|
351
|
-
{
|
|
352
|
-
{
|
|
348
|
+
{ length: [{ var: "state.votes.for" }] },
|
|
349
|
+
{ length: [{ var: "state.votes.against" }] },
|
|
353
350
|
],
|
|
354
351
|
},
|
|
355
352
|
{ var: "state.quorum" },
|
|
@@ -371,7 +368,7 @@ export const daoReputationDef = defineFiberApp({
|
|
|
371
368
|
type: "rejected",
|
|
372
369
|
proposal: { var: "state.proposal" },
|
|
373
370
|
votes: { var: "state.votes" },
|
|
374
|
-
at: { var: "$
|
|
371
|
+
at: { var: "$ordinal" },
|
|
375
372
|
},
|
|
376
373
|
],
|
|
377
374
|
],
|
|
@@ -388,8 +385,17 @@ export const daoReputationDef = defineFiberApp({
|
|
|
388
385
|
from: "ACTIVE",
|
|
389
386
|
to: "ACTIVE",
|
|
390
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).
|
|
391
396
|
guard: {
|
|
392
397
|
and: [
|
|
398
|
+
actorIsSigner(),
|
|
393
399
|
{
|
|
394
400
|
">=": [
|
|
395
401
|
{ var: "event.agentReputation" },
|
|
@@ -407,10 +413,10 @@ export const daoReputationDef = defineFiberApp({
|
|
|
407
413
|
cat: [{ var: "state.members" }, [{ var: "event.agent" }]],
|
|
408
414
|
},
|
|
409
415
|
memberJoinedAt: {
|
|
410
|
-
|
|
416
|
+
set: [
|
|
411
417
|
{ var: "state.memberJoinedAt" },
|
|
412
418
|
{ var: "event.agent" },
|
|
413
|
-
{ var: "$
|
|
419
|
+
{ var: "$ordinal" },
|
|
414
420
|
],
|
|
415
421
|
},
|
|
416
422
|
},
|
|
@@ -423,7 +429,7 @@ export const daoReputationDef = defineFiberApp({
|
|
|
423
429
|
from: "ACTIVE",
|
|
424
430
|
to: "ACTIVE",
|
|
425
431
|
eventName: "leave",
|
|
426
|
-
guard:
|
|
432
|
+
guard: signerInSet("state.members"),
|
|
427
433
|
effect: {
|
|
428
434
|
merge: [
|
|
429
435
|
{ var: "state" },
|
|
@@ -464,9 +470,9 @@ export const daoReputationDef = defineFiberApp({
|
|
|
464
470
|
proposeThreshold: { var: "event.proposeThreshold" },
|
|
465
471
|
},
|
|
466
472
|
proposer: { var: "event.agent" },
|
|
467
|
-
proposedAt: { var: "$
|
|
473
|
+
proposedAt: { var: "$ordinal" },
|
|
468
474
|
deadline: {
|
|
469
|
-
"+": [{ var: "$
|
|
475
|
+
"+": [{ var: "$ordinal" }, { var: "state.votingPeriodMs" }],
|
|
470
476
|
},
|
|
471
477
|
},
|
|
472
478
|
votes: { for: [], against: [], abstain: [] },
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { defineFiberApp } from "../../../schema/fiber-app.js";
|
|
2
|
+
import { signerIsParty } from "../../../schema/guards.js";
|
|
2
3
|
/**
|
|
3
4
|
* Single owner controls all actions. Simplest governance model.
|
|
4
5
|
*/
|
|
@@ -110,7 +111,7 @@ export const daoSingleDef = defineFiberApp({
|
|
|
110
111
|
from: "ACTIVE",
|
|
111
112
|
to: "ACTIVE",
|
|
112
113
|
eventName: "execute",
|
|
113
|
-
guard:
|
|
114
|
+
guard: signerIsParty("state.owner"),
|
|
114
115
|
effect: {
|
|
115
116
|
merge: [
|
|
116
117
|
{ var: "state" },
|
|
@@ -123,15 +124,23 @@ export const daoSingleDef = defineFiberApp({
|
|
|
123
124
|
id: { var: "event.actionId" },
|
|
124
125
|
type: { var: "event.actionType" },
|
|
125
126
|
payload: { var: "event.payload" },
|
|
126
|
-
executedAt: { var: "$
|
|
127
|
+
executedAt: { var: "$ordinal" },
|
|
127
128
|
},
|
|
128
129
|
],
|
|
129
130
|
],
|
|
130
131
|
},
|
|
132
|
+
// A3 fix: transition-level `emits` is dropped by the chain; emit from INSIDE the effect
|
|
133
|
+
// under the reserved `_emit` key (extracted as an EmittedEvent, stripped from state).
|
|
134
|
+
_emit: [
|
|
135
|
+
{
|
|
136
|
+
name: "action_executed",
|
|
137
|
+
data: { actionId: { var: "event.actionId" } },
|
|
138
|
+
destination: "external",
|
|
139
|
+
},
|
|
140
|
+
],
|
|
131
141
|
},
|
|
132
142
|
],
|
|
133
143
|
},
|
|
134
|
-
emits: [{ event: "action_executed", to: "external" }],
|
|
135
144
|
dependencies: [],
|
|
136
145
|
},
|
|
137
146
|
// ACTIVE → TRANSFERRING: transfer_ownership (owner only)
|
|
@@ -139,13 +148,13 @@ export const daoSingleDef = defineFiberApp({
|
|
|
139
148
|
from: "ACTIVE",
|
|
140
149
|
to: "TRANSFERRING",
|
|
141
150
|
eventName: "transfer_ownership",
|
|
142
|
-
guard:
|
|
151
|
+
guard: signerIsParty("state.owner"),
|
|
143
152
|
effect: {
|
|
144
153
|
merge: [
|
|
145
154
|
{ var: "state" },
|
|
146
155
|
{
|
|
147
156
|
pendingOwner: { var: "event.newOwner" },
|
|
148
|
-
transferInitiatedAt: { var: "$
|
|
157
|
+
transferInitiatedAt: { var: "$ordinal" },
|
|
149
158
|
},
|
|
150
159
|
],
|
|
151
160
|
},
|
|
@@ -156,7 +165,7 @@ export const daoSingleDef = defineFiberApp({
|
|
|
156
165
|
from: "TRANSFERRING",
|
|
157
166
|
to: "ACTIVE",
|
|
158
167
|
eventName: "accept_ownership",
|
|
159
|
-
guard:
|
|
168
|
+
guard: signerIsParty("state.pendingOwner"),
|
|
160
169
|
effect: {
|
|
161
170
|
merge: [
|
|
162
171
|
{ var: "state" },
|
|
@@ -171,15 +180,23 @@ export const daoSingleDef = defineFiberApp({
|
|
|
171
180
|
{
|
|
172
181
|
from: { var: "state.owner" },
|
|
173
182
|
to: { var: "state.pendingOwner" },
|
|
174
|
-
at: { var: "$
|
|
183
|
+
at: { var: "$ordinal" },
|
|
175
184
|
},
|
|
176
185
|
],
|
|
177
186
|
],
|
|
178
187
|
},
|
|
188
|
+
// A3 fix: transition-level `emits` is dropped by the chain; emit from INSIDE the effect
|
|
189
|
+
// under the reserved `_emit` key (extracted as an EmittedEvent, stripped from state).
|
|
190
|
+
_emit: [
|
|
191
|
+
{
|
|
192
|
+
name: "ownership_transferred",
|
|
193
|
+
data: { var: "event" },
|
|
194
|
+
destination: "Identity",
|
|
195
|
+
},
|
|
196
|
+
],
|
|
179
197
|
},
|
|
180
198
|
],
|
|
181
199
|
},
|
|
182
|
-
emits: [{ event: "ownership_transferred", to: "Identity" }],
|
|
183
200
|
dependencies: [],
|
|
184
201
|
},
|
|
185
202
|
// TRANSFERRING → ACTIVE: cancel_transfer (owner only)
|
|
@@ -187,7 +204,7 @@ export const daoSingleDef = defineFiberApp({
|
|
|
187
204
|
from: "TRANSFERRING",
|
|
188
205
|
to: "ACTIVE",
|
|
189
206
|
eventName: "cancel_transfer",
|
|
190
|
-
guard:
|
|
207
|
+
guard: signerIsParty("state.owner"),
|
|
191
208
|
effect: {
|
|
192
209
|
merge: [
|
|
193
210
|
{ var: "state" },
|
|
@@ -204,12 +221,12 @@ export const daoSingleDef = defineFiberApp({
|
|
|
204
221
|
from: "ACTIVE",
|
|
205
222
|
to: "DISSOLVED",
|
|
206
223
|
eventName: "dissolve",
|
|
207
|
-
guard:
|
|
224
|
+
guard: signerIsParty("state.owner"),
|
|
208
225
|
effect: {
|
|
209
226
|
merge: [
|
|
210
227
|
{ var: "state" },
|
|
211
228
|
{
|
|
212
|
-
dissolvedAt: { var: "$
|
|
229
|
+
dissolvedAt: { var: "$ordinal" },
|
|
213
230
|
status: "DISSOLVED",
|
|
214
231
|
},
|
|
215
232
|
],
|