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