@ottochain/sdk 2.3.0 → 2.4.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 (209) hide show
  1. package/dist/cjs/apps/contracts/index.js +15 -8
  2. package/dist/cjs/apps/contracts/state-machines/contract-agreement.js +35 -40
  3. package/dist/cjs/apps/contracts/state-machines/contract-escrow.js +80 -37
  4. package/dist/cjs/apps/contracts/state-machines/contract-universal.js +4 -4
  5. package/dist/cjs/apps/corporate/index.js +2 -2
  6. package/dist/cjs/apps/corporate/state-machines/corp-board.js +169 -59
  7. package/dist/cjs/apps/corporate/state-machines/corp-entity.js +245 -47
  8. package/dist/cjs/apps/corporate/state-machines/corp-securities.js +407 -99
  9. package/dist/cjs/apps/corporate/state-machines/corp-shareholders.js +151 -37
  10. package/dist/cjs/apps/governance/index.js +14 -14
  11. package/dist/cjs/apps/governance/state-machines/dao-multisig.js +58 -40
  12. package/dist/cjs/apps/governance/state-machines/dao-reputation.js +46 -40
  13. package/dist/cjs/apps/governance/state-machines/dao-single.js +28 -11
  14. package/dist/cjs/apps/governance/state-machines/dao-token.js +67 -41
  15. package/dist/cjs/apps/governance/state-machines/governance-simple.js +93 -61
  16. package/dist/cjs/apps/governance/state-machines/governance-universal.js +2 -2
  17. package/dist/cjs/apps/identity/constants.js +55 -14
  18. package/dist/cjs/apps/identity/index.js +27 -11
  19. package/dist/cjs/apps/identity/state-machines/identity-agent.js +3 -3
  20. package/dist/cjs/apps/identity/state-machines/identity-oracle.js +25 -22
  21. package/dist/cjs/apps/identity/state-machines/identity-registry.js +288 -0
  22. package/dist/cjs/apps/identity/state-machines/identity-universal.js +3 -3
  23. package/dist/cjs/apps/identity/state-machines/index.js +3 -1
  24. package/dist/cjs/apps/index.js +19 -8
  25. package/dist/cjs/apps/lending/assets.js +223 -0
  26. package/dist/cjs/apps/lending/credit-scoring.js +87 -0
  27. package/dist/cjs/apps/lending/eligibility.js +121 -0
  28. package/dist/cjs/apps/lending/index.js +91 -0
  29. package/dist/cjs/apps/lending/state-machines/index.js +9 -0
  30. package/dist/cjs/apps/lending/state-machines/lending-zk-loan.js +412 -0
  31. package/dist/cjs/apps/markets/index.js +21 -11
  32. package/dist/cjs/apps/markets/state-machines/market-auction.js +14 -13
  33. package/dist/cjs/apps/markets/state-machines/market-crowdfund.js +29 -24
  34. package/dist/cjs/apps/markets/state-machines/market-group-buy.js +24 -26
  35. package/dist/cjs/apps/markets/state-machines/market-prediction.js +80 -53
  36. package/dist/cjs/apps/markets/state-machines/market-universal.js +5 -5
  37. package/dist/cjs/apps/oracles/index.js +2 -2
  38. package/dist/cjs/errors.js +3 -3
  39. package/dist/cjs/generated/google/protobuf/struct.js +4 -4
  40. package/dist/cjs/generated/index.js +11 -7
  41. package/dist/cjs/generated/openapi.js +6 -0
  42. package/dist/cjs/generated/ottochain/apps/contracts/v1/contract.js +50 -50
  43. package/dist/cjs/generated/ottochain/apps/corporate/v1/corporate.js +19 -20
  44. package/dist/cjs/generated/ottochain/apps/governance/v1/governance.js +13 -13
  45. package/dist/cjs/generated/ottochain/apps/identity/v1/attestation.js +4 -4
  46. package/dist/cjs/generated/ottochain/apps/identity/v1/identity.js +124 -130
  47. package/dist/cjs/generated/ottochain/apps/markets/v1/market.js +107 -107
  48. package/dist/cjs/generated/ottochain/v1/common.js +4 -4
  49. package/dist/cjs/generated/ottochain/v1/fiber.js +4 -4
  50. package/dist/cjs/index.js +41 -7
  51. package/dist/cjs/openapi.js +2 -0
  52. package/dist/cjs/ottochain/drop-nulls.js +1 -2
  53. package/dist/cjs/ottochain/genesis-manifest.js +11 -11
  54. package/dist/cjs/ottochain/index.js +23 -13
  55. package/dist/cjs/ottochain/metagraph-client.js +65 -8
  56. package/dist/cjs/ottochain/snapshot.js +11 -12
  57. package/dist/cjs/ottochain/transaction.js +57 -14
  58. package/dist/cjs/ottochain/types.js +16 -2
  59. package/dist/cjs/privacy/index.js +14 -0
  60. package/dist/cjs/privacy/sealed-bid.js +210 -0
  61. package/dist/cjs/privacy/shield-app.js +131 -0
  62. package/dist/cjs/schema/effects.js +40 -0
  63. package/dist/cjs/schema/fiber-app.js +19 -13
  64. package/dist/cjs/schema/guard-lint.js +352 -0
  65. package/dist/cjs/schema/guards.js +246 -0
  66. package/dist/cjs/signing.js +80 -0
  67. package/dist/cjs/types.js +2 -3
  68. package/dist/cjs/validation.js +8 -8
  69. package/dist/cjs/verify.js +9 -4
  70. package/dist/cjs/zk/commit.js +53 -0
  71. package/dist/cjs/zk/guard.js +107 -0
  72. package/dist/cjs/zk/index.js +48 -0
  73. package/dist/cjs/zk/preimage.js +37 -0
  74. package/dist/cjs/zk/prover.js +87 -0
  75. package/dist/cjs/zk/registry.js +62 -0
  76. package/dist/cjs/zk/types.js +28 -0
  77. package/dist/cjs/zk/witness.js +19 -0
  78. package/dist/esm/apps/contracts/index.js +7 -3
  79. package/dist/esm/apps/contracts/state-machines/contract-agreement.js +35 -40
  80. package/dist/esm/apps/contracts/state-machines/contract-escrow.js +80 -37
  81. package/dist/esm/apps/contracts/state-machines/contract-universal.js +4 -4
  82. package/dist/esm/apps/corporate/state-machines/corp-board.js +169 -59
  83. package/dist/esm/apps/corporate/state-machines/corp-entity.js +245 -47
  84. package/dist/esm/apps/corporate/state-machines/corp-securities.js +407 -99
  85. package/dist/esm/apps/corporate/state-machines/corp-shareholders.js +151 -37
  86. package/dist/esm/apps/governance/state-machines/dao-multisig.js +58 -40
  87. package/dist/esm/apps/governance/state-machines/dao-reputation.js +46 -40
  88. package/dist/esm/apps/governance/state-machines/dao-single.js +28 -11
  89. package/dist/esm/apps/governance/state-machines/dao-token.js +67 -41
  90. package/dist/esm/apps/governance/state-machines/governance-simple.js +93 -61
  91. package/dist/esm/apps/governance/state-machines/governance-universal.js +2 -2
  92. package/dist/esm/apps/identity/constants.js +51 -12
  93. package/dist/esm/apps/identity/index.js +12 -7
  94. package/dist/esm/apps/identity/state-machines/identity-agent.js +3 -3
  95. package/dist/esm/apps/identity/state-machines/identity-oracle.js +25 -22
  96. package/dist/esm/apps/identity/state-machines/identity-registry.js +285 -0
  97. package/dist/esm/apps/identity/state-machines/identity-universal.js +3 -3
  98. package/dist/esm/apps/identity/state-machines/index.js +1 -0
  99. package/dist/esm/apps/index.js +1 -0
  100. package/dist/esm/apps/lending/assets.js +207 -0
  101. package/dist/esm/apps/lending/credit-scoring.js +81 -0
  102. package/dist/esm/apps/lending/eligibility.js +115 -0
  103. package/dist/esm/apps/lending/index.js +69 -0
  104. package/dist/esm/apps/lending/state-machines/index.js +5 -0
  105. package/dist/esm/apps/lending/state-machines/lending-zk-loan.js +409 -0
  106. package/dist/esm/apps/markets/index.js +8 -4
  107. package/dist/esm/apps/markets/state-machines/market-auction.js +14 -13
  108. package/dist/esm/apps/markets/state-machines/market-crowdfund.js +29 -24
  109. package/dist/esm/apps/markets/state-machines/market-group-buy.js +24 -26
  110. package/dist/esm/apps/markets/state-machines/market-prediction.js +80 -53
  111. package/dist/esm/apps/markets/state-machines/market-universal.js +5 -5
  112. package/dist/esm/generated/index.js +9 -5
  113. package/dist/esm/generated/openapi.js +5 -0
  114. package/dist/esm/generated/ottochain/apps/contracts/v1/contract.js +46 -46
  115. package/dist/esm/generated/ottochain/apps/identity/v1/identity.js +114 -120
  116. package/dist/esm/generated/ottochain/apps/markets/v1/market.js +100 -100
  117. package/dist/esm/index.js +21 -2
  118. package/dist/esm/openapi.js +1 -0
  119. package/dist/esm/ottochain/genesis-manifest.js +9 -9
  120. package/dist/esm/ottochain/index.js +2 -3
  121. package/dist/esm/ottochain/metagraph-client.js +65 -8
  122. package/dist/esm/ottochain/snapshot.js +4 -4
  123. package/dist/esm/ottochain/transaction.js +43 -3
  124. package/dist/esm/ottochain/types.js +15 -1
  125. package/dist/esm/privacy/index.js +6 -0
  126. package/dist/esm/privacy/sealed-bid.js +206 -0
  127. package/dist/esm/privacy/shield-app.js +127 -0
  128. package/dist/esm/schema/effects.js +35 -0
  129. package/dist/esm/schema/fiber-app.js +13 -6
  130. package/dist/esm/schema/guard-lint.js +346 -0
  131. package/dist/esm/schema/guards.js +229 -0
  132. package/dist/esm/signing.js +74 -0
  133. package/dist/esm/verify.js +8 -2
  134. package/dist/esm/zk/commit.js +44 -0
  135. package/dist/esm/zk/guard.js +99 -0
  136. package/dist/esm/zk/index.js +19 -0
  137. package/dist/esm/zk/preimage.js +30 -0
  138. package/dist/esm/zk/prover.js +82 -0
  139. package/dist/esm/zk/registry.js +55 -0
  140. package/dist/esm/zk/types.js +25 -0
  141. package/dist/esm/zk/witness.js +15 -0
  142. package/dist/types/apps/contracts/index.d.ts +69 -209
  143. package/dist/types/apps/contracts/state-machines/contract-agreement.d.ts +20 -95
  144. package/dist/types/apps/contracts/state-machines/contract-escrow.d.ts +46 -112
  145. package/dist/types/apps/corporate/index.d.ts +1040 -304
  146. package/dist/types/apps/corporate/state-machines/corp-board.d.ts +188 -52
  147. package/dist/types/apps/corporate/state-machines/corp-entity.d.ts +267 -62
  148. package/dist/types/apps/corporate/state-machines/corp-securities.d.ts +355 -131
  149. package/dist/types/apps/corporate/state-machines/corp-shareholders.d.ts +225 -53
  150. package/dist/types/apps/governance/index.d.ts +296 -398
  151. package/dist/types/apps/governance/state-machines/dao-multisig.d.ts +77 -92
  152. package/dist/types/apps/governance/state-machines/dao-reputation.d.ts +42 -66
  153. package/dist/types/apps/governance/state-machines/dao-single.d.ts +25 -47
  154. package/dist/types/apps/governance/state-machines/dao-token.d.ts +60 -49
  155. package/dist/types/apps/governance/state-machines/governance-simple.d.ts +87 -117
  156. package/dist/types/apps/governance/state-machines/governance-universal.d.ts +2 -2
  157. package/dist/types/apps/identity/constants.d.ts +32 -4
  158. package/dist/types/apps/identity/index.d.ts +378 -94
  159. package/dist/types/apps/identity/state-machines/identity-oracle.d.ts +16 -87
  160. package/dist/types/apps/identity/state-machines/identity-registry.d.ts +379 -0
  161. package/dist/types/apps/identity/state-machines/index.d.ts +1 -0
  162. package/dist/types/apps/index.d.ts +1 -0
  163. package/dist/types/apps/lending/assets.d.ts +258 -0
  164. package/dist/types/apps/lending/credit-scoring.d.ts +80 -0
  165. package/dist/types/apps/lending/eligibility.d.ts +83 -0
  166. package/dist/types/apps/lending/index.d.ts +548 -0
  167. package/dist/types/apps/lending/state-machines/index.d.ts +5 -0
  168. package/dist/types/apps/lending/state-machines/lending-zk-loan.d.ts +528 -0
  169. package/dist/types/apps/markets/index.d.ts +108 -203
  170. package/dist/types/apps/markets/state-machines/market-auction.d.ts +13 -37
  171. package/dist/types/apps/markets/state-machines/market-crowdfund.d.ts +16 -34
  172. package/dist/types/apps/markets/state-machines/market-group-buy.d.ts +17 -43
  173. package/dist/types/apps/markets/state-machines/market-prediction.d.ts +51 -72
  174. package/dist/types/apps/markets/state-machines/market-universal.d.ts +5 -5
  175. package/dist/types/generated/index.d.ts +5 -5
  176. package/dist/types/generated/openapi.d.ts +1257 -0
  177. package/dist/types/generated/ottochain/apps/contracts/v1/contract.d.ts +5 -5
  178. package/dist/types/generated/ottochain/apps/identity/v1/identity.d.ts +12 -12
  179. package/dist/types/generated/ottochain/apps/markets/v1/market.d.ts +11 -11
  180. package/dist/types/index.d.ts +6 -2
  181. package/dist/types/openapi.d.ts +22 -0
  182. package/dist/types/ottochain/genesis-manifest.d.ts +5 -5
  183. package/dist/types/ottochain/index.d.ts +5 -6
  184. package/dist/types/ottochain/metagraph-client.d.ts +49 -7
  185. package/dist/types/ottochain/snapshot.d.ts +6 -6
  186. package/dist/types/ottochain/transaction.d.ts +33 -1
  187. package/dist/types/ottochain/types.d.ts +335 -30
  188. package/dist/types/privacy/index.d.ts +6 -0
  189. package/dist/types/privacy/sealed-bid.d.ts +348 -0
  190. package/dist/types/privacy/shield-app.d.ts +48 -0
  191. package/dist/types/schema/effects.d.ts +34 -0
  192. package/dist/types/schema/fiber-app.d.ts +1 -2
  193. package/dist/types/schema/guard-lint.d.ts +111 -0
  194. package/dist/types/schema/guards.d.ts +134 -0
  195. package/dist/types/signing.d.ts +45 -0
  196. package/dist/types/validation.d.ts +22 -217
  197. package/dist/types/verify.d.ts +4 -0
  198. package/dist/types/zk/commit.d.ts +28 -0
  199. package/dist/types/zk/guard.d.ts +46 -0
  200. package/dist/types/zk/index.d.ts +19 -0
  201. package/dist/types/zk/preimage.d.ts +10 -0
  202. package/dist/types/zk/prover.d.ts +34 -0
  203. package/dist/types/zk/registry.d.ts +34 -0
  204. package/dist/types/zk/types.d.ts +33 -0
  205. package/dist/types/zk/witness.d.ts +40 -0
  206. package/package.json +27 -13
  207. package/dist/cjs/ottochain/normalize.js +0 -186
  208. package/dist/esm/ottochain/normalize.js +0 -179
  209. package/dist/types/ottochain/normalize.d.ts +0 -79
@@ -1,4 +1,6 @@
1
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.
@@ -44,13 +46,42 @@ export const corpEntityDef = defineFiberApp({
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
61
  type: "string",
51
62
  description: "Unique identifier for this corporate entity",
52
63
  immutable: true,
53
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.",
83
+ immutable: true,
84
+ },
54
85
  legalName: {
55
86
  type: "string",
56
87
  description: "Full legal name of the corporation",
@@ -138,6 +169,10 @@ export const corpEntityDef = defineFiberApp({
138
169
  stateSchema: {
139
170
  properties: {
140
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 },
141
176
  legalName: { type: "string" },
142
177
  tradeName: { type: "string", nullable: true },
143
178
  entityType: { type: "string" },
@@ -176,6 +211,13 @@ export const corpEntityDef = defineFiberApp({
176
211
  },
177
212
  createdAt: { type: "timestamp", computed: true },
178
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: {
@@ -191,8 +233,8 @@ export const corpEntityDef = defineFiberApp({
191
233
  },
192
234
  },
193
235
  },
194
- amend_charter: {
195
- description: "Amend the certificate/articles of incorporation (requires shareholder approval for most amendments)",
236
+ propose_amend_charter: {
237
+ description: "Phase 1 of a charter amendment: bind the approving resolution fiber (#24 _addDependency) and record the pending amendment",
196
238
  required: [
197
239
  "amendmentId",
198
240
  "description",
@@ -227,6 +269,37 @@ export const corpEntityDef = defineFiberApp({
227
269
  newLegalName: { type: "string", nullable: true },
228
270
  },
229
271
  },
272
+ amend_charter: {
273
+ description: "Phase 2 of a charter amendment: apply once the bound approving resolution is EXECUTED",
274
+ required: [
275
+ "amendmentId",
276
+ "description",
277
+ "amendmentType",
278
+ "effectiveDate",
279
+ "filedDate",
280
+ ],
281
+ properties: {
282
+ amendmentId: { type: "string" },
283
+ description: { type: "string" },
284
+ amendmentType: {
285
+ type: "string",
286
+ enum: [
287
+ "NAME_CHANGE",
288
+ "SHARE_AUTHORIZATION",
289
+ "PURPOSE_CHANGE",
290
+ "OTHER",
291
+ ],
292
+ },
293
+ effectiveDate: { type: "string", format: "date" },
294
+ filedDate: { type: "string", format: "date" },
295
+ newShareAuthorization: {
296
+ type: "object",
297
+ nullable: true,
298
+ description: "If increasing/changing authorized shares",
299
+ },
300
+ newLegalName: { type: "string", nullable: true },
301
+ },
302
+ },
230
303
  update_share_class: {
231
304
  description: "Update authorized shares for an existing class or add new class (requires charter amendment)",
232
305
  required: [
@@ -305,8 +378,8 @@ export const corpEntityDef = defineFiberApp({
305
378
  penaltiesPaid: { type: "number", nullable: true },
306
379
  },
307
380
  },
308
- dissolve_voluntary: {
309
- description: "Voluntary dissolution approved by board and shareholders",
381
+ propose_dissolve_voluntary: {
382
+ description: "Phase 1 of voluntary dissolution: bind the executing board + shareholder resolution fibers (#24 _addDependency) and record the pending dissolution",
310
383
  required: [
311
384
  "dissolutionDate",
312
385
  "boardResolutionRef",
@@ -323,6 +396,18 @@ export const corpEntityDef = defineFiberApp({
323
396
  certificateOfDissolution: { type: "string" },
324
397
  },
325
398
  },
399
+ dissolve_voluntary: {
400
+ description: "Phase 2 of voluntary dissolution: execute once both bound resolutions are EXECUTED",
401
+ required: ["dissolutionDate"],
402
+ properties: {
403
+ dissolutionDate: { type: "string", format: "date" },
404
+ windingUpPlan: {
405
+ type: "string",
406
+ description: "Reference to winding up plan",
407
+ },
408
+ certificateOfDissolution: { type: "string" },
409
+ },
410
+ },
326
411
  dissolve_administrative: {
327
412
  description: "Administrative dissolution by state after prolonged suspension",
328
413
  required: ["dissolutionDate", "stateOrder", "reason"],
@@ -432,8 +517,8 @@ export const corpEntityDef = defineFiberApp({
432
517
  { "!=": [{ var: "state.legalName" }, null] },
433
518
  { "!=": [{ var: "state.jurisdiction.state" }, null] },
434
519
  { "!=": [{ var: "state.registeredAgent" }, null] },
435
- { ">": [{ var: "state.incorporators.length" }, 0] },
436
- { ">": [{ var: "state.shareStructure.classes.length" }, 0] },
520
+ { ">": [{ length: [{ var: "state.incorporators" }] }, 0] },
521
+ { ">": [{ length: [{ var: "state.shareStructure.classes" }] }, 0] },
437
522
  { ">": [{ var: "state.shareStructure.totalAuthorized" }, 0] },
438
523
  ],
439
524
  },
@@ -443,38 +528,77 @@ export const corpEntityDef = defineFiberApp({
443
528
  {
444
529
  status: "ACTIVE",
445
530
  formationDate: { var: "event.approvalDate" },
446
- updatedAt: { var: "$timestamp" },
531
+ updatedAt: { var: "$ordinal" },
532
+ },
533
+ {
534
+ _emit: [
535
+ { name: "CORPORATION_FORMED", data: { var: "event" }, destination: "external" },
536
+ ],
447
537
  },
448
538
  ],
449
539
  },
450
- emits: ["CORPORATION_FORMED"],
451
540
  },
452
- // ACTIVE -> ACTIVE (amend_charter)
541
+ // ACTIVE -> ACTIVE (propose_amend_charter) — phase 1 (#24): bind the approving resolution fiber and
542
+ // record the pending amendment, so amend_charter can read the resolution's state next transition.
543
+ {
544
+ from: "ACTIVE",
545
+ to: "ACTIVE",
546
+ eventName: "propose_amend_charter",
547
+ // 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)
548
+ guard: signerIsParty("state.charterAuthority"),
549
+ effect: {
550
+ merge: [
551
+ { var: "state" },
552
+ {
553
+ pendingAmendCharter: {
554
+ amendmentId: { var: "event.amendmentId" },
555
+ description: { var: "event.description" },
556
+ effectiveDate: { var: "event.effectiveDate" },
557
+ filedDate: { var: "event.filedDate" },
558
+ newLegalName: { var: "event.newLegalName" },
559
+ ref: { var: "event.resolutionRef" },
560
+ proposedAt: { var: "$ordinal" },
561
+ },
562
+ },
563
+ // bind the resolution fiber so amend_charter can assert its state next transition
564
+ addDependency({ var: "event.resolutionRef" }),
565
+ ],
566
+ },
567
+ dependencies: [],
568
+ },
569
+ // ACTIVE -> ACTIVE (amend_charter) — phase 2 (#24): apply once the bound approving resolution is
570
+ // EXECUTED. depInState replaces the dropped object-form dependency (which silently never gated).
453
571
  {
454
572
  from: "ACTIVE",
455
573
  to: "ACTIVE",
456
574
  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
- ],
575
+ // 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)
576
+ guard: {
577
+ and: [
578
+ signerIsParty("state.charterAuthority"),
579
+ // the proposal must target this amendment, and its bound resolution must be EXECUTED
580
+ {
581
+ "==": [
582
+ { var: "state.pendingAmendCharter.amendmentId" },
583
+ { var: "event.amendmentId" },
584
+ ],
585
+ },
586
+ depInState("state.pendingAmendCharter.ref", "EXECUTED"),
587
+ ],
588
+ },
465
589
  effect: {
466
590
  merge: [
467
591
  { var: "state" },
468
592
  {
469
593
  charterAmendments: {
470
- cat: [
594
+ merge: [
471
595
  { var: "state.charterAmendments" },
472
596
  [
473
597
  {
474
598
  amendmentId: { var: "event.amendmentId" },
475
599
  description: { var: "event.description" },
476
600
  effectiveDate: { var: "event.effectiveDate" },
477
- resolutionRef: { var: "event.resolutionRef" },
601
+ resolutionRef: { var: "state.pendingAmendCharter.ref" },
478
602
  filedDate: { var: "event.filedDate" },
479
603
  },
480
604
  ],
@@ -487,11 +611,18 @@ export const corpEntityDef = defineFiberApp({
487
611
  { var: "state.legalName" },
488
612
  ],
489
613
  },
490
- updatedAt: { var: "$timestamp" },
614
+ updatedAt: { var: "$ordinal" },
615
+ // clear the consumed proposal
616
+ pendingAmendCharter: null,
617
+ },
618
+ {
619
+ _emit: [
620
+ { name: "CHARTER_AMENDED", data: { var: "event" }, destination: "external" },
621
+ ],
491
622
  },
492
623
  ],
493
624
  },
494
- emits: ["CHARTER_AMENDED"],
625
+ dependencies: [],
495
626
  },
496
627
  // ACTIVE -> ACTIVE (update_share_class)
497
628
  {
@@ -503,7 +634,7 @@ export const corpEntityDef = defineFiberApp({
503
634
  { var: "state.charterAmendments" },
504
635
  {
505
636
  "==": [
506
- { var: ".amendmentId" },
637
+ { var: "amendmentId" },
507
638
  { var: "event.charterAmendmentRef" },
508
639
  ],
509
640
  },
@@ -524,7 +655,7 @@ export const corpEntityDef = defineFiberApp({
524
655
  if: [
525
656
  {
526
657
  "==": [
527
- { var: ".classId" },
658
+ { var: "classId" },
528
659
  { var: "event.classId" },
529
660
  ],
530
661
  },
@@ -561,7 +692,8 @@ export const corpEntityDef = defineFiberApp({
561
692
  from: "ACTIVE",
562
693
  to: "ACTIVE",
563
694
  eventName: "update_registered_agent",
564
- guard: { "==": [1, 1] },
695
+ // 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)
696
+ guard: signerIsParty("state.boardAuthority"),
565
697
  effect: {
566
698
  merge: [
567
699
  { var: "state" },
@@ -574,16 +706,21 @@ export const corpEntityDef = defineFiberApp({
574
706
  effectiveDate: { var: "event.effectiveDate" },
575
707
  },
576
708
  },
709
+ {
710
+ _emit: [
711
+ { name: "REGISTERED_AGENT_CHANGED", data: { var: "event" }, destination: "external" },
712
+ ],
713
+ },
577
714
  ],
578
715
  },
579
- emits: ["REGISTERED_AGENT_CHANGED"],
580
716
  },
581
717
  // ACTIVE -> SUSPENDED
582
718
  {
583
719
  from: "ACTIVE",
584
720
  to: "SUSPENDED",
585
721
  eventName: "suspend",
586
- guard: { "==": [1, 1] },
722
+ // 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)
723
+ guard: signerIsParty("state.stateAuthority"),
587
724
  effect: {
588
725
  merge: [
589
726
  { var: "state" },
@@ -592,16 +729,21 @@ export const corpEntityDef = defineFiberApp({
592
729
  suspensionReason: { var: "event.reason" },
593
730
  suspensionDate: { var: "event.suspensionDate" },
594
731
  },
732
+ {
733
+ _emit: [
734
+ { name: "CORPORATION_SUSPENDED", data: { var: "event" }, destination: "external" },
735
+ ],
736
+ },
595
737
  ],
596
738
  },
597
- emits: ["CORPORATION_SUSPENDED"],
598
739
  },
599
740
  // SUSPENDED -> ACTIVE
600
741
  {
601
742
  from: "SUSPENDED",
602
743
  to: "ACTIVE",
603
744
  eventName: "reinstate",
604
- guard: { "==": [1, 1] },
745
+ // 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)
746
+ guard: signerIsParty("state.boardAuthority"),
605
747
  effect: {
606
748
  merge: [
607
749
  { var: "state" },
@@ -610,28 +752,72 @@ export const corpEntityDef = defineFiberApp({
610
752
  suspensionReason: null,
611
753
  suspensionDate: null,
612
754
  },
755
+ {
756
+ _emit: [
757
+ { name: "CORPORATION_REINSTATED", data: { var: "event" }, destination: "external" },
758
+ ],
759
+ },
760
+ ],
761
+ },
762
+ },
763
+ // ACTIVE -> ACTIVE (propose_dissolve_voluntary) — phase 1 (#24): bind BOTH executing resolution
764
+ // fibers (board + shareholder) and record the pending dissolution, so dissolve_voluntary can read
765
+ // both resolutions' states next transition.
766
+ {
767
+ from: "ACTIVE",
768
+ to: "ACTIVE",
769
+ eventName: "propose_dissolve_voluntary",
770
+ // 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)
771
+ guard: {
772
+ and: [
773
+ signerIsParty("state.boardAuthority"),
774
+ signerIsParty("state.shareholderAuthority"),
775
+ ],
776
+ },
777
+ effect: {
778
+ merge: [
779
+ { var: "state" },
780
+ {
781
+ pendingDissolveVoluntary: {
782
+ dissolutionDate: { var: "event.dissolutionDate" },
783
+ boardRef: { var: "event.boardResolutionRef" },
784
+ shareholderRef: { var: "event.shareholderResolutionRef" },
785
+ proposedAt: { var: "$ordinal" },
786
+ },
787
+ },
788
+ // bind both resolution fibers so dissolve_voluntary can assert their states next transition
789
+ {
790
+ _addDependency: [
791
+ { fiberId: { var: "event.boardResolutionRef" } },
792
+ { fiberId: { var: "event.shareholderResolutionRef" } },
793
+ ],
794
+ },
613
795
  ],
614
796
  },
615
- emits: ["CORPORATION_REINSTATED"],
797
+ dependencies: [],
616
798
  },
617
- // ACTIVE -> DISSOLVED (voluntary)
799
+ // ACTIVE -> DISSOLVED (dissolve_voluntary) — phase 2 (#24): execute once BOTH bound resolutions are
800
+ // EXECUTED. depInState replaces the dropped object-form dependencies (which silently never gated).
618
801
  {
619
802
  from: "ACTIVE",
620
803
  to: "DISSOLVED",
621
804
  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
- ],
805
+ // 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)
806
+ guard: {
807
+ and: [
808
+ signerIsParty("state.boardAuthority"),
809
+ signerIsParty("state.shareholderAuthority"),
810
+ // the proposal must target this dissolution, and its bound resolutions must both be EXECUTED
811
+ {
812
+ "==": [
813
+ { var: "state.pendingDissolveVoluntary.dissolutionDate" },
814
+ { var: "event.dissolutionDate" },
815
+ ],
816
+ },
817
+ depInState("state.pendingDissolveVoluntary.boardRef", "EXECUTED"),
818
+ depInState("state.pendingDissolveVoluntary.shareholderRef", "EXECUTED"),
819
+ ],
820
+ },
635
821
  effect: {
636
822
  merge: [
637
823
  { var: "state" },
@@ -639,17 +825,25 @@ export const corpEntityDef = defineFiberApp({
639
825
  status: "DISSOLVED",
640
826
  dissolutionDate: { var: "event.dissolutionDate" },
641
827
  dissolutionReason: "VOLUNTARY",
828
+ // clear the consumed proposal
829
+ pendingDissolveVoluntary: null,
830
+ },
831
+ {
832
+ _emit: [
833
+ { name: "CORPORATION_DISSOLVED", data: { var: "event" }, destination: "external" },
834
+ ],
642
835
  },
643
836
  ],
644
837
  },
645
- emits: ["CORPORATION_DISSOLVED"],
838
+ dependencies: [],
646
839
  },
647
840
  // SUSPENDED -> DISSOLVED (administrative)
648
841
  {
649
842
  from: "SUSPENDED",
650
843
  to: "DISSOLVED",
651
844
  eventName: "dissolve_administrative",
652
- guard: { "==": [1, 1] },
845
+ // 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)
846
+ guard: signerIsParty("state.stateAuthority"),
653
847
  effect: {
654
848
  merge: [
655
849
  { var: "state" },
@@ -660,9 +854,13 @@ export const corpEntityDef = defineFiberApp({
660
854
  cat: ["ADMINISTRATIVE: ", { var: "event.reason" }],
661
855
  },
662
856
  },
857
+ {
858
+ _emit: [
859
+ { name: "CORPORATION_DISSOLVED", data: { var: "event" }, destination: "external" },
860
+ ],
861
+ },
663
862
  ],
664
863
  },
665
- emits: ["CORPORATION_DISSOLVED"],
666
864
  },
667
865
  ],
668
866
  });