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