@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,1099 @@
1
+ import { defineFiberApp } from "../../../schema/fiber-app.js";
2
+ /**
3
+ * Shareholder meeting state machine managing annual/special meetings, record dates, proxy periods, voting, and certification of results.
4
+ * Supports multiple share classes and cumulative voting.
5
+ */
6
+ export const corpShareholdersDef = defineFiberApp({
7
+ metadata: {
8
+ name: "CorpShareholders",
9
+ app: "corporate",
10
+ type: "shareholders",
11
+ version: "1.0.0",
12
+ description: "Shareholder meeting state machine managing annual/special meetings, record dates, proxy periods, voting, and certification of results. Supports multiple share classes and cumulative voting.",
13
+ crossReferences: {
14
+ entity: {
15
+ machine: "corporate-entity",
16
+ description: "Parent corporate entity",
17
+ foreignKey: "entityId",
18
+ },
19
+ proxies: {
20
+ machine: "corporate-proxy",
21
+ description: "Proxy grants for this meeting",
22
+ foreignKey: "meetingId",
23
+ },
24
+ resolutions: {
25
+ machine: "corporate-resolution",
26
+ description: "Resolutions resulting from meeting votes",
27
+ foreignKey: "meetingId",
28
+ },
29
+ securities: {
30
+ machine: "corporate-securities",
31
+ description: "Share records for determining voting rights",
32
+ foreignKey: "entityId",
33
+ },
34
+ },
35
+ },
36
+ createSchema: {
37
+ required: ["meetingId", "entityId"],
38
+ properties: {
39
+ meetingId: {
40
+ type: "string",
41
+ description: "Unique identifier for this shareholder meeting",
42
+ immutable: true,
43
+ },
44
+ entityId: {
45
+ type: "string",
46
+ description: "Reference to parent corporate-entity",
47
+ immutable: true,
48
+ },
49
+ meetingType: {
50
+ type: "string",
51
+ enum: ["ANNUAL", "SPECIAL"],
52
+ description: "Annual meetings are required; special meetings called for specific purposes",
53
+ },
54
+ fiscalYear: {
55
+ type: "integer",
56
+ description: "Fiscal year for annual meetings",
57
+ },
58
+ scheduledDate: {
59
+ type: "string",
60
+ format: "date-time",
61
+ },
62
+ location: {
63
+ type: "object",
64
+ properties: {
65
+ physical: { type: "string", nullable: true },
66
+ virtualUrl: { type: "string", nullable: true },
67
+ isHybrid: { type: "boolean", default: false },
68
+ },
69
+ },
70
+ },
71
+ },
72
+ stateSchema: {
73
+ properties: {
74
+ meetingId: { type: "string", immutable: true },
75
+ entityId: { type: "string", immutable: true },
76
+ meetingType: { type: "string" },
77
+ fiscalYear: { type: "integer" },
78
+ scheduledDate: { type: "string", format: "date-time" },
79
+ location: { type: "object" },
80
+ calledBy: { $ref: "#/definitions/CalledBy", computed: true },
81
+ noticeInfo: { $ref: "#/definitions/NoticeInfo", computed: true },
82
+ recordDate: {
83
+ $ref: "#/definitions/RecordDate",
84
+ nullable: true,
85
+ computed: true,
86
+ },
87
+ eligibleVoters: {
88
+ type: "array",
89
+ items: { $ref: "#/definitions/EligibleVoter" },
90
+ computed: true,
91
+ },
92
+ quorumRequirements: {
93
+ $ref: "#/definitions/QuorumRequirements",
94
+ computed: true,
95
+ },
96
+ agenda: {
97
+ type: "array",
98
+ items: { $ref: "#/definitions/AgendaItem" },
99
+ computed: true,
100
+ },
101
+ proxyPeriod: {
102
+ $ref: "#/definitions/ProxyPeriod",
103
+ nullable: true,
104
+ computed: true,
105
+ },
106
+ votes: {
107
+ type: "array",
108
+ items: { $ref: "#/definitions/Vote" },
109
+ computed: true,
110
+ },
111
+ voteTallies: {
112
+ type: "array",
113
+ items: { $ref: "#/definitions/VoteTally" },
114
+ computed: true,
115
+ },
116
+ inspectorOfElections: {
117
+ $ref: "#/definitions/Inspector",
118
+ nullable: true,
119
+ computed: true,
120
+ },
121
+ sessionInfo: {
122
+ $ref: "#/definitions/SessionInfo",
123
+ nullable: true,
124
+ computed: true,
125
+ },
126
+ certification: {
127
+ $ref: "#/definitions/Certification",
128
+ nullable: true,
129
+ computed: true,
130
+ },
131
+ status: {
132
+ type: "string",
133
+ enum: [
134
+ "SCHEDULED",
135
+ "RECORD_DATE_SET",
136
+ "PROXY_PERIOD",
137
+ "IN_SESSION",
138
+ "VOTING",
139
+ "CLOSED",
140
+ ],
141
+ computed: true,
142
+ },
143
+ createdAt: { type: "timestamp", computed: true },
144
+ updatedAt: { type: "timestamp", computed: true },
145
+ },
146
+ },
147
+ eventSchemas: {
148
+ schedule_annual: {
149
+ description: "Schedule an annual shareholder meeting",
150
+ required: [
151
+ "meetingId",
152
+ "entityId",
153
+ "fiscalYear",
154
+ "scheduledDate",
155
+ "boardResolutionRef",
156
+ ],
157
+ properties: {
158
+ meetingId: { type: "string" },
159
+ entityId: { type: "string" },
160
+ fiscalYear: { type: "integer" },
161
+ scheduledDate: { type: "string", format: "date-time" },
162
+ location: { type: "object" },
163
+ boardResolutionRef: { type: "string" },
164
+ },
165
+ },
166
+ schedule_special: {
167
+ description: "Schedule a special shareholder meeting",
168
+ required: [
169
+ "meetingId",
170
+ "entityId",
171
+ "scheduledDate",
172
+ "purpose",
173
+ "calledByType",
174
+ ],
175
+ properties: {
176
+ meetingId: { type: "string" },
177
+ entityId: { type: "string" },
178
+ scheduledDate: { type: "string", format: "date-time" },
179
+ location: { type: "object" },
180
+ purpose: {
181
+ type: "string",
182
+ description: "Specific purpose for special meeting",
183
+ },
184
+ calledByType: {
185
+ type: "string",
186
+ enum: ["BOARD", "SHAREHOLDERS", "COURT"],
187
+ },
188
+ resolutionRef: { type: "string" },
189
+ petitionRef: { type: "string" },
190
+ },
191
+ },
192
+ set_record_date: {
193
+ description: "Board sets the record date for determining eligible shareholders",
194
+ required: ["recordDate", "resolutionRef"],
195
+ properties: {
196
+ recordDate: { type: "string", format: "date" },
197
+ resolutionRef: { type: "string" },
198
+ },
199
+ },
200
+ register_eligible_shareholders: {
201
+ description: "Register shareholders of record as of record date",
202
+ required: ["shareholders", "totalSharesOutstanding"],
203
+ properties: {
204
+ shareholders: {
205
+ type: "array",
206
+ items: {
207
+ type: "object",
208
+ properties: {
209
+ shareholderId: { type: "string" },
210
+ name: { type: "string" },
211
+ shareholdings: { type: "array" },
212
+ },
213
+ },
214
+ },
215
+ totalSharesOutstanding: { type: "integer" },
216
+ },
217
+ },
218
+ open_proxy_period: {
219
+ description: "Distribute proxy materials and open proxy solicitation period",
220
+ required: [
221
+ "startDate",
222
+ "proxyStatementRef",
223
+ "formOfProxyRef",
224
+ "agenda",
225
+ ],
226
+ properties: {
227
+ startDate: { type: "string", format: "date" },
228
+ proxyStatementRef: { type: "string" },
229
+ formOfProxyRef: { type: "string" },
230
+ annualReportRef: { type: "string" },
231
+ agenda: { type: "array" },
232
+ },
233
+ },
234
+ add_agenda_item: {
235
+ description: "Add an item to the meeting agenda (e.g., shareholder proposal)",
236
+ required: ["itemId", "title", "type", "voteRequired"],
237
+ properties: {
238
+ itemId: { type: "string" },
239
+ title: { type: "string" },
240
+ description: { type: "string" },
241
+ type: { type: "string" },
242
+ voteRequired: { type: "string" },
243
+ eligibleClasses: { type: "array", items: { type: "string" } },
244
+ allowCumulativeVoting: { type: "boolean", default: false },
245
+ },
246
+ },
247
+ open_meeting: {
248
+ description: "Convene the shareholder meeting",
249
+ required: [
250
+ "openedAt",
251
+ "chairPerson",
252
+ "secretaryPresent",
253
+ "initialQuorumCount",
254
+ ],
255
+ properties: {
256
+ openedAt: { type: "string", format: "date-time" },
257
+ chairPerson: { type: "string" },
258
+ secretaryPresent: { type: "string" },
259
+ inspectorOfElections: { type: "object" },
260
+ initialQuorumCount: { type: "integer" },
261
+ },
262
+ },
263
+ open_polls: {
264
+ description: "Open polls for voting on agenda items",
265
+ required: ["pollsOpenedAt"],
266
+ properties: {
267
+ pollsOpenedAt: { type: "string", format: "date-time" },
268
+ },
269
+ },
270
+ cast_vote: {
271
+ description: "Record a vote from a shareholder or proxy holder",
272
+ required: [
273
+ "voteId",
274
+ "agendaItemId",
275
+ "voterId",
276
+ "shareholderId",
277
+ "shareClass",
278
+ ],
279
+ properties: {
280
+ voteId: { type: "string" },
281
+ agendaItemId: { type: "string" },
282
+ voterId: { type: "string" },
283
+ shareholderId: { type: "string" },
284
+ shareClass: { type: "string" },
285
+ votesFor: { type: "integer", default: 0 },
286
+ votesAgainst: { type: "integer", default: 0 },
287
+ votesAbstain: { type: "integer", default: 0 },
288
+ votesWithhold: { type: "integer", default: 0 },
289
+ cumulativeVoteAllocation: { type: "object", nullable: true },
290
+ viaProxy: { type: "boolean", default: false },
291
+ },
292
+ },
293
+ close_polls: {
294
+ description: "Close polls and begin vote tabulation",
295
+ required: ["pollsClosedAt"],
296
+ properties: {
297
+ pollsClosedAt: { type: "string", format: "date-time" },
298
+ },
299
+ },
300
+ certify_results: {
301
+ description: "Inspector of elections certifies vote results",
302
+ required: ["certifiedAt", "certifiedBy", "certificateRef"],
303
+ properties: {
304
+ certifiedAt: { type: "string", format: "date-time" },
305
+ certifiedBy: { type: "string" },
306
+ certificateRef: { type: "string" },
307
+ results: {
308
+ type: "array",
309
+ items: {
310
+ type: "object",
311
+ properties: {
312
+ agendaItemId: { type: "string" },
313
+ result: {
314
+ type: "string",
315
+ enum: ["APPROVED", "REJECTED"],
316
+ },
317
+ },
318
+ },
319
+ },
320
+ minutesRef: { type: "string" },
321
+ },
322
+ },
323
+ adjourn_without_action: {
324
+ description: "Adjourn meeting without completing agenda (e.g., quorum lost)",
325
+ required: ["adjournedAt", "reason"],
326
+ properties: {
327
+ adjournedAt: { type: "string", format: "date-time" },
328
+ reason: { type: "string" },
329
+ adjournedTo: { type: "string", format: "date-time", nullable: true },
330
+ },
331
+ },
332
+ },
333
+ definitions: {
334
+ CalledBy: {
335
+ type: "object",
336
+ properties: {
337
+ type: {
338
+ type: "string",
339
+ enum: ["BOARD", "SHAREHOLDERS", "COURT"],
340
+ },
341
+ resolutionRef: { type: "string", nullable: true },
342
+ shareholderPetitionRef: { type: "string", nullable: true },
343
+ courtOrderRef: { type: "string", nullable: true },
344
+ },
345
+ },
346
+ NoticeInfo: {
347
+ type: "object",
348
+ properties: {
349
+ noticeSentDate: { type: "string", format: "date" },
350
+ noticeMethod: {
351
+ type: "string",
352
+ enum: ["MAIL", "EMAIL", "ELECTRONIC_ACCESS"],
353
+ },
354
+ minimumNoticeDays: { type: "integer", default: 10 },
355
+ maximumNoticeDays: { type: "integer", default: 60 },
356
+ },
357
+ },
358
+ RecordDate: {
359
+ type: "object",
360
+ nullable: true,
361
+ properties: {
362
+ date: { type: "string", format: "date" },
363
+ setByBoardOn: { type: "string", format: "date" },
364
+ resolutionRef: { type: "string" },
365
+ },
366
+ },
367
+ EligibleVoter: {
368
+ type: "object",
369
+ properties: {
370
+ shareholderId: { type: "string" },
371
+ name: { type: "string" },
372
+ shareholdings: {
373
+ type: "array",
374
+ items: {
375
+ type: "object",
376
+ properties: {
377
+ shareClass: { type: "string" },
378
+ shares: { type: "integer" },
379
+ votes: {
380
+ type: "integer",
381
+ description: "Votes this holding represents",
382
+ },
383
+ },
384
+ },
385
+ },
386
+ totalVotes: { type: "integer" },
387
+ proxyGrantedTo: {
388
+ type: "string",
389
+ nullable: true,
390
+ description: "Proxy holder ID if proxied",
391
+ },
392
+ hasVoted: { type: "boolean", default: false },
393
+ },
394
+ },
395
+ QuorumRequirements: {
396
+ type: "object",
397
+ properties: {
398
+ type: {
399
+ type: "string",
400
+ enum: ["SHARES_REPRESENTED", "SHARES_OUTSTANDING"],
401
+ },
402
+ threshold: {
403
+ type: "number",
404
+ default: 0.5,
405
+ description: "Fraction required for quorum",
406
+ },
407
+ sharesRequired: { type: "integer" },
408
+ sharesRepresented: { type: "integer", default: 0 },
409
+ quorumMet: { type: "boolean", default: false },
410
+ },
411
+ },
412
+ AgendaItem: {
413
+ type: "object",
414
+ properties: {
415
+ itemId: { type: "string" },
416
+ itemNumber: { type: "integer" },
417
+ title: { type: "string" },
418
+ description: { type: "string" },
419
+ type: {
420
+ type: "string",
421
+ enum: [
422
+ "DIRECTOR_ELECTION",
423
+ "AUDITOR_RATIFICATION",
424
+ "SAY_ON_PAY",
425
+ "CHARTER_AMENDMENT",
426
+ "MERGER",
427
+ "STOCK_PLAN",
428
+ "SHAREHOLDER_PROPOSAL",
429
+ "OTHER",
430
+ ],
431
+ },
432
+ voteRequired: {
433
+ type: "string",
434
+ enum: [
435
+ "PLURALITY",
436
+ "MAJORITY_CAST",
437
+ "MAJORITY_OUTSTANDING",
438
+ "SUPERMAJORITY",
439
+ "UNANIMOUS",
440
+ ],
441
+ description: "Vote threshold for approval",
442
+ },
443
+ supermajorityThreshold: { type: "number", nullable: true },
444
+ eligibleClasses: {
445
+ type: "array",
446
+ items: { type: "string" },
447
+ description: "Share classes that can vote on this item",
448
+ },
449
+ allowCumulativeVoting: {
450
+ type: "boolean",
451
+ default: false,
452
+ description: "For director elections",
453
+ },
454
+ status: {
455
+ type: "string",
456
+ enum: [
457
+ "PENDING",
458
+ "VOTING",
459
+ "CLOSED",
460
+ "APPROVED",
461
+ "REJECTED",
462
+ ],
463
+ },
464
+ },
465
+ },
466
+ ProxyPeriod: {
467
+ type: "object",
468
+ nullable: true,
469
+ properties: {
470
+ startDate: { type: "string", format: "date" },
471
+ endDate: {
472
+ type: "string",
473
+ format: "date-time",
474
+ description: "Usually meeting start time",
475
+ },
476
+ proxyMaterials: {
477
+ type: "object",
478
+ properties: {
479
+ proxyStatementRef: { type: "string" },
480
+ formOfProxyRef: { type: "string" },
481
+ annualReportRef: { type: "string", nullable: true },
482
+ },
483
+ },
484
+ },
485
+ },
486
+ Vote: {
487
+ type: "object",
488
+ properties: {
489
+ voteId: { type: "string" },
490
+ agendaItemId: { type: "string" },
491
+ voterId: {
492
+ type: "string",
493
+ description: "Shareholder or proxy holder ID",
494
+ },
495
+ shareholderId: { type: "string", description: "Beneficial owner" },
496
+ shareClass: { type: "string" },
497
+ votesFor: { type: "integer", default: 0 },
498
+ votesAgainst: { type: "integer", default: 0 },
499
+ votesAbstain: { type: "integer", default: 0 },
500
+ votesWithhold: {
501
+ type: "integer",
502
+ default: 0,
503
+ description: "For director elections",
504
+ },
505
+ cumulativeVoteAllocation: {
506
+ type: "object",
507
+ additionalProperties: { type: "integer" },
508
+ nullable: true,
509
+ description: "For cumulative voting: candidate ID -> votes allocated",
510
+ },
511
+ viaProxy: { type: "boolean", default: false },
512
+ timestamp: { type: "string", format: "date-time" },
513
+ },
514
+ },
515
+ VoteTally: {
516
+ type: "object",
517
+ properties: {
518
+ agendaItemId: { type: "string" },
519
+ forVotes: { type: "integer", default: 0 },
520
+ againstVotes: { type: "integer", default: 0 },
521
+ abstainVotes: { type: "integer", default: 0 },
522
+ withholdVotes: { type: "integer", default: 0 },
523
+ brokerNonVotes: { type: "integer", default: 0 },
524
+ candidateVotes: {
525
+ type: "object",
526
+ additionalProperties: { type: "integer" },
527
+ nullable: true,
528
+ description: "For director elections: candidate ID -> total votes",
529
+ },
530
+ result: {
531
+ type: "string",
532
+ enum: ["APPROVED", "REJECTED", "PENDING"],
533
+ },
534
+ certified: { type: "boolean", default: false },
535
+ },
536
+ },
537
+ Inspector: {
538
+ type: "object",
539
+ nullable: true,
540
+ properties: {
541
+ name: { type: "string" },
542
+ company: { type: "string", nullable: true },
543
+ appointedBy: { type: "string" },
544
+ appointmentDate: { type: "string", format: "date" },
545
+ },
546
+ },
547
+ SessionInfo: {
548
+ type: "object",
549
+ nullable: true,
550
+ properties: {
551
+ openedAt: { type: "string", format: "date-time" },
552
+ chairPerson: { type: "string" },
553
+ secretaryPresent: { type: "string" },
554
+ pollsOpenedAt: { type: "string", format: "date-time", nullable: true },
555
+ pollsClosedAt: { type: "string", format: "date-time", nullable: true },
556
+ adjournedAt: { type: "string", format: "date-time", nullable: true },
557
+ minutesRef: { type: "string", nullable: true },
558
+ },
559
+ },
560
+ Certification: {
561
+ type: "object",
562
+ nullable: true,
563
+ properties: {
564
+ certifiedAt: { type: "string", format: "date-time" },
565
+ certifiedBy: { type: "string" },
566
+ certificateRef: { type: "string" },
567
+ },
568
+ },
569
+ },
570
+ states: {
571
+ SCHEDULED: {
572
+ id: "SCHEDULED",
573
+ isFinal: false,
574
+ description: "Meeting has been scheduled but record date not yet set",
575
+ },
576
+ RECORD_DATE_SET: {
577
+ id: "RECORD_DATE_SET",
578
+ isFinal: false,
579
+ description: "Record date established; eligible shareholders determined",
580
+ },
581
+ PROXY_PERIOD: {
582
+ id: "PROXY_PERIOD",
583
+ isFinal: false,
584
+ description: "Proxy materials distributed; shareholders may submit proxies",
585
+ },
586
+ IN_SESSION: {
587
+ id: "IN_SESSION",
588
+ isFinal: false,
589
+ description: "Meeting is convened and in progress",
590
+ },
591
+ VOTING: {
592
+ id: "VOTING",
593
+ isFinal: false,
594
+ description: "Polls are open for voting on agenda items",
595
+ },
596
+ CLOSED: {
597
+ id: "CLOSED",
598
+ isFinal: true,
599
+ description: "Meeting concluded; results certified",
600
+ },
601
+ },
602
+ initialState: "SCHEDULED",
603
+ transitions: [
604
+ // Initial creation transitions (from: null means creation)
605
+ // schedule_annual -> SCHEDULED
606
+ {
607
+ from: "SCHEDULED",
608
+ to: "SCHEDULED",
609
+ eventName: "schedule_annual",
610
+ guard: { "==": [1, 1] },
611
+ dependencies: [
612
+ {
613
+ machine: "corporate-resolution",
614
+ instanceRef: { var: "event.boardResolutionRef" },
615
+ requiredState: "EXECUTED",
616
+ },
617
+ ],
618
+ effect: {
619
+ merge: [
620
+ { var: "state" },
621
+ {
622
+ meetingId: { var: "event.meetingId" },
623
+ entityId: { var: "event.entityId" },
624
+ meetingType: "ANNUAL",
625
+ fiscalYear: { var: "event.fiscalYear" },
626
+ scheduledDate: { var: "event.scheduledDate" },
627
+ location: { var: "event.location" },
628
+ calledBy: {
629
+ type: "BOARD",
630
+ resolutionRef: { var: "event.boardResolutionRef" },
631
+ },
632
+ },
633
+ ],
634
+ },
635
+ emits: ["SHAREHOLDER_MEETING_SCHEDULED"],
636
+ },
637
+ // schedule_special -> SCHEDULED
638
+ {
639
+ from: "SCHEDULED",
640
+ to: "SCHEDULED",
641
+ eventName: "schedule_special",
642
+ guard: { "==": [1, 1] },
643
+ effect: {
644
+ merge: [
645
+ { var: "state" },
646
+ {
647
+ meetingId: { var: "event.meetingId" },
648
+ entityId: { var: "event.entityId" },
649
+ meetingType: "SPECIAL",
650
+ scheduledDate: { var: "event.scheduledDate" },
651
+ calledBy: {
652
+ type: { var: "event.calledByType" },
653
+ },
654
+ },
655
+ ],
656
+ },
657
+ emits: ["SPECIAL_MEETING_SCHEDULED"],
658
+ },
659
+ // SCHEDULED -> RECORD_DATE_SET
660
+ {
661
+ from: "SCHEDULED",
662
+ to: "RECORD_DATE_SET",
663
+ eventName: "set_record_date",
664
+ guard: { "==": [1, 1] }, // validRecordDateTiming simplified
665
+ effect: {
666
+ merge: [
667
+ { var: "state" },
668
+ {
669
+ status: "RECORD_DATE_SET",
670
+ recordDate: {
671
+ date: { var: "event.recordDate" },
672
+ setByBoardOn: { var: "$timestamp" },
673
+ resolutionRef: { var: "event.resolutionRef" },
674
+ },
675
+ },
676
+ ],
677
+ },
678
+ emits: ["RECORD_DATE_SET"],
679
+ },
680
+ // RECORD_DATE_SET -> RECORD_DATE_SET (register_eligible_shareholders)
681
+ {
682
+ from: "RECORD_DATE_SET",
683
+ to: "RECORD_DATE_SET",
684
+ eventName: "register_eligible_shareholders",
685
+ guard: { "==": [1, 1] },
686
+ effect: {
687
+ merge: [
688
+ { var: "state" },
689
+ {
690
+ eligibleVoters: { var: "event.shareholders" },
691
+ quorumRequirements: {
692
+ merge: [
693
+ { var: "state.quorumRequirements" },
694
+ {
695
+ sharesRequired: {
696
+ "*": [{ var: "event.totalSharesOutstanding" }, 0.5],
697
+ },
698
+ },
699
+ ],
700
+ },
701
+ },
702
+ ],
703
+ },
704
+ },
705
+ // RECORD_DATE_SET -> PROXY_PERIOD
706
+ {
707
+ from: "RECORD_DATE_SET",
708
+ to: "PROXY_PERIOD",
709
+ eventName: "open_proxy_period",
710
+ guard: { "==": [1, 1] },
711
+ effect: {
712
+ merge: [
713
+ { var: "state" },
714
+ {
715
+ status: "PROXY_PERIOD",
716
+ proxyPeriod: {
717
+ startDate: { var: "event.startDate" },
718
+ endDate: { var: "state.scheduledDate" },
719
+ proxyMaterials: {
720
+ proxyStatementRef: { var: "event.proxyStatementRef" },
721
+ formOfProxyRef: { var: "event.formOfProxyRef" },
722
+ annualReportRef: { var: "event.annualReportRef" },
723
+ },
724
+ },
725
+ agenda: { var: "event.agenda" },
726
+ noticeInfo: {
727
+ merge: [
728
+ { var: "state.noticeInfo" },
729
+ { noticeSentDate: { var: "event.startDate" } },
730
+ ],
731
+ },
732
+ },
733
+ ],
734
+ },
735
+ emits: ["PROXY_PERIOD_OPENED"],
736
+ },
737
+ // add_agenda_item (can be from multiple states)
738
+ {
739
+ from: "SCHEDULED",
740
+ to: "SCHEDULED",
741
+ eventName: "add_agenda_item",
742
+ guard: { "==": [1, 1] },
743
+ effect: {
744
+ merge: [
745
+ { var: "state" },
746
+ {
747
+ agenda: {
748
+ cat: [
749
+ { var: "state.agenda" },
750
+ [
751
+ {
752
+ itemId: { var: "event.itemId" },
753
+ itemNumber: { "+": [{ var: "state.agenda.length" }, 1] },
754
+ title: { var: "event.title" },
755
+ description: { var: "event.description" },
756
+ type: { var: "event.type" },
757
+ voteRequired: { var: "event.voteRequired" },
758
+ eligibleClasses: { var: "event.eligibleClasses" },
759
+ allowCumulativeVoting: {
760
+ var: "event.allowCumulativeVoting",
761
+ },
762
+ status: "PENDING",
763
+ },
764
+ ],
765
+ ],
766
+ },
767
+ },
768
+ ],
769
+ },
770
+ },
771
+ {
772
+ from: "RECORD_DATE_SET",
773
+ to: "RECORD_DATE_SET",
774
+ eventName: "add_agenda_item",
775
+ guard: { "==": [1, 1] },
776
+ effect: {
777
+ merge: [
778
+ { var: "state" },
779
+ {
780
+ agenda: {
781
+ cat: [
782
+ { var: "state.agenda" },
783
+ [
784
+ {
785
+ itemId: { var: "event.itemId" },
786
+ itemNumber: { "+": [{ var: "state.agenda.length" }, 1] },
787
+ title: { var: "event.title" },
788
+ description: { var: "event.description" },
789
+ type: { var: "event.type" },
790
+ voteRequired: { var: "event.voteRequired" },
791
+ eligibleClasses: { var: "event.eligibleClasses" },
792
+ allowCumulativeVoting: {
793
+ var: "event.allowCumulativeVoting",
794
+ },
795
+ status: "PENDING",
796
+ },
797
+ ],
798
+ ],
799
+ },
800
+ },
801
+ ],
802
+ },
803
+ },
804
+ {
805
+ from: "PROXY_PERIOD",
806
+ to: "PROXY_PERIOD",
807
+ eventName: "add_agenda_item",
808
+ guard: { "==": [1, 1] },
809
+ effect: {
810
+ merge: [
811
+ { var: "state" },
812
+ {
813
+ agenda: {
814
+ cat: [
815
+ { var: "state.agenda" },
816
+ [
817
+ {
818
+ itemId: { var: "event.itemId" },
819
+ itemNumber: { "+": [{ var: "state.agenda.length" }, 1] },
820
+ title: { var: "event.title" },
821
+ description: { var: "event.description" },
822
+ type: { var: "event.type" },
823
+ voteRequired: { var: "event.voteRequired" },
824
+ eligibleClasses: { var: "event.eligibleClasses" },
825
+ allowCumulativeVoting: {
826
+ var: "event.allowCumulativeVoting",
827
+ },
828
+ status: "PENDING",
829
+ },
830
+ ],
831
+ ],
832
+ },
833
+ },
834
+ ],
835
+ },
836
+ },
837
+ // PROXY_PERIOD -> IN_SESSION
838
+ {
839
+ from: "PROXY_PERIOD",
840
+ to: "IN_SESSION",
841
+ eventName: "open_meeting",
842
+ guard: {
843
+ ">=": [
844
+ { var: "event.initialQuorumCount" },
845
+ { var: "state.quorumRequirements.sharesRequired" },
846
+ ],
847
+ },
848
+ effect: {
849
+ merge: [
850
+ { var: "state" },
851
+ {
852
+ status: "IN_SESSION",
853
+ sessionInfo: {
854
+ openedAt: { var: "event.openedAt" },
855
+ chairPerson: { var: "event.chairPerson" },
856
+ secretaryPresent: { var: "event.secretaryPresent" },
857
+ },
858
+ inspectorOfElections: { var: "event.inspectorOfElections" },
859
+ quorumRequirements: {
860
+ merge: [
861
+ { var: "state.quorumRequirements" },
862
+ {
863
+ sharesRepresented: { var: "event.initialQuorumCount" },
864
+ quorumMet: true,
865
+ },
866
+ ],
867
+ },
868
+ },
869
+ ],
870
+ },
871
+ emits: ["SHAREHOLDER_MEETING_OPENED"],
872
+ },
873
+ // IN_SESSION -> VOTING
874
+ {
875
+ from: "IN_SESSION",
876
+ to: "VOTING",
877
+ eventName: "open_polls",
878
+ guard: { "==": [1, 1] },
879
+ effect: {
880
+ merge: [
881
+ { var: "state" },
882
+ {
883
+ status: "VOTING",
884
+ sessionInfo: {
885
+ merge: [
886
+ { var: "state.sessionInfo" },
887
+ { pollsOpenedAt: { var: "event.pollsOpenedAt" } },
888
+ ],
889
+ },
890
+ agenda: {
891
+ map: [
892
+ { var: "state.agenda" },
893
+ {
894
+ merge: [{ var: "" }, { status: "VOTING" }],
895
+ },
896
+ ],
897
+ },
898
+ },
899
+ ],
900
+ },
901
+ },
902
+ // VOTING -> VOTING (cast_vote)
903
+ {
904
+ from: "VOTING",
905
+ to: "VOTING",
906
+ eventName: "cast_vote",
907
+ guard: {
908
+ and: [
909
+ {
910
+ some: [
911
+ { var: "state.eligibleVoters" },
912
+ {
913
+ "==": [
914
+ { var: ".shareholderId" },
915
+ { var: "event.shareholderId" },
916
+ ],
917
+ },
918
+ ],
919
+ },
920
+ {
921
+ "!": {
922
+ some: [
923
+ { var: "state.votes" },
924
+ {
925
+ and: [
926
+ {
927
+ "==": [
928
+ { var: ".shareholderId" },
929
+ { var: "event.shareholderId" },
930
+ ],
931
+ },
932
+ {
933
+ "==": [
934
+ { var: ".agendaItemId" },
935
+ { var: "event.agendaItemId" },
936
+ ],
937
+ },
938
+ ],
939
+ },
940
+ ],
941
+ },
942
+ },
943
+ ],
944
+ },
945
+ effect: {
946
+ merge: [
947
+ { var: "state" },
948
+ {
949
+ votes: {
950
+ cat: [
951
+ { var: "state.votes" },
952
+ [
953
+ {
954
+ voteId: { var: "event.voteId" },
955
+ agendaItemId: { var: "event.agendaItemId" },
956
+ voterId: { var: "event.voterId" },
957
+ shareholderId: { var: "event.shareholderId" },
958
+ shareClass: { var: "event.shareClass" },
959
+ votesFor: { var: "event.votesFor" },
960
+ votesAgainst: { var: "event.votesAgainst" },
961
+ votesAbstain: { var: "event.votesAbstain" },
962
+ votesWithhold: { var: "event.votesWithhold" },
963
+ cumulativeVoteAllocation: {
964
+ var: "event.cumulativeVoteAllocation",
965
+ },
966
+ viaProxy: { var: "event.viaProxy" },
967
+ timestamp: { var: "$timestamp" },
968
+ },
969
+ ],
970
+ ],
971
+ },
972
+ eligibleVoters: {
973
+ map: [
974
+ { var: "state.eligibleVoters" },
975
+ {
976
+ if: [
977
+ {
978
+ "==": [
979
+ { var: ".shareholderId" },
980
+ { var: "event.shareholderId" },
981
+ ],
982
+ },
983
+ {
984
+ merge: [{ var: "" }, { hasVoted: true }],
985
+ },
986
+ { var: "" },
987
+ ],
988
+ },
989
+ ],
990
+ },
991
+ },
992
+ ],
993
+ },
994
+ },
995
+ // VOTING -> IN_SESSION (close_polls)
996
+ {
997
+ from: "VOTING",
998
+ to: "IN_SESSION",
999
+ eventName: "close_polls",
1000
+ guard: { "==": [1, 1] },
1001
+ effect: {
1002
+ merge: [
1003
+ { var: "state" },
1004
+ {
1005
+ status: "IN_SESSION",
1006
+ sessionInfo: {
1007
+ merge: [
1008
+ { var: "state.sessionInfo" },
1009
+ { pollsClosedAt: { var: "event.pollsClosedAt" } },
1010
+ ],
1011
+ },
1012
+ agenda: {
1013
+ map: [
1014
+ { var: "state.agenda" },
1015
+ {
1016
+ merge: [{ var: "" }, { status: "CLOSED" }],
1017
+ },
1018
+ ],
1019
+ },
1020
+ },
1021
+ ],
1022
+ },
1023
+ },
1024
+ // IN_SESSION -> CLOSED (certify_results)
1025
+ {
1026
+ from: "IN_SESSION",
1027
+ to: "CLOSED",
1028
+ eventName: "certify_results",
1029
+ guard: { "==": [1, 1] },
1030
+ effect: {
1031
+ merge: [
1032
+ { var: "state" },
1033
+ {
1034
+ status: "CLOSED",
1035
+ certification: {
1036
+ certifiedAt: { var: "event.certifiedAt" },
1037
+ certifiedBy: { var: "event.certifiedBy" },
1038
+ certificateRef: { var: "event.certificateRef" },
1039
+ },
1040
+ sessionInfo: {
1041
+ merge: [
1042
+ { var: "state.sessionInfo" },
1043
+ {
1044
+ adjournedAt: { var: "event.certifiedAt" },
1045
+ minutesRef: { var: "event.minutesRef" },
1046
+ },
1047
+ ],
1048
+ },
1049
+ },
1050
+ ],
1051
+ },
1052
+ emits: ["MEETING_RESULTS_CERTIFIED"],
1053
+ },
1054
+ // IN_SESSION -> CLOSED (adjourn_without_action)
1055
+ {
1056
+ from: "IN_SESSION",
1057
+ to: "CLOSED",
1058
+ eventName: "adjourn_without_action",
1059
+ guard: { "==": [1, 1] },
1060
+ effect: {
1061
+ merge: [
1062
+ { var: "state" },
1063
+ {
1064
+ status: "CLOSED",
1065
+ sessionInfo: {
1066
+ merge: [
1067
+ { var: "state.sessionInfo" },
1068
+ { adjournedAt: { var: "event.adjournedAt" } },
1069
+ ],
1070
+ },
1071
+ },
1072
+ ],
1073
+ },
1074
+ emits: ["MEETING_ADJOURNED"],
1075
+ },
1076
+ // VOTING -> CLOSED (adjourn_without_action)
1077
+ {
1078
+ from: "VOTING",
1079
+ to: "CLOSED",
1080
+ eventName: "adjourn_without_action",
1081
+ guard: { "==": [1, 1] },
1082
+ effect: {
1083
+ merge: [
1084
+ { var: "state" },
1085
+ {
1086
+ status: "CLOSED",
1087
+ sessionInfo: {
1088
+ merge: [
1089
+ { var: "state.sessionInfo" },
1090
+ { adjournedAt: { var: "event.adjournedAt" } },
1091
+ ],
1092
+ },
1093
+ },
1094
+ ],
1095
+ },
1096
+ emits: ["MEETING_ADJOURNED"],
1097
+ },
1098
+ ],
1099
+ });