@ottochain/sdk 2.2.5 → 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 (222) hide show
  1. package/dist/cjs/apps/contracts/index.js +15 -8
  2. package/dist/cjs/apps/contracts/state-machines/contract-agreement.js +89 -46
  3. package/dist/cjs/apps/contracts/state-machines/contract-escrow.js +152 -45
  4. package/dist/cjs/apps/contracts/state-machines/contract-universal.js +40 -8
  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 +85 -43
  12. package/dist/cjs/apps/governance/state-machines/dao-reputation.js +73 -43
  13. package/dist/cjs/apps/governance/state-machines/dao-single.js +55 -14
  14. package/dist/cjs/apps/governance/state-machines/dao-token.js +103 -45
  15. package/dist/cjs/apps/governance/state-machines/governance-simple.js +129 -65
  16. package/dist/cjs/apps/governance/state-machines/governance-universal.js +29 -5
  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 +57 -9
  20. package/dist/cjs/apps/identity/state-machines/identity-oracle.js +70 -27
  21. package/dist/cjs/apps/identity/state-machines/identity-registry.js +288 -0
  22. package/dist/cjs/apps/identity/state-machines/identity-universal.js +30 -6
  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 +44 -19
  33. package/dist/cjs/apps/markets/state-machines/market-crowdfund.js +54 -29
  34. package/dist/cjs/apps/markets/state-machines/market-group-buy.js +53 -31
  35. package/dist/cjs/apps/markets/state-machines/market-prediction.js +120 -61
  36. package/dist/cjs/apps/markets/state-machines/market-universal.js +50 -10
  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 +1722 -1
  49. package/dist/cjs/generated/ottochain/v1/fiber.js +355 -5
  50. package/dist/cjs/generated/ottochain/v1/messages.js +775 -3
  51. package/dist/cjs/generated/ottochain/v1/records.js +350 -3
  52. package/dist/cjs/index.js +45 -7
  53. package/dist/cjs/openapi.js +2 -0
  54. package/dist/cjs/ottochain/drop-nulls.js +1 -2
  55. package/dist/cjs/ottochain/genesis-manifest.js +193 -0
  56. package/dist/cjs/ottochain/index.js +27 -13
  57. package/dist/cjs/ottochain/metagraph-client.js +65 -8
  58. package/dist/cjs/ottochain/snapshot.js +11 -12
  59. package/dist/cjs/ottochain/transaction.js +57 -14
  60. package/dist/cjs/ottochain/types.js +19 -1
  61. package/dist/cjs/privacy/index.js +14 -0
  62. package/dist/cjs/privacy/sealed-bid.js +210 -0
  63. package/dist/cjs/privacy/shield-app.js +131 -0
  64. package/dist/cjs/schema/effects.js +40 -0
  65. package/dist/cjs/schema/fiber-app.js +19 -13
  66. package/dist/cjs/schema/guard-lint.js +352 -0
  67. package/dist/cjs/schema/guards.js +246 -0
  68. package/dist/cjs/signing.js +80 -0
  69. package/dist/cjs/types.js +2 -3
  70. package/dist/cjs/validation.js +8 -8
  71. package/dist/cjs/verify.js +9 -4
  72. package/dist/cjs/zk/commit.js +53 -0
  73. package/dist/cjs/zk/guard.js +107 -0
  74. package/dist/cjs/zk/index.js +48 -0
  75. package/dist/cjs/zk/preimage.js +37 -0
  76. package/dist/cjs/zk/prover.js +87 -0
  77. package/dist/cjs/zk/registry.js +62 -0
  78. package/dist/cjs/zk/types.js +28 -0
  79. package/dist/cjs/zk/witness.js +19 -0
  80. package/dist/esm/apps/contracts/index.js +7 -3
  81. package/dist/esm/apps/contracts/state-machines/contract-agreement.js +89 -46
  82. package/dist/esm/apps/contracts/state-machines/contract-escrow.js +152 -45
  83. package/dist/esm/apps/contracts/state-machines/contract-universal.js +40 -8
  84. package/dist/esm/apps/corporate/state-machines/corp-board.js +169 -59
  85. package/dist/esm/apps/corporate/state-machines/corp-entity.js +245 -47
  86. package/dist/esm/apps/corporate/state-machines/corp-securities.js +407 -99
  87. package/dist/esm/apps/corporate/state-machines/corp-shareholders.js +151 -37
  88. package/dist/esm/apps/governance/state-machines/dao-multisig.js +85 -43
  89. package/dist/esm/apps/governance/state-machines/dao-reputation.js +73 -43
  90. package/dist/esm/apps/governance/state-machines/dao-single.js +55 -14
  91. package/dist/esm/apps/governance/state-machines/dao-token.js +103 -45
  92. package/dist/esm/apps/governance/state-machines/governance-simple.js +129 -65
  93. package/dist/esm/apps/governance/state-machines/governance-universal.js +29 -5
  94. package/dist/esm/apps/identity/constants.js +51 -12
  95. package/dist/esm/apps/identity/index.js +12 -7
  96. package/dist/esm/apps/identity/state-machines/identity-agent.js +57 -9
  97. package/dist/esm/apps/identity/state-machines/identity-oracle.js +70 -27
  98. package/dist/esm/apps/identity/state-machines/identity-registry.js +285 -0
  99. package/dist/esm/apps/identity/state-machines/identity-universal.js +30 -6
  100. package/dist/esm/apps/identity/state-machines/index.js +1 -0
  101. package/dist/esm/apps/index.js +1 -0
  102. package/dist/esm/apps/lending/assets.js +207 -0
  103. package/dist/esm/apps/lending/credit-scoring.js +81 -0
  104. package/dist/esm/apps/lending/eligibility.js +115 -0
  105. package/dist/esm/apps/lending/index.js +69 -0
  106. package/dist/esm/apps/lending/state-machines/index.js +5 -0
  107. package/dist/esm/apps/lending/state-machines/lending-zk-loan.js +409 -0
  108. package/dist/esm/apps/markets/index.js +8 -4
  109. package/dist/esm/apps/markets/state-machines/market-auction.js +44 -19
  110. package/dist/esm/apps/markets/state-machines/market-crowdfund.js +54 -29
  111. package/dist/esm/apps/markets/state-machines/market-group-buy.js +53 -31
  112. package/dist/esm/apps/markets/state-machines/market-prediction.js +120 -61
  113. package/dist/esm/apps/markets/state-machines/market-universal.js +50 -10
  114. package/dist/esm/generated/index.js +9 -5
  115. package/dist/esm/generated/openapi.js +5 -0
  116. package/dist/esm/generated/ottochain/apps/contracts/v1/contract.js +46 -46
  117. package/dist/esm/generated/ottochain/apps/identity/v1/identity.js +114 -120
  118. package/dist/esm/generated/ottochain/apps/markets/v1/market.js +100 -100
  119. package/dist/esm/generated/ottochain/v1/common.js +1718 -0
  120. package/dist/esm/generated/ottochain/v1/fiber.js +351 -1
  121. package/dist/esm/generated/ottochain/v1/messages.js +774 -2
  122. package/dist/esm/generated/ottochain/v1/records.js +349 -2
  123. package/dist/esm/index.js +23 -2
  124. package/dist/esm/openapi.js +1 -0
  125. package/dist/esm/ottochain/genesis-manifest.js +189 -0
  126. package/dist/esm/ottochain/index.js +4 -3
  127. package/dist/esm/ottochain/metagraph-client.js +65 -8
  128. package/dist/esm/ottochain/snapshot.js +4 -4
  129. package/dist/esm/ottochain/transaction.js +43 -3
  130. package/dist/esm/ottochain/types.js +18 -0
  131. package/dist/esm/privacy/index.js +6 -0
  132. package/dist/esm/privacy/sealed-bid.js +206 -0
  133. package/dist/esm/privacy/shield-app.js +127 -0
  134. package/dist/esm/schema/effects.js +35 -0
  135. package/dist/esm/schema/fiber-app.js +13 -6
  136. package/dist/esm/schema/guard-lint.js +346 -0
  137. package/dist/esm/schema/guards.js +229 -0
  138. package/dist/esm/signing.js +74 -0
  139. package/dist/esm/verify.js +8 -2
  140. package/dist/esm/zk/commit.js +44 -0
  141. package/dist/esm/zk/guard.js +99 -0
  142. package/dist/esm/zk/index.js +19 -0
  143. package/dist/esm/zk/preimage.js +30 -0
  144. package/dist/esm/zk/prover.js +82 -0
  145. package/dist/esm/zk/registry.js +55 -0
  146. package/dist/esm/zk/types.js +25 -0
  147. package/dist/esm/zk/witness.js +15 -0
  148. package/dist/types/apps/contracts/index.d.ts +159 -227
  149. package/dist/types/apps/contracts/state-machines/contract-agreement.d.ts +50 -101
  150. package/dist/types/apps/contracts/state-machines/contract-escrow.d.ts +86 -120
  151. package/dist/types/apps/contracts/state-machines/contract-universal.d.ts +20 -4
  152. package/dist/types/apps/corporate/index.d.ts +1040 -304
  153. package/dist/types/apps/corporate/state-machines/corp-board.d.ts +188 -52
  154. package/dist/types/apps/corporate/state-machines/corp-entity.d.ts +267 -62
  155. package/dist/types/apps/corporate/state-machines/corp-securities.d.ts +355 -131
  156. package/dist/types/apps/corporate/state-machines/corp-shareholders.d.ts +225 -53
  157. package/dist/types/apps/governance/index.d.ts +396 -417
  158. package/dist/types/apps/governance/state-machines/dao-multisig.d.ts +92 -95
  159. package/dist/types/apps/governance/state-machines/dao-reputation.d.ts +57 -69
  160. package/dist/types/apps/governance/state-machines/dao-single.d.ts +40 -50
  161. package/dist/types/apps/governance/state-machines/dao-token.d.ts +80 -53
  162. package/dist/types/apps/governance/state-machines/governance-simple.d.ts +107 -121
  163. package/dist/types/apps/governance/state-machines/governance-universal.d.ts +17 -5
  164. package/dist/types/apps/identity/constants.d.ts +32 -4
  165. package/dist/types/apps/identity/index.d.ts +449 -100
  166. package/dist/types/apps/identity/state-machines/identity-agent.d.ts +30 -0
  167. package/dist/types/apps/identity/state-machines/identity-oracle.d.ts +41 -87
  168. package/dist/types/apps/identity/state-machines/identity-registry.d.ts +379 -0
  169. package/dist/types/apps/identity/state-machines/identity-universal.d.ts +15 -0
  170. package/dist/types/apps/identity/state-machines/index.d.ts +1 -0
  171. package/dist/types/apps/index.d.ts +1 -0
  172. package/dist/types/apps/lending/assets.d.ts +258 -0
  173. package/dist/types/apps/lending/credit-scoring.d.ts +80 -0
  174. package/dist/types/apps/lending/eligibility.d.ts +83 -0
  175. package/dist/types/apps/lending/index.d.ts +548 -0
  176. package/dist/types/apps/lending/state-machines/index.d.ts +5 -0
  177. package/dist/types/apps/lending/state-machines/lending-zk-loan.d.ts +528 -0
  178. package/dist/types/apps/markets/index.d.ts +184 -204
  179. package/dist/types/apps/markets/state-machines/market-auction.d.ts +25 -37
  180. package/dist/types/apps/markets/state-machines/market-crowdfund.d.ts +26 -34
  181. package/dist/types/apps/markets/state-machines/market-group-buy.d.ts +31 -43
  182. package/dist/types/apps/markets/state-machines/market-prediction.d.ts +67 -72
  183. package/dist/types/apps/markets/state-machines/market-universal.d.ts +30 -10
  184. package/dist/types/generated/index.d.ts +5 -5
  185. package/dist/types/generated/openapi.d.ts +1257 -0
  186. package/dist/types/generated/ottochain/apps/contracts/v1/contract.d.ts +5 -5
  187. package/dist/types/generated/ottochain/apps/identity/v1/identity.d.ts +12 -12
  188. package/dist/types/generated/ottochain/apps/markets/v1/market.d.ts +11 -11
  189. package/dist/types/generated/ottochain/v1/common.d.ts +228 -0
  190. package/dist/types/generated/ottochain/v1/fiber.d.ts +32 -1
  191. package/dist/types/generated/ottochain/v1/messages.d.ts +84 -0
  192. package/dist/types/generated/ottochain/v1/records.d.ts +34 -0
  193. package/dist/types/index.d.ts +8 -2
  194. package/dist/types/openapi.d.ts +22 -0
  195. package/dist/types/ottochain/genesis-manifest.d.ts +130 -0
  196. package/dist/types/ottochain/index.d.ts +6 -5
  197. package/dist/types/ottochain/metagraph-client.d.ts +49 -7
  198. package/dist/types/ottochain/snapshot.d.ts +6 -6
  199. package/dist/types/ottochain/transaction.d.ts +33 -1
  200. package/dist/types/ottochain/types.d.ts +602 -11
  201. package/dist/types/privacy/index.d.ts +6 -0
  202. package/dist/types/privacy/sealed-bid.d.ts +348 -0
  203. package/dist/types/privacy/shield-app.d.ts +48 -0
  204. package/dist/types/schema/effects.d.ts +34 -0
  205. package/dist/types/schema/fiber-app.d.ts +41 -3
  206. package/dist/types/schema/guard-lint.d.ts +111 -0
  207. package/dist/types/schema/guards.d.ts +134 -0
  208. package/dist/types/signing.d.ts +45 -0
  209. package/dist/types/validation.d.ts +22 -217
  210. package/dist/types/verify.d.ts +4 -0
  211. package/dist/types/zk/commit.d.ts +28 -0
  212. package/dist/types/zk/guard.d.ts +46 -0
  213. package/dist/types/zk/index.d.ts +19 -0
  214. package/dist/types/zk/preimage.d.ts +10 -0
  215. package/dist/types/zk/prover.d.ts +34 -0
  216. package/dist/types/zk/registry.d.ts +34 -0
  217. package/dist/types/zk/types.d.ts +33 -0
  218. package/dist/types/zk/witness.d.ts +40 -0
  219. package/package.json +52 -35
  220. package/dist/cjs/ottochain/normalize.js +0 -186
  221. package/dist/esm/ottochain/normalize.js +0 -179
  222. package/dist/types/ottochain/normalize.d.ts +0 -79
@@ -30,10 +30,42 @@ exports.contractUniversalDef = (0, fiber_app_js_1.defineFiberApp)({
30
30
  complete: {},
31
31
  },
32
32
  states: {
33
- PROPOSED: { id: "PROPOSED", isFinal: false, metadata: null },
34
- ACTIVE: { id: "ACTIVE", isFinal: false, metadata: null },
35
- COMPLETED: { id: "COMPLETED", isFinal: true, metadata: null },
36
- CANCELLED: { id: "CANCELLED", isFinal: true, metadata: null },
33
+ PROPOSED: {
34
+ id: "PROPOSED",
35
+ isFinal: false,
36
+ metadata: {
37
+ label: "Proposed",
38
+ description: "Contract proposed; awaiting acceptance",
39
+ category: "initial",
40
+ },
41
+ },
42
+ ACTIVE: {
43
+ id: "ACTIVE",
44
+ isFinal: false,
45
+ metadata: {
46
+ label: "Active",
47
+ description: "Contract accepted and in effect",
48
+ category: "active",
49
+ },
50
+ },
51
+ COMPLETED: {
52
+ id: "COMPLETED",
53
+ isFinal: true,
54
+ metadata: {
55
+ label: "Completed",
56
+ description: "Contract obligations fulfilled (terminal)",
57
+ category: "terminal",
58
+ },
59
+ },
60
+ CANCELLED: {
61
+ id: "CANCELLED",
62
+ isFinal: true,
63
+ metadata: {
64
+ label: "Cancelled",
65
+ description: "Contract cancelled before completion (terminal)",
66
+ category: "terminal",
67
+ },
68
+ },
37
69
  },
38
70
  initialState: "PROPOSED",
39
71
  transitions: [
@@ -45,7 +77,7 @@ exports.contractUniversalDef = (0, fiber_app_js_1.defineFiberApp)({
45
77
  effect: {
46
78
  merge: [
47
79
  { var: "state" },
48
- { status: "ACTIVE", acceptedAt: { var: "$timestamp" } },
80
+ { status: "ACTIVE", acceptedAt: { var: "$ordinal" } },
49
81
  ],
50
82
  },
51
83
  dependencies: [],
@@ -58,7 +90,7 @@ exports.contractUniversalDef = (0, fiber_app_js_1.defineFiberApp)({
58
90
  effect: {
59
91
  merge: [
60
92
  { var: "state" },
61
- { status: "CANCELLED", cancelledAt: { var: "$timestamp" } },
93
+ { status: "CANCELLED", cancelledAt: { var: "$ordinal" } },
62
94
  ],
63
95
  },
64
96
  dependencies: [],
@@ -71,7 +103,7 @@ exports.contractUniversalDef = (0, fiber_app_js_1.defineFiberApp)({
71
103
  effect: {
72
104
  merge: [
73
105
  { var: "state" },
74
- { status: "COMPLETED", completedAt: { var: "$timestamp" } },
106
+ { status: "COMPLETED", completedAt: { var: "$ordinal" } },
75
107
  ],
76
108
  },
77
109
  dependencies: [],
@@ -84,7 +116,7 @@ exports.contractUniversalDef = (0, fiber_app_js_1.defineFiberApp)({
84
116
  effect: {
85
117
  merge: [
86
118
  { var: "state" },
87
- { status: "CANCELLED", cancelledAt: { var: "$timestamp" } },
119
+ { status: "CANCELLED", cancelledAt: { var: "$ordinal" } },
88
120
  ],
89
121
  },
90
122
  dependencies: [],
@@ -22,7 +22,8 @@
22
22
  */
23
23
  Object.defineProperty(exports, "__esModule", { value: true });
24
24
  exports.corpBoardDef = exports.corpEntityDef = exports.resolutionStatusToJSON = exports.resolutionStatusFromJSON = exports.boardMeetingTypeToJSON = exports.boardMeetingTypeFromJSON = exports.officerStatusToJSON = exports.officerStatusFromJSON = exports.directorStatusToJSON = exports.directorStatusFromJSON = exports.entityStateToJSON = exports.entityStateFromJSON = exports.entityTypeToJSON = exports.entityTypeFromJSON = exports.ProposeResolutionRequest = exports.IssueSharesRequest = exports.AppointDirectorRequest = exports.CreateEntityRequest = exports.ComplianceRequirement = exports.FilingRecord = exports.CorporateCompliance = exports.SecurityTransfer = exports.SecurityIssuance = exports.CorporateSecurities = exports.ResolutionVote = exports.CorporateResolution = exports.ShareHolding = exports.Shareholder = exports.CorporateShareholders = exports.OfficerAction = exports.Officer = exports.CorporateOfficers = exports.MeetingAttendee = exports.BoardMeeting = exports.QuorumRules = exports.SeatInfo = exports.Director = exports.CorporateBoard = exports.ShareStructure = exports.Incorporator = exports.RegisteredAgent = exports.CorporateEntity = exports.ShareClass = exports.Jurisdiction = exports.ResolutionStatus = exports.BoardMeetingType = exports.OfficerStatus = exports.DirectorStatus = exports.EntityState = exports.EntityType = void 0;
25
- exports.getCorporateDefinition = exports.CORPORATE_DEFINITIONS = exports.corpSecuritiesDef = exports.corpShareholdersDef = void 0;
25
+ exports.CORPORATE_DEFINITIONS = exports.corpSecuritiesDef = exports.corpShareholdersDef = void 0;
26
+ exports.getCorporateDefinition = getCorporateDefinition;
26
27
  // Re-export generated protobuf types (source of truth)
27
28
  var corporate_js_1 = require("../../generated/ottochain/apps/corporate/v1/corporate.js");
28
29
  Object.defineProperty(exports, "EntityType", { enumerable: true, get: function () { return corporate_js_1.EntityType; } });
@@ -95,4 +96,3 @@ exports.CORPORATE_DEFINITIONS = {
95
96
  function getCorporateDefinition(type) {
96
97
  return exports.CORPORATE_DEFINITIONS[type];
97
98
  }
98
- exports.getCorporateDefinition = getCorporateDefinition;
@@ -2,6 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.corpBoardDef = void 0;
4
4
  const fiber_app_js_1 = require("../../../schema/fiber-app.js");
5
+ const guards_js_1 = require("../../../schema/guards.js");
6
+ const effects_js_1 = require("../../../schema/effects.js");
5
7
  /**
6
8
  * Board of directors state machine managing director seats, meetings, quorum, and formal board actions.
7
9
  * Supports staggered boards with classified directors.
@@ -37,7 +39,7 @@ exports.corpBoardDef = (0, fiber_app_js_1.defineFiberApp)({
37
39
  },
38
40
  },
39
41
  createSchema: {
40
- required: ["boardId", "entityId", "seats"],
42
+ required: ["boardId", "entityId", "seats", "authorizedRemovers"],
41
43
  properties: {
42
44
  boardId: {
43
45
  type: "string",
@@ -49,6 +51,12 @@ exports.corpBoardDef = (0, fiber_app_js_1.defineFiberApp)({
49
51
  description: "Reference to parent corporate-entity",
50
52
  immutable: true,
51
53
  },
54
+ authorizedRemovers: {
55
+ type: "array",
56
+ description: "State-pinned set of DAG addresses authorized to remove a director for cause (board/shareholder authority). A verified signer must be a member; checked against proofs[].address.",
57
+ immutable: false,
58
+ items: { type: "address" },
59
+ },
52
60
  seats: {
53
61
  type: "object",
54
62
  properties: {
@@ -122,6 +130,7 @@ exports.corpBoardDef = (0, fiber_app_js_1.defineFiberApp)({
122
130
  properties: {
123
131
  boardId: { type: "string", immutable: true },
124
132
  entityId: { type: "string", immutable: true },
133
+ authorizedRemovers: { type: "array", items: { type: "address" } },
125
134
  directors: {
126
135
  type: "array",
127
136
  items: { $ref: "#/definitions/Director" },
@@ -148,6 +157,9 @@ exports.corpBoardDef = (0, fiber_app_js_1.defineFiberApp)({
148
157
  },
149
158
  createdAt: { type: "timestamp", computed: true },
150
159
  updatedAt: { type: "timestamp", computed: true },
160
+ // Two-phase removal (#24): propose_removal binds the resolution fiber + records the pending
161
+ // removal here; remove_for_cause asserts the bound resolution is EXECUTED, then clears this.
162
+ pendingRemoval: { type: "object", nullable: true, computed: true },
151
163
  },
152
164
  },
153
165
  eventSchemas: {
@@ -192,18 +204,20 @@ exports.corpBoardDef = (0, fiber_app_js_1.defineFiberApp)({
192
204
  },
193
205
  },
194
206
  },
195
- remove_for_cause: {
196
- description: "Remove a director for cause (requires board or shareholder action depending on bylaws)",
197
- required: [
198
- "directorId",
199
- "cause",
200
- "removalResolutionRef",
201
- "effectiveDate",
202
- ],
207
+ propose_removal: {
208
+ description: "Phase 1 of for-cause removal: bind the executing resolution fiber (#24 _addDependency) and record the pending removal",
209
+ required: ["directorId", "cause", "removalResolutionRef"],
203
210
  properties: {
204
211
  directorId: { type: "string" },
205
212
  cause: { type: "string" },
206
213
  removalResolutionRef: { type: "string" },
214
+ },
215
+ },
216
+ remove_for_cause: {
217
+ description: "Phase 2 of for-cause removal: execute once the bound removal resolution is EXECUTED",
218
+ required: ["directorId", "effectiveDate"],
219
+ properties: {
220
+ directorId: { type: "string" },
207
221
  effectiveDate: { type: "string", format: "date" },
208
222
  },
209
223
  },
@@ -423,12 +437,8 @@ exports.corpBoardDef = (0, fiber_app_js_1.defineFiberApp)({
423
437
  eventName: "elect_director",
424
438
  guard: {
425
439
  and: [
426
- {
427
- or: [
428
- { ">": [{ var: "state.seats.vacant" }, 0] },
429
- { "==": [{ var: "event.isFillingVacancy" }, true] },
430
- ],
431
- },
440
+ // vacancy gated solely on verified state — the forgeable event.isFillingVacancy disjunct was removed
441
+ { ">": [{ var: "state.seats.vacant" }, 0] },
432
442
  { "!=": [{ var: "event.electionResolutionRef" }, null] },
433
443
  {
434
444
  "!": {
@@ -438,11 +448,11 @@ exports.corpBoardDef = (0, fiber_app_js_1.defineFiberApp)({
438
448
  and: [
439
449
  {
440
450
  "==": [
441
- { var: ".directorId" },
451
+ { var: "directorId" },
442
452
  { var: "event.directorId" },
443
453
  ],
444
454
  },
445
- { "==": [{ var: ".status" }, "ACTIVE"] },
455
+ { "==": [{ var: "status" }, "ACTIVE"] },
446
456
  ],
447
457
  },
448
458
  ],
@@ -455,7 +465,7 @@ exports.corpBoardDef = (0, fiber_app_js_1.defineFiberApp)({
455
465
  { var: "state" },
456
466
  {
457
467
  directors: {
458
- cat: [
468
+ merge: [
459
469
  { var: "state.directors" },
460
470
  [
461
471
  {
@@ -485,9 +495,13 @@ exports.corpBoardDef = (0, fiber_app_js_1.defineFiberApp)({
485
495
  ],
486
496
  },
487
497
  },
498
+ {
499
+ _emit: [
500
+ { name: "DIRECTOR_ELECTED", data: { var: "event" }, destination: "external" },
501
+ ],
502
+ },
488
503
  ],
489
504
  },
490
- emits: ["DIRECTOR_ELECTED"],
491
505
  },
492
506
  // ACTIVE -> ACTIVE (resign_director) and IN_MEETING -> ACTIVE (resign_director)
493
507
  {
@@ -499,8 +513,8 @@ exports.corpBoardDef = (0, fiber_app_js_1.defineFiberApp)({
499
513
  { var: "state.directors" },
500
514
  {
501
515
  and: [
502
- { "==": [{ var: ".directorId" }, { var: "event.directorId" }] },
503
- { "==": [{ var: ".status" }, "ACTIVE"] },
516
+ { "==": [{ var: "directorId" }, { var: "event.directorId" }] },
517
+ { "==": [{ var: "status" }, "ACTIVE"] },
504
518
  ],
505
519
  },
506
520
  ],
@@ -516,7 +530,7 @@ exports.corpBoardDef = (0, fiber_app_js_1.defineFiberApp)({
516
530
  if: [
517
531
  {
518
532
  "==": [
519
- { var: ".directorId" },
533
+ { var: "directorId" },
520
534
  { var: "event.directorId" },
521
535
  ],
522
536
  },
@@ -544,9 +558,13 @@ exports.corpBoardDef = (0, fiber_app_js_1.defineFiberApp)({
544
558
  ],
545
559
  },
546
560
  },
561
+ {
562
+ _emit: [
563
+ { name: "DIRECTOR_RESIGNED", data: { var: "event" }, destination: "external" },
564
+ ],
565
+ },
547
566
  ],
548
567
  },
549
- emits: ["DIRECTOR_RESIGNED"],
550
568
  },
551
569
  {
552
570
  from: "IN_MEETING",
@@ -557,8 +575,8 @@ exports.corpBoardDef = (0, fiber_app_js_1.defineFiberApp)({
557
575
  { var: "state.directors" },
558
576
  {
559
577
  and: [
560
- { "==": [{ var: ".directorId" }, { var: "event.directorId" }] },
561
- { "==": [{ var: ".status" }, "ACTIVE"] },
578
+ { "==": [{ var: "directorId" }, { var: "event.directorId" }] },
579
+ { "==": [{ var: "status" }, "ACTIVE"] },
562
580
  ],
563
581
  },
564
582
  ],
@@ -574,7 +592,7 @@ exports.corpBoardDef = (0, fiber_app_js_1.defineFiberApp)({
574
592
  if: [
575
593
  {
576
594
  "==": [
577
- { var: ".directorId" },
595
+ { var: "directorId" },
578
596
  { var: "event.directorId" },
579
597
  ],
580
598
  },
@@ -602,33 +620,88 @@ exports.corpBoardDef = (0, fiber_app_js_1.defineFiberApp)({
602
620
  ],
603
621
  },
604
622
  },
623
+ {
624
+ _emit: [
625
+ { name: "DIRECTOR_RESIGNED", data: { var: "event" }, destination: "external" },
626
+ ],
627
+ },
605
628
  ],
606
629
  },
607
- emits: ["DIRECTOR_RESIGNED"],
608
630
  },
609
- // ACTIVE -> ACTIVE (remove_for_cause)
631
+ // ACTIVE -> ACTIVE (propose_removal) — phase 1 (#24): bind the executing resolution fiber and
632
+ // record the pending removal, so the next transition can read the resolution's state.
633
+ {
634
+ from: "ACTIVE",
635
+ to: "ACTIVE",
636
+ eventName: "propose_removal",
637
+ guard: {
638
+ and: [
639
+ (0, guards_js_1.signerInSet)("state.authorizedRemovers"),
640
+ {
641
+ some: [
642
+ { var: "state.directors" },
643
+ {
644
+ and: [
645
+ { "==": [{ var: "directorId" }, { var: "event.directorId" }] },
646
+ { "==": [{ var: "status" }, "ACTIVE"] },
647
+ ],
648
+ },
649
+ ],
650
+ },
651
+ ],
652
+ },
653
+ effect: {
654
+ merge: [
655
+ { var: "state" },
656
+ {
657
+ pendingRemoval: {
658
+ directorId: { var: "event.directorId" },
659
+ cause: { var: "event.cause" },
660
+ resolutionRef: { var: "event.removalResolutionRef" },
661
+ proposedAt: { var: "$ordinal" },
662
+ },
663
+ },
664
+ // bind the resolution fiber so remove_for_cause can assert its state next transition
665
+ (0, effects_js_1.addDependency)({ var: "event.removalResolutionRef" }),
666
+ ],
667
+ },
668
+ dependencies: [],
669
+ },
670
+ // ACTIVE -> ACTIVE (remove_for_cause) — phase 2 (#24): execute once the bound removal resolution is
671
+ // EXECUTED. depInState replaces the dropped object-form dependency (which silently never gated).
610
672
  {
611
673
  from: "ACTIVE",
612
674
  to: "ACTIVE",
613
675
  eventName: "remove_for_cause",
676
+ // authority gate — a member of the pinned authorizedRemovers set must sign; an identity role
677
+ // attestation (BOARD_MEMBER/...) layers on additively when the identity registry lands (§4.2).
614
678
  guard: {
615
- some: [
616
- { var: "state.directors" },
679
+ and: [
680
+ (0, guards_js_1.signerInSet)("state.authorizedRemovers"),
681
+ // the proposal must target this director, and its bound resolution must be EXECUTED
617
682
  {
618
- and: [
619
- { "==": [{ var: ".directorId" }, { var: "event.directorId" }] },
620
- { "==": [{ var: ".status" }, "ACTIVE"] },
683
+ "==": [
684
+ { var: "state.pendingRemoval.directorId" },
685
+ { var: "event.directorId" },
686
+ ],
687
+ },
688
+ (0, guards_js_1.depInState)("state.pendingRemoval.resolutionRef", "EXECUTED"),
689
+ // event.directorId is the lookup key only — the director must exist and be ACTIVE
690
+ {
691
+ some: [
692
+ { var: "state.directors" },
693
+ {
694
+ and: [
695
+ {
696
+ "==": [{ var: "directorId" }, { var: "event.directorId" }],
697
+ },
698
+ { "==": [{ var: "status" }, "ACTIVE"] },
699
+ ],
700
+ },
621
701
  ],
622
702
  },
623
703
  ],
624
704
  },
625
- dependencies: [
626
- {
627
- machine: "corporate-resolution",
628
- instanceRef: { var: "event.removalResolutionRef" },
629
- requiredState: "EXECUTED",
630
- },
631
- ],
632
705
  effect: {
633
706
  merge: [
634
707
  { var: "state" },
@@ -640,7 +713,7 @@ exports.corpBoardDef = (0, fiber_app_js_1.defineFiberApp)({
640
713
  if: [
641
714
  {
642
715
  "==": [
643
- { var: ".directorId" },
716
+ { var: "directorId" },
644
717
  { var: "event.directorId" },
645
718
  ],
646
719
  },
@@ -667,10 +740,17 @@ exports.corpBoardDef = (0, fiber_app_js_1.defineFiberApp)({
667
740
  },
668
741
  ],
669
742
  },
743
+ // clear the consumed proposal
744
+ pendingRemoval: null,
745
+ },
746
+ {
747
+ _emit: [
748
+ { name: "DIRECTOR_REMOVED", data: { var: "event" }, destination: "external" },
749
+ ],
670
750
  },
671
751
  ],
672
752
  },
673
- emits: ["DIRECTOR_REMOVED"],
753
+ dependencies: [],
674
754
  },
675
755
  // ACTIVE -> ACTIVE (designate_chair)
676
756
  {
@@ -682,8 +762,8 @@ exports.corpBoardDef = (0, fiber_app_js_1.defineFiberApp)({
682
762
  { var: "state.directors" },
683
763
  {
684
764
  and: [
685
- { "==": [{ var: ".directorId" }, { var: "event.directorId" }] },
686
- { "==": [{ var: ".status" }, "ACTIVE"] },
765
+ { "==": [{ var: "directorId" }, { var: "event.directorId" }] },
766
+ { "==": [{ var: "status" }, "ACTIVE"] },
687
767
  ],
688
768
  },
689
769
  ],
@@ -701,7 +781,7 @@ exports.corpBoardDef = (0, fiber_app_js_1.defineFiberApp)({
701
781
  {
702
782
  isChair: {
703
783
  "==": [
704
- { var: ".directorId" },
784
+ { var: "directorId" },
705
785
  { var: "event.directorId" },
706
786
  ],
707
787
  },
@@ -763,9 +843,13 @@ exports.corpBoardDef = (0, fiber_app_js_1.defineFiberApp)({
763
843
  quorumCount: 0,
764
844
  },
765
845
  },
846
+ {
847
+ _emit: [
848
+ { name: "BOARD_MEETING_SCHEDULED", data: { var: "event" }, destination: "external" },
849
+ ],
850
+ },
766
851
  ],
767
852
  },
768
- emits: ["BOARD_MEETING_SCHEDULED"],
769
853
  },
770
854
  // ACTIVE -> ACTIVE (record_attendance)
771
855
  {
@@ -782,9 +866,9 @@ exports.corpBoardDef = (0, fiber_app_js_1.defineFiberApp)({
782
866
  {
783
867
  and: [
784
868
  {
785
- "==": [{ var: ".directorId" }, { var: "event.directorId" }],
869
+ "==": [{ var: "directorId" }, { var: "event.directorId" }],
786
870
  },
787
- { "==": [{ var: ".status" }, "ACTIVE"] },
871
+ { "==": [{ var: "status" }, "ACTIVE"] },
788
872
  ],
789
873
  },
790
874
  ],
@@ -800,7 +884,7 @@ exports.corpBoardDef = (0, fiber_app_js_1.defineFiberApp)({
800
884
  { var: "state.currentMeeting" },
801
885
  {
802
886
  attendees: {
803
- cat: [
887
+ merge: [
804
888
  { var: "state.currentMeeting.attendees" },
805
889
  [
806
890
  {
@@ -843,9 +927,13 @@ exports.corpBoardDef = (0, fiber_app_js_1.defineFiberApp)({
843
927
  ],
844
928
  },
845
929
  },
930
+ {
931
+ _emit: [
932
+ { name: "BOARD_MEETING_OPENED", data: { var: "event" }, destination: "external" },
933
+ ],
934
+ },
846
935
  ],
847
936
  },
848
- emits: ["BOARD_MEETING_OPENED"],
849
937
  },
850
938
  // IN_MEETING -> IN_MEETING (director_departs)
851
939
  {
@@ -868,7 +956,7 @@ exports.corpBoardDef = (0, fiber_app_js_1.defineFiberApp)({
868
956
  if: [
869
957
  {
870
958
  "==": [
871
- { var: ".directorId" },
959
+ { var: "directorId" },
872
960
  { var: "event.directorId" },
873
961
  ],
874
962
  },
@@ -900,9 +988,16 @@ exports.corpBoardDef = (0, fiber_app_js_1.defineFiberApp)({
900
988
  eventName: "quorum_lost",
901
989
  guard: { "==": [{ var: "state.currentMeeting.quorumPresent" }, false] },
902
990
  effect: {
903
- merge: [{ var: "state" }, { status: "QUORUM_LOST" }],
991
+ merge: [
992
+ { var: "state" },
993
+ { status: "QUORUM_LOST" },
994
+ {
995
+ _emit: [
996
+ { name: "BOARD_QUORUM_LOST", data: { var: "event" }, destination: "external" },
997
+ ],
998
+ },
999
+ ],
904
1000
  },
905
- emits: ["BOARD_QUORUM_LOST"],
906
1001
  },
907
1002
  // QUORUM_LOST -> IN_MEETING
908
1003
  {
@@ -911,9 +1006,16 @@ exports.corpBoardDef = (0, fiber_app_js_1.defineFiberApp)({
911
1006
  eventName: "quorum_restored",
912
1007
  guard: { "==": [{ var: "state.currentMeeting.quorumPresent" }, true] },
913
1008
  effect: {
914
- merge: [{ var: "state" }, { status: "IN_MEETING" }],
1009
+ merge: [
1010
+ { var: "state" },
1011
+ { status: "IN_MEETING" },
1012
+ {
1013
+ _emit: [
1014
+ { name: "BOARD_QUORUM_RESTORED", data: { var: "event" }, destination: "external" },
1015
+ ],
1016
+ },
1017
+ ],
915
1018
  },
916
- emits: ["BOARD_QUORUM_RESTORED"],
917
1019
  },
918
1020
  // IN_MEETING -> ACTIVE (adjourn)
919
1021
  {
@@ -928,7 +1030,7 @@ exports.corpBoardDef = (0, fiber_app_js_1.defineFiberApp)({
928
1030
  status: "ACTIVE",
929
1031
  currentMeeting: null,
930
1032
  meetingHistory: {
931
- cat: [
1033
+ merge: [
932
1034
  { var: "state.meetingHistory" },
933
1035
  [
934
1036
  {
@@ -946,9 +1048,13 @@ exports.corpBoardDef = (0, fiber_app_js_1.defineFiberApp)({
946
1048
  ],
947
1049
  },
948
1050
  },
1051
+ {
1052
+ _emit: [
1053
+ { name: "BOARD_MEETING_ADJOURNED", data: { var: "event" }, destination: "external" },
1054
+ ],
1055
+ },
949
1056
  ],
950
1057
  },
951
- emits: ["BOARD_MEETING_ADJOURNED"],
952
1058
  },
953
1059
  // QUORUM_LOST -> ACTIVE (adjourn)
954
1060
  {
@@ -963,7 +1069,7 @@ exports.corpBoardDef = (0, fiber_app_js_1.defineFiberApp)({
963
1069
  status: "ACTIVE",
964
1070
  currentMeeting: null,
965
1071
  meetingHistory: {
966
- cat: [
1072
+ merge: [
967
1073
  { var: "state.meetingHistory" },
968
1074
  [
969
1075
  {
@@ -981,9 +1087,13 @@ exports.corpBoardDef = (0, fiber_app_js_1.defineFiberApp)({
981
1087
  ],
982
1088
  },
983
1089
  },
1090
+ {
1091
+ _emit: [
1092
+ { name: "BOARD_MEETING_ADJOURNED", data: { var: "event" }, destination: "external" },
1093
+ ],
1094
+ },
984
1095
  ],
985
1096
  },
986
- emits: ["BOARD_MEETING_ADJOURNED"],
987
1097
  },
988
1098
  // ACTIVE -> ACTIVE (update_seats)
989
1099
  {