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