@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,550 +1,625 @@
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
  * Master corporate record tracking the lifecycle of a business entity from incorporation through dissolution.
4
6
  * Manages legal identity, share structure, and corporate status.
5
7
  */
6
8
  export const corpEntityDef = defineFiberApp({
7
9
  metadata: {
8
- name: "CorpEntity",
9
- app: "corporate",
10
- type: "entity",
11
- version: "1.0.0",
12
- description: "Master corporate record tracking the lifecycle of a business entity from incorporation through dissolution. Manages legal identity, share structure, and corporate status.",
10
+ name: 'CorpEntity',
11
+ app: 'corporate',
12
+ type: 'entity',
13
+ version: '1.0.0',
14
+ description: 'Master corporate record tracking the lifecycle of a business entity from incorporation through dissolution. Manages legal identity, share structure, and corporate status.',
13
15
  crossReferences: {
14
16
  board: {
15
- machine: "corporate-board",
16
- description: "Board of directors for this entity",
17
- foreignKey: "entityId",
17
+ machine: 'corporate-board',
18
+ description: 'Board of directors for this entity',
19
+ foreignKey: 'entityId',
18
20
  },
19
21
  officers: {
20
- machine: "corporate-officers",
21
- description: "Executive officers for this entity",
22
- foreignKey: "entityId",
22
+ machine: 'corporate-officers',
23
+ description: 'Executive officers for this entity',
24
+ foreignKey: 'entityId',
23
25
  },
24
26
  bylaws: {
25
- machine: "corporate-bylaws",
26
- description: "Governing bylaws for this entity",
27
- foreignKey: "entityId",
27
+ machine: 'corporate-bylaws',
28
+ description: 'Governing bylaws for this entity',
29
+ foreignKey: 'entityId',
28
30
  },
29
31
  shareholders: {
30
- machine: "corporate-shareholders",
31
- description: "Shareholder meeting instances",
32
- foreignKey: "entityId",
32
+ machine: 'corporate-shareholders',
33
+ description: 'Shareholder meeting instances',
34
+ foreignKey: 'entityId',
33
35
  },
34
36
  securities: {
35
- machine: "corporate-securities",
36
- description: "Stock issuance records",
37
- foreignKey: "entityId",
37
+ machine: 'corporate-securities',
38
+ description: 'Stock issuance records',
39
+ foreignKey: 'entityId',
38
40
  },
39
41
  compliance: {
40
- machine: "corporate-compliance",
41
- description: "Regulatory compliance tracking",
42
- foreignKey: "entityId",
42
+ machine: 'corporate-compliance',
43
+ description: 'Regulatory compliance tracking',
44
+ foreignKey: 'entityId',
43
45
  },
44
46
  },
45
47
  },
46
48
  createSchema: {
47
- required: ["entityId", "legalName", "entityType", "jurisdiction"],
49
+ required: [
50
+ 'entityId',
51
+ 'legalName',
52
+ 'entityType',
53
+ 'jurisdiction',
54
+ 'charterAuthority',
55
+ 'boardAuthority',
56
+ 'shareholderAuthority',
57
+ 'stateAuthority',
58
+ ],
48
59
  properties: {
49
60
  entityId: {
50
- type: "string",
51
- description: "Unique identifier for this corporate entity",
61
+ type: 'string',
62
+ description: 'Unique identifier for this corporate entity',
63
+ immutable: true,
64
+ },
65
+ charterAuthority: {
66
+ type: 'address',
67
+ description: 'State-pinned DAG address authorized to amend the charter (legal identity). Verified against proofs[].address.',
68
+ immutable: true,
69
+ },
70
+ boardAuthority: {
71
+ type: 'address',
72
+ description: 'State-pinned DAG address of the board authority (governs registered-agent changes, suspension/reinstatement, and the board half of voluntary dissolution). Verified against proofs[].address.',
73
+ immutable: true,
74
+ },
75
+ shareholderAuthority: {
76
+ type: 'address',
77
+ description: 'State-pinned DAG address of the shareholder authority (the shareholder half of voluntary dissolution). Verified against proofs[].address.',
78
+ immutable: true,
79
+ },
80
+ stateAuthority: {
81
+ type: 'address',
82
+ description: 'State-pinned DAG address of the chartering jurisdiction/registrar that may administratively dissolve a suspended entity. Verified against proofs[].address.',
52
83
  immutable: true,
53
84
  },
54
85
  legalName: {
55
- type: "string",
56
- description: "Full legal name of the corporation",
86
+ type: 'string',
87
+ description: 'Full legal name of the corporation',
57
88
  },
58
89
  tradeName: {
59
- type: "string",
90
+ type: 'string',
60
91
  nullable: true,
61
- description: "DBA or trade name if different",
92
+ description: 'DBA or trade name if different',
62
93
  },
63
94
  entityType: {
64
- type: "string",
65
- enum: ["C_CORP", "S_CORP", "B_CORP", "LLC", "LP", "LLP"],
66
- description: "Legal entity type",
95
+ type: 'string',
96
+ enum: ['C_CORP', 'S_CORP', 'B_CORP', 'LLC', 'LP', 'LLP'],
97
+ description: 'Legal entity type',
67
98
  },
68
99
  jurisdiction: {
69
- type: "object",
100
+ type: 'object',
70
101
  properties: {
71
102
  state: {
72
- type: "string",
73
- description: "State of incorporation (e.g., DE, NV, WY)",
103
+ type: 'string',
104
+ description: 'State of incorporation (e.g., DE, NV, WY)',
74
105
  },
75
- country: { type: "string", default: "USA" },
106
+ country: { type: 'string', default: 'USA' },
76
107
  foreignQualifications: {
77
- type: "array",
78
- items: { type: "string" },
79
- description: "States where foreign qualified to do business",
108
+ type: 'array',
109
+ items: { type: 'string' },
110
+ description: 'States where foreign qualified to do business',
80
111
  },
81
112
  },
82
113
  },
83
114
  fiscalYearEnd: {
84
- type: "string",
85
- description: "Fiscal year end (MM-DD format)",
115
+ type: 'string',
116
+ description: 'Fiscal year end (MM-DD format)',
86
117
  },
87
118
  registeredAgent: {
88
- type: "object",
119
+ type: 'object',
89
120
  properties: {
90
- name: { type: "string" },
91
- address: { type: "object" },
92
- phone: { type: "string" },
93
- email: { type: "string" },
94
- effectiveDate: { type: "string", format: "date" },
121
+ name: { type: 'string' },
122
+ address: { type: 'object' },
123
+ phone: { type: 'string' },
124
+ email: { type: 'string' },
125
+ effectiveDate: { type: 'string', format: 'date' },
95
126
  },
96
127
  },
97
128
  principalOffice: {
98
- type: "object",
129
+ type: 'object',
99
130
  properties: {
100
- street: { type: "string" },
101
- city: { type: "string" },
102
- state: { type: "string" },
103
- zip: { type: "string" },
104
- country: { type: "string", default: "USA" },
131
+ street: { type: 'string' },
132
+ city: { type: 'string' },
133
+ state: { type: 'string' },
134
+ zip: { type: 'string' },
135
+ country: { type: 'string', default: 'USA' },
105
136
  },
106
137
  },
107
138
  shareStructure: {
108
- type: "object",
139
+ type: 'object',
109
140
  properties: {
110
141
  classes: {
111
- type: "array",
112
- items: { $ref: "#/definitions/ShareClass" },
142
+ type: 'array',
143
+ items: { $ref: '#/definitions/ShareClass' },
113
144
  },
114
145
  totalAuthorized: {
115
- type: "integer",
116
- description: "Sum of all authorized shares",
146
+ type: 'integer',
147
+ description: 'Sum of all authorized shares',
117
148
  },
118
- totalIssued: { type: "integer" },
119
- totalOutstanding: { type: "integer" },
149
+ totalIssued: { type: 'integer' },
150
+ totalOutstanding: { type: 'integer' },
120
151
  },
121
152
  },
122
153
  incorporators: {
123
- type: "array",
124
- items: { $ref: "#/definitions/Incorporator" },
154
+ type: 'array',
155
+ items: { $ref: '#/definitions/Incorporator' },
125
156
  },
126
157
  ein: {
127
- type: "string",
158
+ type: 'string',
128
159
  nullable: true,
129
- description: "Federal EIN",
160
+ description: 'Federal EIN',
130
161
  },
131
162
  stateIds: {
132
- type: "object",
133
- additionalProperties: { type: "string" },
134
- description: "State-specific entity IDs keyed by state code",
163
+ type: 'object',
164
+ additionalProperties: { type: 'string' },
165
+ description: 'State-specific entity IDs keyed by state code',
135
166
  },
136
167
  },
137
168
  },
138
169
  stateSchema: {
139
170
  properties: {
140
- entityId: { type: "string", immutable: true },
141
- legalName: { type: "string" },
142
- tradeName: { type: "string", nullable: true },
143
- entityType: { type: "string" },
144
- jurisdiction: { type: "object" },
145
- formationDate: { type: "string", format: "date", computed: true },
146
- fiscalYearEnd: { type: "string" },
147
- registeredAgent: { type: "object" },
148
- principalOffice: { type: "object" },
149
- shareStructure: { type: "object" },
150
- incorporators: { type: "array" },
151
- ein: { type: "string", nullable: true },
152
- stateIds: { type: "object" },
171
+ entityId: { type: 'string', immutable: true },
172
+ charterAuthority: { type: 'address', immutable: true },
173
+ boardAuthority: { type: 'address', immutable: true },
174
+ shareholderAuthority: { type: 'address', immutable: true },
175
+ stateAuthority: { type: 'address', immutable: true },
176
+ legalName: { type: 'string' },
177
+ tradeName: { type: 'string', nullable: true },
178
+ entityType: { type: 'string' },
179
+ jurisdiction: { type: 'object' },
180
+ formationDate: { type: 'string', format: 'date', computed: true },
181
+ fiscalYearEnd: { type: 'string' },
182
+ registeredAgent: { type: 'object' },
183
+ principalOffice: { type: 'object' },
184
+ shareStructure: { type: 'object' },
185
+ incorporators: { type: 'array' },
186
+ ein: { type: 'string', nullable: true },
187
+ stateIds: { type: 'object' },
153
188
  status: {
154
- type: "string",
155
- enum: ["INCORPORATING", "ACTIVE", "SUSPENDED", "DISSOLVED"],
189
+ type: 'string',
190
+ enum: ['INCORPORATING', 'ACTIVE', 'SUSPENDED', 'DISSOLVED'],
156
191
  computed: true,
157
192
  },
158
- suspensionReason: { type: "string", nullable: true, computed: true },
193
+ suspensionReason: { type: 'string', nullable: true, computed: true },
159
194
  suspensionDate: {
160
- type: "string",
161
- format: "date",
195
+ type: 'string',
196
+ format: 'date',
162
197
  nullable: true,
163
198
  computed: true,
164
199
  },
165
200
  dissolutionDate: {
166
- type: "string",
167
- format: "date",
201
+ type: 'string',
202
+ format: 'date',
168
203
  nullable: true,
169
204
  computed: true,
170
205
  },
171
- dissolutionReason: { type: "string", nullable: true, computed: true },
206
+ dissolutionReason: { type: 'string', nullable: true, computed: true },
172
207
  charterAmendments: {
173
- type: "array",
174
- items: { $ref: "#/definitions/CharterAmendment" },
208
+ type: 'array',
209
+ items: { $ref: '#/definitions/CharterAmendment' },
175
210
  computed: true,
176
211
  },
177
- createdAt: { type: "timestamp", computed: true },
178
- updatedAt: { type: "timestamp", computed: true },
212
+ createdAt: { type: 'timestamp', computed: true },
213
+ updatedAt: { type: 'timestamp', computed: true },
214
+ // Two-phase amendment (#24): propose_amend_charter binds the resolution fiber + records the
215
+ // pending amendment here; amend_charter asserts the bound resolution is EXECUTED, then clears this.
216
+ pendingAmendCharter: { type: 'object', nullable: true, computed: true },
217
+ // Two-phase voluntary dissolution (#24): propose_dissolve_voluntary binds the board + shareholder
218
+ // resolution fibers + records the pending dissolution here; dissolve_voluntary asserts both bound
219
+ // resolutions are EXECUTED, then clears this.
220
+ pendingDissolveVoluntary: { type: 'object', nullable: true, computed: true },
179
221
  },
180
222
  },
181
223
  eventSchemas: {
182
224
  incorporate: {
183
- description: "State approves articles of incorporation, corporation comes into existence",
184
- required: ["approvalDate", "stateFileNumber"],
225
+ description: 'State approves articles of incorporation, corporation comes into existence',
226
+ required: ['approvalDate', 'stateFileNumber'],
185
227
  properties: {
186
- approvalDate: { type: "string", format: "date" },
187
- stateFileNumber: { type: "string" },
228
+ approvalDate: { type: 'string', format: 'date' },
229
+ stateFileNumber: { type: 'string' },
188
230
  certificateOfIncorporation: {
189
- type: "string",
190
- description: "Document reference",
231
+ type: 'string',
232
+ description: 'Document reference',
191
233
  },
192
234
  },
193
235
  },
194
- amend_charter: {
195
- description: "Amend the certificate/articles of incorporation (requires shareholder approval for most amendments)",
196
- required: [
197
- "amendmentId",
198
- "description",
199
- "amendmentType",
200
- "resolutionRef",
201
- "effectiveDate",
202
- "filedDate",
203
- ],
236
+ propose_amend_charter: {
237
+ description: 'Phase 1 of a charter amendment: bind the approving resolution fiber (#24 _addDependency) and record the pending amendment',
238
+ required: ['amendmentId', 'description', 'amendmentType', 'resolutionRef', 'effectiveDate', 'filedDate'],
204
239
  properties: {
205
- amendmentId: { type: "string" },
206
- description: { type: "string" },
240
+ amendmentId: { type: 'string' },
241
+ description: { type: 'string' },
207
242
  amendmentType: {
208
- type: "string",
209
- enum: [
210
- "NAME_CHANGE",
211
- "SHARE_AUTHORIZATION",
212
- "PURPOSE_CHANGE",
213
- "OTHER",
214
- ],
243
+ type: 'string',
244
+ enum: ['NAME_CHANGE', 'SHARE_AUTHORIZATION', 'PURPOSE_CHANGE', 'OTHER'],
215
245
  },
216
246
  resolutionRef: {
217
- type: "string",
218
- description: "Reference to board/shareholder resolution",
247
+ type: 'string',
248
+ description: 'Reference to board/shareholder resolution',
219
249
  },
220
- effectiveDate: { type: "string", format: "date" },
221
- filedDate: { type: "string", format: "date" },
250
+ effectiveDate: { type: 'string', format: 'date' },
251
+ filedDate: { type: 'string', format: 'date' },
222
252
  newShareAuthorization: {
223
- type: "object",
253
+ type: 'object',
224
254
  nullable: true,
225
- description: "If increasing/changing authorized shares",
255
+ description: 'If increasing/changing authorized shares',
226
256
  },
227
- newLegalName: { type: "string", nullable: true },
257
+ newLegalName: { type: 'string', nullable: true },
258
+ },
259
+ },
260
+ amend_charter: {
261
+ description: 'Phase 2 of a charter amendment: apply once the bound approving resolution is EXECUTED',
262
+ required: ['amendmentId', 'description', 'amendmentType', 'effectiveDate', 'filedDate'],
263
+ properties: {
264
+ amendmentId: { type: 'string' },
265
+ description: { type: 'string' },
266
+ amendmentType: {
267
+ type: 'string',
268
+ enum: ['NAME_CHANGE', 'SHARE_AUTHORIZATION', 'PURPOSE_CHANGE', 'OTHER'],
269
+ },
270
+ effectiveDate: { type: 'string', format: 'date' },
271
+ filedDate: { type: 'string', format: 'date' },
272
+ newShareAuthorization: {
273
+ type: 'object',
274
+ nullable: true,
275
+ description: 'If increasing/changing authorized shares',
276
+ },
277
+ newLegalName: { type: 'string', nullable: true },
228
278
  },
229
279
  },
230
280
  update_share_class: {
231
- description: "Update authorized shares for an existing class or add new class (requires charter amendment)",
232
- required: [
233
- "classId",
234
- "className",
235
- "authorized",
236
- "parValue",
237
- "votingRights",
238
- "charterAmendmentRef",
239
- ],
281
+ description: 'Update authorized shares for an existing class or add new class (requires charter amendment)',
282
+ required: ['classId', 'className', 'authorized', 'parValue', 'votingRights', 'charterAmendmentRef'],
240
283
  properties: {
241
- classId: { type: "string" },
242
- className: { type: "string" },
243
- authorized: { type: "integer" },
244
- parValue: { type: "number" },
245
- votingRights: { type: "boolean" },
246
- votesPerShare: { type: "number", default: 1 },
247
- liquidationPreference: { type: "number", nullable: true },
248
- dividendRate: { type: "number", nullable: true },
249
- convertible: { type: "boolean", default: false },
250
- charterAmendmentRef: { type: "string" },
284
+ classId: { type: 'string' },
285
+ className: { type: 'string' },
286
+ authorized: { type: 'integer' },
287
+ parValue: { type: 'number' },
288
+ votingRights: { type: 'boolean' },
289
+ votesPerShare: { type: 'number', default: 1 },
290
+ liquidationPreference: { type: 'number', nullable: true },
291
+ dividendRate: { type: 'number', nullable: true },
292
+ convertible: { type: 'boolean', default: false },
293
+ charterAmendmentRef: { type: 'string' },
251
294
  },
252
295
  },
253
296
  update_registered_agent: {
254
- description: "Change the registered agent on file with the state",
255
- required: ["name", "address", "effectiveDate"],
297
+ description: 'Change the registered agent on file with the state',
298
+ required: ['name', 'address', 'effectiveDate'],
256
299
  properties: {
257
- name: { type: "string" },
258
- address: { type: "object" },
259
- phone: { type: "string" },
260
- email: { type: "string" },
261
- effectiveDate: { type: "string", format: "date" },
300
+ name: { type: 'string' },
301
+ address: { type: 'object' },
302
+ phone: { type: 'string' },
303
+ email: { type: 'string' },
304
+ effectiveDate: { type: 'string', format: 'date' },
262
305
  filingConfirmation: {
263
- type: "string",
264
- description: "State filing confirmation number",
306
+ type: 'string',
307
+ description: 'State filing confirmation number',
265
308
  },
266
309
  },
267
310
  },
268
311
  suspend: {
269
- description: "State suspends corporate powers (typically for tax/filing noncompliance)",
270
- required: ["reason", "suspensionDate"],
312
+ description: 'State suspends corporate powers (typically for tax/filing noncompliance)',
313
+ required: ['reason', 'suspensionDate'],
271
314
  properties: {
272
315
  reason: {
273
- type: "string",
316
+ type: 'string',
274
317
  enum: [
275
- "FRANCHISE_TAX_DELINQUENT",
276
- "ANNUAL_REPORT_MISSING",
277
- "REGISTERED_AGENT_LAPSE",
278
- "ADMINISTRATIVE",
279
- "OTHER",
318
+ 'FRANCHISE_TAX_DELINQUENT',
319
+ 'ANNUAL_REPORT_MISSING',
320
+ 'REGISTERED_AGENT_LAPSE',
321
+ 'ADMINISTRATIVE',
322
+ 'OTHER',
280
323
  ],
281
324
  },
282
- suspensionDate: { type: "string", format: "date" },
325
+ suspensionDate: { type: 'string', format: 'date' },
283
326
  stateNotice: {
284
- type: "string",
285
- description: "Reference to state notice",
327
+ type: 'string',
328
+ description: 'Reference to state notice',
286
329
  },
287
- cureDeadline: { type: "string", format: "date", nullable: true },
330
+ cureDeadline: { type: 'string', format: 'date', nullable: true },
288
331
  },
289
332
  },
290
333
  reinstate: {
291
- description: "Cure deficiencies and reinstate corporate powers",
292
- required: [
293
- "reinstatementDate",
294
- "curativeActions",
295
- "stateConfirmation",
296
- ],
334
+ description: 'Cure deficiencies and reinstate corporate powers',
335
+ required: ['reinstatementDate', 'curativeActions', 'stateConfirmation'],
297
336
  properties: {
298
- reinstatementDate: { type: "string", format: "date" },
337
+ reinstatementDate: { type: 'string', format: 'date' },
299
338
  curativeActions: {
300
- type: "array",
301
- items: { type: "string" },
302
- description: "List of actions taken to cure",
339
+ type: 'array',
340
+ items: { type: 'string' },
341
+ description: 'List of actions taken to cure',
303
342
  },
304
- stateConfirmation: { type: "string" },
305
- penaltiesPaid: { type: "number", nullable: true },
343
+ stateConfirmation: { type: 'string' },
344
+ penaltiesPaid: { type: 'number', nullable: true },
345
+ },
346
+ },
347
+ propose_dissolve_voluntary: {
348
+ description: 'Phase 1 of voluntary dissolution: bind the executing board + shareholder resolution fibers (#24 _addDependency) and record the pending dissolution',
349
+ required: ['dissolutionDate', 'boardResolutionRef', 'shareholderResolutionRef'],
350
+ properties: {
351
+ dissolutionDate: { type: 'string', format: 'date' },
352
+ boardResolutionRef: { type: 'string' },
353
+ shareholderResolutionRef: { type: 'string' },
354
+ windingUpPlan: {
355
+ type: 'string',
356
+ description: 'Reference to winding up plan',
357
+ },
358
+ certificateOfDissolution: { type: 'string' },
306
359
  },
307
360
  },
308
361
  dissolve_voluntary: {
309
- description: "Voluntary dissolution approved by board and shareholders",
310
- required: [
311
- "dissolutionDate",
312
- "boardResolutionRef",
313
- "shareholderResolutionRef",
314
- ],
362
+ description: 'Phase 2 of voluntary dissolution: execute once both bound resolutions are EXECUTED',
363
+ required: ['dissolutionDate'],
315
364
  properties: {
316
- dissolutionDate: { type: "string", format: "date" },
317
- boardResolutionRef: { type: "string" },
318
- shareholderResolutionRef: { type: "string" },
365
+ dissolutionDate: { type: 'string', format: 'date' },
319
366
  windingUpPlan: {
320
- type: "string",
321
- description: "Reference to winding up plan",
367
+ type: 'string',
368
+ description: 'Reference to winding up plan',
322
369
  },
323
- certificateOfDissolution: { type: "string" },
370
+ certificateOfDissolution: { type: 'string' },
324
371
  },
325
372
  },
326
373
  dissolve_administrative: {
327
- description: "Administrative dissolution by state after prolonged suspension",
328
- required: ["dissolutionDate", "stateOrder", "reason"],
374
+ description: 'Administrative dissolution by state after prolonged suspension',
375
+ required: ['dissolutionDate', 'stateOrder', 'reason'],
329
376
  properties: {
330
- dissolutionDate: { type: "string", format: "date" },
331
- stateOrder: { type: "string" },
332
- reason: { type: "string" },
377
+ dissolutionDate: { type: 'string', format: 'date' },
378
+ stateOrder: { type: 'string' },
379
+ reason: { type: 'string' },
333
380
  },
334
381
  },
335
382
  },
336
383
  definitions: {
337
384
  ShareClass: {
338
- type: "object",
385
+ type: 'object',
339
386
  properties: {
340
387
  className: {
341
- type: "string",
342
- description: "e.g., Common, Series A Preferred",
388
+ type: 'string',
389
+ description: 'e.g., Common, Series A Preferred',
343
390
  },
344
- classId: { type: "string" },
345
- authorized: { type: "integer", description: "Total shares authorized" },
346
- issued: { type: "integer", description: "Shares currently issued" },
347
- outstanding: { type: "integer", description: "Issued minus treasury" },
348
- treasury: { type: "integer", description: "Shares held by company" },
349
- parValue: { type: "number", description: "Par value per share" },
391
+ classId: { type: 'string' },
392
+ authorized: { type: 'integer', description: 'Total shares authorized' },
393
+ issued: { type: 'integer', description: 'Shares currently issued' },
394
+ outstanding: { type: 'integer', description: 'Issued minus treasury' },
395
+ treasury: { type: 'integer', description: 'Shares held by company' },
396
+ parValue: { type: 'number', description: 'Par value per share' },
350
397
  votingRights: {
351
- type: "boolean",
352
- description: "Whether class has voting rights",
398
+ type: 'boolean',
399
+ description: 'Whether class has voting rights',
353
400
  },
354
- votesPerShare: { type: "number", default: 1 },
401
+ votesPerShare: { type: 'number', default: 1 },
355
402
  liquidationPreference: {
356
- type: "number",
403
+ type: 'number',
357
404
  nullable: true,
358
- description: "Liquidation preference multiple",
405
+ description: 'Liquidation preference multiple',
359
406
  },
360
407
  dividendRate: {
361
- type: "number",
408
+ type: 'number',
362
409
  nullable: true,
363
- description: "Annual dividend rate %",
410
+ description: 'Annual dividend rate %',
364
411
  },
365
- convertible: { type: "boolean", default: false },
366
- conversionRatio: { type: "number", nullable: true },
412
+ convertible: { type: 'boolean', default: false },
413
+ conversionRatio: { type: 'number', nullable: true },
367
414
  antidilution: {
368
- type: "string",
369
- enum: [
370
- "NONE",
371
- "BROAD_BASED",
372
- "NARROW_BASED",
373
- "FULL_RATCHET",
374
- ],
415
+ type: 'string',
416
+ enum: ['NONE', 'BROAD_BASED', 'NARROW_BASED', 'FULL_RATCHET'],
375
417
  nullable: true,
376
418
  },
377
419
  },
378
420
  },
379
421
  Incorporator: {
380
- type: "object",
422
+ type: 'object',
381
423
  properties: {
382
- name: { type: "string" },
383
- address: { type: "object" },
384
- signatureDate: { type: "string", format: "date" },
424
+ name: { type: 'string' },
425
+ address: { type: 'object' },
426
+ signatureDate: { type: 'string', format: 'date' },
385
427
  },
386
428
  },
387
429
  CharterAmendment: {
388
- type: "object",
430
+ type: 'object',
389
431
  properties: {
390
- amendmentId: { type: "string" },
391
- description: { type: "string" },
392
- effectiveDate: { type: "string", format: "date" },
432
+ amendmentId: { type: 'string' },
433
+ description: { type: 'string' },
434
+ effectiveDate: { type: 'string', format: 'date' },
393
435
  resolutionRef: {
394
- type: "string",
395
- description: "Reference to approving resolution",
436
+ type: 'string',
437
+ description: 'Reference to approving resolution',
396
438
  },
397
- filedDate: { type: "string", format: "date" },
439
+ filedDate: { type: 'string', format: 'date' },
398
440
  },
399
441
  },
400
442
  },
401
443
  states: {
402
444
  INCORPORATING: {
403
- id: "INCORPORATING",
445
+ id: 'INCORPORATING',
404
446
  isFinal: false,
405
- description: "Initial state during formation process. Articles filed but not yet approved by state.",
447
+ description: 'Initial state during formation process. Articles filed but not yet approved by state.',
406
448
  },
407
449
  ACTIVE: {
408
- id: "ACTIVE",
450
+ id: 'ACTIVE',
409
451
  isFinal: false,
410
- description: "Corporation is in good standing and authorized to conduct business.",
452
+ description: 'Corporation is in good standing and authorized to conduct business.',
411
453
  },
412
454
  SUSPENDED: {
413
- id: "SUSPENDED",
455
+ id: 'SUSPENDED',
414
456
  isFinal: false,
415
- description: "Corporate powers suspended due to compliance failure (tax, filings, etc). Can be reinstated.",
457
+ description: 'Corporate powers suspended due to compliance failure (tax, filings, etc). Can be reinstated.',
416
458
  },
417
459
  DISSOLVED: {
418
- id: "DISSOLVED",
460
+ id: 'DISSOLVED',
419
461
  isFinal: true,
420
- description: "Corporation has been legally dissolved. Terminal state.",
462
+ description: 'Corporation has been legally dissolved. Terminal state.',
421
463
  },
422
464
  },
423
- initialState: "INCORPORATING",
465
+ initialState: 'INCORPORATING',
424
466
  transitions: [
425
467
  // INCORPORATING -> ACTIVE
426
468
  {
427
- from: "INCORPORATING",
428
- to: "ACTIVE",
429
- eventName: "incorporate",
469
+ from: 'INCORPORATING',
470
+ to: 'ACTIVE',
471
+ eventName: 'incorporate',
430
472
  guard: {
431
473
  and: [
432
- { "!=": [{ var: "state.legalName" }, null] },
433
- { "!=": [{ var: "state.jurisdiction.state" }, null] },
434
- { "!=": [{ var: "state.registeredAgent" }, null] },
435
- { ">": [{ var: "state.incorporators.length" }, 0] },
436
- { ">": [{ var: "state.shareStructure.classes.length" }, 0] },
437
- { ">": [{ var: "state.shareStructure.totalAuthorized" }, 0] },
474
+ { '!=': [{ var: 'state.legalName' }, null] },
475
+ { '!=': [{ var: 'state.jurisdiction.state' }, null] },
476
+ { '!=': [{ var: 'state.registeredAgent' }, null] },
477
+ { '>': [{ length: [{ var: 'state.incorporators' }] }, 0] },
478
+ { '>': [{ length: [{ var: 'state.shareStructure.classes' }] }, 0] },
479
+ { '>': [{ var: 'state.shareStructure.totalAuthorized' }, 0] },
438
480
  ],
439
481
  },
440
482
  effect: {
441
483
  merge: [
442
- { var: "state" },
484
+ { var: 'state' },
485
+ {
486
+ status: 'ACTIVE',
487
+ formationDate: { var: 'event.approvalDate' },
488
+ updatedAt: { var: '$ordinal' },
489
+ },
443
490
  {
444
- status: "ACTIVE",
445
- formationDate: { var: "event.approvalDate" },
446
- updatedAt: { var: "$timestamp" },
491
+ _emit: [{ name: 'CORPORATION_FORMED', data: { var: 'event' }, destination: 'external' }],
447
492
  },
448
493
  ],
449
494
  },
450
- emits: ["CORPORATION_FORMED"],
451
495
  },
452
- // ACTIVE -> ACTIVE (amend_charter)
496
+ // ACTIVE -> ACTIVE (propose_amend_charter) — phase 1 (#24): bind the approving resolution fiber and
497
+ // record the pending amendment, so amend_charter can read the resolution's state next transition.
453
498
  {
454
- from: "ACTIVE",
455
- to: "ACTIVE",
456
- eventName: "amend_charter",
457
- guard: { "!=": [{ var: "event.resolutionRef" }, null] },
458
- dependencies: [
459
- {
460
- machine: "corporate-resolution",
461
- instanceRef: { var: "event.resolutionRef" },
462
- requiredState: "EXECUTED",
463
- },
464
- ],
499
+ from: 'ACTIVE',
500
+ to: 'ACTIVE',
501
+ eventName: 'propose_amend_charter',
502
+ // 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)
503
+ guard: signerIsParty('state.charterAuthority'),
465
504
  effect: {
466
505
  merge: [
467
- { var: "state" },
506
+ { var: 'state' },
507
+ {
508
+ pendingAmendCharter: {
509
+ amendmentId: { var: 'event.amendmentId' },
510
+ description: { var: 'event.description' },
511
+ effectiveDate: { var: 'event.effectiveDate' },
512
+ filedDate: { var: 'event.filedDate' },
513
+ newLegalName: { var: 'event.newLegalName' },
514
+ ref: { var: 'event.resolutionRef' },
515
+ proposedAt: { var: '$ordinal' },
516
+ },
517
+ },
518
+ // bind the resolution fiber so amend_charter can assert its state next transition
519
+ addDependency({ var: 'event.resolutionRef' }),
520
+ ],
521
+ },
522
+ dependencies: [],
523
+ },
524
+ // ACTIVE -> ACTIVE (amend_charter) — phase 2 (#24): apply once the bound approving resolution is
525
+ // EXECUTED. depInState replaces the dropped object-form dependency (which silently never gated).
526
+ {
527
+ from: 'ACTIVE',
528
+ to: 'ACTIVE',
529
+ eventName: 'amend_charter',
530
+ // 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)
531
+ guard: {
532
+ and: [
533
+ signerIsParty('state.charterAuthority'),
534
+ // the proposal must target this amendment, and its bound resolution must be EXECUTED
535
+ {
536
+ '==': [{ var: 'state.pendingAmendCharter.amendmentId' }, { var: 'event.amendmentId' }],
537
+ },
538
+ depInState('state.pendingAmendCharter.ref', 'EXECUTED'),
539
+ ],
540
+ },
541
+ effect: {
542
+ merge: [
543
+ { var: 'state' },
468
544
  {
469
545
  charterAmendments: {
470
- cat: [
471
- { var: "state.charterAmendments" },
546
+ merge: [
547
+ { var: 'state.charterAmendments' },
472
548
  [
473
549
  {
474
- amendmentId: { var: "event.amendmentId" },
475
- description: { var: "event.description" },
476
- effectiveDate: { var: "event.effectiveDate" },
477
- resolutionRef: { var: "event.resolutionRef" },
478
- filedDate: { var: "event.filedDate" },
550
+ amendmentId: { var: 'event.amendmentId' },
551
+ description: { var: 'event.description' },
552
+ effectiveDate: { var: 'event.effectiveDate' },
553
+ resolutionRef: { var: 'state.pendingAmendCharter.ref' },
554
+ filedDate: { var: 'event.filedDate' },
479
555
  },
480
556
  ],
481
557
  ],
482
558
  },
483
559
  legalName: {
484
560
  if: [
485
- { "!=": [{ var: "event.newLegalName" }, null] },
486
- { var: "event.newLegalName" },
487
- { var: "state.legalName" },
561
+ { '!=': [{ var: 'event.newLegalName' }, null] },
562
+ { var: 'event.newLegalName' },
563
+ { var: 'state.legalName' },
488
564
  ],
489
565
  },
490
- updatedAt: { var: "$timestamp" },
566
+ updatedAt: { var: '$ordinal' },
567
+ // clear the consumed proposal
568
+ pendingAmendCharter: null,
569
+ },
570
+ {
571
+ _emit: [{ name: 'CHARTER_AMENDED', data: { var: 'event' }, destination: 'external' }],
491
572
  },
492
573
  ],
493
574
  },
494
- emits: ["CHARTER_AMENDED"],
575
+ dependencies: [],
495
576
  },
496
577
  // ACTIVE -> ACTIVE (update_share_class)
497
578
  {
498
- from: "ACTIVE",
499
- to: "ACTIVE",
500
- eventName: "update_share_class",
579
+ from: 'ACTIVE',
580
+ to: 'ACTIVE',
581
+ eventName: 'update_share_class',
501
582
  guard: {
502
583
  some: [
503
- { var: "state.charterAmendments" },
584
+ { var: 'state.charterAmendments' },
504
585
  {
505
- "==": [
506
- { var: ".amendmentId" },
507
- { var: "event.charterAmendmentRef" },
508
- ],
586
+ '==': [{ var: 'amendmentId' }, { var: 'event.charterAmendmentRef' }],
509
587
  },
510
588
  ],
511
589
  },
512
590
  effect: {
513
591
  merge: [
514
- { var: "state" },
592
+ { var: 'state' },
515
593
  {
516
594
  shareStructure: {
517
595
  merge: [
518
- { var: "state.shareStructure" },
596
+ { var: 'state.shareStructure' },
519
597
  {
520
598
  classes: {
521
599
  map: [
522
- { var: "state.shareStructure.classes" },
600
+ { var: 'state.shareStructure.classes' },
523
601
  {
524
602
  if: [
525
603
  {
526
- "==": [
527
- { var: ".classId" },
528
- { var: "event.classId" },
529
- ],
604
+ '==': [{ var: 'classId' }, { var: 'event.classId' }],
530
605
  },
531
606
  {
532
- classId: { var: "event.classId" },
533
- className: { var: "event.className" },
534
- authorized: { var: "event.authorized" },
607
+ classId: { var: 'event.classId' },
608
+ className: { var: 'event.className' },
609
+ authorized: { var: 'event.authorized' },
535
610
  issued: 0,
536
611
  outstanding: 0,
537
612
  treasury: 0,
538
- parValue: { var: "event.parValue" },
539
- votingRights: { var: "event.votingRights" },
540
- votesPerShare: { var: "event.votesPerShare" },
613
+ parValue: { var: 'event.parValue' },
614
+ votingRights: { var: 'event.votingRights' },
615
+ votesPerShare: { var: 'event.votesPerShare' },
541
616
  liquidationPreference: {
542
- var: "event.liquidationPreference",
617
+ var: 'event.liquidationPreference',
543
618
  },
544
- dividendRate: { var: "event.dividendRate" },
545
- convertible: { var: "event.convertible" },
619
+ dividendRate: { var: 'event.dividendRate' },
620
+ convertible: { var: 'event.convertible' },
546
621
  },
547
- { var: "" },
622
+ { var: '' },
548
623
  ],
549
624
  },
550
625
  ],
@@ -558,111 +633,162 @@ export const corpEntityDef = defineFiberApp({
558
633
  },
559
634
  // ACTIVE -> ACTIVE (update_registered_agent)
560
635
  {
561
- from: "ACTIVE",
562
- to: "ACTIVE",
563
- eventName: "update_registered_agent",
564
- guard: { "==": [1, 1] },
636
+ from: 'ACTIVE',
637
+ to: 'ACTIVE',
638
+ eventName: 'update_registered_agent',
639
+ // 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)
640
+ guard: signerIsParty('state.boardAuthority'),
565
641
  effect: {
566
642
  merge: [
567
- { var: "state" },
643
+ { var: 'state' },
568
644
  {
569
645
  registeredAgent: {
570
- name: { var: "event.name" },
571
- address: { var: "event.address" },
572
- phone: { var: "event.phone" },
573
- email: { var: "event.email" },
574
- effectiveDate: { var: "event.effectiveDate" },
646
+ name: { var: 'event.name' },
647
+ address: { var: 'event.address' },
648
+ phone: { var: 'event.phone' },
649
+ email: { var: 'event.email' },
650
+ effectiveDate: { var: 'event.effectiveDate' },
575
651
  },
576
652
  },
653
+ {
654
+ _emit: [{ name: 'REGISTERED_AGENT_CHANGED', data: { var: 'event' }, destination: 'external' }],
655
+ },
577
656
  ],
578
657
  },
579
- emits: ["REGISTERED_AGENT_CHANGED"],
580
658
  },
581
659
  // ACTIVE -> SUSPENDED
582
660
  {
583
- from: "ACTIVE",
584
- to: "SUSPENDED",
585
- eventName: "suspend",
586
- guard: { "==": [1, 1] },
661
+ from: 'ACTIVE',
662
+ to: 'SUSPENDED',
663
+ eventName: 'suspend',
664
+ // authority gate state-initiated enforcement; 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
+ guard: signerIsParty('state.stateAuthority'),
587
666
  effect: {
588
667
  merge: [
589
- { var: "state" },
668
+ { var: 'state' },
590
669
  {
591
- status: "SUSPENDED",
592
- suspensionReason: { var: "event.reason" },
593
- suspensionDate: { var: "event.suspensionDate" },
670
+ status: 'SUSPENDED',
671
+ suspensionReason: { var: 'event.reason' },
672
+ suspensionDate: { var: 'event.suspensionDate' },
673
+ },
674
+ {
675
+ _emit: [{ name: 'CORPORATION_SUSPENDED', data: { var: 'event' }, destination: 'external' }],
594
676
  },
595
677
  ],
596
678
  },
597
- emits: ["CORPORATION_SUSPENDED"],
598
679
  },
599
680
  // SUSPENDED -> ACTIVE
600
681
  {
601
- from: "SUSPENDED",
602
- to: "ACTIVE",
603
- eventName: "reinstate",
604
- guard: { "==": [1, 1] },
682
+ from: 'SUSPENDED',
683
+ to: 'ACTIVE',
684
+ eventName: 'reinstate',
685
+ // 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)
686
+ guard: signerIsParty('state.boardAuthority'),
605
687
  effect: {
606
688
  merge: [
607
- { var: "state" },
689
+ { var: 'state' },
608
690
  {
609
- status: "ACTIVE",
691
+ status: 'ACTIVE',
610
692
  suspensionReason: null,
611
693
  suspensionDate: null,
612
694
  },
695
+ {
696
+ _emit: [{ name: 'CORPORATION_REINSTATED', data: { var: 'event' }, destination: 'external' }],
697
+ },
613
698
  ],
614
699
  },
615
- emits: ["CORPORATION_REINSTATED"],
616
700
  },
617
- // ACTIVE -> DISSOLVED (voluntary)
701
+ // ACTIVE -> ACTIVE (propose_dissolve_voluntary) — phase 1 (#24): bind BOTH executing resolution
702
+ // fibers (board + shareholder) and record the pending dissolution, so dissolve_voluntary can read
703
+ // both resolutions' states next transition.
618
704
  {
619
- from: "ACTIVE",
620
- to: "DISSOLVED",
621
- eventName: "dissolve_voluntary",
622
- guard: { "==": [1, 1] },
623
- dependencies: [
624
- {
625
- machine: "corporate-resolution",
626
- instanceRef: { var: "event.boardResolutionRef" },
627
- requiredState: "EXECUTED",
628
- },
629
- {
630
- machine: "corporate-resolution",
631
- instanceRef: { var: "event.shareholderResolutionRef" },
632
- requiredState: "EXECUTED",
633
- },
634
- ],
705
+ from: 'ACTIVE',
706
+ to: 'ACTIVE',
707
+ eventName: 'propose_dissolve_voluntary',
708
+ // authority gate both the board and shareholder authorities must sign; identity role attestations (BOARD_MEMBER/...) layer on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
709
+ guard: {
710
+ and: [signerIsParty('state.boardAuthority'), signerIsParty('state.shareholderAuthority')],
711
+ },
712
+ effect: {
713
+ merge: [
714
+ { var: 'state' },
715
+ {
716
+ pendingDissolveVoluntary: {
717
+ dissolutionDate: { var: 'event.dissolutionDate' },
718
+ boardRef: { var: 'event.boardResolutionRef' },
719
+ shareholderRef: { var: 'event.shareholderResolutionRef' },
720
+ proposedAt: { var: '$ordinal' },
721
+ },
722
+ },
723
+ // bind both resolution fibers so dissolve_voluntary can assert their states next transition
724
+ {
725
+ _addDependency: [
726
+ { fiberId: { var: 'event.boardResolutionRef' } },
727
+ { fiberId: { var: 'event.shareholderResolutionRef' } },
728
+ ],
729
+ },
730
+ ],
731
+ },
732
+ dependencies: [],
733
+ },
734
+ // ACTIVE -> DISSOLVED (dissolve_voluntary) — phase 2 (#24): execute once BOTH bound resolutions are
735
+ // EXECUTED. depInState replaces the dropped object-form dependencies (which silently never gated).
736
+ {
737
+ from: 'ACTIVE',
738
+ to: 'DISSOLVED',
739
+ eventName: 'dissolve_voluntary',
740
+ // authority gate — both the board and shareholder authorities must sign; identity role attestations (BOARD_MEMBER/...) layer on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
741
+ guard: {
742
+ and: [
743
+ signerIsParty('state.boardAuthority'),
744
+ signerIsParty('state.shareholderAuthority'),
745
+ // the proposal must target this dissolution, and its bound resolutions must both be EXECUTED
746
+ {
747
+ '==': [{ var: 'state.pendingDissolveVoluntary.dissolutionDate' }, { var: 'event.dissolutionDate' }],
748
+ },
749
+ depInState('state.pendingDissolveVoluntary.boardRef', 'EXECUTED'),
750
+ depInState('state.pendingDissolveVoluntary.shareholderRef', 'EXECUTED'),
751
+ ],
752
+ },
635
753
  effect: {
636
754
  merge: [
637
- { var: "state" },
755
+ { var: 'state' },
756
+ {
757
+ status: 'DISSOLVED',
758
+ dissolutionDate: { var: 'event.dissolutionDate' },
759
+ dissolutionReason: 'VOLUNTARY',
760
+ // clear the consumed proposal
761
+ pendingDissolveVoluntary: null,
762
+ },
638
763
  {
639
- status: "DISSOLVED",
640
- dissolutionDate: { var: "event.dissolutionDate" },
641
- dissolutionReason: "VOLUNTARY",
764
+ _emit: [{ name: 'CORPORATION_DISSOLVED', data: { var: 'event' }, destination: 'external' }],
642
765
  },
643
766
  ],
644
767
  },
645
- emits: ["CORPORATION_DISSOLVED"],
768
+ dependencies: [],
646
769
  },
647
770
  // SUSPENDED -> DISSOLVED (administrative)
648
771
  {
649
- from: "SUSPENDED",
650
- to: "DISSOLVED",
651
- eventName: "dissolve_administrative",
652
- guard: { "==": [1, 1] },
772
+ from: 'SUSPENDED',
773
+ to: 'DISSOLVED',
774
+ eventName: 'dissolve_administrative',
775
+ // authority gate state-initiated dissolution; an identity role attestation (ISSUER/BOARD_MEMBER/...) layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
776
+ guard: signerIsParty('state.stateAuthority'),
653
777
  effect: {
654
778
  merge: [
655
- { var: "state" },
779
+ { var: 'state' },
656
780
  {
657
- status: "DISSOLVED",
658
- dissolutionDate: { var: "event.dissolutionDate" },
781
+ status: 'DISSOLVED',
782
+ dissolutionDate: { var: 'event.dissolutionDate' },
659
783
  dissolutionReason: {
660
- cat: ["ADMINISTRATIVE: ", { var: "event.reason" }],
784
+ cat: ['ADMINISTRATIVE: ', { var: 'event.reason' }],
661
785
  },
662
786
  },
787
+ {
788
+ _emit: [{ name: 'CORPORATION_DISSOLVED', data: { var: 'event' }, destination: 'external' }],
789
+ },
663
790
  ],
664
791
  },
665
- emits: ["CORPORATION_DISSOLVED"],
666
792
  },
667
793
  ],
668
794
  });