@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,479 @@
1
+ import { defineFiberApp } from "../../../schema/fiber-app.js";
2
+ /**
3
+ * Simple org governance: manage members, update rules, resolve disputes.
4
+ */
5
+ export const govSimpleDef = defineFiberApp({
6
+ metadata: {
7
+ name: "Governance",
8
+ app: "governance",
9
+ type: "simple",
10
+ version: "1.0.0",
11
+ description: "Simple org governance: manage members, update rules, resolve disputes",
12
+ },
13
+ createSchema: {
14
+ required: [
15
+ "admins",
16
+ "passingThreshold",
17
+ "disputeQuorum",
18
+ "votingPeriodMs",
19
+ ],
20
+ properties: {
21
+ admins: {
22
+ type: "array",
23
+ description: "Initial admin addresses",
24
+ immutable: false,
25
+ },
26
+ passingThreshold: {
27
+ type: "number",
28
+ description: "Fraction of members required to pass (0-1)",
29
+ },
30
+ disputeQuorum: {
31
+ type: "number",
32
+ description: "Min votes to resolve a dispute",
33
+ },
34
+ votingPeriodMs: {
35
+ type: "number",
36
+ description: "Voting window in milliseconds",
37
+ },
38
+ },
39
+ },
40
+ stateSchema: {
41
+ properties: {
42
+ admins: { type: "array", immutable: false },
43
+ members: { type: "object", computed: true },
44
+ rules: { type: "object", computed: true },
45
+ history: { type: "array", computed: true },
46
+ proposal: { type: "object" },
47
+ votes: { type: "object", computed: true },
48
+ dispute: { type: "object" },
49
+ passingThreshold: { type: "number" },
50
+ disputeQuorum: { type: "number" },
51
+ votingPeriodMs: { type: "number" },
52
+ },
53
+ },
54
+ eventSchemas: {
55
+ add_member: {
56
+ description: "Add a member (admin only)",
57
+ required: ["member", "role"],
58
+ properties: {
59
+ agent: { type: "address" },
60
+ member: { type: "address" },
61
+ role: { type: "string" },
62
+ },
63
+ },
64
+ remove_member: {
65
+ description: "Remove a member (admin only)",
66
+ required: ["member"],
67
+ properties: {
68
+ agent: { type: "address" },
69
+ member: { type: "address" },
70
+ },
71
+ },
72
+ propose: {
73
+ description: "Submit a rule change proposal",
74
+ required: ["proposalId", "type", "changes"],
75
+ properties: {
76
+ agent: { type: "address" },
77
+ proposalId: { type: "string" },
78
+ type: { type: "string" },
79
+ changes: { type: "object" },
80
+ },
81
+ },
82
+ vote: {
83
+ description: "Cast a vote on the active proposal or dispute",
84
+ required: ["vote"],
85
+ properties: {
86
+ agent: { type: "address" },
87
+ vote: { type: "string" },
88
+ ruling: { type: "string" },
89
+ },
90
+ },
91
+ finalize: {
92
+ description: "Finalize the voting period",
93
+ required: ["forCount"],
94
+ properties: {
95
+ forCount: { type: "number" },
96
+ },
97
+ },
98
+ file_dispute: {
99
+ description: "File a dispute against a member",
100
+ required: ["disputeId", "defendant", "claim"],
101
+ properties: {
102
+ agent: { type: "address" },
103
+ disputeId: { type: "string" },
104
+ defendant: { type: "address" },
105
+ claim: { type: "string" },
106
+ },
107
+ },
108
+ submit_evidence: {
109
+ description: "Submit evidence in a dispute",
110
+ required: ["content"],
111
+ properties: {
112
+ agent: { type: "address" },
113
+ content: { type: "string" },
114
+ },
115
+ },
116
+ resolve: {
117
+ description: "Resolve the active dispute",
118
+ required: ["ruling", "remedy"],
119
+ properties: {
120
+ ruling: { type: "string" },
121
+ remedy: { type: "string" },
122
+ },
123
+ },
124
+ dissolve: {
125
+ description: "Dissolve the organization (requires 90% approval)",
126
+ required: ["approvalCount"],
127
+ properties: {
128
+ approvalCount: { type: "number" },
129
+ },
130
+ },
131
+ },
132
+ states: {
133
+ ACTIVE: { id: "ACTIVE", isFinal: false, metadata: null },
134
+ VOTING: { id: "VOTING", isFinal: false, metadata: null },
135
+ DISPUTE: { id: "DISPUTE", isFinal: false, metadata: null },
136
+ DISSOLVED: { id: "DISSOLVED", isFinal: true, metadata: null },
137
+ },
138
+ initialState: "ACTIVE",
139
+ transitions: [
140
+ // ACTIVE → ACTIVE: add member (admin only)
141
+ {
142
+ from: "ACTIVE",
143
+ to: "ACTIVE",
144
+ eventName: "add_member",
145
+ guard: { in: [{ var: "event.agent" }, { var: "state.admins" }] },
146
+ effect: {
147
+ merge: [
148
+ { var: "state" },
149
+ {
150
+ members: {
151
+ setKey: [
152
+ { var: "state.members" },
153
+ { var: "event.member" },
154
+ { role: { var: "event.role" }, addedAt: { var: "$timestamp" } },
155
+ ],
156
+ },
157
+ },
158
+ ],
159
+ },
160
+ dependencies: [],
161
+ },
162
+ // ACTIVE → ACTIVE: remove member (admin only)
163
+ {
164
+ from: "ACTIVE",
165
+ to: "ACTIVE",
166
+ eventName: "remove_member",
167
+ guard: { in: [{ var: "event.agent" }, { var: "state.admins" }] },
168
+ effect: {
169
+ merge: [
170
+ { var: "state" },
171
+ {
172
+ members: {
173
+ deleteKey: [{ var: "state.members" }, { var: "event.member" }],
174
+ },
175
+ },
176
+ ],
177
+ },
178
+ dependencies: [],
179
+ },
180
+ // ACTIVE → VOTING: propose
181
+ {
182
+ from: "ACTIVE",
183
+ to: "VOTING",
184
+ eventName: "propose",
185
+ guard: { getKey: [{ var: "state.members" }, { var: "event.agent" }] },
186
+ effect: {
187
+ merge: [
188
+ { var: "state" },
189
+ {
190
+ proposal: {
191
+ id: { var: "event.proposalId" },
192
+ type: { var: "event.type" },
193
+ changes: { var: "event.changes" },
194
+ proposer: { var: "event.agent" },
195
+ proposedAt: { var: "$timestamp" },
196
+ deadline: {
197
+ "+": [{ var: "$timestamp" }, { var: "state.votingPeriodMs" }],
198
+ },
199
+ },
200
+ votes: {},
201
+ },
202
+ ],
203
+ },
204
+ dependencies: [],
205
+ },
206
+ // VOTING → VOTING: vote (member, no double-voting)
207
+ {
208
+ from: "VOTING",
209
+ to: "VOTING",
210
+ eventName: "vote",
211
+ guard: {
212
+ and: [
213
+ { getKey: [{ var: "state.members" }, { var: "event.agent" }] },
214
+ {
215
+ "!": [{ getKey: [{ var: "state.votes" }, { var: "event.agent" }] }],
216
+ },
217
+ ],
218
+ },
219
+ effect: {
220
+ merge: [
221
+ { var: "state" },
222
+ {
223
+ votes: {
224
+ setKey: [
225
+ { var: "state.votes" },
226
+ { var: "event.agent" },
227
+ { vote: { var: "event.vote" }, votedAt: { var: "$timestamp" } },
228
+ ],
229
+ },
230
+ },
231
+ ],
232
+ },
233
+ dependencies: [],
234
+ },
235
+ // VOTING → ACTIVE: finalize (passed)
236
+ {
237
+ from: "VOTING",
238
+ to: "ACTIVE",
239
+ eventName: "finalize",
240
+ guard: {
241
+ ">=": [
242
+ { var: "event.forCount" },
243
+ {
244
+ "*": [
245
+ { size: { var: "state.members" } },
246
+ { var: "state.passingThreshold" },
247
+ ],
248
+ },
249
+ ],
250
+ },
251
+ effect: {
252
+ merge: [
253
+ { var: "state" },
254
+ {
255
+ rules: {
256
+ merge: [
257
+ { var: "state.rules" },
258
+ { var: "state.proposal.changes" },
259
+ ],
260
+ },
261
+ history: {
262
+ cat: [
263
+ { var: "state.history" },
264
+ [
265
+ {
266
+ type: "rule_change",
267
+ proposal: { var: "state.proposal" },
268
+ outcome: "passed",
269
+ finalizedAt: { var: "$timestamp" },
270
+ },
271
+ ],
272
+ ],
273
+ },
274
+ proposal: null,
275
+ votes: {},
276
+ },
277
+ ],
278
+ },
279
+ dependencies: [],
280
+ },
281
+ // VOTING → ACTIVE: finalize (failed)
282
+ {
283
+ from: "VOTING",
284
+ to: "ACTIVE",
285
+ eventName: "finalize",
286
+ guard: {
287
+ "<": [
288
+ { var: "event.forCount" },
289
+ {
290
+ "*": [
291
+ { size: { var: "state.members" } },
292
+ { var: "state.passingThreshold" },
293
+ ],
294
+ },
295
+ ],
296
+ },
297
+ effect: {
298
+ merge: [
299
+ { var: "state" },
300
+ {
301
+ history: {
302
+ cat: [
303
+ { var: "state.history" },
304
+ [
305
+ {
306
+ type: "rule_change",
307
+ proposal: { var: "state.proposal" },
308
+ outcome: "failed",
309
+ finalizedAt: { var: "$timestamp" },
310
+ },
311
+ ],
312
+ ],
313
+ },
314
+ proposal: null,
315
+ votes: {},
316
+ },
317
+ ],
318
+ },
319
+ dependencies: [],
320
+ },
321
+ // ACTIVE → DISPUTE: file_dispute
322
+ {
323
+ from: "ACTIVE",
324
+ to: "DISPUTE",
325
+ eventName: "file_dispute",
326
+ guard: { getKey: [{ var: "state.members" }, { var: "event.agent" }] },
327
+ effect: {
328
+ merge: [
329
+ { var: "state" },
330
+ {
331
+ dispute: {
332
+ id: { var: "event.disputeId" },
333
+ plaintiff: { var: "event.agent" },
334
+ defendant: { var: "event.defendant" },
335
+ claim: { var: "event.claim" },
336
+ filedAt: { var: "$timestamp" },
337
+ evidence: [],
338
+ },
339
+ votes: {},
340
+ },
341
+ ],
342
+ },
343
+ dependencies: [],
344
+ },
345
+ // DISPUTE → DISPUTE: submit_evidence (plaintiff or defendant)
346
+ {
347
+ from: "DISPUTE",
348
+ to: "DISPUTE",
349
+ eventName: "submit_evidence",
350
+ guard: {
351
+ or: [
352
+ {
353
+ "===": [{ var: "event.agent" }, { var: "state.dispute.plaintiff" }],
354
+ },
355
+ {
356
+ "===": [{ var: "event.agent" }, { var: "state.dispute.defendant" }],
357
+ },
358
+ ],
359
+ },
360
+ effect: {
361
+ merge: [
362
+ { var: "state" },
363
+ {
364
+ dispute: {
365
+ merge: [
366
+ { var: "state.dispute" },
367
+ {
368
+ evidence: {
369
+ cat: [
370
+ { var: "state.dispute.evidence" },
371
+ [
372
+ {
373
+ from: { var: "event.agent" },
374
+ content: { var: "event.content" },
375
+ at: { var: "$timestamp" },
376
+ },
377
+ ],
378
+ ],
379
+ },
380
+ },
381
+ ],
382
+ },
383
+ },
384
+ ],
385
+ },
386
+ dependencies: [],
387
+ },
388
+ // DISPUTE → DISPUTE: vote (member, not party, no double-vote)
389
+ {
390
+ from: "DISPUTE",
391
+ to: "DISPUTE",
392
+ eventName: "vote",
393
+ guard: {
394
+ and: [
395
+ { getKey: [{ var: "state.members" }, { var: "event.agent" }] },
396
+ {
397
+ "!==": [{ var: "event.agent" }, { var: "state.dispute.plaintiff" }],
398
+ },
399
+ {
400
+ "!==": [{ var: "event.agent" }, { var: "state.dispute.defendant" }],
401
+ },
402
+ {
403
+ "!": [{ getKey: [{ var: "state.votes" }, { var: "event.agent" }] }],
404
+ },
405
+ ],
406
+ },
407
+ effect: {
408
+ merge: [
409
+ { var: "state" },
410
+ {
411
+ votes: {
412
+ setKey: [
413
+ { var: "state.votes" },
414
+ { var: "event.agent" },
415
+ {
416
+ ruling: { var: "event.ruling" },
417
+ votedAt: { var: "$timestamp" },
418
+ },
419
+ ],
420
+ },
421
+ },
422
+ ],
423
+ },
424
+ dependencies: [],
425
+ },
426
+ // DISPUTE → ACTIVE: resolve (quorum met)
427
+ {
428
+ from: "DISPUTE",
429
+ to: "ACTIVE",
430
+ eventName: "resolve",
431
+ guard: {
432
+ ">=": [
433
+ { size: { var: "state.votes" } },
434
+ { var: "state.disputeQuorum" },
435
+ ],
436
+ },
437
+ effect: {
438
+ merge: [
439
+ { var: "state" },
440
+ {
441
+ history: {
442
+ cat: [
443
+ { var: "state.history" },
444
+ [
445
+ {
446
+ type: "dispute",
447
+ dispute: { var: "state.dispute" },
448
+ ruling: { var: "event.ruling" },
449
+ remedy: { var: "event.remedy" },
450
+ resolvedAt: { var: "$timestamp" },
451
+ },
452
+ ],
453
+ ],
454
+ },
455
+ dispute: null,
456
+ votes: {},
457
+ },
458
+ ],
459
+ },
460
+ dependencies: [],
461
+ },
462
+ // ACTIVE → DISSOLVED: dissolve (90% approval)
463
+ {
464
+ from: "ACTIVE",
465
+ to: "DISSOLVED",
466
+ eventName: "dissolve",
467
+ guard: {
468
+ ">=": [
469
+ { var: "event.approvalCount" },
470
+ { "*": [{ size: { var: "state.members" } }, 0.9] },
471
+ ],
472
+ },
473
+ effect: {
474
+ merge: [{ var: "state" }, { dissolvedAt: { var: "$timestamp" } }],
475
+ },
476
+ dependencies: [],
477
+ },
478
+ ],
479
+ });
@@ -0,0 +1,135 @@
1
+ import { defineFiberApp } from "../../../schema/fiber-app.js";
2
+ /**
3
+ * Minimal governance state machine - extend for custom use cases.
4
+ */
5
+ export const govUniversalDef = defineFiberApp({
6
+ metadata: {
7
+ name: "GovernanceUniversal",
8
+ app: "governance",
9
+ type: "universal",
10
+ version: "1.0.0",
11
+ description: "Minimal governance state machine - extend for custom use cases",
12
+ },
13
+ createSchema: {
14
+ properties: {},
15
+ },
16
+ stateSchema: {
17
+ properties: {
18
+ status: { type: "string" },
19
+ proposal: { type: "object" },
20
+ proposedAt: { type: "timestamp" },
21
+ votes: { type: "object", computed: true },
22
+ lastProposal: { type: "object" },
23
+ lastResult: { type: "string" },
24
+ dissolvedAt: { type: "timestamp" },
25
+ },
26
+ },
27
+ eventSchemas: {
28
+ propose: {
29
+ description: "Submit a new proposal",
30
+ properties: {
31
+ proposal: { type: "object" },
32
+ },
33
+ },
34
+ vote: {
35
+ description: "Cast a vote on the active proposal",
36
+ properties: {
37
+ agent: { type: "address" },
38
+ vote: { type: "string" },
39
+ },
40
+ },
41
+ finalize: {
42
+ description: "Finalize the current proposal",
43
+ properties: {
44
+ result: { type: "string" },
45
+ },
46
+ },
47
+ dissolve: {
48
+ description: "Dissolve the governance entity",
49
+ },
50
+ },
51
+ states: {
52
+ ACTIVE: { id: "ACTIVE", isFinal: false, metadata: null },
53
+ VOTING: { id: "VOTING", isFinal: false, metadata: null },
54
+ DISSOLVED: { id: "DISSOLVED", isFinal: true, metadata: null },
55
+ },
56
+ initialState: "ACTIVE",
57
+ transitions: [
58
+ {
59
+ from: "ACTIVE",
60
+ to: "VOTING",
61
+ eventName: "propose",
62
+ guard: { "==": [1, 1] },
63
+ effect: {
64
+ merge: [
65
+ { var: "state" },
66
+ {
67
+ status: "VOTING",
68
+ proposal: { var: "event.proposal" },
69
+ proposedAt: { var: "$timestamp" },
70
+ votes: {},
71
+ },
72
+ ],
73
+ },
74
+ dependencies: [],
75
+ },
76
+ {
77
+ from: "VOTING",
78
+ to: "VOTING",
79
+ eventName: "vote",
80
+ guard: { "==": [1, 1] },
81
+ effect: {
82
+ merge: [
83
+ { var: "state" },
84
+ {
85
+ votes: {
86
+ merge: [
87
+ { var: "state.votes" },
88
+ {
89
+ __key: { var: "event.agent" },
90
+ __value: { var: "event.vote" },
91
+ },
92
+ ],
93
+ },
94
+ },
95
+ ],
96
+ },
97
+ dependencies: [],
98
+ },
99
+ {
100
+ from: "VOTING",
101
+ to: "ACTIVE",
102
+ eventName: "finalize",
103
+ guard: { "==": [1, 1] },
104
+ effect: {
105
+ merge: [
106
+ { var: "state" },
107
+ {
108
+ status: "ACTIVE",
109
+ lastProposal: { var: "state.proposal" },
110
+ lastResult: { var: "event.result" },
111
+ proposal: null,
112
+ votes: null,
113
+ },
114
+ ],
115
+ },
116
+ dependencies: [],
117
+ },
118
+ {
119
+ from: "ACTIVE",
120
+ to: "DISSOLVED",
121
+ eventName: "dissolve",
122
+ guard: { "==": [1, 1] },
123
+ effect: {
124
+ merge: [
125
+ { var: "state" },
126
+ {
127
+ status: "DISSOLVED",
128
+ dissolvedAt: { var: "$timestamp" },
129
+ },
130
+ ],
131
+ },
132
+ dependencies: [],
133
+ },
134
+ ],
135
+ });