@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
@@ -0,0 +1,455 @@
1
+ import { defineFiberApp } from "../../../schema/fiber-app.js";
2
+ /**
3
+ * Reputation-based governance. Minimum reputation required for participation.
4
+ */
5
+ export const daoReputationDef = defineFiberApp({
6
+ metadata: {
7
+ name: "DAOReputation",
8
+ app: "governance",
9
+ type: "daoReputation",
10
+ version: "1.0.0",
11
+ description: "Reputation-based governance. Minimum reputation required for participation.",
12
+ category: "governance/dao",
13
+ crossReferences: {
14
+ Identity: "member verification",
15
+ Reputation: "threshold checks",
16
+ Contract: "action execution",
17
+ },
18
+ },
19
+ createSchema: {
20
+ required: [
21
+ "memberThreshold",
22
+ "voteThreshold",
23
+ "proposeThreshold",
24
+ "quorum",
25
+ "votingPeriodMs",
26
+ ],
27
+ properties: {
28
+ memberThreshold: {
29
+ type: "number",
30
+ description: "Min reputation to join as a member",
31
+ },
32
+ voteThreshold: { type: "number", description: "Min reputation to vote" },
33
+ proposeThreshold: {
34
+ type: "number",
35
+ description: "Min reputation to submit a proposal",
36
+ },
37
+ quorum: {
38
+ type: "number",
39
+ description: "Min total votes (count) to execute",
40
+ },
41
+ votingPeriodMs: {
42
+ type: "number",
43
+ description: "Voting window in milliseconds",
44
+ },
45
+ },
46
+ },
47
+ stateSchema: {
48
+ properties: {
49
+ members: { type: "array", computed: true },
50
+ memberJoinedAt: { type: "object", computed: true },
51
+ memberThreshold: { type: "number" },
52
+ voteThreshold: { type: "number" },
53
+ proposeThreshold: { type: "number" },
54
+ quorum: { type: "number" },
55
+ votingPeriodMs: { type: "number" },
56
+ proposal: { type: "object" },
57
+ votes: { type: "object", computed: true },
58
+ history: { type: "array", computed: true },
59
+ },
60
+ },
61
+ eventSchemas: {
62
+ propose: {
63
+ description: "Submit a proposal (requires >= proposeThreshold reputation)",
64
+ required: [
65
+ "proposalId",
66
+ "title",
67
+ "description",
68
+ "actionType",
69
+ "payload",
70
+ "agentReputation",
71
+ ],
72
+ properties: {
73
+ agent: { type: "address" },
74
+ agentReputation: { type: "number" },
75
+ proposalId: { type: "string" },
76
+ title: { type: "string" },
77
+ description: { type: "string" },
78
+ actionType: { type: "string" },
79
+ payload: { type: "object" },
80
+ },
81
+ },
82
+ vote: {
83
+ description: "Cast a vote (requires >= voteThreshold, no double-vote, within window)",
84
+ required: ["vote", "agentReputation"],
85
+ properties: {
86
+ agent: { type: "address" },
87
+ agentReputation: { type: "number" },
88
+ vote: { type: "string", description: '"for" | "against" | "abstain"' },
89
+ },
90
+ },
91
+ execute: {
92
+ description: "Execute a passing proposal after voting ends",
93
+ properties: {},
94
+ },
95
+ reject: {
96
+ description: "Formally reject a failed proposal",
97
+ properties: {},
98
+ },
99
+ join: {
100
+ description: "Join the DAO (requires >= memberThreshold reputation)",
101
+ required: ["agentReputation"],
102
+ properties: {
103
+ agent: { type: "address" },
104
+ agentReputation: { type: "number" },
105
+ },
106
+ },
107
+ leave: {
108
+ description: "Leave the DAO voluntarily",
109
+ properties: {
110
+ agent: { type: "address" },
111
+ },
112
+ },
113
+ propose_threshold_change: {
114
+ description: "Propose changing reputation thresholds",
115
+ required: ["proposalId", "agentReputation"],
116
+ properties: {
117
+ agent: { type: "address" },
118
+ agentReputation: { type: "number" },
119
+ proposalId: { type: "string" },
120
+ memberThreshold: { type: "number" },
121
+ voteThreshold: { type: "number" },
122
+ proposeThreshold: { type: "number" },
123
+ },
124
+ },
125
+ },
126
+ states: {
127
+ ACTIVE: { id: "ACTIVE", isFinal: false, metadata: null },
128
+ VOTING: { id: "VOTING", isFinal: false, metadata: null },
129
+ DISSOLVED: { id: "DISSOLVED", isFinal: true, metadata: null },
130
+ },
131
+ initialState: "ACTIVE",
132
+ transitions: [
133
+ // ACTIVE → VOTING: propose (reputation check)
134
+ {
135
+ from: "ACTIVE",
136
+ to: "VOTING",
137
+ eventName: "propose",
138
+ guard: {
139
+ ">=": [
140
+ { var: "event.agentReputation" },
141
+ { var: "state.proposeThreshold" },
142
+ ],
143
+ },
144
+ effect: {
145
+ merge: [
146
+ { var: "state" },
147
+ {
148
+ proposal: {
149
+ id: { var: "event.proposalId" },
150
+ title: { var: "event.title" },
151
+ description: { var: "event.description" },
152
+ actionType: { var: "event.actionType" },
153
+ payload: { var: "event.payload" },
154
+ proposer: { var: "event.agent" },
155
+ proposedAt: { var: "$timestamp" },
156
+ deadline: {
157
+ "+": [{ var: "$timestamp" }, { var: "state.votingPeriodMs" }],
158
+ },
159
+ },
160
+ votes: { for: [], against: [], abstain: [] },
161
+ },
162
+ ],
163
+ },
164
+ dependencies: [],
165
+ },
166
+ // VOTING → VOTING: vote (reputation check, no double-vote, within window)
167
+ {
168
+ from: "VOTING",
169
+ to: "VOTING",
170
+ eventName: "vote",
171
+ guard: {
172
+ and: [
173
+ {
174
+ ">=": [
175
+ { var: "event.agentReputation" },
176
+ { var: "state.voteThreshold" },
177
+ ],
178
+ },
179
+ {
180
+ "!": [{ in: [{ var: "event.agent" }, { var: "state.votes.for" }] }],
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" }] },
193
+ ],
194
+ },
195
+ effect: {
196
+ merge: [
197
+ { var: "state" },
198
+ {
199
+ votes: {
200
+ if: [
201
+ { "===": [{ var: "event.vote" }, "for"] },
202
+ {
203
+ merge: [
204
+ { var: "state.votes" },
205
+ {
206
+ for: {
207
+ cat: [
208
+ { var: "state.votes.for" },
209
+ [{ var: "event.agent" }],
210
+ ],
211
+ },
212
+ },
213
+ ],
214
+ },
215
+ { "===": [{ var: "event.vote" }, "against"] },
216
+ {
217
+ merge: [
218
+ { var: "state.votes" },
219
+ {
220
+ against: {
221
+ cat: [
222
+ { var: "state.votes.against" },
223
+ [{ var: "event.agent" }],
224
+ ],
225
+ },
226
+ },
227
+ ],
228
+ },
229
+ {
230
+ merge: [
231
+ { var: "state.votes" },
232
+ {
233
+ abstain: {
234
+ cat: [
235
+ { var: "state.votes.abstain" },
236
+ [{ var: "event.agent" }],
237
+ ],
238
+ },
239
+ },
240
+ ],
241
+ },
242
+ ],
243
+ },
244
+ },
245
+ ],
246
+ },
247
+ dependencies: [],
248
+ },
249
+ // VOTING → ACTIVE: execute (voting ended, for > against, quorum met)
250
+ {
251
+ from: "VOTING",
252
+ to: "ACTIVE",
253
+ eventName: "execute",
254
+ guard: {
255
+ and: [
256
+ { ">": [{ var: "$timestamp" }, { var: "state.proposal.deadline" }] },
257
+ {
258
+ ">": [
259
+ { size: { var: "state.votes.for" } },
260
+ { size: { var: "state.votes.against" } },
261
+ ],
262
+ },
263
+ {
264
+ ">=": [
265
+ {
266
+ "+": [
267
+ { size: { var: "state.votes.for" } },
268
+ { size: { var: "state.votes.against" } },
269
+ ],
270
+ },
271
+ { var: "state.quorum" },
272
+ ],
273
+ },
274
+ ],
275
+ },
276
+ effect: {
277
+ merge: [
278
+ { var: "state" },
279
+ {
280
+ history: {
281
+ cat: [
282
+ { var: "state.history" },
283
+ [
284
+ {
285
+ type: "executed",
286
+ proposal: { var: "state.proposal" },
287
+ votes: { var: "state.votes" },
288
+ at: { var: "$timestamp" },
289
+ },
290
+ ],
291
+ ],
292
+ },
293
+ proposal: null,
294
+ votes: null,
295
+ },
296
+ ],
297
+ },
298
+ emits: [
299
+ {
300
+ event: "proposal_executed",
301
+ to: "Reputation",
302
+ payload: { action: "increase", agents: { var: "state.votes.for" } },
303
+ },
304
+ ],
305
+ dependencies: [],
306
+ },
307
+ // VOTING → ACTIVE: reject (voting ended, for <= against or quorum not met)
308
+ {
309
+ from: "VOTING",
310
+ to: "ACTIVE",
311
+ eventName: "reject",
312
+ guard: {
313
+ and: [
314
+ { ">": [{ var: "$timestamp" }, { var: "state.proposal.deadline" }] },
315
+ {
316
+ or: [
317
+ {
318
+ "<=": [
319
+ { size: { var: "state.votes.for" } },
320
+ { size: { var: "state.votes.against" } },
321
+ ],
322
+ },
323
+ {
324
+ "<": [
325
+ {
326
+ "+": [
327
+ { size: { var: "state.votes.for" } },
328
+ { size: { var: "state.votes.against" } },
329
+ ],
330
+ },
331
+ { var: "state.quorum" },
332
+ ],
333
+ },
334
+ ],
335
+ },
336
+ ],
337
+ },
338
+ effect: {
339
+ merge: [
340
+ { var: "state" },
341
+ {
342
+ history: {
343
+ cat: [
344
+ { var: "state.history" },
345
+ [
346
+ {
347
+ type: "rejected",
348
+ proposal: { var: "state.proposal" },
349
+ votes: { var: "state.votes" },
350
+ at: { var: "$timestamp" },
351
+ },
352
+ ],
353
+ ],
354
+ },
355
+ proposal: null,
356
+ votes: null,
357
+ },
358
+ ],
359
+ },
360
+ dependencies: [],
361
+ },
362
+ // ACTIVE → ACTIVE: join (reputation check, not already member)
363
+ {
364
+ from: "ACTIVE",
365
+ to: "ACTIVE",
366
+ eventName: "join",
367
+ guard: {
368
+ and: [
369
+ {
370
+ ">=": [
371
+ { var: "event.agentReputation" },
372
+ { var: "state.memberThreshold" },
373
+ ],
374
+ },
375
+ { "!": [{ in: [{ var: "event.agent" }, { var: "state.members" }] }] },
376
+ ],
377
+ },
378
+ effect: {
379
+ merge: [
380
+ { var: "state" },
381
+ {
382
+ members: {
383
+ cat: [{ var: "state.members" }, [{ var: "event.agent" }]],
384
+ },
385
+ memberJoinedAt: {
386
+ setKey: [
387
+ { var: "state.memberJoinedAt" },
388
+ { var: "event.agent" },
389
+ { var: "$timestamp" },
390
+ ],
391
+ },
392
+ },
393
+ ],
394
+ },
395
+ dependencies: [],
396
+ },
397
+ // ACTIVE → ACTIVE: leave (member only)
398
+ {
399
+ from: "ACTIVE",
400
+ to: "ACTIVE",
401
+ eventName: "leave",
402
+ guard: { in: [{ var: "event.agent" }, { var: "state.members" }] },
403
+ effect: {
404
+ merge: [
405
+ { var: "state" },
406
+ {
407
+ members: {
408
+ filter: [
409
+ { var: "state.members" },
410
+ { "!==": [{ var: "" }, { var: "event.agent" }] },
411
+ ],
412
+ },
413
+ },
414
+ ],
415
+ },
416
+ dependencies: [],
417
+ },
418
+ // ACTIVE → VOTING: propose_threshold_change
419
+ {
420
+ from: "ACTIVE",
421
+ to: "VOTING",
422
+ eventName: "propose_threshold_change",
423
+ guard: {
424
+ ">=": [
425
+ { var: "event.agentReputation" },
426
+ { var: "state.proposeThreshold" },
427
+ ],
428
+ },
429
+ effect: {
430
+ merge: [
431
+ { var: "state" },
432
+ {
433
+ proposal: {
434
+ id: { var: "event.proposalId" },
435
+ title: "Threshold Change",
436
+ actionType: "threshold_change",
437
+ payload: {
438
+ memberThreshold: { var: "event.memberThreshold" },
439
+ voteThreshold: { var: "event.voteThreshold" },
440
+ proposeThreshold: { var: "event.proposeThreshold" },
441
+ },
442
+ proposer: { var: "event.agent" },
443
+ proposedAt: { var: "$timestamp" },
444
+ deadline: {
445
+ "+": [{ var: "$timestamp" }, { var: "state.votingPeriodMs" }],
446
+ },
447
+ },
448
+ votes: { for: [], against: [], abstain: [] },
449
+ },
450
+ ],
451
+ },
452
+ dependencies: [],
453
+ },
454
+ ],
455
+ });
@@ -0,0 +1,196 @@
1
+ import { defineFiberApp } from "../../../schema/fiber-app.js";
2
+ /**
3
+ * Single owner controls all actions. Simplest governance model.
4
+ */
5
+ export const daoSingleDef = defineFiberApp({
6
+ metadata: {
7
+ name: "SingleOwnerDAO",
8
+ app: "governance",
9
+ type: "daoSingle",
10
+ version: "1.0.0",
11
+ description: "Single owner controls all actions. Simplest governance model.",
12
+ category: "governance/dao",
13
+ crossReferences: {
14
+ Identity: "owner registration",
15
+ Contract: "action execution targets",
16
+ Treasury: "fund management",
17
+ },
18
+ },
19
+ createSchema: {
20
+ required: ["owner"],
21
+ properties: {
22
+ owner: {
23
+ type: "address",
24
+ description: "DAG address of the initial owner",
25
+ immutable: false,
26
+ },
27
+ },
28
+ },
29
+ stateSchema: {
30
+ properties: {
31
+ owner: { type: "address" },
32
+ pendingOwner: { type: "address" },
33
+ transferInitiatedAt: { type: "timestamp" },
34
+ ownershipHistory: { type: "array", computed: true },
35
+ actions: { type: "array", computed: true },
36
+ status: { type: "string", computed: true },
37
+ },
38
+ },
39
+ eventSchemas: {
40
+ execute: {
41
+ description: "Execute an action (owner only)",
42
+ required: ["actionId", "actionType", "payload"],
43
+ properties: {
44
+ agent: { type: "address" },
45
+ actionId: { type: "string" },
46
+ actionType: { type: "string" },
47
+ payload: { type: "object" },
48
+ },
49
+ },
50
+ transfer_ownership: {
51
+ description: "Initiate ownership transfer (owner only)",
52
+ required: ["newOwner"],
53
+ properties: {
54
+ agent: { type: "address" },
55
+ newOwner: { type: "address" },
56
+ },
57
+ },
58
+ accept_ownership: {
59
+ description: "Accept ownership (pending owner only)",
60
+ properties: {
61
+ agent: { type: "address" },
62
+ },
63
+ },
64
+ cancel_transfer: {
65
+ description: "Cancel pending ownership transfer (owner only)",
66
+ properties: {
67
+ agent: { type: "address" },
68
+ },
69
+ },
70
+ dissolve: {
71
+ description: "Dissolve the DAO (owner only)",
72
+ properties: {
73
+ agent: { type: "address" },
74
+ },
75
+ },
76
+ },
77
+ states: {
78
+ ACTIVE: { id: "ACTIVE", isFinal: false, metadata: null },
79
+ TRANSFERRING: { id: "TRANSFERRING", isFinal: false, metadata: null },
80
+ DISSOLVED: { id: "DISSOLVED", isFinal: true, metadata: null },
81
+ },
82
+ initialState: "ACTIVE",
83
+ transitions: [
84
+ // ACTIVE → ACTIVE: execute (owner only)
85
+ {
86
+ from: "ACTIVE",
87
+ to: "ACTIVE",
88
+ eventName: "execute",
89
+ guard: { "===": [{ var: "event.agent" }, { var: "state.owner" }] },
90
+ effect: {
91
+ merge: [
92
+ { var: "state" },
93
+ {
94
+ actions: {
95
+ cat: [
96
+ { var: "state.actions" },
97
+ [
98
+ {
99
+ id: { var: "event.actionId" },
100
+ type: { var: "event.actionType" },
101
+ payload: { var: "event.payload" },
102
+ executedAt: { var: "$timestamp" },
103
+ },
104
+ ],
105
+ ],
106
+ },
107
+ },
108
+ ],
109
+ },
110
+ emits: [{ event: "action_executed", to: "external" }],
111
+ dependencies: [],
112
+ },
113
+ // ACTIVE → TRANSFERRING: transfer_ownership (owner only)
114
+ {
115
+ from: "ACTIVE",
116
+ to: "TRANSFERRING",
117
+ eventName: "transfer_ownership",
118
+ guard: { "===": [{ var: "event.agent" }, { var: "state.owner" }] },
119
+ effect: {
120
+ merge: [
121
+ { var: "state" },
122
+ {
123
+ pendingOwner: { var: "event.newOwner" },
124
+ transferInitiatedAt: { var: "$timestamp" },
125
+ },
126
+ ],
127
+ },
128
+ dependencies: [],
129
+ },
130
+ // TRANSFERRING → ACTIVE: accept_ownership (pending owner only)
131
+ {
132
+ from: "TRANSFERRING",
133
+ to: "ACTIVE",
134
+ eventName: "accept_ownership",
135
+ guard: { "===": [{ var: "event.agent" }, { var: "state.pendingOwner" }] },
136
+ effect: {
137
+ merge: [
138
+ { var: "state" },
139
+ {
140
+ owner: { var: "state.pendingOwner" },
141
+ pendingOwner: null,
142
+ transferInitiatedAt: null,
143
+ ownershipHistory: {
144
+ cat: [
145
+ { var: "state.ownershipHistory" },
146
+ [
147
+ {
148
+ from: { var: "state.owner" },
149
+ to: { var: "state.pendingOwner" },
150
+ at: { var: "$timestamp" },
151
+ },
152
+ ],
153
+ ],
154
+ },
155
+ },
156
+ ],
157
+ },
158
+ emits: [{ event: "ownership_transferred", to: "Identity" }],
159
+ dependencies: [],
160
+ },
161
+ // TRANSFERRING → ACTIVE: cancel_transfer (owner only)
162
+ {
163
+ from: "TRANSFERRING",
164
+ to: "ACTIVE",
165
+ eventName: "cancel_transfer",
166
+ guard: { "===": [{ var: "event.agent" }, { var: "state.owner" }] },
167
+ effect: {
168
+ merge: [
169
+ { var: "state" },
170
+ {
171
+ pendingOwner: null,
172
+ transferInitiatedAt: null,
173
+ },
174
+ ],
175
+ },
176
+ dependencies: [],
177
+ },
178
+ // ACTIVE → DISSOLVED: dissolve (owner only)
179
+ {
180
+ from: "ACTIVE",
181
+ to: "DISSOLVED",
182
+ eventName: "dissolve",
183
+ guard: { "===": [{ var: "event.agent" }, { var: "state.owner" }] },
184
+ effect: {
185
+ merge: [
186
+ { var: "state" },
187
+ {
188
+ dissolvedAt: { var: "$timestamp" },
189
+ status: "DISSOLVED",
190
+ },
191
+ ],
192
+ },
193
+ dependencies: [],
194
+ },
195
+ ],
196
+ });