@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,995 @@
1
+ import { defineFiberApp } from "../../../schema/fiber-app.js";
2
+ /**
3
+ * Securities state machine tracking the lifecycle of equity from authorization through issuance, transfer, and retirement.
4
+ * Manages stock certificates, book entry positions, and restricted securities.
5
+ */
6
+ export const corpSecuritiesDef = defineFiberApp({
7
+ metadata: {
8
+ name: "CorpSecurities",
9
+ app: "corporate",
10
+ type: "securities",
11
+ version: "1.0.0",
12
+ description: "Securities state machine tracking the lifecycle of equity from authorization through issuance, transfer, and retirement. Manages stock certificates, book entry positions, and restricted securities.",
13
+ crossReferences: {
14
+ entity: {
15
+ machine: "corporate-entity",
16
+ description: "Parent corporate entity with share class definitions",
17
+ foreignKey: "entityId",
18
+ },
19
+ resolutions: {
20
+ machine: "corporate-resolution",
21
+ description: "Board resolutions authorizing securities actions",
22
+ foreignKey: "entityId",
23
+ },
24
+ shareholders: {
25
+ machine: "corporate-shareholders",
26
+ description: "Shareholder meetings for determining voting rights",
27
+ foreignKey: "entityId",
28
+ },
29
+ },
30
+ },
31
+ createSchema: {
32
+ required: [
33
+ "securityId",
34
+ "entityId",
35
+ "shareClass",
36
+ "shareClassName",
37
+ "shareCount",
38
+ "parValue",
39
+ ],
40
+ properties: {
41
+ securityId: {
42
+ type: "string",
43
+ description: "Unique identifier for this security lot/certificate",
44
+ immutable: true,
45
+ },
46
+ entityId: {
47
+ type: "string",
48
+ description: "Reference to parent corporate-entity",
49
+ immutable: true,
50
+ },
51
+ shareClass: {
52
+ type: "string",
53
+ description: "Share class ID from corporate-entity",
54
+ },
55
+ shareClassName: {
56
+ type: "string",
57
+ description: "Human-readable class name",
58
+ },
59
+ shareCount: {
60
+ type: "integer",
61
+ description: "Number of shares in this lot",
62
+ },
63
+ parValue: {
64
+ type: "number",
65
+ description: "Par value per share",
66
+ },
67
+ },
68
+ },
69
+ stateSchema: {
70
+ properties: {
71
+ securityId: { type: "string", immutable: true },
72
+ entityId: { type: "string", immutable: true },
73
+ shareClass: { type: "string" },
74
+ shareClassName: { type: "string" },
75
+ certificateNumber: {
76
+ type: "string",
77
+ nullable: true,
78
+ description: "For certificated shares",
79
+ },
80
+ cusip: {
81
+ type: "string",
82
+ nullable: true,
83
+ description: "CUSIP number if assigned",
84
+ },
85
+ shareCount: { type: "integer" },
86
+ parValue: { type: "number" },
87
+ issuancePrice: {
88
+ type: "number",
89
+ nullable: true,
90
+ description: "Price per share at issuance",
91
+ computed: true,
92
+ },
93
+ issuanceDate: {
94
+ type: "string",
95
+ format: "date",
96
+ nullable: true,
97
+ computed: true,
98
+ },
99
+ form: {
100
+ type: "string",
101
+ enum: ["CERTIFICATED", "BOOK_ENTRY", "DRS"],
102
+ description: "Physical certificate, book entry, or Direct Registration System",
103
+ computed: true,
104
+ },
105
+ holder: { $ref: "#/definitions/Holder", nullable: true, computed: true },
106
+ restrictions: { $ref: "#/definitions/Restrictions", computed: true },
107
+ authorization: {
108
+ $ref: "#/definitions/Authorization",
109
+ nullable: true,
110
+ computed: true,
111
+ },
112
+ issuanceDetails: {
113
+ $ref: "#/definitions/IssuanceDetails",
114
+ nullable: true,
115
+ computed: true,
116
+ },
117
+ transferHistory: {
118
+ type: "array",
119
+ items: { $ref: "#/definitions/TransferRecord" },
120
+ computed: true,
121
+ },
122
+ corporateActions: {
123
+ type: "array",
124
+ items: { $ref: "#/definitions/CorporateAction" },
125
+ computed: true,
126
+ },
127
+ retirementDetails: {
128
+ $ref: "#/definitions/RetirementDetails",
129
+ nullable: true,
130
+ computed: true,
131
+ },
132
+ status: {
133
+ type: "string",
134
+ enum: [
135
+ "AUTHORIZED",
136
+ "ISSUED",
137
+ "TREASURY",
138
+ "TRANSFERRED",
139
+ "RETIRED",
140
+ ],
141
+ computed: true,
142
+ },
143
+ createdAt: { type: "timestamp", computed: true },
144
+ updatedAt: { type: "timestamp", computed: true },
145
+ },
146
+ },
147
+ eventSchemas: {
148
+ authorize_shares: {
149
+ description: "Record shares as authorized per charter/amendment",
150
+ required: [
151
+ "securityId",
152
+ "entityId",
153
+ "shareClass",
154
+ "shareClassName",
155
+ "shareCount",
156
+ "parValue",
157
+ "authorizedDate",
158
+ ],
159
+ properties: {
160
+ securityId: { type: "string" },
161
+ entityId: { type: "string" },
162
+ shareClass: { type: "string" },
163
+ shareClassName: { type: "string" },
164
+ shareCount: { type: "integer" },
165
+ parValue: { type: "number" },
166
+ authorizedDate: { type: "string", format: "date" },
167
+ charterProvision: { type: "string" },
168
+ },
169
+ },
170
+ issue_shares: {
171
+ description: "Issue shares to a holder",
172
+ required: [
173
+ "holderId",
174
+ "holderType",
175
+ "holderName",
176
+ "issuanceDate",
177
+ "form",
178
+ "boardResolutionRef",
179
+ "consideration",
180
+ ],
181
+ properties: {
182
+ holderId: { type: "string" },
183
+ holderType: { type: "string" },
184
+ holderName: { type: "string" },
185
+ address: { type: "object" },
186
+ issuanceDate: { type: "string", format: "date" },
187
+ issuancePrice: { type: "number" },
188
+ form: {
189
+ type: "string",
190
+ enum: ["CERTIFICATED", "BOOK_ENTRY", "DRS"],
191
+ },
192
+ certificateNumber: { type: "string" },
193
+ boardResolutionRef: { type: "string" },
194
+ consideration: { type: "object" },
195
+ isRestricted: { type: "boolean", default: false },
196
+ restrictionType: { type: "array" },
197
+ legends: { type: "array" },
198
+ exemptionUsed: { type: "string" },
199
+ accreditedInvestor: { type: "boolean" },
200
+ },
201
+ },
202
+ initiate_transfer: {
203
+ description: "Begin transfer of shares to new holder",
204
+ required: [
205
+ "transferId",
206
+ "toHolderId",
207
+ "toHolderName",
208
+ "toHolderType",
209
+ "transferType",
210
+ "transferDate",
211
+ ],
212
+ properties: {
213
+ transferId: { type: "string" },
214
+ toHolderId: { type: "string" },
215
+ toHolderName: { type: "string" },
216
+ toHolderType: { type: "string" },
217
+ toAddress: { type: "object" },
218
+ transferType: { type: "string" },
219
+ pricePerShare: { type: "number" },
220
+ transferDate: { type: "string", format: "date" },
221
+ },
222
+ },
223
+ complete_transfer: {
224
+ description: "Complete the transfer, update holder",
225
+ required: [
226
+ "toHolderId",
227
+ "toHolderName",
228
+ "toHolderType",
229
+ "completedDate",
230
+ ],
231
+ properties: {
232
+ transferAgentConfirmation: { type: "string" },
233
+ newCertificateNumber: { type: "string" },
234
+ toHolderId: { type: "string" },
235
+ toHolderName: { type: "string" },
236
+ toHolderType: { type: "string" },
237
+ toAddress: { type: "object" },
238
+ completedDate: { type: "string", format: "date" },
239
+ costBasis: { type: "number" },
240
+ },
241
+ },
242
+ repurchase: {
243
+ description: "Company repurchases shares from holder",
244
+ required: [
245
+ "repurchaseDate",
246
+ "pricePerShare",
247
+ "boardResolutionRef",
248
+ ],
249
+ properties: {
250
+ repurchaseDate: { type: "string", format: "date" },
251
+ pricePerShare: { type: "number" },
252
+ boardResolutionRef: { type: "string" },
253
+ repurchaseAgreementRef: { type: "string" },
254
+ },
255
+ },
256
+ reissue_from_treasury: {
257
+ description: "Reissue treasury shares to a new holder",
258
+ required: [
259
+ "holderId",
260
+ "holderName",
261
+ "holderType",
262
+ "reissueDate",
263
+ "boardResolutionRef",
264
+ ],
265
+ properties: {
266
+ holderId: { type: "string" },
267
+ holderName: { type: "string" },
268
+ holderType: { type: "string" },
269
+ address: { type: "object" },
270
+ reissueDate: { type: "string", format: "date" },
271
+ issuancePrice: { type: "number" },
272
+ boardResolutionRef: { type: "string" },
273
+ },
274
+ },
275
+ retire: {
276
+ description: "Retire shares (cancel them)",
277
+ required: [
278
+ "retiredDate",
279
+ "retirementMethod",
280
+ "boardResolutionRef",
281
+ ],
282
+ properties: {
283
+ retiredDate: { type: "string", format: "date" },
284
+ retirementMethod: { type: "string" },
285
+ boardResolutionRef: { type: "string" },
286
+ repurchasePrice: { type: "number" },
287
+ },
288
+ },
289
+ stock_split: {
290
+ description: "Apply stock split to this lot",
291
+ required: [
292
+ "actionId",
293
+ "splitRatio",
294
+ "effectiveDate",
295
+ "resolutionRef",
296
+ "newShareCount",
297
+ ],
298
+ properties: {
299
+ actionId: { type: "string" },
300
+ splitRatio: {
301
+ type: "string",
302
+ description: "e.g., '2:1' for 2-for-1 split",
303
+ },
304
+ effectiveDate: { type: "string", format: "date" },
305
+ resolutionRef: { type: "string" },
306
+ newShareCount: { type: "integer" },
307
+ },
308
+ },
309
+ declare_dividend: {
310
+ description: "Record dividend declaration affecting this lot (for stock dividends)",
311
+ required: [
312
+ "actionId",
313
+ "dividendType",
314
+ "recordDate",
315
+ "paymentDate",
316
+ "resolutionRef",
317
+ ],
318
+ properties: {
319
+ actionId: { type: "string" },
320
+ dividendType: { type: "string", enum: ["CASH", "STOCK"] },
321
+ recordDate: { type: "string", format: "date" },
322
+ paymentDate: { type: "string", format: "date" },
323
+ cashAmount: { type: "number" },
324
+ stockShares: { type: "integer" },
325
+ resolutionRef: { type: "string" },
326
+ },
327
+ },
328
+ remove_restriction: {
329
+ description: "Remove or update restrictions on the shares",
330
+ required: ["restrictionType", "removedDate"],
331
+ properties: {
332
+ restrictionType: { type: "string" },
333
+ removedDate: { type: "string", format: "date" },
334
+ reason: { type: "string" },
335
+ legalOpinionRef: { type: "string" },
336
+ },
337
+ },
338
+ },
339
+ definitions: {
340
+ Holder: {
341
+ type: "object",
342
+ nullable: true,
343
+ properties: {
344
+ holderId: { type: "string" },
345
+ holderType: {
346
+ type: "string",
347
+ enum: ["INDIVIDUAL", "ENTITY", "TRUST", "TREASURY"],
348
+ },
349
+ name: { type: "string" },
350
+ taxId: { type: "string", nullable: true },
351
+ address: { type: "object", nullable: true },
352
+ acquisitionDate: { type: "string", format: "date" },
353
+ acquisitionMethod: {
354
+ type: "string",
355
+ enum: [
356
+ "ORIGINAL_ISSUANCE",
357
+ "PURCHASE",
358
+ "GIFT",
359
+ "INHERITANCE",
360
+ "STOCK_SPLIT",
361
+ "CONVERSION",
362
+ "EXERCISE",
363
+ ],
364
+ },
365
+ costBasis: { type: "number", nullable: true },
366
+ },
367
+ },
368
+ Restrictions: {
369
+ type: "object",
370
+ properties: {
371
+ isRestricted: { type: "boolean", default: false },
372
+ restrictionType: {
373
+ type: "array",
374
+ items: {
375
+ type: "string",
376
+ enum: [
377
+ "RULE_144",
378
+ "SECTION_4(a)(2)",
379
+ "REG_D",
380
+ "REG_S",
381
+ "LOCK_UP",
382
+ "VESTING",
383
+ "RIGHT_OF_FIRST_REFUSAL",
384
+ ],
385
+ },
386
+ },
387
+ restrictionEndDate: { type: "string", format: "date", nullable: true },
388
+ legends: {
389
+ type: "array",
390
+ items: { type: "string" },
391
+ description: "Legend text on certificates",
392
+ },
393
+ vestingSchedule: {
394
+ type: "object",
395
+ nullable: true,
396
+ properties: {
397
+ vestingStartDate: { type: "string", format: "date" },
398
+ totalShares: { type: "integer" },
399
+ vestedShares: { type: "integer" },
400
+ vestingScheduleRef: { type: "string" },
401
+ },
402
+ },
403
+ lockUpExpiration: { type: "string", format: "date", nullable: true },
404
+ rofr: {
405
+ type: "object",
406
+ nullable: true,
407
+ description: "Right of First Refusal",
408
+ properties: {
409
+ holderIds: { type: "array", items: { type: "string" } },
410
+ noticePeriodDays: { type: "integer" },
411
+ },
412
+ },
413
+ },
414
+ },
415
+ Authorization: {
416
+ type: "object",
417
+ nullable: true,
418
+ description: "For shares in AUTHORIZED state",
419
+ properties: {
420
+ authorizedDate: { type: "string", format: "date" },
421
+ charterProvision: { type: "string" },
422
+ authorizedShares: { type: "integer" },
423
+ },
424
+ },
425
+ IssuanceDetails: {
426
+ type: "object",
427
+ nullable: true,
428
+ properties: {
429
+ boardResolutionRef: { type: "string" },
430
+ issuanceAgreementRef: { type: "string" },
431
+ consideration: {
432
+ type: "object",
433
+ properties: {
434
+ type: {
435
+ type: "string",
436
+ enum: [
437
+ "CASH",
438
+ "PROPERTY",
439
+ "SERVICES",
440
+ "DEBT_CONVERSION",
441
+ "STOCK_CONVERSION",
442
+ ],
443
+ },
444
+ value: { type: "number" },
445
+ description: { type: "string" },
446
+ },
447
+ },
448
+ exemptionUsed: { type: "string", nullable: true },
449
+ accreditedInvestor: { type: "boolean", nullable: true },
450
+ },
451
+ },
452
+ TransferRecord: {
453
+ type: "object",
454
+ properties: {
455
+ transferId: { type: "string" },
456
+ transferDate: { type: "string", format: "date" },
457
+ fromHolderId: { type: "string" },
458
+ toHolderId: { type: "string" },
459
+ shares: { type: "integer" },
460
+ transferType: {
461
+ type: "string",
462
+ enum: ["SALE", "GIFT", "INHERITANCE", "INTERNAL"],
463
+ },
464
+ pricePerShare: { type: "number", nullable: true },
465
+ transferAgentConfirmation: { type: "string", nullable: true },
466
+ },
467
+ },
468
+ CorporateAction: {
469
+ type: "object",
470
+ description: "Stock splits, dividends, etc. affecting this lot",
471
+ properties: {
472
+ actionId: { type: "string" },
473
+ actionType: {
474
+ type: "string",
475
+ enum: [
476
+ "STOCK_SPLIT",
477
+ "REVERSE_SPLIT",
478
+ "STOCK_DIVIDEND",
479
+ "CONVERSION",
480
+ "RECLASSIFICATION",
481
+ ],
482
+ },
483
+ actionDate: { type: "string", format: "date" },
484
+ ratio: {
485
+ type: "string",
486
+ nullable: true,
487
+ description: "e.g., 2:1 for split",
488
+ },
489
+ sharesBeforeAction: { type: "integer" },
490
+ sharesAfterAction: { type: "integer" },
491
+ resolutionRef: { type: "string" },
492
+ },
493
+ },
494
+ RetirementDetails: {
495
+ type: "object",
496
+ nullable: true,
497
+ properties: {
498
+ retiredDate: { type: "string", format: "date" },
499
+ retirementMethod: {
500
+ type: "string",
501
+ enum: [
502
+ "REPURCHASE",
503
+ "REDEMPTION",
504
+ "CANCELLATION",
505
+ "CONVERSION",
506
+ ],
507
+ },
508
+ repurchasePrice: { type: "number", nullable: true },
509
+ boardResolutionRef: { type: "string" },
510
+ },
511
+ },
512
+ },
513
+ states: {
514
+ AUTHORIZED: {
515
+ id: "AUTHORIZED",
516
+ isFinal: false,
517
+ description: "Shares authorized by charter but not yet issued",
518
+ },
519
+ ISSUED: {
520
+ id: "ISSUED",
521
+ isFinal: false,
522
+ description: "Shares issued and held by a shareholder",
523
+ },
524
+ TREASURY: {
525
+ id: "TREASURY",
526
+ isFinal: false,
527
+ description: "Shares repurchased and held by the company",
528
+ },
529
+ TRANSFERRED: {
530
+ id: "TRANSFERRED",
531
+ isFinal: false,
532
+ description: "Transitional state during transfer between holders",
533
+ },
534
+ RETIRED: {
535
+ id: "RETIRED",
536
+ isFinal: true,
537
+ description: "Shares cancelled and returned to authorized but unissued",
538
+ },
539
+ },
540
+ initialState: "AUTHORIZED",
541
+ transitions: [
542
+ // Initial authorization (creation)
543
+ {
544
+ from: "AUTHORIZED",
545
+ to: "AUTHORIZED",
546
+ eventName: "authorize_shares",
547
+ guard: { "==": [1, 1] },
548
+ effect: {
549
+ merge: [
550
+ { var: "state" },
551
+ {
552
+ securityId: { var: "event.securityId" },
553
+ entityId: { var: "event.entityId" },
554
+ shareClass: { var: "event.shareClass" },
555
+ shareClassName: { var: "event.shareClassName" },
556
+ shareCount: { var: "event.shareCount" },
557
+ parValue: { var: "event.parValue" },
558
+ authorization: {
559
+ authorizedDate: { var: "event.authorizedDate" },
560
+ charterProvision: { var: "event.charterProvision" },
561
+ authorizedShares: { var: "event.shareCount" },
562
+ },
563
+ transferHistory: [],
564
+ corporateActions: [],
565
+ },
566
+ ],
567
+ },
568
+ },
569
+ // AUTHORIZED -> ISSUED
570
+ {
571
+ from: "AUTHORIZED",
572
+ to: "ISSUED",
573
+ eventName: "issue_shares",
574
+ guard: { "==": [1, 1] },
575
+ dependencies: [
576
+ {
577
+ machine: "corporate-resolution",
578
+ instanceRef: { var: "event.boardResolutionRef" },
579
+ requiredState: "EXECUTED",
580
+ },
581
+ {
582
+ machine: "corporate-entity",
583
+ instanceRef: { var: "state.entityId" },
584
+ requiredState: "ACTIVE",
585
+ },
586
+ ],
587
+ effect: {
588
+ merge: [
589
+ { var: "state" },
590
+ {
591
+ status: "ISSUED",
592
+ form: { var: "event.form" },
593
+ certificateNumber: { var: "event.certificateNumber" },
594
+ issuanceDate: { var: "event.issuanceDate" },
595
+ issuancePrice: { var: "event.issuancePrice" },
596
+ holder: {
597
+ holderId: { var: "event.holderId" },
598
+ holderType: { var: "event.holderType" },
599
+ name: { var: "event.holderName" },
600
+ address: { var: "event.address" },
601
+ acquisitionDate: { var: "event.issuanceDate" },
602
+ acquisitionMethod: "ORIGINAL_ISSUANCE",
603
+ costBasis: {
604
+ "*": [
605
+ { var: "event.issuancePrice" },
606
+ { var: "state.shareCount" },
607
+ ],
608
+ },
609
+ },
610
+ restrictions: {
611
+ isRestricted: { var: "event.isRestricted" },
612
+ restrictionType: { var: "event.restrictionType" },
613
+ legends: { var: "event.legends" },
614
+ },
615
+ issuanceDetails: {
616
+ boardResolutionRef: { var: "event.boardResolutionRef" },
617
+ consideration: { var: "event.consideration" },
618
+ exemptionUsed: { var: "event.exemptionUsed" },
619
+ accreditedInvestor: { var: "event.accreditedInvestor" },
620
+ },
621
+ },
622
+ ],
623
+ },
624
+ emits: ["SHARES_ISSUED"],
625
+ },
626
+ // ISSUED -> TRANSFERRED
627
+ {
628
+ from: "ISSUED",
629
+ to: "TRANSFERRED",
630
+ eventName: "initiate_transfer",
631
+ guard: {
632
+ and: [
633
+ {
634
+ or: [
635
+ { "==": [{ var: "state.restrictions.isRestricted" }, false] },
636
+ {
637
+ "==": [{ var: "state.restrictions.restrictionEndDate" }, null],
638
+ },
639
+ {
640
+ ">=": [
641
+ { var: "$timestamp" },
642
+ { var: "state.restrictions.restrictionEndDate" },
643
+ ],
644
+ },
645
+ ],
646
+ },
647
+ { "==": [{ var: "state.restrictions.rofr" }, null] },
648
+ ],
649
+ },
650
+ effect: {
651
+ merge: [
652
+ { var: "state" },
653
+ {
654
+ status: "TRANSFERRED",
655
+ transferHistory: {
656
+ cat: [
657
+ { var: "state.transferHistory" },
658
+ [
659
+ {
660
+ transferId: { var: "event.transferId" },
661
+ transferDate: { var: "event.transferDate" },
662
+ fromHolderId: { var: "state.holder.holderId" },
663
+ toHolderId: { var: "event.toHolderId" },
664
+ shares: { var: "state.shareCount" },
665
+ transferType: { var: "event.transferType" },
666
+ pricePerShare: { var: "event.pricePerShare" },
667
+ },
668
+ ],
669
+ ],
670
+ },
671
+ },
672
+ ],
673
+ },
674
+ emits: ["TRANSFER_INITIATED"],
675
+ },
676
+ // TRANSFERRED -> ISSUED
677
+ {
678
+ from: "TRANSFERRED",
679
+ to: "ISSUED",
680
+ eventName: "complete_transfer",
681
+ guard: { "==": [1, 1] },
682
+ effect: {
683
+ merge: [
684
+ { var: "state" },
685
+ {
686
+ status: "ISSUED",
687
+ holder: {
688
+ holderId: { var: "event.toHolderId" },
689
+ holderType: { var: "event.toHolderType" },
690
+ name: { var: "event.toHolderName" },
691
+ address: { var: "event.toAddress" },
692
+ acquisitionDate: { var: "event.completedDate" },
693
+ acquisitionMethod: "PURCHASE",
694
+ costBasis: { var: "event.costBasis" },
695
+ },
696
+ certificateNumber: {
697
+ if: [
698
+ { "!=": [{ var: "event.newCertificateNumber" }, null] },
699
+ { var: "event.newCertificateNumber" },
700
+ { var: "state.certificateNumber" },
701
+ ],
702
+ },
703
+ },
704
+ ],
705
+ },
706
+ emits: ["TRANSFER_COMPLETED"],
707
+ },
708
+ // ISSUED -> TREASURY
709
+ {
710
+ from: "ISSUED",
711
+ to: "TREASURY",
712
+ eventName: "repurchase",
713
+ guard: { "==": [1, 1] },
714
+ dependencies: [
715
+ {
716
+ machine: "corporate-resolution",
717
+ instanceRef: { var: "event.boardResolutionRef" },
718
+ requiredState: "EXECUTED",
719
+ },
720
+ ],
721
+ effect: {
722
+ merge: [
723
+ { var: "state" },
724
+ {
725
+ status: "TREASURY",
726
+ transferHistory: {
727
+ cat: [
728
+ { var: "state.transferHistory" },
729
+ [
730
+ {
731
+ transferId: {
732
+ cat: ["REPURCHASE-", { var: "event.repurchaseDate" }],
733
+ },
734
+ transferDate: { var: "event.repurchaseDate" },
735
+ fromHolderId: { var: "state.holder.holderId" },
736
+ toHolderId: "TREASURY",
737
+ shares: { var: "state.shareCount" },
738
+ transferType: "INTERNAL",
739
+ pricePerShare: { var: "event.pricePerShare" },
740
+ },
741
+ ],
742
+ ],
743
+ },
744
+ holder: {
745
+ holderId: "TREASURY",
746
+ holderType: "TREASURY",
747
+ name: "Treasury Stock",
748
+ acquisitionDate: { var: "event.repurchaseDate" },
749
+ acquisitionMethod: "PURCHASE",
750
+ costBasis: {
751
+ "*": [
752
+ { var: "event.pricePerShare" },
753
+ { var: "state.shareCount" },
754
+ ],
755
+ },
756
+ },
757
+ },
758
+ ],
759
+ },
760
+ emits: ["SHARES_REPURCHASED"],
761
+ },
762
+ // TREASURY -> ISSUED
763
+ {
764
+ from: "TREASURY",
765
+ to: "ISSUED",
766
+ eventName: "reissue_from_treasury",
767
+ guard: { "==": [1, 1] },
768
+ dependencies: [
769
+ {
770
+ machine: "corporate-resolution",
771
+ instanceRef: { var: "event.boardResolutionRef" },
772
+ requiredState: "EXECUTED",
773
+ },
774
+ ],
775
+ effect: {
776
+ merge: [
777
+ { var: "state" },
778
+ {
779
+ status: "ISSUED",
780
+ holder: {
781
+ holderId: { var: "event.holderId" },
782
+ holderType: { var: "event.holderType" },
783
+ name: { var: "event.holderName" },
784
+ address: { var: "event.address" },
785
+ acquisitionDate: { var: "event.reissueDate" },
786
+ acquisitionMethod: "PURCHASE",
787
+ costBasis: {
788
+ "*": [
789
+ { var: "event.issuancePrice" },
790
+ { var: "state.shareCount" },
791
+ ],
792
+ },
793
+ },
794
+ },
795
+ ],
796
+ },
797
+ emits: ["TREASURY_SHARES_REISSUED"],
798
+ },
799
+ // ISSUED -> RETIRED
800
+ {
801
+ from: "ISSUED",
802
+ to: "RETIRED",
803
+ eventName: "retire",
804
+ guard: { "==": [1, 1] },
805
+ dependencies: [
806
+ {
807
+ machine: "corporate-resolution",
808
+ instanceRef: { var: "event.boardResolutionRef" },
809
+ requiredState: "EXECUTED",
810
+ },
811
+ ],
812
+ effect: {
813
+ merge: [
814
+ { var: "state" },
815
+ {
816
+ status: "RETIRED",
817
+ retirementDetails: {
818
+ retiredDate: { var: "event.retiredDate" },
819
+ retirementMethod: { var: "event.retirementMethod" },
820
+ repurchasePrice: { var: "event.repurchasePrice" },
821
+ boardResolutionRef: { var: "event.boardResolutionRef" },
822
+ },
823
+ holder: null,
824
+ },
825
+ ],
826
+ },
827
+ emits: ["SHARES_RETIRED"],
828
+ },
829
+ // TREASURY -> RETIRED
830
+ {
831
+ from: "TREASURY",
832
+ to: "RETIRED",
833
+ eventName: "retire",
834
+ guard: { "==": [1, 1] },
835
+ dependencies: [
836
+ {
837
+ machine: "corporate-resolution",
838
+ instanceRef: { var: "event.boardResolutionRef" },
839
+ requiredState: "EXECUTED",
840
+ },
841
+ ],
842
+ effect: {
843
+ merge: [
844
+ { var: "state" },
845
+ {
846
+ status: "RETIRED",
847
+ retirementDetails: {
848
+ retiredDate: { var: "event.retiredDate" },
849
+ retirementMethod: { var: "event.retirementMethod" },
850
+ repurchasePrice: { var: "event.repurchasePrice" },
851
+ boardResolutionRef: { var: "event.boardResolutionRef" },
852
+ },
853
+ holder: null,
854
+ },
855
+ ],
856
+ },
857
+ emits: ["SHARES_RETIRED"],
858
+ },
859
+ // ISSUED -> ISSUED (stock_split)
860
+ {
861
+ from: "ISSUED",
862
+ to: "ISSUED",
863
+ eventName: "stock_split",
864
+ guard: { "==": [1, 1] },
865
+ effect: {
866
+ merge: [
867
+ { var: "state" },
868
+ {
869
+ corporateActions: {
870
+ cat: [
871
+ { var: "state.corporateActions" },
872
+ [
873
+ {
874
+ actionId: { var: "event.actionId" },
875
+ actionType: "STOCK_SPLIT",
876
+ actionDate: { var: "event.effectiveDate" },
877
+ ratio: { var: "event.splitRatio" },
878
+ sharesBeforeAction: { var: "state.shareCount" },
879
+ sharesAfterAction: { var: "event.newShareCount" },
880
+ resolutionRef: { var: "event.resolutionRef" },
881
+ },
882
+ ],
883
+ ],
884
+ },
885
+ shareCount: { var: "event.newShareCount" },
886
+ },
887
+ ],
888
+ },
889
+ emits: ["STOCK_SPLIT_APPLIED"],
890
+ },
891
+ // ISSUED -> ISSUED (declare_dividend) - stock dividend handling
892
+ {
893
+ from: "ISSUED",
894
+ to: "ISSUED",
895
+ eventName: "declare_dividend",
896
+ guard: { "==": [1, 1] },
897
+ dependencies: [
898
+ {
899
+ machine: "corporate-resolution",
900
+ instanceRef: { var: "event.resolutionRef" },
901
+ requiredState: "EXECUTED",
902
+ },
903
+ ],
904
+ effect: {
905
+ if: [
906
+ { "==": [{ var: "event.dividendType" }, "STOCK"] },
907
+ {
908
+ merge: [
909
+ { var: "state" },
910
+ {
911
+ corporateActions: {
912
+ cat: [
913
+ { var: "state.corporateActions" },
914
+ [
915
+ {
916
+ actionId: { var: "event.actionId" },
917
+ actionType: "STOCK_DIVIDEND",
918
+ actionDate: { var: "event.paymentDate" },
919
+ sharesBeforeAction: { var: "state.shareCount" },
920
+ sharesAfterAction: {
921
+ "+": [
922
+ { var: "state.shareCount" },
923
+ { var: "event.stockShares" },
924
+ ],
925
+ },
926
+ resolutionRef: { var: "event.resolutionRef" },
927
+ },
928
+ ],
929
+ ],
930
+ },
931
+ shareCount: {
932
+ "+": [
933
+ { var: "state.shareCount" },
934
+ { var: "event.stockShares" },
935
+ ],
936
+ },
937
+ },
938
+ ],
939
+ },
940
+ { var: "state" },
941
+ ],
942
+ },
943
+ },
944
+ // ISSUED -> ISSUED (remove_restriction)
945
+ {
946
+ from: "ISSUED",
947
+ to: "ISSUED",
948
+ eventName: "remove_restriction",
949
+ guard: { "==": [1, 1] },
950
+ effect: {
951
+ merge: [
952
+ { var: "state" },
953
+ {
954
+ restrictions: {
955
+ merge: [
956
+ { var: "state.restrictions" },
957
+ {
958
+ restrictionType: {
959
+ filter: [
960
+ { var: "state.restrictions.restrictionType" },
961
+ { "!=": [{ var: "" }, { var: "event.restrictionType" }] },
962
+ ],
963
+ },
964
+ isRestricted: {
965
+ ">": [
966
+ {
967
+ reduce: [
968
+ {
969
+ filter: [
970
+ { var: "state.restrictions.restrictionType" },
971
+ {
972
+ "!=": [
973
+ { var: "" },
974
+ { var: "event.restrictionType" },
975
+ ],
976
+ },
977
+ ],
978
+ },
979
+ { "+": [{ var: "accumulator" }, 1] },
980
+ 0,
981
+ ],
982
+ },
983
+ 0,
984
+ ],
985
+ },
986
+ },
987
+ ],
988
+ },
989
+ },
990
+ ],
991
+ },
992
+ emits: ["RESTRICTION_REMOVED"],
993
+ },
994
+ ],
995
+ });