@ottochain/sdk 1.7.0-beta.2 → 2.1.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.
Files changed (113) hide show
  1. package/dist/cjs/apps/contracts/index.js +1 -1
  2. package/dist/cjs/apps/contracts/state-machines/contract-agreement.js +272 -0
  3. package/dist/cjs/apps/contracts/state-machines/contract-escrow.js +284 -0
  4. package/dist/cjs/apps/contracts/state-machines/contract-universal.js +93 -0
  5. package/dist/cjs/apps/contracts/state-machines/index.js +177 -1
  6. package/dist/cjs/apps/corporate/state-machines/corp-board.js +1022 -0
  7. package/dist/cjs/apps/corporate/state-machines/corp-entity.js +671 -0
  8. package/dist/cjs/apps/corporate/state-machines/corp-securities.js +998 -0
  9. package/dist/cjs/apps/corporate/state-machines/corp-shareholders.js +1102 -0
  10. package/dist/cjs/apps/corporate/state-machines/index.js +20 -4440
  11. package/dist/cjs/apps/governance/index.js +7 -7
  12. package/dist/cjs/apps/governance/state-machines/dao-multisig.js +467 -0
  13. package/dist/cjs/apps/governance/state-machines/dao-reputation.js +458 -0
  14. package/dist/cjs/apps/governance/state-machines/dao-single.js +199 -0
  15. package/dist/cjs/apps/governance/state-machines/dao-token.js +503 -0
  16. package/dist/cjs/apps/governance/state-machines/governance-simple.js +482 -0
  17. package/dist/cjs/apps/governance/state-machines/governance-universal.js +138 -0
  18. package/dist/cjs/apps/governance/state-machines/index.js +16 -2934
  19. package/dist/cjs/apps/identity/constants.js +20 -20
  20. package/dist/cjs/apps/identity/index.js +13 -21
  21. package/dist/cjs/apps/identity/state-machines/identity-agent.js +256 -0
  22. package/dist/cjs/apps/identity/state-machines/identity-oracle.js +321 -0
  23. package/dist/cjs/apps/identity/state-machines/identity-universal.js +106 -0
  24. package/dist/cjs/apps/identity/state-machines/index.js +15 -784
  25. package/dist/cjs/apps/markets/index.js +1 -1
  26. package/dist/cjs/apps/markets/state-machines/index.js +14 -2298
  27. package/dist/cjs/apps/markets/state-machines/market-auction.js +283 -0
  28. package/dist/cjs/apps/markets/state-machines/market-crowdfund.js +312 -0
  29. package/dist/cjs/apps/markets/state-machines/market-group-buy.js +407 -0
  30. package/dist/cjs/apps/markets/state-machines/market-prediction.js +485 -0
  31. package/dist/cjs/apps/markets/state-machines/market-universal.js +129 -0
  32. package/dist/cjs/apps/oracles/index.js +36 -0
  33. package/dist/cjs/generated/index.js +14 -7
  34. package/dist/cjs/generated/ottochain/apps/identity/v1/identity.js +197 -198
  35. package/dist/cjs/schema/fiber-app.js +55 -0
  36. package/dist/cjs/schema/index.js +20 -0
  37. package/dist/esm/apps/contracts/index.js +3 -3
  38. package/dist/esm/apps/contracts/state-machines/contract-agreement.js +269 -0
  39. package/dist/esm/apps/contracts/state-machines/contract-escrow.js +281 -0
  40. package/dist/esm/apps/contracts/state-machines/contract-universal.js +90 -0
  41. package/dist/esm/apps/contracts/state-machines/index.js +177 -1
  42. package/dist/esm/apps/corporate/index.js +3 -3
  43. package/dist/esm/apps/corporate/state-machines/corp-board.js +1019 -0
  44. package/dist/esm/apps/corporate/state-machines/corp-entity.js +668 -0
  45. package/dist/esm/apps/corporate/state-machines/corp-securities.js +995 -0
  46. package/dist/esm/apps/corporate/state-machines/corp-shareholders.js +1099 -0
  47. package/dist/esm/apps/corporate/state-machines/index.js +15 -4439
  48. package/dist/esm/apps/governance/index.js +9 -9
  49. package/dist/esm/apps/governance/state-machines/dao-multisig.js +464 -0
  50. package/dist/esm/apps/governance/state-machines/dao-reputation.js +455 -0
  51. package/dist/esm/apps/governance/state-machines/dao-single.js +196 -0
  52. package/dist/esm/apps/governance/state-machines/dao-token.js +500 -0
  53. package/dist/esm/apps/governance/state-machines/governance-simple.js +479 -0
  54. package/dist/esm/apps/governance/state-machines/governance-universal.js +135 -0
  55. package/dist/esm/apps/governance/state-machines/index.js +9 -2933
  56. package/dist/esm/apps/identity/constants.js +21 -21
  57. package/dist/esm/apps/identity/index.js +13 -22
  58. package/dist/esm/apps/identity/state-machines/identity-agent.js +253 -0
  59. package/dist/esm/apps/identity/state-machines/identity-oracle.js +318 -0
  60. package/dist/esm/apps/identity/state-machines/identity-universal.js +103 -0
  61. package/dist/esm/apps/identity/state-machines/index.js +11 -783
  62. package/dist/esm/apps/index.js +5 -5
  63. package/dist/esm/apps/markets/index.js +3 -3
  64. package/dist/esm/apps/markets/state-machines/index.js +8 -2297
  65. package/dist/esm/apps/markets/state-machines/market-auction.js +280 -0
  66. package/dist/esm/apps/markets/state-machines/market-crowdfund.js +309 -0
  67. package/dist/esm/apps/markets/state-machines/market-group-buy.js +404 -0
  68. package/dist/esm/apps/markets/state-machines/market-prediction.js +482 -0
  69. package/dist/esm/apps/markets/state-machines/market-universal.js +126 -0
  70. package/dist/esm/apps/oracles/index.js +21 -0
  71. package/dist/esm/generated/index.js +8 -3
  72. package/dist/esm/generated/ottochain/apps/identity/v1/identity.js +196 -197
  73. package/dist/esm/schema/fiber-app.js +47 -0
  74. package/dist/esm/schema/index.js +4 -0
  75. package/dist/types/apps/contracts/index.d.ts +151 -2
  76. package/dist/types/apps/contracts/state-machines/contract-agreement.d.ts +462 -0
  77. package/dist/types/apps/contracts/state-machines/contract-escrow.d.ts +511 -0
  78. package/dist/types/apps/contracts/state-machines/contract-universal.d.ts +147 -0
  79. package/dist/types/apps/contracts/state-machines/index.d.ts +149 -0
  80. package/dist/types/apps/corporate/index.d.ts +5263 -3825
  81. package/dist/types/apps/corporate/state-machines/corp-board.d.ts +1479 -0
  82. package/dist/types/apps/corporate/state-machines/corp-entity.d.ts +970 -0
  83. package/dist/types/apps/corporate/state-machines/corp-securities.d.ts +1381 -0
  84. package/dist/types/apps/corporate/state-machines/corp-shareholders.d.ts +1631 -0
  85. package/dist/types/apps/corporate/state-machines/index.d.ts +5245 -3802
  86. package/dist/types/apps/governance/index.d.ts +875 -37
  87. package/dist/types/apps/governance/state-machines/dao-multisig.d.ts +644 -0
  88. package/dist/types/apps/governance/state-machines/dao-reputation.d.ts +610 -0
  89. package/dist/types/apps/governance/state-machines/dao-single.d.ts +276 -0
  90. package/dist/types/apps/governance/state-machines/dao-token.d.ts +601 -0
  91. package/dist/types/apps/governance/state-machines/governance-simple.d.ts +652 -0
  92. package/dist/types/apps/governance/state-machines/governance-universal.d.ts +181 -0
  93. package/dist/types/apps/governance/state-machines/index.d.ts +9 -2136
  94. package/dist/types/apps/identity/constants.d.ts +4 -7
  95. package/dist/types/apps/identity/index.d.ts +1082 -592
  96. package/dist/types/apps/identity/state-machines/identity-agent.d.ts +401 -0
  97. package/dist/types/apps/identity/state-machines/identity-oracle.d.ts +550 -0
  98. package/dist/types/apps/identity/state-machines/identity-universal.d.ts +151 -0
  99. package/dist/types/apps/identity/state-machines/index.d.ts +1069 -567
  100. package/dist/types/apps/index.d.ts +5 -5
  101. package/dist/types/apps/markets/index.d.ts +535 -7
  102. package/dist/types/apps/markets/state-machines/index.d.ts +8 -1678
  103. package/dist/types/apps/markets/state-machines/market-auction.d.ts +392 -0
  104. package/dist/types/apps/markets/state-machines/market-crowdfund.d.ts +443 -0
  105. package/dist/types/apps/markets/state-machines/market-group-buy.d.ts +539 -0
  106. package/dist/types/apps/markets/state-machines/market-prediction.d.ts +651 -0
  107. package/dist/types/apps/markets/state-machines/market-universal.d.ts +191 -0
  108. package/dist/types/apps/oracles/index.d.ts +18 -0
  109. package/dist/types/generated/index.d.ts +3 -1
  110. package/dist/types/generated/ottochain/apps/identity/v1/identity.d.ts +43 -64
  111. package/dist/types/schema/fiber-app.d.ts +139 -0
  112. package/dist/types/schema/index.d.ts +4 -0
  113. package/package.json +1 -1
@@ -20,11 +20,11 @@
20
20
  * @packageDocumentation
21
21
  */
22
22
  // Re-export generated protobuf types (source of truth)
23
- export { DAOType, DAOStatus, ProposalStatus, VoteChoice, DAOMetadata, Proposal, Vote, VoteTally, SingleOwnerDAO, SingleOwnerAction, OwnershipTransfer, MultisigDAO, MultisigAction, TokenDAO, TokenProposalResult, ThresholdDAO, ThresholdVotes, ThresholdHistoryEntry, CreateDAORequest, ProposeRequest, VoteRequest, ExecuteRequest, dAOTypeFromJSON, dAOTypeToJSON, dAOStatusFromJSON, dAOStatusToJSON, proposalStatusFromJSON, proposalStatusToJSON, voteChoiceFromJSON, voteChoiceToJSON, } from '../../generated/ottochain/apps/governance/v1/governance.js';
23
+ export { DAOType, DAOStatus, ProposalStatus, VoteChoice, DAOMetadata, Proposal, Vote, VoteTally, SingleOwnerDAO, SingleOwnerAction, OwnershipTransfer, MultisigDAO, MultisigAction, TokenDAO, TokenProposalResult, ThresholdDAO, ThresholdVotes, ThresholdHistoryEntry, CreateDAORequest, ProposeRequest, VoteRequest, ExecuteRequest, dAOTypeFromJSON, dAOTypeToJSON, dAOStatusFromJSON, dAOStatusToJSON, proposalStatusFromJSON, proposalStatusToJSON, voteChoiceFromJSON, voteChoiceToJSON, } from "../../generated/ottochain/apps/governance/v1/governance.js";
24
24
  // ---------------------------------------------------------------------------
25
25
  // State Machine Definitions (generated from JSON at build time)
26
26
  // ---------------------------------------------------------------------------
27
- import { govUniversalDef, govSimpleDef, daoSingleDef, daoMultisigDef, daoTokenDef, daoReputationDef, } from './state-machines/index.js';
27
+ import { govUniversalDef, govSimpleDef, daoSingleDef, daoMultisigDef, daoTokenDef, daoReputationDef, } from "./state-machines/index.js";
28
28
  export { govUniversalDef, govSimpleDef, daoSingleDef, daoMultisigDef, daoTokenDef, daoReputationDef, };
29
29
  /** All governance state machine definitions */
30
30
  export const GOVERNANCE_DEFINITIONS = {
@@ -45,10 +45,10 @@ export function getGovernanceDefinition(type) {
45
45
  /** @deprecated Use getGovernanceDefinition('daoSingle' | 'daoMultisig' | 'daoToken' | 'daoReputation') */
46
46
  export function getDAODefinition(daoType) {
47
47
  const map = {
48
- Single: 'daoSingle',
49
- Multisig: 'daoMultisig',
50
- Threshold: 'daoReputation',
51
- Token: 'daoToken',
48
+ Single: "daoSingle",
49
+ Multisig: "daoMultisig",
50
+ Threshold: "daoReputation",
51
+ Token: "daoToken",
52
52
  };
53
53
  return GOVERNANCE_DEFINITIONS[map[daoType]];
54
54
  }
@@ -117,11 +117,11 @@ export function canPropose(state, agent) {
117
117
  */
118
118
  export function meetsThreshold(state, reputation, action) {
119
119
  switch (action) {
120
- case 'member':
120
+ case "member":
121
121
  return reputation >= state.memberThreshold;
122
- case 'vote':
122
+ case "vote":
123
123
  return reputation >= state.voteThreshold;
124
- case 'propose':
124
+ case "propose":
125
125
  return reputation >= state.proposeThreshold;
126
126
  }
127
127
  }
@@ -0,0 +1,464 @@
1
+ import { defineFiberApp } from "../../../schema/fiber-app.js";
2
+ /**
3
+ * N-of-M multisig governance. Requires threshold signatures for actions.
4
+ */
5
+ export const daoMultisigDef = defineFiberApp({
6
+ metadata: {
7
+ name: "MultisigDAO",
8
+ app: "governance",
9
+ type: "daoMultisig",
10
+ version: "1.0.0",
11
+ description: "N-of-M multisig governance. Requires threshold signatures for actions.",
12
+ category: "governance/dao",
13
+ crossReferences: {
14
+ Identity: "signer verification",
15
+ Contract: "action execution targets",
16
+ Treasury: "fund management",
17
+ Escrow: "controlled release",
18
+ },
19
+ },
20
+ createSchema: {
21
+ required: ["signers", "threshold", "proposalTTLMs"],
22
+ properties: {
23
+ signers: {
24
+ type: "array",
25
+ description: "Authorized signer addresses",
26
+ immutable: false,
27
+ },
28
+ threshold: {
29
+ type: "number",
30
+ description: "Number of signatures required to execute",
31
+ },
32
+ proposalTTLMs: {
33
+ type: "number",
34
+ description: "Proposal expiry window in milliseconds",
35
+ },
36
+ },
37
+ },
38
+ stateSchema: {
39
+ properties: {
40
+ signers: { type: "array" },
41
+ threshold: { type: "number" },
42
+ proposalTTLMs: { type: "number" },
43
+ proposal: { type: "object" },
44
+ signatures: { type: "object", computed: true },
45
+ actions: { type: "array", computed: true },
46
+ cancelledProposals: { type: "array", computed: true },
47
+ status: { type: "string", computed: true },
48
+ },
49
+ },
50
+ eventSchemas: {
51
+ propose: {
52
+ description: "Propose an action (signer only)",
53
+ required: ["proposalId", "actionType", "payload"],
54
+ properties: {
55
+ agent: { type: "address" },
56
+ proposalId: { type: "string" },
57
+ actionType: { type: "string" },
58
+ payload: { type: "object" },
59
+ },
60
+ },
61
+ sign: {
62
+ description: "Sign the current proposal (signer only, no double-signing)",
63
+ properties: {
64
+ agent: { type: "address" },
65
+ },
66
+ },
67
+ execute: {
68
+ description: "Execute once threshold signatures collected",
69
+ properties: {
70
+ agent: { type: "address" },
71
+ },
72
+ },
73
+ cancel: {
74
+ description: "Cancel proposal (expired or proposer)",
75
+ properties: {
76
+ agent: { type: "address" },
77
+ },
78
+ },
79
+ propose_add_signer: {
80
+ description: "Propose adding a new signer (signer only)",
81
+ required: ["proposalId", "newSigner"],
82
+ properties: {
83
+ agent: { type: "address" },
84
+ proposalId: { type: "string" },
85
+ newSigner: { type: "address" },
86
+ },
87
+ },
88
+ propose_remove_signer: {
89
+ description: "Propose removing a signer (signer only, must keep > threshold signers)",
90
+ required: ["proposalId", "removeSigner"],
91
+ properties: {
92
+ agent: { type: "address" },
93
+ proposalId: { type: "string" },
94
+ removeSigner: { type: "address" },
95
+ },
96
+ },
97
+ propose_change_threshold: {
98
+ description: "Propose changing the signature threshold",
99
+ required: ["proposalId", "newThreshold"],
100
+ properties: {
101
+ agent: { type: "address" },
102
+ proposalId: { type: "string" },
103
+ newThreshold: { type: "number", minimum: 1 },
104
+ },
105
+ },
106
+ apply_signer_change: {
107
+ description: "Apply approved signer-set or threshold change",
108
+ properties: {
109
+ agent: { type: "address" },
110
+ },
111
+ },
112
+ dissolve: {
113
+ description: "Dissolve the DAO (requires unanimous signer count)",
114
+ properties: {
115
+ signatureCount: { type: "number" },
116
+ },
117
+ },
118
+ },
119
+ states: {
120
+ ACTIVE: { id: "ACTIVE", isFinal: false, metadata: null },
121
+ PENDING: { id: "PENDING", isFinal: false, metadata: null },
122
+ DISSOLVED: { id: "DISSOLVED", isFinal: true, metadata: null },
123
+ },
124
+ initialState: "ACTIVE",
125
+ transitions: [
126
+ // ACTIVE → PENDING: propose (signer only)
127
+ {
128
+ from: "ACTIVE",
129
+ to: "PENDING",
130
+ eventName: "propose",
131
+ guard: { in: [{ var: "event.agent" }, { var: "state.signers" }] },
132
+ effect: {
133
+ merge: [
134
+ { var: "state" },
135
+ {
136
+ proposal: {
137
+ id: { var: "event.proposalId" },
138
+ actionType: { var: "event.actionType" },
139
+ payload: { var: "event.payload" },
140
+ proposer: { var: "event.agent" },
141
+ proposedAt: { var: "$timestamp" },
142
+ expiresAt: {
143
+ "+": [{ var: "$timestamp" }, { var: "state.proposalTTLMs" }],
144
+ },
145
+ },
146
+ signatures: {
147
+ setKey: [{}, { var: "event.agent" }, { var: "$timestamp" }],
148
+ },
149
+ },
150
+ ],
151
+ },
152
+ dependencies: [],
153
+ },
154
+ // PENDING → PENDING: sign (signer, no double-sign, not yet at threshold)
155
+ {
156
+ from: "PENDING",
157
+ to: "PENDING",
158
+ eventName: "sign",
159
+ guard: {
160
+ and: [
161
+ { in: [{ var: "event.agent" }, { var: "state.signers" }] },
162
+ {
163
+ "!": [
164
+ { getKey: [{ var: "state.signatures" }, { var: "event.agent" }] },
165
+ ],
166
+ },
167
+ {
168
+ "<": [
169
+ { size: { var: "state.signatures" } },
170
+ { var: "state.threshold" },
171
+ ],
172
+ },
173
+ ],
174
+ },
175
+ effect: {
176
+ merge: [
177
+ { var: "state" },
178
+ {
179
+ signatures: {
180
+ setKey: [
181
+ { var: "state.signatures" },
182
+ { var: "event.agent" },
183
+ { var: "$timestamp" },
184
+ ],
185
+ },
186
+ },
187
+ ],
188
+ },
189
+ dependencies: [],
190
+ },
191
+ // PENDING → ACTIVE: execute (threshold met)
192
+ {
193
+ from: "PENDING",
194
+ to: "ACTIVE",
195
+ eventName: "execute",
196
+ guard: {
197
+ ">=": [
198
+ { size: { var: "state.signatures" } },
199
+ { var: "state.threshold" },
200
+ ],
201
+ },
202
+ effect: {
203
+ merge: [
204
+ { var: "state" },
205
+ {
206
+ actions: {
207
+ cat: [
208
+ { var: "state.actions" },
209
+ [
210
+ {
211
+ id: { var: "state.proposal.id" },
212
+ type: { var: "state.proposal.actionType" },
213
+ payload: { var: "state.proposal.payload" },
214
+ signatures: { var: "state.signatures" },
215
+ executedAt: { var: "$timestamp" },
216
+ },
217
+ ],
218
+ ],
219
+ },
220
+ proposal: null,
221
+ signatures: {},
222
+ },
223
+ ],
224
+ },
225
+ emits: [{ event: "multisig_executed", to: "external" }],
226
+ dependencies: [],
227
+ },
228
+ // PENDING → ACTIVE: cancel (expired or proposer)
229
+ {
230
+ from: "PENDING",
231
+ to: "ACTIVE",
232
+ eventName: "cancel",
233
+ guard: {
234
+ or: [
235
+ { ">": [{ var: "$timestamp" }, { var: "state.proposal.expiresAt" }] },
236
+ {
237
+ "===": [{ var: "event.agent" }, { var: "state.proposal.proposer" }],
238
+ },
239
+ ],
240
+ },
241
+ effect: {
242
+ merge: [
243
+ { var: "state" },
244
+ {
245
+ cancelledProposals: {
246
+ cat: [
247
+ { var: "state.cancelledProposals" },
248
+ [
249
+ {
250
+ merge: [
251
+ { var: "state.proposal" },
252
+ { cancelledAt: { var: "$timestamp" } },
253
+ ],
254
+ },
255
+ ],
256
+ ],
257
+ },
258
+ proposal: null,
259
+ signatures: {},
260
+ },
261
+ ],
262
+ },
263
+ dependencies: [],
264
+ },
265
+ // ACTIVE → PENDING: propose_add_signer
266
+ {
267
+ from: "ACTIVE",
268
+ to: "PENDING",
269
+ eventName: "propose_add_signer",
270
+ guard: { in: [{ var: "event.agent" }, { var: "state.signers" }] },
271
+ effect: {
272
+ merge: [
273
+ { var: "state" },
274
+ {
275
+ proposal: {
276
+ id: { var: "event.proposalId" },
277
+ actionType: "add_signer",
278
+ payload: { newSigner: { var: "event.newSigner" } },
279
+ proposer: { var: "event.agent" },
280
+ proposedAt: { var: "$timestamp" },
281
+ expiresAt: {
282
+ "+": [{ var: "$timestamp" }, { var: "state.proposalTTLMs" }],
283
+ },
284
+ },
285
+ signatures: {
286
+ setKey: [{}, { var: "event.agent" }, { var: "$timestamp" }],
287
+ },
288
+ },
289
+ ],
290
+ },
291
+ dependencies: [],
292
+ },
293
+ // ACTIVE → PENDING: propose_remove_signer (signers > threshold)
294
+ {
295
+ from: "ACTIVE",
296
+ to: "PENDING",
297
+ eventName: "propose_remove_signer",
298
+ guard: {
299
+ and: [
300
+ { in: [{ var: "event.agent" }, { var: "state.signers" }] },
301
+ {
302
+ ">": [
303
+ { size: { var: "state.signers" } },
304
+ { var: "state.threshold" },
305
+ ],
306
+ },
307
+ ],
308
+ },
309
+ effect: {
310
+ merge: [
311
+ { var: "state" },
312
+ {
313
+ proposal: {
314
+ id: { var: "event.proposalId" },
315
+ actionType: "remove_signer",
316
+ payload: { removeSigner: { var: "event.removeSigner" } },
317
+ proposer: { var: "event.agent" },
318
+ proposedAt: { var: "$timestamp" },
319
+ expiresAt: {
320
+ "+": [{ var: "$timestamp" }, { var: "state.proposalTTLMs" }],
321
+ },
322
+ },
323
+ signatures: {
324
+ setKey: [{}, { var: "event.agent" }, { var: "$timestamp" }],
325
+ },
326
+ },
327
+ ],
328
+ },
329
+ dependencies: [],
330
+ },
331
+ // ACTIVE → PENDING: propose_change_threshold (1 <= new <= signers count)
332
+ {
333
+ from: "ACTIVE",
334
+ to: "PENDING",
335
+ eventName: "propose_change_threshold",
336
+ guard: {
337
+ and: [
338
+ { in: [{ var: "event.agent" }, { var: "state.signers" }] },
339
+ { ">=": [{ var: "event.newThreshold" }, 1] },
340
+ {
341
+ "<=": [
342
+ { var: "event.newThreshold" },
343
+ { size: { var: "state.signers" } },
344
+ ],
345
+ },
346
+ ],
347
+ },
348
+ effect: {
349
+ merge: [
350
+ { var: "state" },
351
+ {
352
+ proposal: {
353
+ id: { var: "event.proposalId" },
354
+ actionType: "change_threshold",
355
+ payload: { newThreshold: { var: "event.newThreshold" } },
356
+ proposer: { var: "event.agent" },
357
+ proposedAt: { var: "$timestamp" },
358
+ expiresAt: {
359
+ "+": [{ var: "$timestamp" }, { var: "state.proposalTTLMs" }],
360
+ },
361
+ },
362
+ signatures: {
363
+ setKey: [{}, { var: "event.agent" }, { var: "$timestamp" }],
364
+ },
365
+ },
366
+ ],
367
+ },
368
+ dependencies: [],
369
+ },
370
+ // PENDING → ACTIVE: apply_signer_change (threshold met, signer-type proposal)
371
+ {
372
+ from: "PENDING",
373
+ to: "ACTIVE",
374
+ eventName: "apply_signer_change",
375
+ guard: {
376
+ and: [
377
+ {
378
+ ">=": [
379
+ { size: { var: "state.signatures" } },
380
+ { var: "state.threshold" },
381
+ ],
382
+ },
383
+ {
384
+ in: [
385
+ { var: "state.proposal.actionType" },
386
+ ["add_signer", "remove_signer", "change_threshold"],
387
+ ],
388
+ },
389
+ ],
390
+ },
391
+ effect: {
392
+ if: [
393
+ { "===": [{ var: "state.proposal.actionType" }, "add_signer"] },
394
+ {
395
+ merge: [
396
+ { var: "state" },
397
+ {
398
+ signers: {
399
+ cat: [
400
+ { var: "state.signers" },
401
+ [{ var: "state.proposal.payload.newSigner" }],
402
+ ],
403
+ },
404
+ proposal: null,
405
+ signatures: {},
406
+ },
407
+ ],
408
+ },
409
+ { "===": [{ var: "state.proposal.actionType" }, "remove_signer"] },
410
+ {
411
+ merge: [
412
+ { var: "state" },
413
+ {
414
+ signers: {
415
+ filter: [
416
+ { var: "state.signers" },
417
+ {
418
+ "!==": [
419
+ { var: "" },
420
+ { var: "state.proposal.payload.removeSigner" },
421
+ ],
422
+ },
423
+ ],
424
+ },
425
+ proposal: null,
426
+ signatures: {},
427
+ },
428
+ ],
429
+ },
430
+ {
431
+ merge: [
432
+ { var: "state" },
433
+ {
434
+ threshold: { var: "state.proposal.payload.newThreshold" },
435
+ proposal: null,
436
+ signatures: {},
437
+ },
438
+ ],
439
+ },
440
+ ],
441
+ },
442
+ dependencies: [],
443
+ },
444
+ // ACTIVE → DISSOLVED: dissolve (unanimous)
445
+ {
446
+ from: "ACTIVE",
447
+ to: "DISSOLVED",
448
+ eventName: "dissolve",
449
+ guard: {
450
+ "===": [
451
+ { var: "event.signatureCount" },
452
+ { size: { var: "state.signers" } },
453
+ ],
454
+ },
455
+ effect: {
456
+ merge: [
457
+ { var: "state" },
458
+ { dissolvedAt: { var: "$timestamp" }, status: "DISSOLVED" },
459
+ ],
460
+ },
461
+ dependencies: [],
462
+ },
463
+ ],
464
+ });