@ottochain/sdk 2.0.0 → 2.1.0

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