@ottochain/sdk 2.3.0 → 2.5.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 (287) hide show
  1. package/dist/cjs/apps/compute/index.js +33 -0
  2. package/dist/cjs/apps/compute/state-machines/compute-rule110.js +164 -0
  3. package/dist/cjs/apps/compute/state-machines/index.js +9 -0
  4. package/dist/cjs/apps/contracts/index.js +16 -9
  5. package/dist/cjs/apps/contracts/state-machines/contract-agreement.js +134 -161
  6. package/dist/cjs/apps/contracts/state-machines/contract-escrow.js +192 -170
  7. package/dist/cjs/apps/contracts/state-machines/contract-universal.js +46 -58
  8. package/dist/cjs/apps/corporate/index.js +2 -2
  9. package/dist/cjs/apps/corporate/state-machines/corp-board.js +500 -456
  10. package/dist/cjs/apps/corporate/state-machines/corp-entity.js +487 -361
  11. package/dist/cjs/apps/corporate/state-machines/corp-securities.js +769 -576
  12. package/dist/cjs/apps/corporate/state-machines/corp-shareholders.js +567 -557
  13. package/dist/cjs/apps/governance/index.js +21 -21
  14. package/dist/cjs/apps/governance/state-machines/dao-multisig.js +188 -209
  15. package/dist/cjs/apps/governance/state-machines/dao-reputation.js +181 -228
  16. package/dist/cjs/apps/governance/state-machines/dao-single.js +105 -88
  17. package/dist/cjs/apps/governance/state-machines/dao-token.js +199 -227
  18. package/dist/cjs/apps/governance/state-machines/governance-simple.js +231 -231
  19. package/dist/cjs/apps/governance/state-machines/governance-universal.js +64 -64
  20. package/dist/cjs/apps/identity/constants.js +55 -22
  21. package/dist/cjs/apps/identity/index.js +28 -12
  22. package/dist/cjs/apps/identity/state-machines/identity-agent.js +124 -158
  23. package/dist/cjs/apps/identity/state-machines/identity-oracle.js +158 -173
  24. package/dist/cjs/apps/identity/state-machines/identity-registry.js +262 -0
  25. package/dist/cjs/apps/identity/state-machines/identity-universal.js +51 -57
  26. package/dist/cjs/apps/identity/state-machines/index.js +3 -1
  27. package/dist/cjs/apps/index.js +22 -8
  28. package/dist/cjs/apps/lending/assets.js +247 -0
  29. package/dist/cjs/apps/lending/credit-scoring.js +87 -0
  30. package/dist/cjs/apps/lending/eligibility.js +105 -0
  31. package/dist/cjs/apps/lending/index.js +91 -0
  32. package/dist/cjs/apps/lending/state-machines/index.js +9 -0
  33. package/dist/cjs/apps/lending/state-machines/lending-zk-loan.js +433 -0
  34. package/dist/cjs/apps/markets/index.js +22 -12
  35. package/dist/cjs/apps/markets/state-machines/market-auction.js +116 -134
  36. package/dist/cjs/apps/markets/state-machines/market-crowdfund.js +131 -141
  37. package/dist/cjs/apps/markets/state-machines/market-group-buy.js +163 -184
  38. package/dist/cjs/apps/markets/state-machines/market-prediction.js +226 -233
  39. package/dist/cjs/apps/markets/state-machines/market-universal.js +65 -80
  40. package/dist/cjs/apps/oracles/index.js +3 -3
  41. package/dist/cjs/apps/privacy/index.js +67 -0
  42. package/dist/cjs/apps/privacy/state-machines/index.js +17 -0
  43. package/dist/cjs/apps/privacy/state-machines/mixer-ddhRing.js +286 -0
  44. package/dist/cjs/apps/privacy/state-machines/note-pool.js +476 -0
  45. package/dist/cjs/apps/staked-pool/assets.js +103 -0
  46. package/dist/cjs/apps/staked-pool/base.js +498 -0
  47. package/dist/cjs/apps/staked-pool/consumer.js +55 -0
  48. package/dist/cjs/apps/staked-pool/index.js +83 -0
  49. package/dist/cjs/apps/staked-pool/state-machines/index.js +12 -0
  50. package/dist/cjs/apps/staked-pool/state-machines/staked-pool-base.js +49 -0
  51. package/dist/cjs/apps/staked-pool/state-machines/staked-pool-oracle.js +131 -0
  52. package/dist/cjs/errors.js +3 -3
  53. package/dist/cjs/generated/google/protobuf/struct.js +5 -5
  54. package/dist/cjs/generated/google/protobuf/timestamp.js +1 -1
  55. package/dist/cjs/generated/index.js +11 -7
  56. package/dist/cjs/generated/openapi.js +6 -0
  57. package/dist/cjs/generated/ottochain/apps/contracts/v1/contract.js +51 -51
  58. package/dist/cjs/generated/ottochain/apps/corporate/v1/corporate.js +20 -21
  59. package/dist/cjs/generated/ottochain/apps/governance/v1/governance.js +14 -14
  60. package/dist/cjs/generated/ottochain/apps/identity/v1/attestation.js +5 -5
  61. package/dist/cjs/generated/ottochain/apps/identity/v1/identity.js +125 -131
  62. package/dist/cjs/generated/ottochain/apps/markets/v1/market.js +108 -108
  63. package/dist/cjs/generated/ottochain/v1/common.js +5 -5
  64. package/dist/cjs/generated/ottochain/v1/fiber.js +44 -6
  65. package/dist/cjs/generated/ottochain/v1/messages.js +1 -1
  66. package/dist/cjs/generated/ottochain/v1/records.js +1 -1
  67. package/dist/cjs/index.js +58 -7
  68. package/dist/cjs/openapi.js +2 -0
  69. package/dist/cjs/ottochain/drop-nulls.js +1 -2
  70. package/dist/cjs/ottochain/genesis-manifest.js +17 -11
  71. package/dist/cjs/ottochain/index.js +23 -13
  72. package/dist/cjs/ottochain/metagraph-client.js +81 -16
  73. package/dist/cjs/ottochain/snapshot.js +13 -16
  74. package/dist/cjs/ottochain/transaction.js +67 -14
  75. package/dist/cjs/ottochain/types.js +16 -2
  76. package/dist/cjs/privacy/index.js +14 -0
  77. package/dist/cjs/privacy/sealed-bid.js +213 -0
  78. package/dist/cjs/privacy/shield-app.js +131 -0
  79. package/dist/cjs/schema/effects.js +156 -0
  80. package/dist/cjs/schema/fiber-app.js +150 -15
  81. package/dist/cjs/schema/guard-lint.js +343 -0
  82. package/dist/cjs/schema/guards.js +246 -0
  83. package/dist/cjs/signing.js +80 -0
  84. package/dist/cjs/templates/asset-policy.js +190 -0
  85. package/dist/cjs/templates/index.js +86 -0
  86. package/dist/cjs/templates/machine.js +130 -0
  87. package/dist/cjs/templates/migration.js +39 -0
  88. package/dist/cjs/templates/state-shape.js +38 -0
  89. package/dist/cjs/types.js +2 -3
  90. package/dist/cjs/validation.js +9 -11
  91. package/dist/cjs/verify.js +9 -4
  92. package/dist/cjs/zk/commit.js +53 -0
  93. package/dist/cjs/zk/guard.js +107 -0
  94. package/dist/cjs/zk/index.js +48 -0
  95. package/dist/cjs/zk/preimage.js +37 -0
  96. package/dist/cjs/zk/prover.js +87 -0
  97. package/dist/cjs/zk/registry.js +62 -0
  98. package/dist/cjs/zk/types.js +28 -0
  99. package/dist/cjs/zk/witness.js +19 -0
  100. package/dist/esm/apps/compute/index.js +29 -0
  101. package/dist/esm/apps/compute/state-machines/compute-rule110.js +161 -0
  102. package/dist/esm/apps/compute/state-machines/index.js +5 -0
  103. package/dist/esm/apps/contracts/index.js +9 -5
  104. package/dist/esm/apps/contracts/state-machines/contract-agreement.js +135 -162
  105. package/dist/esm/apps/contracts/state-machines/contract-escrow.js +193 -171
  106. package/dist/esm/apps/contracts/state-machines/contract-universal.js +47 -59
  107. package/dist/esm/apps/corporate/index.js +2 -2
  108. package/dist/esm/apps/corporate/state-machines/corp-board.js +501 -457
  109. package/dist/esm/apps/corporate/state-machines/corp-entity.js +488 -362
  110. package/dist/esm/apps/corporate/state-machines/corp-securities.js +770 -577
  111. package/dist/esm/apps/corporate/state-machines/corp-shareholders.js +568 -558
  112. package/dist/esm/apps/governance/index.js +10 -10
  113. package/dist/esm/apps/governance/state-machines/dao-multisig.js +189 -210
  114. package/dist/esm/apps/governance/state-machines/dao-reputation.js +182 -229
  115. package/dist/esm/apps/governance/state-machines/dao-single.js +106 -89
  116. package/dist/esm/apps/governance/state-machines/dao-token.js +200 -228
  117. package/dist/esm/apps/governance/state-machines/governance-simple.js +232 -232
  118. package/dist/esm/apps/governance/state-machines/governance-universal.js +65 -65
  119. package/dist/esm/apps/identity/constants.js +52 -21
  120. package/dist/esm/apps/identity/index.js +14 -9
  121. package/dist/esm/apps/identity/state-machines/identity-agent.js +125 -159
  122. package/dist/esm/apps/identity/state-machines/identity-oracle.js +159 -174
  123. package/dist/esm/apps/identity/state-machines/identity-registry.js +259 -0
  124. package/dist/esm/apps/identity/state-machines/identity-universal.js +52 -58
  125. package/dist/esm/apps/identity/state-machines/index.js +1 -0
  126. package/dist/esm/apps/index.js +9 -5
  127. package/dist/esm/apps/lending/assets.js +231 -0
  128. package/dist/esm/apps/lending/credit-scoring.js +81 -0
  129. package/dist/esm/apps/lending/eligibility.js +99 -0
  130. package/dist/esm/apps/lending/index.js +69 -0
  131. package/dist/esm/apps/lending/state-machines/index.js +5 -0
  132. package/dist/esm/apps/lending/state-machines/lending-zk-loan.js +430 -0
  133. package/dist/esm/apps/markets/index.js +11 -7
  134. package/dist/esm/apps/markets/state-machines/market-auction.js +117 -135
  135. package/dist/esm/apps/markets/state-machines/market-crowdfund.js +132 -142
  136. package/dist/esm/apps/markets/state-machines/market-group-buy.js +164 -185
  137. package/dist/esm/apps/markets/state-machines/market-prediction.js +227 -234
  138. package/dist/esm/apps/markets/state-machines/market-universal.js +66 -81
  139. package/dist/esm/apps/oracles/index.js +3 -3
  140. package/dist/esm/apps/privacy/index.js +56 -0
  141. package/dist/esm/apps/privacy/state-machines/index.js +6 -0
  142. package/dist/esm/apps/privacy/state-machines/mixer-ddhRing.js +282 -0
  143. package/dist/esm/apps/privacy/state-machines/note-pool.js +470 -0
  144. package/dist/esm/apps/staked-pool/assets.js +91 -0
  145. package/dist/esm/apps/staked-pool/base.js +493 -0
  146. package/dist/esm/apps/staked-pool/consumer.js +49 -0
  147. package/dist/esm/apps/staked-pool/index.js +60 -0
  148. package/dist/esm/apps/staked-pool/state-machines/index.js +6 -0
  149. package/dist/esm/apps/staked-pool/state-machines/staked-pool-base.js +46 -0
  150. package/dist/esm/apps/staked-pool/state-machines/staked-pool-oracle.js +127 -0
  151. package/dist/esm/generated/google/protobuf/struct.js +1 -1
  152. package/dist/esm/generated/google/protobuf/timestamp.js +1 -1
  153. package/dist/esm/generated/index.js +9 -5
  154. package/dist/esm/generated/openapi.js +5 -0
  155. package/dist/esm/generated/ottochain/apps/contracts/v1/contract.js +47 -47
  156. package/dist/esm/generated/ottochain/apps/corporate/v1/corporate.js +1 -1
  157. package/dist/esm/generated/ottochain/apps/governance/v1/governance.js +1 -1
  158. package/dist/esm/generated/ottochain/apps/identity/v1/attestation.js +1 -1
  159. package/dist/esm/generated/ottochain/apps/identity/v1/identity.js +115 -121
  160. package/dist/esm/generated/ottochain/apps/markets/v1/market.js +101 -101
  161. package/dist/esm/generated/ottochain/v1/common.js +1 -1
  162. package/dist/esm/generated/ottochain/v1/fiber.js +40 -2
  163. package/dist/esm/generated/ottochain/v1/messages.js +1 -1
  164. package/dist/esm/generated/ottochain/v1/records.js +1 -1
  165. package/dist/esm/index.js +28 -3
  166. package/dist/esm/openapi.js +1 -0
  167. package/dist/esm/ottochain/genesis-manifest.js +15 -9
  168. package/dist/esm/ottochain/index.js +2 -3
  169. package/dist/esm/ottochain/metagraph-client.js +81 -16
  170. package/dist/esm/ottochain/snapshot.js +6 -8
  171. package/dist/esm/ottochain/transaction.js +51 -3
  172. package/dist/esm/ottochain/types.js +15 -1
  173. package/dist/esm/privacy/index.js +6 -0
  174. package/dist/esm/privacy/sealed-bid.js +209 -0
  175. package/dist/esm/privacy/shield-app.js +127 -0
  176. package/dist/esm/schema/effects.js +145 -0
  177. package/dist/esm/schema/fiber-app.js +139 -8
  178. package/dist/esm/schema/guard-lint.js +337 -0
  179. package/dist/esm/schema/guards.js +228 -0
  180. package/dist/esm/signing.js +74 -0
  181. package/dist/esm/templates/asset-policy.js +182 -0
  182. package/dist/esm/templates/index.js +41 -0
  183. package/dist/esm/templates/machine.js +125 -0
  184. package/dist/esm/templates/migration.js +34 -0
  185. package/dist/esm/templates/state-shape.js +34 -0
  186. package/dist/esm/validation.js +1 -3
  187. package/dist/esm/verify.js +8 -2
  188. package/dist/esm/zk/commit.js +44 -0
  189. package/dist/esm/zk/guard.js +99 -0
  190. package/dist/esm/zk/index.js +19 -0
  191. package/dist/esm/zk/preimage.js +30 -0
  192. package/dist/esm/zk/prover.js +82 -0
  193. package/dist/esm/zk/registry.js +55 -0
  194. package/dist/esm/zk/types.js +25 -0
  195. package/dist/esm/zk/witness.js +15 -0
  196. package/dist/types/apps/compute/index.d.ts +176 -0
  197. package/dist/types/apps/compute/state-machines/compute-rule110.d.ts +157 -0
  198. package/dist/types/apps/compute/state-machines/index.d.ts +5 -0
  199. package/dist/types/apps/contracts/index.d.ts +81 -221
  200. package/dist/types/apps/contracts/state-machines/contract-agreement.d.ts +23 -98
  201. package/dist/types/apps/contracts/state-machines/contract-escrow.d.ts +49 -115
  202. package/dist/types/apps/contracts/state-machines/contract-universal.d.ts +4 -4
  203. package/dist/types/apps/corporate/index.d.ts +1176 -440
  204. package/dist/types/apps/corporate/state-machines/corp-board.d.ts +271 -135
  205. package/dist/types/apps/corporate/state-machines/corp-entity.d.ts +279 -74
  206. package/dist/types/apps/corporate/state-machines/corp-securities.d.ts +373 -149
  207. package/dist/types/apps/corporate/state-machines/corp-shareholders.d.ts +252 -80
  208. package/dist/types/apps/governance/index.d.ts +368 -470
  209. package/dist/types/apps/governance/state-machines/dao-multisig.d.ts +92 -107
  210. package/dist/types/apps/governance/state-machines/dao-reputation.d.ts +61 -85
  211. package/dist/types/apps/governance/state-machines/dao-single.d.ts +25 -47
  212. package/dist/types/apps/governance/state-machines/dao-token.d.ts +79 -68
  213. package/dist/types/apps/governance/state-machines/governance-simple.d.ts +95 -125
  214. package/dist/types/apps/governance/state-machines/governance-universal.d.ts +6 -6
  215. package/dist/types/apps/identity/constants.d.ts +33 -5
  216. package/dist/types/apps/identity/index.d.ts +415 -131
  217. package/dist/types/apps/identity/state-machines/identity-agent.d.ts +23 -23
  218. package/dist/types/apps/identity/state-machines/identity-oracle.d.ts +27 -98
  219. package/dist/types/apps/identity/state-machines/identity-registry.d.ts +379 -0
  220. package/dist/types/apps/identity/state-machines/identity-universal.d.ts +4 -4
  221. package/dist/types/apps/identity/state-machines/index.d.ts +1 -0
  222. package/dist/types/apps/index.d.ts +9 -5
  223. package/dist/types/apps/lending/assets.d.ts +258 -0
  224. package/dist/types/apps/lending/credit-scoring.d.ts +80 -0
  225. package/dist/types/apps/lending/eligibility.d.ts +83 -0
  226. package/dist/types/apps/lending/index.d.ts +556 -0
  227. package/dist/types/apps/lending/state-machines/index.d.ts +5 -0
  228. package/dist/types/apps/lending/state-machines/lending-zk-loan.d.ts +536 -0
  229. package/dist/types/apps/markets/index.d.ts +181 -276
  230. package/dist/types/apps/markets/state-machines/market-auction.d.ts +25 -49
  231. package/dist/types/apps/markets/state-machines/market-crowdfund.d.ts +35 -53
  232. package/dist/types/apps/markets/state-machines/market-group-buy.d.ts +35 -61
  233. package/dist/types/apps/markets/state-machines/market-prediction.d.ts +65 -86
  234. package/dist/types/apps/markets/state-machines/market-universal.d.ts +12 -12
  235. package/dist/types/apps/oracles/index.d.ts +1 -1
  236. package/dist/types/apps/privacy/index.d.ts +328 -0
  237. package/dist/types/apps/privacy/state-machines/index.d.ts +6 -0
  238. package/dist/types/apps/privacy/state-machines/mixer-ddhRing.d.ts +337 -0
  239. package/dist/types/apps/privacy/state-machines/note-pool.d.ts +196 -0
  240. package/dist/types/apps/staked-pool/assets.d.ts +53 -0
  241. package/dist/types/apps/staked-pool/base.d.ts +80 -0
  242. package/dist/types/apps/staked-pool/consumer.d.ts +29 -0
  243. package/dist/types/apps/staked-pool/index.d.ts +51 -0
  244. package/dist/types/apps/staked-pool/state-machines/index.d.ts +6 -0
  245. package/dist/types/apps/staked-pool/state-machines/staked-pool-base.d.ts +8 -0
  246. package/dist/types/apps/staked-pool/state-machines/staked-pool-oracle.d.ts +34 -0
  247. package/dist/types/generated/index.d.ts +5 -5
  248. package/dist/types/generated/openapi.d.ts +1270 -0
  249. package/dist/types/generated/ottochain/apps/contracts/v1/contract.d.ts +5 -5
  250. package/dist/types/generated/ottochain/apps/identity/v1/identity.d.ts +12 -12
  251. package/dist/types/generated/ottochain/apps/markets/v1/market.d.ts +11 -11
  252. package/dist/types/generated/ottochain/v1/fiber.d.ts +7 -0
  253. package/dist/types/index.d.ts +7 -3
  254. package/dist/types/openapi.d.ts +24 -0
  255. package/dist/types/ottochain/genesis-manifest.d.ts +11 -5
  256. package/dist/types/ottochain/index.d.ts +5 -6
  257. package/dist/types/ottochain/metagraph-client.d.ts +49 -7
  258. package/dist/types/ottochain/snapshot.d.ts +6 -6
  259. package/dist/types/ottochain/transaction.d.ts +41 -1
  260. package/dist/types/ottochain/types.d.ts +336 -31
  261. package/dist/types/privacy/index.d.ts +6 -0
  262. package/dist/types/privacy/sealed-bid.d.ts +348 -0
  263. package/dist/types/privacy/shield-app.d.ts +48 -0
  264. package/dist/types/schema/effects.d.ts +141 -0
  265. package/dist/types/schema/fiber-app.d.ts +282 -2
  266. package/dist/types/schema/guard-lint.d.ts +111 -0
  267. package/dist/types/schema/guards.d.ts +146 -0
  268. package/dist/types/signing.d.ts +45 -0
  269. package/dist/types/templates/asset-policy.d.ts +119 -0
  270. package/dist/types/templates/index.d.ts +26 -0
  271. package/dist/types/templates/machine.d.ts +139 -0
  272. package/dist/types/templates/migration.d.ts +34 -0
  273. package/dist/types/templates/state-shape.d.ts +30 -0
  274. package/dist/types/validation.d.ts +22 -217
  275. package/dist/types/verify.d.ts +4 -0
  276. package/dist/types/zk/commit.d.ts +28 -0
  277. package/dist/types/zk/guard.d.ts +46 -0
  278. package/dist/types/zk/index.d.ts +19 -0
  279. package/dist/types/zk/preimage.d.ts +10 -0
  280. package/dist/types/zk/prover.d.ts +34 -0
  281. package/dist/types/zk/registry.d.ts +34 -0
  282. package/dist/types/zk/types.d.ts +33 -0
  283. package/dist/types/zk/witness.d.ts +40 -0
  284. package/package.json +47 -15
  285. package/dist/cjs/ottochain/normalize.js +0 -186
  286. package/dist/esm/ottochain/normalize.js +0 -179
  287. package/dist/types/ottochain/normalize.d.ts +0 -79
@@ -1,564 +1,566 @@
1
- import { defineFiberApp } from "../../../schema/fiber-app.js";
1
+ import { defineFiberApp } from '../../../schema/fiber-app.js';
2
+ import { signerIsParty, depInState } from '../../../schema/guards.js';
3
+ import { addDependency } from '../../../schema/effects.js';
2
4
  /**
3
5
  * Securities state machine tracking the lifecycle of equity from authorization through issuance, transfer, and retirement.
4
6
  * Manages stock certificates, book entry positions, and restricted securities.
5
7
  */
6
8
  export const corpSecuritiesDef = defineFiberApp({
7
9
  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.",
10
+ name: 'CorpSecurities',
11
+ app: 'corporate',
12
+ type: 'securities',
13
+ version: '1.0.0',
14
+ 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
15
  crossReferences: {
14
16
  entity: {
15
- machine: "corporate-entity",
16
- description: "Parent corporate entity with share class definitions",
17
- foreignKey: "entityId",
17
+ machine: 'corporate-entity',
18
+ description: 'Parent corporate entity with share class definitions',
19
+ foreignKey: 'entityId',
18
20
  },
19
21
  resolutions: {
20
- machine: "corporate-resolution",
21
- description: "Board resolutions authorizing securities actions",
22
- foreignKey: "entityId",
22
+ machine: 'corporate-resolution',
23
+ description: 'Board resolutions authorizing securities actions',
24
+ foreignKey: 'entityId',
23
25
  },
24
26
  shareholders: {
25
- machine: "corporate-shareholders",
26
- description: "Shareholder meetings for determining voting rights",
27
- foreignKey: "entityId",
27
+ machine: 'corporate-shareholders',
28
+ description: 'Shareholder meetings for determining voting rights',
29
+ foreignKey: 'entityId',
28
30
  },
29
31
  },
30
32
  },
31
33
  createSchema: {
32
34
  required: [
33
- "securityId",
34
- "entityId",
35
- "shareClass",
36
- "shareClassName",
37
- "shareCount",
38
- "parValue",
35
+ 'securityId',
36
+ 'entityId',
37
+ 'issuerAddress',
38
+ 'shareClass',
39
+ 'shareClassName',
40
+ 'shareCount',
41
+ 'parValue',
39
42
  ],
40
43
  properties: {
41
44
  securityId: {
42
- type: "string",
43
- description: "Unique identifier for this security lot/certificate",
45
+ type: 'string',
46
+ description: 'Unique identifier for this security lot/certificate',
44
47
  immutable: true,
45
48
  },
46
49
  entityId: {
47
- type: "string",
48
- description: "Reference to parent corporate-entity",
50
+ type: 'string',
51
+ description: 'Reference to parent corporate-entity',
52
+ immutable: true,
53
+ },
54
+ issuerAddress: {
55
+ type: 'address',
56
+ description: 'State-pinned DAG address of the issuing authority (the corporation / transfer agent). Verified against proofs[].address to gate issuer-privileged transitions.',
49
57
  immutable: true,
50
58
  },
51
59
  shareClass: {
52
- type: "string",
53
- description: "Share class ID from corporate-entity",
60
+ type: 'string',
61
+ description: 'Share class ID from corporate-entity',
54
62
  },
55
63
  shareClassName: {
56
- type: "string",
57
- description: "Human-readable class name",
64
+ type: 'string',
65
+ description: 'Human-readable class name',
58
66
  },
59
67
  shareCount: {
60
- type: "integer",
61
- description: "Number of shares in this lot",
68
+ type: 'integer',
69
+ description: 'Number of shares in this lot',
62
70
  },
63
71
  parValue: {
64
- type: "number",
65
- description: "Par value per share",
72
+ type: 'number',
73
+ description: 'Par value per share',
66
74
  },
67
75
  },
68
76
  },
69
77
  stateSchema: {
70
78
  properties: {
71
- securityId: { type: "string", immutable: true },
72
- entityId: { type: "string", immutable: true },
73
- shareClass: { type: "string" },
74
- shareClassName: { type: "string" },
79
+ securityId: { type: 'string', immutable: true },
80
+ entityId: { type: 'string', immutable: true },
81
+ issuerAddress: { type: 'address', immutable: true },
82
+ shareClass: { type: 'string' },
83
+ shareClassName: { type: 'string' },
75
84
  certificateNumber: {
76
- type: "string",
85
+ type: 'string',
77
86
  nullable: true,
78
- description: "For certificated shares",
87
+ description: 'For certificated shares',
79
88
  },
80
89
  cusip: {
81
- type: "string",
90
+ type: 'string',
82
91
  nullable: true,
83
- description: "CUSIP number if assigned",
92
+ description: 'CUSIP number if assigned',
84
93
  },
85
- shareCount: { type: "integer" },
86
- parValue: { type: "number" },
94
+ shareCount: { type: 'integer' },
95
+ parValue: { type: 'number' },
87
96
  issuancePrice: {
88
- type: "number",
97
+ type: 'number',
89
98
  nullable: true,
90
- description: "Price per share at issuance",
99
+ description: 'Price per share at issuance',
91
100
  computed: true,
92
101
  },
93
102
  issuanceDate: {
94
- type: "string",
95
- format: "date",
103
+ type: 'string',
104
+ format: 'date',
96
105
  nullable: true,
97
106
  computed: true,
98
107
  },
99
108
  form: {
100
- type: "string",
101
- enum: ["CERTIFICATED", "BOOK_ENTRY", "DRS"],
102
- description: "Physical certificate, book entry, or Direct Registration System",
109
+ type: 'string',
110
+ enum: ['CERTIFICATED', 'BOOK_ENTRY', 'DRS'],
111
+ description: 'Physical certificate, book entry, or Direct Registration System',
103
112
  computed: true,
104
113
  },
105
- holder: { $ref: "#/definitions/Holder", nullable: true, computed: true },
106
- restrictions: { $ref: "#/definitions/Restrictions", computed: true },
114
+ holder: { $ref: '#/definitions/Holder', nullable: true, computed: true },
115
+ restrictions: { $ref: '#/definitions/Restrictions', computed: true },
107
116
  authorization: {
108
- $ref: "#/definitions/Authorization",
117
+ $ref: '#/definitions/Authorization',
109
118
  nullable: true,
110
119
  computed: true,
111
120
  },
112
121
  issuanceDetails: {
113
- $ref: "#/definitions/IssuanceDetails",
122
+ $ref: '#/definitions/IssuanceDetails',
114
123
  nullable: true,
115
124
  computed: true,
116
125
  },
117
126
  transferHistory: {
118
- type: "array",
119
- items: { $ref: "#/definitions/TransferRecord" },
127
+ type: 'array',
128
+ items: { $ref: '#/definitions/TransferRecord' },
120
129
  computed: true,
121
130
  },
122
131
  corporateActions: {
123
- type: "array",
124
- items: { $ref: "#/definitions/CorporateAction" },
132
+ type: 'array',
133
+ items: { $ref: '#/definitions/CorporateAction' },
125
134
  computed: true,
126
135
  },
127
136
  retirementDetails: {
128
- $ref: "#/definitions/RetirementDetails",
137
+ $ref: '#/definitions/RetirementDetails',
129
138
  nullable: true,
130
139
  computed: true,
131
140
  },
132
141
  status: {
133
- type: "string",
134
- enum: [
135
- "AUTHORIZED",
136
- "ISSUED",
137
- "TREASURY",
138
- "TRANSFERRED",
139
- "RETIRED",
140
- ],
142
+ type: 'string',
143
+ enum: ['AUTHORIZED', 'ISSUED', 'TREASURY', 'TRANSFERRED', 'RETIRED'],
141
144
  computed: true,
142
145
  },
143
- createdAt: { type: "timestamp", computed: true },
144
- updatedAt: { type: "timestamp", computed: true },
146
+ createdAt: { type: 'timestamp', computed: true },
147
+ updatedAt: { type: 'timestamp', computed: true },
148
+ // Two-phase resolution gating (#24): each propose_<X> binds the executing resolution (and, for
149
+ // issuance, the parent entity) fiber via _addDependency and records the pending action here; the
150
+ // gated <X> then asserts the bound dependency state via depInState and clears the pending object.
151
+ // The dropped object-form dependencies (which the chain silently never gated) are replaced this way.
152
+ pendingIssue: { type: 'object', nullable: true, computed: true },
153
+ pendingRepurchase: { type: 'object', nullable: true, computed: true },
154
+ pendingReissue: { type: 'object', nullable: true, computed: true },
155
+ pendingRetire: { type: 'object', nullable: true, computed: true },
156
+ pendingDividend: { type: 'object', nullable: true, computed: true },
145
157
  },
146
158
  },
147
159
  eventSchemas: {
148
160
  authorize_shares: {
149
- description: "Record shares as authorized per charter/amendment",
161
+ description: 'Record shares as authorized per charter/amendment',
150
162
  required: [
151
- "securityId",
152
- "entityId",
153
- "shareClass",
154
- "shareClassName",
155
- "shareCount",
156
- "parValue",
157
- "authorizedDate",
163
+ 'securityId',
164
+ 'entityId',
165
+ 'shareClass',
166
+ 'shareClassName',
167
+ 'shareCount',
168
+ 'parValue',
169
+ 'authorizedDate',
158
170
  ],
159
171
  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" },
172
+ securityId: { type: 'string' },
173
+ entityId: { type: 'string' },
174
+ shareClass: { type: 'string' },
175
+ shareClassName: { type: 'string' },
176
+ shareCount: { type: 'integer' },
177
+ parValue: { type: 'number' },
178
+ authorizedDate: { type: 'string', format: 'date' },
179
+ charterProvision: { type: 'string' },
180
+ },
181
+ },
182
+ propose_issue: {
183
+ description: 'Phase 1 of issuance (#24): bind the executing board resolution + parent entity fibers (_addDependency) and record the pending issuance',
184
+ required: ['holderId', 'boardResolutionRef'],
185
+ properties: {
186
+ holderId: { type: 'string' },
187
+ boardResolutionRef: { type: 'string' },
168
188
  },
169
189
  },
170
190
  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
- ],
191
+ description: 'Issue shares to a holder',
192
+ required: ['holderId', 'holderType', 'holderName', 'issuanceDate', 'form', 'consideration'],
181
193
  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" },
194
+ holderId: { type: 'string' },
195
+ holderType: { type: 'string' },
196
+ holderName: { type: 'string' },
197
+ holderWallet: {
198
+ type: 'address',
199
+ description: 'DAG wallet address the holder controls; pinned so holder-initiated transfer/repurchase can be authorized via proofs[].address.',
200
+ },
201
+ address: { type: 'object' },
202
+ issuanceDate: { type: 'string', format: 'date' },
203
+ issuancePrice: { type: 'number' },
188
204
  form: {
189
- type: "string",
190
- enum: ["CERTIFICATED", "BOOK_ENTRY", "DRS"],
205
+ type: 'string',
206
+ enum: ['CERTIFICATED', 'BOOK_ENTRY', 'DRS'],
191
207
  },
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" },
208
+ certificateNumber: { type: 'string' },
209
+ consideration: { type: 'object' },
210
+ isRestricted: { type: 'boolean', default: false },
211
+ restrictionType: { type: 'array' },
212
+ legends: { type: 'array' },
213
+ exemptionUsed: { type: 'string' },
214
+ accreditedInvestor: { type: 'boolean' },
200
215
  },
201
216
  },
202
217
  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
- ],
218
+ description: 'Begin transfer of shares to new holder',
219
+ required: ['transferId', 'toHolderId', 'toHolderName', 'toHolderType', 'transferType', 'transferDate'],
212
220
  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
+ transferId: { type: 'string' },
222
+ toHolderId: { type: 'string' },
223
+ toHolderName: { type: 'string' },
224
+ toHolderType: { type: 'string' },
225
+ toAddress: { type: 'object' },
226
+ transferType: { type: 'string' },
227
+ pricePerShare: { type: 'number' },
228
+ transferDate: { type: 'string', format: 'date' },
221
229
  },
222
230
  },
223
231
  complete_transfer: {
224
- description: "Complete the transfer, update holder",
225
- required: [
226
- "toHolderId",
227
- "toHolderName",
228
- "toHolderType",
229
- "completedDate",
230
- ],
232
+ description: 'Complete the transfer, update holder',
233
+ required: ['toHolderId', 'toHolderName', 'toHolderType', 'completedDate'],
234
+ properties: {
235
+ transferAgentConfirmation: { type: 'string' },
236
+ newCertificateNumber: { type: 'string' },
237
+ toHolderId: { type: 'string' },
238
+ toHolderName: { type: 'string' },
239
+ toHolderType: { type: 'string' },
240
+ toHolderWallet: {
241
+ type: 'address',
242
+ description: 'DAG wallet address the new holder controls.',
243
+ },
244
+ toAddress: { type: 'object' },
245
+ completedDate: { type: 'string', format: 'date' },
246
+ costBasis: { type: 'number' },
247
+ },
248
+ },
249
+ propose_repurchase: {
250
+ description: 'Phase 1 of repurchase (#24): bind the executing board resolution fiber (_addDependency) and record the pending repurchase',
251
+ required: ['repurchaseDate', 'boardResolutionRef'],
231
252
  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" },
253
+ repurchaseDate: { type: 'string', format: 'date' },
254
+ boardResolutionRef: { type: 'string' },
240
255
  },
241
256
  },
242
257
  repurchase: {
243
- description: "Company repurchases shares from holder",
244
- required: [
245
- "repurchaseDate",
246
- "pricePerShare",
247
- "boardResolutionRef",
248
- ],
258
+ description: 'Company repurchases shares from holder',
259
+ required: ['repurchaseDate', 'pricePerShare'],
249
260
  properties: {
250
- repurchaseDate: { type: "string", format: "date" },
251
- pricePerShare: { type: "number" },
252
- boardResolutionRef: { type: "string" },
253
- repurchaseAgreementRef: { type: "string" },
261
+ repurchaseDate: { type: 'string', format: 'date' },
262
+ pricePerShare: { type: 'number' },
263
+ repurchaseAgreementRef: { type: 'string' },
264
+ },
265
+ },
266
+ propose_reissue: {
267
+ description: 'Phase 1 of treasury reissue (#24): bind the executing board resolution fiber (_addDependency) and record the pending reissue',
268
+ required: ['holderId', 'boardResolutionRef'],
269
+ properties: {
270
+ holderId: { type: 'string' },
271
+ boardResolutionRef: { type: 'string' },
254
272
  },
255
273
  },
256
274
  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
- ],
275
+ description: 'Reissue treasury shares to a new holder',
276
+ required: ['holderId', 'holderName', 'holderType', 'reissueDate'],
277
+ properties: {
278
+ holderId: { type: 'string' },
279
+ holderName: { type: 'string' },
280
+ holderType: { type: 'string' },
281
+ holderWallet: {
282
+ type: 'address',
283
+ description: 'DAG wallet address the reissued holder controls.',
284
+ },
285
+ address: { type: 'object' },
286
+ reissueDate: { type: 'string', format: 'date' },
287
+ issuancePrice: { type: 'number' },
288
+ },
289
+ },
290
+ propose_retire: {
291
+ description: 'Phase 1 of retirement (#24): bind the executing board resolution fiber (_addDependency) and record the pending retirement (from ISSUED or TREASURY)',
292
+ required: ['retiredDate', 'boardResolutionRef'],
265
293
  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" },
294
+ retiredDate: { type: 'string', format: 'date' },
295
+ boardResolutionRef: { type: 'string' },
273
296
  },
274
297
  },
275
298
  retire: {
276
- description: "Retire shares (cancel them)",
277
- required: [
278
- "retiredDate",
279
- "retirementMethod",
280
- "boardResolutionRef",
281
- ],
299
+ description: 'Retire shares (cancel them)',
300
+ required: ['retiredDate', 'retirementMethod'],
282
301
  properties: {
283
- retiredDate: { type: "string", format: "date" },
284
- retirementMethod: { type: "string" },
285
- boardResolutionRef: { type: "string" },
286
- repurchasePrice: { type: "number" },
302
+ retiredDate: { type: 'string', format: 'date' },
303
+ retirementMethod: { type: 'string' },
304
+ repurchasePrice: { type: 'number' },
287
305
  },
288
306
  },
289
307
  stock_split: {
290
- description: "Apply stock split to this lot",
291
- required: [
292
- "actionId",
293
- "splitRatio",
294
- "effectiveDate",
295
- "resolutionRef",
296
- "newShareCount",
297
- ],
308
+ description: 'Apply stock split to this lot',
309
+ required: ['actionId', 'splitRatio', 'effectiveDate', 'resolutionRef', 'newShareCount'],
298
310
  properties: {
299
- actionId: { type: "string" },
311
+ actionId: { type: 'string' },
300
312
  splitRatio: {
301
- type: "string",
313
+ type: 'string',
302
314
  description: "e.g., '2:1' for 2-for-1 split",
303
315
  },
304
- effectiveDate: { type: "string", format: "date" },
305
- resolutionRef: { type: "string" },
306
- newShareCount: { type: "integer" },
316
+ effectiveDate: { type: 'string', format: 'date' },
317
+ resolutionRef: { type: 'string' },
318
+ newShareCount: { type: 'integer' },
319
+ },
320
+ },
321
+ propose_dividend: {
322
+ description: 'Phase 1 of dividend declaration (#24): bind the executing board resolution fiber (_addDependency) and record the pending declaration',
323
+ required: ['actionId', 'resolutionRef'],
324
+ properties: {
325
+ actionId: { type: 'string' },
326
+ resolutionRef: { type: 'string' },
307
327
  },
308
328
  },
309
329
  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
- ],
330
+ description: 'Record dividend declaration affecting this lot (for stock dividends)',
331
+ required: ['actionId', 'dividendType', 'recordDate', 'paymentDate'],
318
332
  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" },
333
+ actionId: { type: 'string' },
334
+ dividendType: { type: 'string', enum: ['CASH', 'STOCK'] },
335
+ recordDate: { type: 'string', format: 'date' },
336
+ paymentDate: { type: 'string', format: 'date' },
337
+ cashAmount: { type: 'number' },
338
+ stockShares: { type: 'integer' },
326
339
  },
327
340
  },
328
341
  remove_restriction: {
329
- description: "Remove or update restrictions on the shares",
330
- required: ["restrictionType", "removedDate"],
342
+ description: 'Remove or update restrictions on the shares',
343
+ required: ['restrictionType', 'removedDate'],
331
344
  properties: {
332
- restrictionType: { type: "string" },
333
- removedDate: { type: "string", format: "date" },
334
- reason: { type: "string" },
335
- legalOpinionRef: { type: "string" },
345
+ restrictionType: { type: 'string' },
346
+ removedDate: { type: 'string', format: 'date' },
347
+ reason: { type: 'string' },
348
+ legalOpinionRef: { type: 'string' },
336
349
  },
337
350
  },
338
351
  },
339
352
  definitions: {
340
353
  Holder: {
341
- type: "object",
354
+ type: 'object',
342
355
  nullable: true,
343
356
  properties: {
344
- holderId: { type: "string" },
357
+ holderId: { type: 'string' },
345
358
  holderType: {
346
- type: "string",
347
- enum: ["INDIVIDUAL", "ENTITY", "TRUST", "TREASURY"],
359
+ type: 'string',
360
+ enum: ['INDIVIDUAL', 'ENTITY', 'TRUST', 'TREASURY'],
348
361
  },
349
- name: { type: "string" },
350
- taxId: { type: "string", nullable: true },
351
- address: { type: "object", nullable: true },
352
- acquisitionDate: { type: "string", format: "date" },
362
+ name: { type: 'string' },
363
+ taxId: { type: 'string', nullable: true },
364
+ walletAddress: {
365
+ type: 'address',
366
+ nullable: true,
367
+ description: 'State-pinned DAG wallet address controlled by this holder; verified against proofs[].address to gate holder-initiated transfer/repurchase.',
368
+ },
369
+ address: { type: 'object', nullable: true },
370
+ acquisitionDate: { type: 'string', format: 'date' },
353
371
  acquisitionMethod: {
354
- type: "string",
372
+ type: 'string',
355
373
  enum: [
356
- "ORIGINAL_ISSUANCE",
357
- "PURCHASE",
358
- "GIFT",
359
- "INHERITANCE",
360
- "STOCK_SPLIT",
361
- "CONVERSION",
362
- "EXERCISE",
374
+ 'ORIGINAL_ISSUANCE',
375
+ 'PURCHASE',
376
+ 'GIFT',
377
+ 'INHERITANCE',
378
+ 'STOCK_SPLIT',
379
+ 'CONVERSION',
380
+ 'EXERCISE',
363
381
  ],
364
382
  },
365
- costBasis: { type: "number", nullable: true },
383
+ costBasis: { type: 'number', nullable: true },
366
384
  },
367
385
  },
368
386
  Restrictions: {
369
- type: "object",
387
+ type: 'object',
370
388
  properties: {
371
- isRestricted: { type: "boolean", default: false },
389
+ isRestricted: { type: 'boolean', default: false },
372
390
  restrictionType: {
373
- type: "array",
391
+ type: 'array',
374
392
  items: {
375
- type: "string",
393
+ type: 'string',
376
394
  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",
395
+ 'RULE_144',
396
+ 'SECTION_4(a)(2)',
397
+ 'REG_D',
398
+ 'REG_S',
399
+ 'LOCK_UP',
400
+ 'VESTING',
401
+ 'RIGHT_OF_FIRST_REFUSAL',
384
402
  ],
385
403
  },
386
404
  },
387
- restrictionEndDate: { type: "string", format: "date", nullable: true },
405
+ restrictionEndDate: { type: 'string', format: 'date', nullable: true },
388
406
  legends: {
389
- type: "array",
390
- items: { type: "string" },
391
- description: "Legend text on certificates",
407
+ type: 'array',
408
+ items: { type: 'string' },
409
+ description: 'Legend text on certificates',
392
410
  },
393
411
  vestingSchedule: {
394
- type: "object",
412
+ type: 'object',
395
413
  nullable: true,
396
414
  properties: {
397
- vestingStartDate: { type: "string", format: "date" },
398
- totalShares: { type: "integer" },
399
- vestedShares: { type: "integer" },
400
- vestingScheduleRef: { type: "string" },
415
+ vestingStartDate: { type: 'string', format: 'date' },
416
+ totalShares: { type: 'integer' },
417
+ vestedShares: { type: 'integer' },
418
+ vestingScheduleRef: { type: 'string' },
401
419
  },
402
420
  },
403
- lockUpExpiration: { type: "string", format: "date", nullable: true },
421
+ lockUpExpiration: { type: 'string', format: 'date', nullable: true },
404
422
  rofr: {
405
- type: "object",
423
+ type: 'object',
406
424
  nullable: true,
407
- description: "Right of First Refusal",
425
+ description: 'Right of First Refusal',
408
426
  properties: {
409
- holderIds: { type: "array", items: { type: "string" } },
410
- noticePeriodDays: { type: "integer" },
427
+ holderIds: { type: 'array', items: { type: 'string' } },
428
+ noticePeriodDays: { type: 'integer' },
411
429
  },
412
430
  },
413
431
  },
414
432
  },
415
433
  Authorization: {
416
- type: "object",
434
+ type: 'object',
417
435
  nullable: true,
418
- description: "For shares in AUTHORIZED state",
436
+ description: 'For shares in AUTHORIZED state',
419
437
  properties: {
420
- authorizedDate: { type: "string", format: "date" },
421
- charterProvision: { type: "string" },
422
- authorizedShares: { type: "integer" },
438
+ authorizedDate: { type: 'string', format: 'date' },
439
+ charterProvision: { type: 'string' },
440
+ authorizedShares: { type: 'integer' },
423
441
  },
424
442
  },
425
443
  IssuanceDetails: {
426
- type: "object",
444
+ type: 'object',
427
445
  nullable: true,
428
446
  properties: {
429
- boardResolutionRef: { type: "string" },
430
- issuanceAgreementRef: { type: "string" },
447
+ boardResolutionRef: { type: 'string' },
448
+ issuanceAgreementRef: { type: 'string' },
431
449
  consideration: {
432
- type: "object",
450
+ type: 'object',
433
451
  properties: {
434
452
  type: {
435
- type: "string",
436
- enum: [
437
- "CASH",
438
- "PROPERTY",
439
- "SERVICES",
440
- "DEBT_CONVERSION",
441
- "STOCK_CONVERSION",
442
- ],
453
+ type: 'string',
454
+ enum: ['CASH', 'PROPERTY', 'SERVICES', 'DEBT_CONVERSION', 'STOCK_CONVERSION'],
443
455
  },
444
- value: { type: "number" },
445
- description: { type: "string" },
456
+ value: { type: 'number' },
457
+ description: { type: 'string' },
446
458
  },
447
459
  },
448
- exemptionUsed: { type: "string", nullable: true },
449
- accreditedInvestor: { type: "boolean", nullable: true },
460
+ exemptionUsed: { type: 'string', nullable: true },
461
+ accreditedInvestor: { type: 'boolean', nullable: true },
450
462
  },
451
463
  },
452
464
  TransferRecord: {
453
- type: "object",
465
+ type: 'object',
454
466
  properties: {
455
- transferId: { type: "string" },
456
- transferDate: { type: "string", format: "date" },
457
- fromHolderId: { type: "string" },
458
- toHolderId: { type: "string" },
459
- shares: { type: "integer" },
467
+ transferId: { type: 'string' },
468
+ transferDate: { type: 'string', format: 'date' },
469
+ fromHolderId: { type: 'string' },
470
+ toHolderId: { type: 'string' },
471
+ shares: { type: 'integer' },
460
472
  transferType: {
461
- type: "string",
462
- enum: ["SALE", "GIFT", "INHERITANCE", "INTERNAL"],
473
+ type: 'string',
474
+ enum: ['SALE', 'GIFT', 'INHERITANCE', 'INTERNAL'],
463
475
  },
464
- pricePerShare: { type: "number", nullable: true },
465
- transferAgentConfirmation: { type: "string", nullable: true },
476
+ pricePerShare: { type: 'number', nullable: true },
477
+ transferAgentConfirmation: { type: 'string', nullable: true },
466
478
  },
467
479
  },
468
480
  CorporateAction: {
469
- type: "object",
470
- description: "Stock splits, dividends, etc. affecting this lot",
481
+ type: 'object',
482
+ description: 'Stock splits, dividends, etc. affecting this lot',
471
483
  properties: {
472
- actionId: { type: "string" },
484
+ actionId: { type: 'string' },
473
485
  actionType: {
474
- type: "string",
475
- enum: [
476
- "STOCK_SPLIT",
477
- "REVERSE_SPLIT",
478
- "STOCK_DIVIDEND",
479
- "CONVERSION",
480
- "RECLASSIFICATION",
481
- ],
486
+ type: 'string',
487
+ enum: ['STOCK_SPLIT', 'REVERSE_SPLIT', 'STOCK_DIVIDEND', 'CONVERSION', 'RECLASSIFICATION'],
482
488
  },
483
- actionDate: { type: "string", format: "date" },
489
+ actionDate: { type: 'string', format: 'date' },
484
490
  ratio: {
485
- type: "string",
491
+ type: 'string',
486
492
  nullable: true,
487
- description: "e.g., 2:1 for split",
493
+ description: 'e.g., 2:1 for split',
488
494
  },
489
- sharesBeforeAction: { type: "integer" },
490
- sharesAfterAction: { type: "integer" },
491
- resolutionRef: { type: "string" },
495
+ sharesBeforeAction: { type: 'integer' },
496
+ sharesAfterAction: { type: 'integer' },
497
+ resolutionRef: { type: 'string' },
492
498
  },
493
499
  },
494
500
  RetirementDetails: {
495
- type: "object",
501
+ type: 'object',
496
502
  nullable: true,
497
503
  properties: {
498
- retiredDate: { type: "string", format: "date" },
504
+ retiredDate: { type: 'string', format: 'date' },
499
505
  retirementMethod: {
500
- type: "string",
501
- enum: [
502
- "REPURCHASE",
503
- "REDEMPTION",
504
- "CANCELLATION",
505
- "CONVERSION",
506
- ],
506
+ type: 'string',
507
+ enum: ['REPURCHASE', 'REDEMPTION', 'CANCELLATION', 'CONVERSION'],
507
508
  },
508
- repurchasePrice: { type: "number", nullable: true },
509
- boardResolutionRef: { type: "string" },
509
+ repurchasePrice: { type: 'number', nullable: true },
510
+ boardResolutionRef: { type: 'string' },
510
511
  },
511
512
  },
512
513
  },
513
514
  states: {
514
515
  AUTHORIZED: {
515
- id: "AUTHORIZED",
516
+ id: 'AUTHORIZED',
516
517
  isFinal: false,
517
- description: "Shares authorized by charter but not yet issued",
518
+ description: 'Shares authorized by charter but not yet issued',
518
519
  },
519
520
  ISSUED: {
520
- id: "ISSUED",
521
+ id: 'ISSUED',
521
522
  isFinal: false,
522
- description: "Shares issued and held by a shareholder",
523
+ description: 'Shares issued and held by a shareholder',
523
524
  },
524
525
  TREASURY: {
525
- id: "TREASURY",
526
+ id: 'TREASURY',
526
527
  isFinal: false,
527
- description: "Shares repurchased and held by the company",
528
+ description: 'Shares repurchased and held by the company',
528
529
  },
529
530
  TRANSFERRED: {
530
- id: "TRANSFERRED",
531
+ id: 'TRANSFERRED',
531
532
  isFinal: false,
532
- description: "Transitional state during transfer between holders",
533
+ description: 'Transitional state during transfer between holders',
533
534
  },
534
535
  RETIRED: {
535
- id: "RETIRED",
536
+ id: 'RETIRED',
536
537
  isFinal: true,
537
- description: "Shares cancelled and returned to authorized but unissued",
538
+ description: 'Shares cancelled and returned to authorized but unissued',
538
539
  },
539
540
  },
540
- initialState: "AUTHORIZED",
541
+ initialState: 'AUTHORIZED',
541
542
  transitions: [
542
543
  // Initial authorization (creation)
543
544
  {
544
- from: "AUTHORIZED",
545
- to: "AUTHORIZED",
546
- eventName: "authorize_shares",
547
- guard: { "==": [1, 1] },
545
+ from: 'AUTHORIZED',
546
+ to: 'AUTHORIZED',
547
+ eventName: 'authorize_shares',
548
+ // authority gate an identity role attestation (ISSUER/BOARD_MEMBER/...) layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
549
+ guard: signerIsParty('state.issuerAddress'),
548
550
  effect: {
549
551
  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" },
552
+ { var: 'state' },
553
+ {
554
+ securityId: { var: 'event.securityId' },
555
+ entityId: { var: 'event.entityId' },
556
+ shareClass: { var: 'event.shareClass' },
557
+ shareClassName: { var: 'event.shareClassName' },
558
+ shareCount: { var: 'event.shareCount' },
559
+ parValue: { var: 'event.parValue' },
558
560
  authorization: {
559
- authorizedDate: { var: "event.authorizedDate" },
560
- charterProvision: { var: "event.charterProvision" },
561
- authorizedShares: { var: "event.shareCount" },
561
+ authorizedDate: { var: 'event.authorizedDate' },
562
+ charterProvision: { var: 'event.charterProvision' },
563
+ authorizedShares: { var: 'event.shareCount' },
562
564
  },
563
565
  transferHistory: [],
564
566
  corporateActions: [],
@@ -566,417 +568,606 @@ export const corpSecuritiesDef = defineFiberApp({
566
568
  ],
567
569
  },
568
570
  },
569
- // AUTHORIZED -> ISSUED
571
+ // AUTHORIZED -> AUTHORIZED (propose_issue) — phase 1 (#24): bind the executing resolution + parent
572
+ // entity fibers and record the pending issuance, so issue_shares can read their state next transition.
570
573
  {
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
- ],
574
+ from: 'AUTHORIZED',
575
+ to: 'AUTHORIZED',
576
+ eventName: 'propose_issue',
577
+ // authority gate an identity role attestation (ISSUER/BOARD_MEMBER/...) layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
578
+ guard: signerIsParty('state.issuerAddress'),
579
+ effect: {
580
+ merge: [
581
+ { var: 'state' },
582
+ {
583
+ pendingIssue: {
584
+ holderId: { var: 'event.holderId' },
585
+ ref: { var: 'event.boardResolutionRef' },
586
+ proposedAt: { var: '$ordinal' },
587
+ },
588
+ },
589
+ // bind the resolution fiber so issue_shares can assert its state next transition
590
+ addDependency({ var: 'event.boardResolutionRef' }),
591
+ // bind the parent entity fiber so issue_shares can assert it is ACTIVE
592
+ addDependency({ var: 'state.entityId' }),
593
+ ],
594
+ },
595
+ dependencies: [],
596
+ },
597
+ // AUTHORIZED -> ISSUED — phase 2 (#24): issue once the bound resolution is EXECUTED and the parent
598
+ // entity is ACTIVE. depInState replaces the dropped object-form dependencies (which never gated).
599
+ {
600
+ from: 'AUTHORIZED',
601
+ to: 'ISSUED',
602
+ eventName: 'issue_shares',
603
+ // authority gate — an identity role attestation (ISSUER/BOARD_MEMBER/...) layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
604
+ guard: {
605
+ and: [
606
+ signerIsParty('state.issuerAddress'),
607
+ // the proposal must target this holder, and its bound resolution must be EXECUTED
608
+ {
609
+ '==': [{ var: 'state.pendingIssue.holderId' }, { var: 'event.holderId' }],
610
+ },
611
+ depInState('state.pendingIssue.ref', 'EXECUTED'),
612
+ depInState('state.entityId', 'ACTIVE'),
613
+ ],
614
+ },
587
615
  effect: {
588
616
  merge: [
589
- { var: "state" },
617
+ { var: 'state' },
590
618
  {
591
- status: "ISSUED",
592
- form: { var: "event.form" },
593
- certificateNumber: { var: "event.certificateNumber" },
594
- issuanceDate: { var: "event.issuanceDate" },
595
- issuancePrice: { var: "event.issuancePrice" },
619
+ status: 'ISSUED',
620
+ form: { var: 'event.form' },
621
+ certificateNumber: { var: 'event.certificateNumber' },
622
+ issuanceDate: { var: 'event.issuanceDate' },
623
+ issuancePrice: { var: 'event.issuancePrice' },
596
624
  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",
625
+ holderId: { var: 'event.holderId' },
626
+ holderType: { var: 'event.holderType' },
627
+ name: { var: 'event.holderName' },
628
+ walletAddress: { var: 'event.holderWallet' },
629
+ address: { var: 'event.address' },
630
+ acquisitionDate: { var: 'event.issuanceDate' },
631
+ acquisitionMethod: 'ORIGINAL_ISSUANCE',
603
632
  costBasis: {
604
- "*": [
605
- { var: "event.issuancePrice" },
606
- { var: "state.shareCount" },
607
- ],
633
+ '*': [{ var: 'event.issuancePrice' }, { var: 'state.shareCount' }],
608
634
  },
609
635
  },
610
636
  restrictions: {
611
- isRestricted: { var: "event.isRestricted" },
612
- restrictionType: { var: "event.restrictionType" },
613
- legends: { var: "event.legends" },
637
+ isRestricted: { var: 'event.isRestricted' },
638
+ restrictionType: { var: 'event.restrictionType' },
639
+ legends: { var: 'event.legends' },
614
640
  },
615
641
  issuanceDetails: {
616
- boardResolutionRef: { var: "event.boardResolutionRef" },
617
- consideration: { var: "event.consideration" },
618
- exemptionUsed: { var: "event.exemptionUsed" },
619
- accreditedInvestor: { var: "event.accreditedInvestor" },
642
+ boardResolutionRef: { var: 'state.pendingIssue.ref' },
643
+ consideration: { var: 'event.consideration' },
644
+ exemptionUsed: { var: 'event.exemptionUsed' },
645
+ accreditedInvestor: { var: 'event.accreditedInvestor' },
620
646
  },
647
+ // clear the consumed proposal
648
+ pendingIssue: null,
649
+ },
650
+ {
651
+ _emit: [{ name: 'SHARES_ISSUED', data: { var: 'event' }, destination: 'external' }],
621
652
  },
622
653
  ],
623
654
  },
624
- emits: ["SHARES_ISSUED"],
655
+ dependencies: [],
625
656
  },
626
657
  // ISSUED -> TRANSFERRED
627
658
  {
628
- from: "ISSUED",
629
- to: "TRANSFERRED",
630
- eventName: "initiate_transfer",
659
+ from: 'ISSUED',
660
+ to: 'TRANSFERRED',
661
+ eventName: 'initiate_transfer',
631
662
  guard: {
632
663
  and: [
664
+ // authority gate — an identity role attestation (ISSUER/BOARD_MEMBER/...) layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
665
+ signerIsParty('state.holder.walletAddress'),
633
666
  {
634
667
  or: [
635
- { "==": [{ var: "state.restrictions.isRestricted" }, false] },
668
+ { '==': [{ var: 'state.restrictions.isRestricted' }, false] },
636
669
  {
637
- "==": [{ var: "state.restrictions.restrictionEndDate" }, null],
670
+ '==': [{ var: 'state.restrictions.restrictionEndDate' }, null],
638
671
  },
639
672
  {
640
- ">=": [
641
- { var: "$timestamp" },
642
- { var: "state.restrictions.restrictionEndDate" },
643
- ],
673
+ '>=': [{ var: '$ordinal' }, { var: 'state.restrictions.restrictionEndDate' }],
644
674
  },
645
675
  ],
646
676
  },
647
- { "==": [{ var: "state.restrictions.rofr" }, null] },
677
+ { '==': [{ var: 'state.restrictions.rofr' }, null] },
648
678
  ],
649
679
  },
650
680
  effect: {
651
681
  merge: [
652
- { var: "state" },
682
+ { var: 'state' },
653
683
  {
654
- status: "TRANSFERRED",
684
+ status: 'TRANSFERRED',
655
685
  transferHistory: {
656
- cat: [
657
- { var: "state.transferHistory" },
686
+ merge: [
687
+ { var: 'state.transferHistory' },
658
688
  [
659
689
  {
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" },
690
+ transferId: { var: 'event.transferId' },
691
+ transferDate: { var: 'event.transferDate' },
692
+ fromHolderId: { var: 'state.holder.holderId' },
693
+ toHolderId: { var: 'event.toHolderId' },
694
+ shares: { var: 'state.shareCount' },
695
+ transferType: { var: 'event.transferType' },
696
+ pricePerShare: { var: 'event.pricePerShare' },
667
697
  },
668
698
  ],
669
699
  ],
670
700
  },
671
701
  },
702
+ {
703
+ _emit: [{ name: 'TRANSFER_INITIATED', data: { var: 'event' }, destination: 'external' }],
704
+ },
672
705
  ],
673
706
  },
674
- emits: ["TRANSFER_INITIATED"],
675
707
  },
676
708
  // TRANSFERRED -> ISSUED
677
709
  {
678
- from: "TRANSFERRED",
679
- to: "ISSUED",
680
- eventName: "complete_transfer",
681
- guard: { "==": [1, 1] },
710
+ from: 'TRANSFERRED',
711
+ to: 'ISSUED',
712
+ eventName: 'complete_transfer',
713
+ // authority gate an identity role attestation (ISSUER/BOARD_MEMBER/...) layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
714
+ guard: signerIsParty('state.issuerAddress'),
682
715
  effect: {
683
716
  merge: [
684
- { var: "state" },
717
+ { var: 'state' },
685
718
  {
686
- status: "ISSUED",
719
+ status: 'ISSUED',
687
720
  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" },
721
+ holderId: { var: 'event.toHolderId' },
722
+ holderType: { var: 'event.toHolderType' },
723
+ name: { var: 'event.toHolderName' },
724
+ walletAddress: { var: 'event.toHolderWallet' },
725
+ address: { var: 'event.toAddress' },
726
+ acquisitionDate: { var: 'event.completedDate' },
727
+ acquisitionMethod: 'PURCHASE',
728
+ costBasis: { var: 'event.costBasis' },
695
729
  },
696
730
  certificateNumber: {
697
731
  if: [
698
- { "!=": [{ var: "event.newCertificateNumber" }, null] },
699
- { var: "event.newCertificateNumber" },
700
- { var: "state.certificateNumber" },
732
+ { '!=': [{ var: 'event.newCertificateNumber' }, null] },
733
+ { var: 'event.newCertificateNumber' },
734
+ { var: 'state.certificateNumber' },
701
735
  ],
702
736
  },
703
737
  },
738
+ {
739
+ _emit: [{ name: 'TRANSFER_COMPLETED', data: { var: 'event' }, destination: 'external' }],
740
+ },
704
741
  ],
705
742
  },
706
- emits: ["TRANSFER_COMPLETED"],
707
743
  },
708
- // ISSUED -> TREASURY
744
+ // ISSUED -> ISSUED (propose_repurchase) — phase 1 (#24): bind the executing resolution fiber and
745
+ // record the pending repurchase, so repurchase can read the resolution's state next transition.
709
746
  {
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
- ],
747
+ from: 'ISSUED',
748
+ to: 'ISSUED',
749
+ eventName: 'propose_repurchase',
750
+ // authority gate the selling holder must sign; an identity role attestation (ISSUER/BOARD_MEMBER/...) layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
751
+ guard: signerIsParty('state.holder.walletAddress'),
752
+ effect: {
753
+ merge: [
754
+ { var: 'state' },
755
+ {
756
+ pendingRepurchase: {
757
+ repurchaseDate: { var: 'event.repurchaseDate' },
758
+ ref: { var: 'event.boardResolutionRef' },
759
+ proposedAt: { var: '$ordinal' },
760
+ },
761
+ },
762
+ // bind the resolution fiber so repurchase can assert its state next transition
763
+ addDependency({ var: 'event.boardResolutionRef' }),
764
+ ],
765
+ },
766
+ dependencies: [],
767
+ },
768
+ // ISSUED -> TREASURY — phase 2 (#24): repurchase once the bound resolution is EXECUTED.
769
+ {
770
+ from: 'ISSUED',
771
+ to: 'TREASURY',
772
+ eventName: 'repurchase',
773
+ // authority gate — the selling holder must sign; an identity role attestation (ISSUER/BOARD_MEMBER/...) layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
774
+ guard: {
775
+ and: [
776
+ signerIsParty('state.holder.walletAddress'),
777
+ // the proposal must match this repurchase, and its bound resolution must be EXECUTED
778
+ {
779
+ '==': [{ var: 'state.pendingRepurchase.repurchaseDate' }, { var: 'event.repurchaseDate' }],
780
+ },
781
+ depInState('state.pendingRepurchase.ref', 'EXECUTED'),
782
+ ],
783
+ },
721
784
  effect: {
722
785
  merge: [
723
- { var: "state" },
786
+ { var: 'state' },
724
787
  {
725
- status: "TREASURY",
788
+ status: 'TREASURY',
726
789
  transferHistory: {
727
- cat: [
728
- { var: "state.transferHistory" },
790
+ merge: [
791
+ { var: 'state.transferHistory' },
729
792
  [
730
793
  {
731
794
  transferId: {
732
- cat: ["REPURCHASE-", { var: "event.repurchaseDate" }],
795
+ cat: ['REPURCHASE-', { var: 'event.repurchaseDate' }],
733
796
  },
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" },
797
+ transferDate: { var: 'event.repurchaseDate' },
798
+ fromHolderId: { var: 'state.holder.holderId' },
799
+ toHolderId: 'TREASURY',
800
+ shares: { var: 'state.shareCount' },
801
+ transferType: 'INTERNAL',
802
+ pricePerShare: { var: 'event.pricePerShare' },
740
803
  },
741
804
  ],
742
805
  ],
743
806
  },
744
807
  holder: {
745
- holderId: "TREASURY",
746
- holderType: "TREASURY",
747
- name: "Treasury Stock",
748
- acquisitionDate: { var: "event.repurchaseDate" },
749
- acquisitionMethod: "PURCHASE",
808
+ holderId: 'TREASURY',
809
+ holderType: 'TREASURY',
810
+ name: 'Treasury Stock',
811
+ acquisitionDate: { var: 'event.repurchaseDate' },
812
+ acquisitionMethod: 'PURCHASE',
750
813
  costBasis: {
751
- "*": [
752
- { var: "event.pricePerShare" },
753
- { var: "state.shareCount" },
754
- ],
814
+ '*': [{ var: 'event.pricePerShare' }, { var: 'state.shareCount' }],
755
815
  },
756
816
  },
817
+ // clear the consumed proposal
818
+ pendingRepurchase: null,
819
+ },
820
+ {
821
+ _emit: [{ name: 'SHARES_REPURCHASED', data: { var: 'event' }, destination: 'external' }],
757
822
  },
758
823
  ],
759
824
  },
760
- emits: ["SHARES_REPURCHASED"],
825
+ dependencies: [],
761
826
  },
762
- // TREASURY -> ISSUED
827
+ // TREASURY -> TREASURY (propose_reissue) — phase 1 (#24): bind the executing resolution fiber and
828
+ // record the pending reissue, so reissue_from_treasury can read the resolution's state next transition.
763
829
  {
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
- ],
830
+ from: 'TREASURY',
831
+ to: 'TREASURY',
832
+ eventName: 'propose_reissue',
833
+ // authority gate an identity role attestation (ISSUER/BOARD_MEMBER/...) layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
834
+ guard: signerIsParty('state.issuerAddress'),
775
835
  effect: {
776
836
  merge: [
777
- { var: "state" },
837
+ { var: 'state' },
778
838
  {
779
- status: "ISSUED",
839
+ pendingReissue: {
840
+ holderId: { var: 'event.holderId' },
841
+ ref: { var: 'event.boardResolutionRef' },
842
+ proposedAt: { var: '$ordinal' },
843
+ },
844
+ },
845
+ // bind the resolution fiber so reissue_from_treasury can assert its state next transition
846
+ addDependency({ var: 'event.boardResolutionRef' }),
847
+ ],
848
+ },
849
+ dependencies: [],
850
+ },
851
+ // TREASURY -> ISSUED — phase 2 (#24): reissue once the bound resolution is EXECUTED.
852
+ {
853
+ from: 'TREASURY',
854
+ to: 'ISSUED',
855
+ eventName: 'reissue_from_treasury',
856
+ // authority gate — an identity role attestation (ISSUER/BOARD_MEMBER/...) layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
857
+ guard: {
858
+ and: [
859
+ signerIsParty('state.issuerAddress'),
860
+ // the proposal must target this holder, and its bound resolution must be EXECUTED
861
+ {
862
+ '==': [{ var: 'state.pendingReissue.holderId' }, { var: 'event.holderId' }],
863
+ },
864
+ depInState('state.pendingReissue.ref', 'EXECUTED'),
865
+ ],
866
+ },
867
+ effect: {
868
+ merge: [
869
+ { var: 'state' },
870
+ {
871
+ status: 'ISSUED',
780
872
  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",
873
+ holderId: { var: 'event.holderId' },
874
+ holderType: { var: 'event.holderType' },
875
+ name: { var: 'event.holderName' },
876
+ walletAddress: { var: 'event.holderWallet' },
877
+ address: { var: 'event.address' },
878
+ acquisitionDate: { var: 'event.reissueDate' },
879
+ acquisitionMethod: 'PURCHASE',
787
880
  costBasis: {
788
- "*": [
789
- { var: "event.issuancePrice" },
790
- { var: "state.shareCount" },
791
- ],
881
+ '*': [{ var: 'event.issuancePrice' }, { var: 'state.shareCount' }],
792
882
  },
793
883
  },
884
+ // clear the consumed proposal
885
+ pendingReissue: null,
886
+ },
887
+ {
888
+ _emit: [{ name: 'TREASURY_SHARES_REISSUED', data: { var: 'event' }, destination: 'external' }],
794
889
  },
795
890
  ],
796
891
  },
797
- emits: ["TREASURY_SHARES_REISSUED"],
892
+ dependencies: [],
798
893
  },
799
- // ISSUED -> RETIRED
894
+ // ISSUED -> ISSUED (propose_retire) — phase 1 (#24): bind the executing resolution fiber and record
895
+ // the pending retirement, so the retire transition can read the resolution's state next transition.
800
896
  {
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
- ],
897
+ from: 'ISSUED',
898
+ to: 'ISSUED',
899
+ eventName: 'propose_retire',
900
+ // authority gate an identity role attestation (ISSUER/BOARD_MEMBER/...) layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
901
+ guard: signerIsParty('state.issuerAddress'),
902
+ effect: {
903
+ merge: [
904
+ { var: 'state' },
905
+ {
906
+ pendingRetire: {
907
+ retiredDate: { var: 'event.retiredDate' },
908
+ ref: { var: 'event.boardResolutionRef' },
909
+ proposedAt: { var: '$ordinal' },
910
+ },
911
+ },
912
+ // bind the resolution fiber so retire can assert its state next transition
913
+ addDependency({ var: 'event.boardResolutionRef' }),
914
+ ],
915
+ },
916
+ dependencies: [],
917
+ },
918
+ // TREASURY -> TREASURY (propose_retire) — phase 1 (#24): the treasury-side counterpart, binding the
919
+ // executing resolution fiber and recording the pending retirement before retire executes.
920
+ {
921
+ from: 'TREASURY',
922
+ to: 'TREASURY',
923
+ eventName: 'propose_retire',
924
+ // authority gate — an identity role attestation (ISSUER/BOARD_MEMBER/...) layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
925
+ guard: signerIsParty('state.issuerAddress'),
812
926
  effect: {
813
927
  merge: [
814
- { var: "state" },
928
+ { var: 'state' },
815
929
  {
816
- status: "RETIRED",
930
+ pendingRetire: {
931
+ retiredDate: { var: 'event.retiredDate' },
932
+ ref: { var: 'event.boardResolutionRef' },
933
+ proposedAt: { var: '$ordinal' },
934
+ },
935
+ },
936
+ // bind the resolution fiber so retire can assert its state next transition
937
+ addDependency({ var: 'event.boardResolutionRef' }),
938
+ ],
939
+ },
940
+ dependencies: [],
941
+ },
942
+ // ISSUED -> RETIRED — phase 2 (#24): retire once the bound resolution is EXECUTED.
943
+ {
944
+ from: 'ISSUED',
945
+ to: 'RETIRED',
946
+ eventName: 'retire',
947
+ // authority gate — an identity role attestation (ISSUER/BOARD_MEMBER/...) layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
948
+ guard: {
949
+ and: [
950
+ signerIsParty('state.issuerAddress'),
951
+ // the proposal must match this retirement, and its bound resolution must be EXECUTED
952
+ {
953
+ '==': [{ var: 'state.pendingRetire.retiredDate' }, { var: 'event.retiredDate' }],
954
+ },
955
+ depInState('state.pendingRetire.ref', 'EXECUTED'),
956
+ ],
957
+ },
958
+ effect: {
959
+ merge: [
960
+ { var: 'state' },
961
+ {
962
+ status: 'RETIRED',
817
963
  retirementDetails: {
818
- retiredDate: { var: "event.retiredDate" },
819
- retirementMethod: { var: "event.retirementMethod" },
820
- repurchasePrice: { var: "event.repurchasePrice" },
821
- boardResolutionRef: { var: "event.boardResolutionRef" },
964
+ retiredDate: { var: 'event.retiredDate' },
965
+ retirementMethod: { var: 'event.retirementMethod' },
966
+ repurchasePrice: { var: 'event.repurchasePrice' },
967
+ boardResolutionRef: { var: 'state.pendingRetire.ref' },
822
968
  },
823
969
  holder: null,
970
+ // clear the consumed proposal
971
+ pendingRetire: null,
972
+ },
973
+ {
974
+ _emit: [{ name: 'SHARES_RETIRED', data: { var: 'event' }, destination: 'external' }],
824
975
  },
825
976
  ],
826
977
  },
827
- emits: ["SHARES_RETIRED"],
978
+ dependencies: [],
828
979
  },
829
- // TREASURY -> RETIRED
980
+ // TREASURY -> RETIRED — phase 2 (#24): retire once the bound resolution is EXECUTED.
830
981
  {
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
- ],
982
+ from: 'TREASURY',
983
+ to: 'RETIRED',
984
+ eventName: 'retire',
985
+ // authority gate an identity role attestation (ISSUER/BOARD_MEMBER/...) layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
986
+ guard: {
987
+ and: [
988
+ signerIsParty('state.issuerAddress'),
989
+ // the proposal must match this retirement, and its bound resolution must be EXECUTED
990
+ {
991
+ '==': [{ var: 'state.pendingRetire.retiredDate' }, { var: 'event.retiredDate' }],
992
+ },
993
+ depInState('state.pendingRetire.ref', 'EXECUTED'),
994
+ ],
995
+ },
842
996
  effect: {
843
997
  merge: [
844
- { var: "state" },
998
+ { var: 'state' },
845
999
  {
846
- status: "RETIRED",
1000
+ status: 'RETIRED',
847
1001
  retirementDetails: {
848
- retiredDate: { var: "event.retiredDate" },
849
- retirementMethod: { var: "event.retirementMethod" },
850
- repurchasePrice: { var: "event.repurchasePrice" },
851
- boardResolutionRef: { var: "event.boardResolutionRef" },
1002
+ retiredDate: { var: 'event.retiredDate' },
1003
+ retirementMethod: { var: 'event.retirementMethod' },
1004
+ repurchasePrice: { var: 'event.repurchasePrice' },
1005
+ boardResolutionRef: { var: 'state.pendingRetire.ref' },
852
1006
  },
853
1007
  holder: null,
1008
+ // clear the consumed proposal
1009
+ pendingRetire: null,
1010
+ },
1011
+ {
1012
+ _emit: [{ name: 'SHARES_RETIRED', data: { var: 'event' }, destination: 'external' }],
854
1013
  },
855
1014
  ],
856
1015
  },
857
- emits: ["SHARES_RETIRED"],
1016
+ dependencies: [],
858
1017
  },
859
1018
  // ISSUED -> ISSUED (stock_split)
860
1019
  {
861
- from: "ISSUED",
862
- to: "ISSUED",
863
- eventName: "stock_split",
864
- guard: { "==": [1, 1] },
1020
+ from: 'ISSUED',
1021
+ to: 'ISSUED',
1022
+ eventName: 'stock_split',
1023
+ // authority gate an identity role attestation (ISSUER/BOARD_MEMBER/...) layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
1024
+ guard: signerIsParty('state.issuerAddress'),
865
1025
  effect: {
866
1026
  merge: [
867
- { var: "state" },
1027
+ { var: 'state' },
868
1028
  {
869
1029
  corporateActions: {
870
- cat: [
871
- { var: "state.corporateActions" },
1030
+ merge: [
1031
+ { var: 'state.corporateActions' },
872
1032
  [
873
1033
  {
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" },
1034
+ actionId: { var: 'event.actionId' },
1035
+ actionType: 'STOCK_SPLIT',
1036
+ actionDate: { var: 'event.effectiveDate' },
1037
+ ratio: { var: 'event.splitRatio' },
1038
+ sharesBeforeAction: { var: 'state.shareCount' },
1039
+ sharesAfterAction: { var: 'event.newShareCount' },
1040
+ resolutionRef: { var: 'event.resolutionRef' },
881
1041
  },
882
1042
  ],
883
1043
  ],
884
1044
  },
885
- shareCount: { var: "event.newShareCount" },
1045
+ shareCount: { var: 'event.newShareCount' },
1046
+ },
1047
+ {
1048
+ _emit: [{ name: 'STOCK_SPLIT_APPLIED', data: { var: 'event' }, destination: 'external' }],
886
1049
  },
887
1050
  ],
888
1051
  },
889
- emits: ["STOCK_SPLIT_APPLIED"],
890
1052
  },
891
- // ISSUED -> ISSUED (declare_dividend) - stock dividend handling
1053
+ // ISSUED -> ISSUED (propose_dividend) phase 1 (#24): bind the executing resolution fiber and record
1054
+ // the pending declaration, so declare_dividend can read the resolution's state next transition.
892
1055
  {
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
- ],
1056
+ from: 'ISSUED',
1057
+ to: 'ISSUED',
1058
+ eventName: 'propose_dividend',
1059
+ // authority gate an identity role attestation (ISSUER/BOARD_MEMBER/...) layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
1060
+ guard: signerIsParty('state.issuerAddress'),
1061
+ effect: {
1062
+ merge: [
1063
+ { var: 'state' },
1064
+ {
1065
+ pendingDividend: {
1066
+ actionId: { var: 'event.actionId' },
1067
+ ref: { var: 'event.resolutionRef' },
1068
+ proposedAt: { var: '$ordinal' },
1069
+ },
1070
+ },
1071
+ // bind the resolution fiber so declare_dividend can assert its state next transition
1072
+ addDependency({ var: 'event.resolutionRef' }),
1073
+ ],
1074
+ },
1075
+ dependencies: [],
1076
+ },
1077
+ // ISSUED -> ISSUED (declare_dividend) — phase 2 (#24): stock dividend handling once the bound
1078
+ // resolution is EXECUTED.
1079
+ {
1080
+ from: 'ISSUED',
1081
+ to: 'ISSUED',
1082
+ eventName: 'declare_dividend',
1083
+ // authority gate — an identity role attestation (ISSUER/BOARD_MEMBER/...) layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
1084
+ guard: {
1085
+ and: [
1086
+ signerIsParty('state.issuerAddress'),
1087
+ // the proposal must target this action, and its bound resolution must be EXECUTED
1088
+ {
1089
+ '==': [{ var: 'state.pendingDividend.actionId' }, { var: 'event.actionId' }],
1090
+ },
1091
+ depInState('state.pendingDividend.ref', 'EXECUTED'),
1092
+ ],
1093
+ },
904
1094
  effect: {
905
1095
  if: [
906
- { "==": [{ var: "event.dividendType" }, "STOCK"] },
1096
+ { '==': [{ var: 'event.dividendType' }, 'STOCK'] },
907
1097
  {
908
1098
  merge: [
909
- { var: "state" },
1099
+ { var: 'state' },
910
1100
  {
911
1101
  corporateActions: {
912
- cat: [
913
- { var: "state.corporateActions" },
1102
+ merge: [
1103
+ { var: 'state.corporateActions' },
914
1104
  [
915
1105
  {
916
- actionId: { var: "event.actionId" },
917
- actionType: "STOCK_DIVIDEND",
918
- actionDate: { var: "event.paymentDate" },
919
- sharesBeforeAction: { var: "state.shareCount" },
1106
+ actionId: { var: 'event.actionId' },
1107
+ actionType: 'STOCK_DIVIDEND',
1108
+ actionDate: { var: 'event.paymentDate' },
1109
+ sharesBeforeAction: { var: 'state.shareCount' },
920
1110
  sharesAfterAction: {
921
- "+": [
922
- { var: "state.shareCount" },
923
- { var: "event.stockShares" },
924
- ],
1111
+ '+': [{ var: 'state.shareCount' }, { var: 'event.stockShares' }],
925
1112
  },
926
- resolutionRef: { var: "event.resolutionRef" },
1113
+ resolutionRef: { var: 'state.pendingDividend.ref' },
927
1114
  },
928
1115
  ],
929
1116
  ],
930
1117
  },
931
1118
  shareCount: {
932
- "+": [
933
- { var: "state.shareCount" },
934
- { var: "event.stockShares" },
935
- ],
1119
+ '+': [{ var: 'state.shareCount' }, { var: 'event.stockShares' }],
936
1120
  },
1121
+ // clear the consumed proposal
1122
+ pendingDividend: null,
937
1123
  },
938
1124
  ],
939
1125
  },
940
- { var: "state" },
1126
+ {
1127
+ merge: [
1128
+ { var: 'state' },
1129
+ // cash dividend: no share change, but still clear the consumed proposal
1130
+ { pendingDividend: null },
1131
+ ],
1132
+ },
941
1133
  ],
942
1134
  },
1135
+ dependencies: [],
943
1136
  },
944
1137
  // ISSUED -> ISSUED (remove_restriction)
945
1138
  {
946
- from: "ISSUED",
947
- to: "ISSUED",
948
- eventName: "remove_restriction",
949
- guard: { "==": [1, 1] },
1139
+ from: 'ISSUED',
1140
+ to: 'ISSUED',
1141
+ eventName: 'remove_restriction',
1142
+ // authority gate an identity role attestation (ISSUER/BOARD_MEMBER/...) layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
1143
+ guard: signerIsParty('state.issuerAddress'),
950
1144
  effect: {
951
1145
  merge: [
952
- { var: "state" },
1146
+ { var: 'state' },
953
1147
  {
954
1148
  restrictions: {
955
1149
  merge: [
956
- { var: "state.restrictions" },
1150
+ { var: 'state.restrictions' },
957
1151
  {
958
1152
  restrictionType: {
959
1153
  filter: [
960
- { var: "state.restrictions.restrictionType" },
961
- { "!=": [{ var: "" }, { var: "event.restrictionType" }] },
1154
+ { var: 'state.restrictions.restrictionType' },
1155
+ { '!=': [{ var: '' }, { var: 'event.restrictionType' }] },
962
1156
  ],
963
1157
  },
964
1158
  isRestricted: {
965
- ">": [
1159
+ '>': [
966
1160
  {
967
1161
  reduce: [
968
1162
  {
969
1163
  filter: [
970
- { var: "state.restrictions.restrictionType" },
1164
+ { var: 'state.restrictions.restrictionType' },
971
1165
  {
972
- "!=": [
973
- { var: "" },
974
- { var: "event.restrictionType" },
975
- ],
1166
+ '!=': [{ var: '' }, { var: 'event.restrictionType' }],
976
1167
  },
977
1168
  ],
978
1169
  },
979
- { "+": [{ var: "accumulator" }, 1] },
1170
+ { '+': [{ var: 'accumulator' }, 1] },
980
1171
  0,
981
1172
  ],
982
1173
  },
@@ -987,9 +1178,11 @@ export const corpSecuritiesDef = defineFiberApp({
987
1178
  ],
988
1179
  },
989
1180
  },
1181
+ {
1182
+ _emit: [{ name: 'RESTRICTION_REMOVED', data: { var: 'event' }, destination: 'external' }],
1183
+ },
990
1184
  ],
991
1185
  },
992
- emits: ["RESTRICTION_REMOVED"],
993
1186
  },
994
1187
  ],
995
1188
  });