@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
@@ -2,701 +2,723 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.corpShareholdersDef = 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
  * Shareholder meeting state machine managing annual/special meetings, record dates, proxy periods, voting, and certification of results.
7
9
  * Supports multiple share classes and cumulative voting.
8
10
  */
9
11
  exports.corpShareholdersDef = (0, fiber_app_js_1.defineFiberApp)({
10
12
  metadata: {
11
- name: "CorpShareholders",
12
- app: "corporate",
13
- type: "shareholders",
14
- version: "1.0.0",
15
- description: "Shareholder meeting state machine managing annual/special meetings, record dates, proxy periods, voting, and certification of results. Supports multiple share classes and cumulative voting.",
13
+ name: 'CorpShareholders',
14
+ app: 'corporate',
15
+ type: 'shareholders',
16
+ version: '1.0.0',
17
+ description: 'Shareholder meeting state machine managing annual/special meetings, record dates, proxy periods, voting, and certification of results. Supports multiple share classes and cumulative voting.',
16
18
  crossReferences: {
17
19
  entity: {
18
- machine: "corporate-entity",
19
- description: "Parent corporate entity",
20
- foreignKey: "entityId",
20
+ machine: 'corporate-entity',
21
+ description: 'Parent corporate entity',
22
+ foreignKey: 'entityId',
21
23
  },
22
24
  proxies: {
23
- machine: "corporate-proxy",
24
- description: "Proxy grants for this meeting",
25
- foreignKey: "meetingId",
25
+ machine: 'corporate-proxy',
26
+ description: 'Proxy grants for this meeting',
27
+ foreignKey: 'meetingId',
26
28
  },
27
29
  resolutions: {
28
- machine: "corporate-resolution",
29
- description: "Resolutions resulting from meeting votes",
30
- foreignKey: "meetingId",
30
+ machine: 'corporate-resolution',
31
+ description: 'Resolutions resulting from meeting votes',
32
+ foreignKey: 'meetingId',
31
33
  },
32
34
  securities: {
33
- machine: "corporate-securities",
34
- description: "Share records for determining voting rights",
35
- foreignKey: "entityId",
35
+ machine: 'corporate-securities',
36
+ description: 'Share records for determining voting rights',
37
+ foreignKey: 'entityId',
36
38
  },
37
39
  },
38
40
  },
39
41
  createSchema: {
40
- required: ["meetingId", "entityId"],
42
+ required: ['meetingId', 'entityId', 'registrar'],
41
43
  properties: {
42
44
  meetingId: {
43
- type: "string",
44
- description: "Unique identifier for this shareholder meeting",
45
+ type: 'string',
46
+ description: 'Unique identifier for this shareholder meeting',
45
47
  immutable: true,
46
48
  },
47
49
  entityId: {
48
- type: "string",
49
- description: "Reference to parent corporate-entity",
50
+ type: 'string',
51
+ description: 'Reference to parent corporate-entity',
52
+ immutable: true,
53
+ },
54
+ registrar: {
55
+ type: 'address',
56
+ description: 'State-pinned DAG address of the transfer agent / registrar authorized to register the eligible-shareholder roster of record. Verified against proofs[].address.',
50
57
  immutable: true,
51
58
  },
52
59
  meetingType: {
53
- type: "string",
54
- enum: ["ANNUAL", "SPECIAL"],
55
- description: "Annual meetings are required; special meetings called for specific purposes",
60
+ type: 'string',
61
+ enum: ['ANNUAL', 'SPECIAL'],
62
+ description: 'Annual meetings are required; special meetings called for specific purposes',
56
63
  },
57
64
  fiscalYear: {
58
- type: "integer",
59
- description: "Fiscal year for annual meetings",
65
+ type: 'integer',
66
+ description: 'Fiscal year for annual meetings',
60
67
  },
61
68
  scheduledDate: {
62
- type: "string",
63
- format: "date-time",
69
+ type: 'string',
70
+ format: 'date-time',
64
71
  },
65
72
  location: {
66
- type: "object",
73
+ type: 'object',
67
74
  properties: {
68
- physical: { type: "string", nullable: true },
69
- virtualUrl: { type: "string", nullable: true },
70
- isHybrid: { type: "boolean", default: false },
75
+ physical: { type: 'string', nullable: true },
76
+ virtualUrl: { type: 'string', nullable: true },
77
+ isHybrid: { type: 'boolean', default: false },
71
78
  },
72
79
  },
73
80
  },
74
81
  },
75
82
  stateSchema: {
76
83
  properties: {
77
- meetingId: { type: "string", immutable: true },
78
- entityId: { type: "string", immutable: true },
79
- meetingType: { type: "string" },
80
- fiscalYear: { type: "integer" },
81
- scheduledDate: { type: "string", format: "date-time" },
82
- location: { type: "object" },
83
- calledBy: { $ref: "#/definitions/CalledBy", computed: true },
84
- noticeInfo: { $ref: "#/definitions/NoticeInfo", computed: true },
84
+ meetingId: { type: 'string', immutable: true },
85
+ entityId: { type: 'string', immutable: true },
86
+ registrar: { type: 'address', immutable: true },
87
+ meetingType: { type: 'string' },
88
+ fiscalYear: { type: 'integer' },
89
+ scheduledDate: { type: 'string', format: 'date-time' },
90
+ location: { type: 'object' },
91
+ calledBy: { $ref: '#/definitions/CalledBy', computed: true },
92
+ noticeInfo: { $ref: '#/definitions/NoticeInfo', computed: true },
85
93
  recordDate: {
86
- $ref: "#/definitions/RecordDate",
94
+ $ref: '#/definitions/RecordDate',
87
95
  nullable: true,
88
96
  computed: true,
89
97
  },
90
98
  eligibleVoters: {
91
- type: "array",
92
- items: { $ref: "#/definitions/EligibleVoter" },
99
+ type: 'array',
100
+ items: { $ref: '#/definitions/EligibleVoter' },
93
101
  computed: true,
94
102
  },
95
103
  quorumRequirements: {
96
- $ref: "#/definitions/QuorumRequirements",
104
+ $ref: '#/definitions/QuorumRequirements',
97
105
  computed: true,
98
106
  },
99
107
  agenda: {
100
- type: "array",
101
- items: { $ref: "#/definitions/AgendaItem" },
108
+ type: 'array',
109
+ items: { $ref: '#/definitions/AgendaItem' },
102
110
  computed: true,
103
111
  },
104
112
  proxyPeriod: {
105
- $ref: "#/definitions/ProxyPeriod",
113
+ $ref: '#/definitions/ProxyPeriod',
106
114
  nullable: true,
107
115
  computed: true,
108
116
  },
109
117
  votes: {
110
- type: "array",
111
- items: { $ref: "#/definitions/Vote" },
118
+ type: 'array',
119
+ items: { $ref: '#/definitions/Vote' },
112
120
  computed: true,
113
121
  },
114
122
  voteTallies: {
115
- type: "array",
116
- items: { $ref: "#/definitions/VoteTally" },
123
+ type: 'array',
124
+ items: { $ref: '#/definitions/VoteTally' },
117
125
  computed: true,
118
126
  },
119
127
  inspectorOfElections: {
120
- $ref: "#/definitions/Inspector",
128
+ $ref: '#/definitions/Inspector',
121
129
  nullable: true,
122
130
  computed: true,
123
131
  },
124
132
  sessionInfo: {
125
- $ref: "#/definitions/SessionInfo",
133
+ $ref: '#/definitions/SessionInfo',
126
134
  nullable: true,
127
135
  computed: true,
128
136
  },
129
137
  certification: {
130
- $ref: "#/definitions/Certification",
138
+ $ref: '#/definitions/Certification',
131
139
  nullable: true,
132
140
  computed: true,
133
141
  },
134
142
  status: {
135
- type: "string",
136
- enum: [
137
- "SCHEDULED",
138
- "RECORD_DATE_SET",
139
- "PROXY_PERIOD",
140
- "IN_SESSION",
141
- "VOTING",
142
- "CLOSED",
143
- ],
143
+ type: 'string',
144
+ enum: ['SCHEDULED', 'RECORD_DATE_SET', 'PROXY_PERIOD', 'IN_SESSION', 'VOTING', 'CLOSED'],
144
145
  computed: true,
145
146
  },
146
- createdAt: { type: "timestamp", computed: true },
147
- updatedAt: { type: "timestamp", computed: true },
147
+ createdAt: { type: 'timestamp', computed: true },
148
+ updatedAt: { type: 'timestamp', computed: true },
149
+ // Two-phase scheduling (#24): propose_schedule_annual binds the board-resolution fiber + records the
150
+ // pending meeting here; schedule_annual asserts the bound resolution is EXECUTED, then clears this.
151
+ pendingschedule_annual: { type: 'object', nullable: true, computed: true },
148
152
  },
149
153
  },
150
154
  eventSchemas: {
155
+ propose_schedule_annual: {
156
+ description: 'Phase 1 of annual-meeting scheduling: bind the executing board-resolution fiber (#24 _addDependency) and record the pending meeting',
157
+ required: ['meetingId', 'entityId', 'fiscalYear', 'scheduledDate', 'boardResolutionRef'],
158
+ properties: {
159
+ meetingId: { type: 'string' },
160
+ entityId: { type: 'string' },
161
+ fiscalYear: { type: 'integer' },
162
+ scheduledDate: { type: 'string', format: 'date-time' },
163
+ location: { type: 'object' },
164
+ boardResolutionRef: { type: 'string' },
165
+ },
166
+ },
151
167
  schedule_annual: {
152
- description: "Schedule an annual shareholder meeting",
153
- required: [
154
- "meetingId",
155
- "entityId",
156
- "fiscalYear",
157
- "scheduledDate",
158
- "boardResolutionRef",
159
- ],
168
+ description: 'Phase 2 of annual-meeting scheduling: execute once the bound board resolution is EXECUTED',
169
+ required: ['meetingId', 'entityId', 'fiscalYear', 'scheduledDate'],
160
170
  properties: {
161
- meetingId: { type: "string" },
162
- entityId: { type: "string" },
163
- fiscalYear: { type: "integer" },
164
- scheduledDate: { type: "string", format: "date-time" },
165
- location: { type: "object" },
166
- boardResolutionRef: { type: "string" },
171
+ meetingId: { type: 'string' },
172
+ entityId: { type: 'string' },
173
+ fiscalYear: { type: 'integer' },
174
+ scheduledDate: { type: 'string', format: 'date-time' },
175
+ location: { type: 'object' },
167
176
  },
168
177
  },
169
178
  schedule_special: {
170
- description: "Schedule a special shareholder meeting",
171
- required: [
172
- "meetingId",
173
- "entityId",
174
- "scheduledDate",
175
- "purpose",
176
- "calledByType",
177
- ],
179
+ description: 'Schedule a special shareholder meeting',
180
+ required: ['meetingId', 'entityId', 'scheduledDate', 'purpose', 'calledByType'],
178
181
  properties: {
179
- meetingId: { type: "string" },
180
- entityId: { type: "string" },
181
- scheduledDate: { type: "string", format: "date-time" },
182
- location: { type: "object" },
182
+ meetingId: { type: 'string' },
183
+ entityId: { type: 'string' },
184
+ scheduledDate: { type: 'string', format: 'date-time' },
185
+ location: { type: 'object' },
183
186
  purpose: {
184
- type: "string",
185
- description: "Specific purpose for special meeting",
187
+ type: 'string',
188
+ description: 'Specific purpose for special meeting',
186
189
  },
187
190
  calledByType: {
188
- type: "string",
189
- enum: ["BOARD", "SHAREHOLDERS", "COURT"],
191
+ type: 'string',
192
+ enum: ['BOARD', 'SHAREHOLDERS', 'COURT'],
190
193
  },
191
- resolutionRef: { type: "string" },
192
- petitionRef: { type: "string" },
194
+ resolutionRef: { type: 'string' },
195
+ petitionRef: { type: 'string' },
193
196
  },
194
197
  },
195
198
  set_record_date: {
196
- description: "Board sets the record date for determining eligible shareholders",
197
- required: ["recordDate", "resolutionRef"],
199
+ description: 'Board sets the record date for determining eligible shareholders',
200
+ required: ['recordDate', 'resolutionRef'],
198
201
  properties: {
199
- recordDate: { type: "string", format: "date" },
200
- resolutionRef: { type: "string" },
202
+ recordDate: { type: 'string', format: 'date' },
203
+ resolutionRef: { type: 'string' },
201
204
  },
202
205
  },
203
206
  register_eligible_shareholders: {
204
- description: "Register shareholders of record as of record date",
205
- required: ["shareholders", "totalSharesOutstanding"],
207
+ description: 'Register shareholders of record as of record date',
208
+ required: ['shareholders', 'totalSharesOutstanding'],
206
209
  properties: {
207
210
  shareholders: {
208
- type: "array",
211
+ type: 'array',
209
212
  items: {
210
- type: "object",
213
+ type: 'object',
211
214
  properties: {
212
- shareholderId: { type: "string" },
213
- name: { type: "string" },
214
- shareholdings: { type: "array" },
215
+ shareholderId: { type: 'string' },
216
+ name: { type: 'string' },
217
+ address: {
218
+ type: 'address',
219
+ description: 'DAG wallet address of record for this shareholder; the only key a verified signer can vote under.',
220
+ },
221
+ shareholdings: { type: 'array' },
215
222
  },
216
223
  },
217
224
  },
218
- totalSharesOutstanding: { type: "integer" },
225
+ totalSharesOutstanding: { type: 'integer' },
219
226
  },
220
227
  },
221
228
  open_proxy_period: {
222
- description: "Distribute proxy materials and open proxy solicitation period",
223
- required: [
224
- "startDate",
225
- "proxyStatementRef",
226
- "formOfProxyRef",
227
- "agenda",
228
- ],
229
+ description: 'Distribute proxy materials and open proxy solicitation period',
230
+ required: ['startDate', 'proxyStatementRef', 'formOfProxyRef', 'agenda'],
229
231
  properties: {
230
- startDate: { type: "string", format: "date" },
231
- proxyStatementRef: { type: "string" },
232
- formOfProxyRef: { type: "string" },
233
- annualReportRef: { type: "string" },
234
- agenda: { type: "array" },
232
+ startDate: { type: 'string', format: 'date' },
233
+ proxyStatementRef: { type: 'string' },
234
+ formOfProxyRef: { type: 'string' },
235
+ annualReportRef: { type: 'string' },
236
+ agenda: { type: 'array' },
235
237
  },
236
238
  },
237
239
  add_agenda_item: {
238
- description: "Add an item to the meeting agenda (e.g., shareholder proposal)",
239
- required: ["itemId", "title", "type", "voteRequired"],
240
+ description: 'Add an item to the meeting agenda (e.g., shareholder proposal)',
241
+ required: ['itemId', 'title', 'type', 'voteRequired'],
240
242
  properties: {
241
- itemId: { type: "string" },
242
- title: { type: "string" },
243
- description: { type: "string" },
244
- type: { type: "string" },
245
- voteRequired: { type: "string" },
246
- eligibleClasses: { type: "array", items: { type: "string" } },
247
- allowCumulativeVoting: { type: "boolean", default: false },
243
+ itemId: { type: 'string' },
244
+ title: { type: 'string' },
245
+ description: { type: 'string' },
246
+ type: { type: 'string' },
247
+ voteRequired: { type: 'string' },
248
+ eligibleClasses: { type: 'array', items: { type: 'string' } },
249
+ allowCumulativeVoting: { type: 'boolean', default: false },
248
250
  },
249
251
  },
250
252
  open_meeting: {
251
- description: "Convene the shareholder meeting",
252
- required: [
253
- "openedAt",
254
- "chairPerson",
255
- "secretaryPresent",
256
- "initialQuorumCount",
257
- ],
253
+ description: 'Convene the shareholder meeting',
254
+ required: ['openedAt', 'chairPerson', 'secretaryPresent', 'initialQuorumCount'],
258
255
  properties: {
259
- openedAt: { type: "string", format: "date-time" },
260
- chairPerson: { type: "string" },
261
- secretaryPresent: { type: "string" },
262
- inspectorOfElections: { type: "object" },
263
- initialQuorumCount: { type: "integer" },
256
+ openedAt: { type: 'string', format: 'date-time' },
257
+ chairPerson: { type: 'string' },
258
+ secretaryPresent: { type: 'string' },
259
+ inspectorOfElections: { type: 'object' },
260
+ initialQuorumCount: { type: 'integer' },
264
261
  },
265
262
  },
266
263
  open_polls: {
267
- description: "Open polls for voting on agenda items",
268
- required: ["pollsOpenedAt"],
264
+ description: 'Open polls for voting on agenda items',
265
+ required: ['pollsOpenedAt'],
269
266
  properties: {
270
- pollsOpenedAt: { type: "string", format: "date-time" },
267
+ pollsOpenedAt: { type: 'string', format: 'date-time' },
271
268
  },
272
269
  },
273
270
  cast_vote: {
274
- description: "Record a vote from a shareholder or proxy holder",
275
- required: [
276
- "voteId",
277
- "agendaItemId",
278
- "voterId",
279
- "shareholderId",
280
- "shareClass",
281
- ],
271
+ description: 'Record a vote from a shareholder or proxy holder',
272
+ required: ['voteId', 'agendaItemId', 'voterId', 'shareholderId', 'shareClass'],
282
273
  properties: {
283
- voteId: { type: "string" },
284
- agendaItemId: { type: "string" },
285
- voterId: { type: "string" },
286
- shareholderId: { type: "string" },
287
- shareClass: { type: "string" },
288
- votesFor: { type: "integer", default: 0 },
289
- votesAgainst: { type: "integer", default: 0 },
290
- votesAbstain: { type: "integer", default: 0 },
291
- votesWithhold: { type: "integer", default: 0 },
292
- cumulativeVoteAllocation: { type: "object", nullable: true },
293
- viaProxy: { type: "boolean", default: false },
274
+ voteId: { type: 'string' },
275
+ agendaItemId: { type: 'string' },
276
+ voterId: { type: 'string' },
277
+ shareholderId: { type: 'string' },
278
+ shareClass: { type: 'string' },
279
+ votesFor: { type: 'integer', default: 0 },
280
+ votesAgainst: { type: 'integer', default: 0 },
281
+ votesAbstain: { type: 'integer', default: 0 },
282
+ votesWithhold: { type: 'integer', default: 0 },
283
+ cumulativeVoteAllocation: { type: 'object', nullable: true },
284
+ viaProxy: { type: 'boolean', default: false },
294
285
  },
295
286
  },
296
287
  close_polls: {
297
- description: "Close polls and begin vote tabulation",
298
- required: ["pollsClosedAt"],
288
+ description: 'Close polls and begin vote tabulation',
289
+ required: ['pollsClosedAt'],
299
290
  properties: {
300
- pollsClosedAt: { type: "string", format: "date-time" },
291
+ pollsClosedAt: { type: 'string', format: 'date-time' },
301
292
  },
302
293
  },
303
294
  certify_results: {
304
- description: "Inspector of elections certifies vote results",
305
- required: ["certifiedAt", "certifiedBy", "certificateRef"],
295
+ description: 'Inspector of elections certifies vote results',
296
+ required: ['certifiedAt', 'certifiedBy', 'certificateRef'],
306
297
  properties: {
307
- certifiedAt: { type: "string", format: "date-time" },
308
- certifiedBy: { type: "string" },
309
- certificateRef: { type: "string" },
298
+ certifiedAt: { type: 'string', format: 'date-time' },
299
+ certifiedBy: { type: 'string' },
300
+ certificateRef: { type: 'string' },
310
301
  results: {
311
- type: "array",
302
+ type: 'array',
312
303
  items: {
313
- type: "object",
304
+ type: 'object',
314
305
  properties: {
315
- agendaItemId: { type: "string" },
306
+ agendaItemId: { type: 'string' },
316
307
  result: {
317
- type: "string",
318
- enum: ["APPROVED", "REJECTED"],
308
+ type: 'string',
309
+ enum: ['APPROVED', 'REJECTED'],
319
310
  },
320
311
  },
321
312
  },
322
313
  },
323
- minutesRef: { type: "string" },
314
+ minutesRef: { type: 'string' },
324
315
  },
325
316
  },
326
317
  adjourn_without_action: {
327
- description: "Adjourn meeting without completing agenda (e.g., quorum lost)",
328
- required: ["adjournedAt", "reason"],
318
+ description: 'Adjourn meeting without completing agenda (e.g., quorum lost)',
319
+ required: ['adjournedAt', 'reason'],
329
320
  properties: {
330
- adjournedAt: { type: "string", format: "date-time" },
331
- reason: { type: "string" },
332
- adjournedTo: { type: "string", format: "date-time", nullable: true },
321
+ adjournedAt: { type: 'string', format: 'date-time' },
322
+ reason: { type: 'string' },
323
+ adjournedTo: { type: 'string', format: 'date-time', nullable: true },
333
324
  },
334
325
  },
335
326
  },
336
327
  definitions: {
337
328
  CalledBy: {
338
- type: "object",
329
+ type: 'object',
339
330
  properties: {
340
331
  type: {
341
- type: "string",
342
- enum: ["BOARD", "SHAREHOLDERS", "COURT"],
332
+ type: 'string',
333
+ enum: ['BOARD', 'SHAREHOLDERS', 'COURT'],
343
334
  },
344
- resolutionRef: { type: "string", nullable: true },
345
- shareholderPetitionRef: { type: "string", nullable: true },
346
- courtOrderRef: { type: "string", nullable: true },
335
+ resolutionRef: { type: 'string', nullable: true },
336
+ shareholderPetitionRef: { type: 'string', nullable: true },
337
+ courtOrderRef: { type: 'string', nullable: true },
347
338
  },
348
339
  },
349
340
  NoticeInfo: {
350
- type: "object",
341
+ type: 'object',
351
342
  properties: {
352
- noticeSentDate: { type: "string", format: "date" },
343
+ noticeSentDate: { type: 'string', format: 'date' },
353
344
  noticeMethod: {
354
- type: "string",
355
- enum: ["MAIL", "EMAIL", "ELECTRONIC_ACCESS"],
345
+ type: 'string',
346
+ enum: ['MAIL', 'EMAIL', 'ELECTRONIC_ACCESS'],
356
347
  },
357
- minimumNoticeDays: { type: "integer", default: 10 },
358
- maximumNoticeDays: { type: "integer", default: 60 },
348
+ minimumNoticeDays: { type: 'integer', default: 10 },
349
+ maximumNoticeDays: { type: 'integer', default: 60 },
359
350
  },
360
351
  },
361
352
  RecordDate: {
362
- type: "object",
353
+ type: 'object',
363
354
  nullable: true,
364
355
  properties: {
365
- date: { type: "string", format: "date" },
366
- setByBoardOn: { type: "string", format: "date" },
367
- resolutionRef: { type: "string" },
356
+ date: { type: 'string', format: 'date' },
357
+ setByBoardOn: { type: 'string', format: 'date' },
358
+ resolutionRef: { type: 'string' },
368
359
  },
369
360
  },
370
361
  EligibleVoter: {
371
- type: "object",
362
+ type: 'object',
372
363
  properties: {
373
- shareholderId: { type: "string" },
374
- name: { type: "string" },
364
+ shareholderId: { type: 'string' },
365
+ name: { type: 'string' },
366
+ address: {
367
+ type: 'address',
368
+ description: 'State-pinned DAG wallet address of record; cast_vote requires this address ∈ proofs[].address.',
369
+ },
375
370
  shareholdings: {
376
- type: "array",
371
+ type: 'array',
377
372
  items: {
378
- type: "object",
373
+ type: 'object',
379
374
  properties: {
380
- shareClass: { type: "string" },
381
- shares: { type: "integer" },
375
+ shareClass: { type: 'string' },
376
+ shares: { type: 'integer' },
382
377
  votes: {
383
- type: "integer",
384
- description: "Votes this holding represents",
378
+ type: 'integer',
379
+ description: 'Votes this holding represents',
385
380
  },
386
381
  },
387
382
  },
388
383
  },
389
- totalVotes: { type: "integer" },
384
+ totalVotes: { type: 'integer' },
390
385
  proxyGrantedTo: {
391
- type: "string",
386
+ type: 'string',
392
387
  nullable: true,
393
- description: "Proxy holder ID if proxied",
388
+ description: 'Proxy holder ID if proxied',
394
389
  },
395
- hasVoted: { type: "boolean", default: false },
390
+ hasVoted: { type: 'boolean', default: false },
396
391
  },
397
392
  },
398
393
  QuorumRequirements: {
399
- type: "object",
394
+ type: 'object',
400
395
  properties: {
401
396
  type: {
402
- type: "string",
403
- enum: ["SHARES_REPRESENTED", "SHARES_OUTSTANDING"],
397
+ type: 'string',
398
+ enum: ['SHARES_REPRESENTED', 'SHARES_OUTSTANDING'],
404
399
  },
405
400
  threshold: {
406
- type: "number",
401
+ type: 'number',
407
402
  default: 0.5,
408
- description: "Fraction required for quorum",
403
+ description: 'Fraction required for quorum',
409
404
  },
410
- sharesRequired: { type: "integer" },
411
- sharesRepresented: { type: "integer", default: 0 },
412
- quorumMet: { type: "boolean", default: false },
405
+ sharesRequired: { type: 'integer' },
406
+ sharesRepresented: { type: 'integer', default: 0 },
407
+ quorumMet: { type: 'boolean', default: false },
413
408
  },
414
409
  },
415
410
  AgendaItem: {
416
- type: "object",
411
+ type: 'object',
417
412
  properties: {
418
- itemId: { type: "string" },
419
- itemNumber: { type: "integer" },
420
- title: { type: "string" },
421
- description: { type: "string" },
413
+ itemId: { type: 'string' },
414
+ itemNumber: { type: 'integer' },
415
+ title: { type: 'string' },
416
+ description: { type: 'string' },
422
417
  type: {
423
- type: "string",
418
+ type: 'string',
424
419
  enum: [
425
- "DIRECTOR_ELECTION",
426
- "AUDITOR_RATIFICATION",
427
- "SAY_ON_PAY",
428
- "CHARTER_AMENDMENT",
429
- "MERGER",
430
- "STOCK_PLAN",
431
- "SHAREHOLDER_PROPOSAL",
432
- "OTHER",
420
+ 'DIRECTOR_ELECTION',
421
+ 'AUDITOR_RATIFICATION',
422
+ 'SAY_ON_PAY',
423
+ 'CHARTER_AMENDMENT',
424
+ 'MERGER',
425
+ 'STOCK_PLAN',
426
+ 'SHAREHOLDER_PROPOSAL',
427
+ 'OTHER',
433
428
  ],
434
429
  },
435
430
  voteRequired: {
436
- type: "string",
437
- enum: [
438
- "PLURALITY",
439
- "MAJORITY_CAST",
440
- "MAJORITY_OUTSTANDING",
441
- "SUPERMAJORITY",
442
- "UNANIMOUS",
443
- ],
444
- description: "Vote threshold for approval",
431
+ type: 'string',
432
+ enum: ['PLURALITY', 'MAJORITY_CAST', 'MAJORITY_OUTSTANDING', 'SUPERMAJORITY', 'UNANIMOUS'],
433
+ description: 'Vote threshold for approval',
445
434
  },
446
- supermajorityThreshold: { type: "number", nullable: true },
435
+ supermajorityThreshold: { type: 'number', nullable: true },
447
436
  eligibleClasses: {
448
- type: "array",
449
- items: { type: "string" },
450
- description: "Share classes that can vote on this item",
437
+ type: 'array',
438
+ items: { type: 'string' },
439
+ description: 'Share classes that can vote on this item',
451
440
  },
452
441
  allowCumulativeVoting: {
453
- type: "boolean",
442
+ type: 'boolean',
454
443
  default: false,
455
- description: "For director elections",
444
+ description: 'For director elections',
456
445
  },
457
446
  status: {
458
- type: "string",
459
- enum: [
460
- "PENDING",
461
- "VOTING",
462
- "CLOSED",
463
- "APPROVED",
464
- "REJECTED",
465
- ],
447
+ type: 'string',
448
+ enum: ['PENDING', 'VOTING', 'CLOSED', 'APPROVED', 'REJECTED'],
466
449
  },
467
450
  },
468
451
  },
469
452
  ProxyPeriod: {
470
- type: "object",
453
+ type: 'object',
471
454
  nullable: true,
472
455
  properties: {
473
- startDate: { type: "string", format: "date" },
456
+ startDate: { type: 'string', format: 'date' },
474
457
  endDate: {
475
- type: "string",
476
- format: "date-time",
477
- description: "Usually meeting start time",
458
+ type: 'string',
459
+ format: 'date-time',
460
+ description: 'Usually meeting start time',
478
461
  },
479
462
  proxyMaterials: {
480
- type: "object",
463
+ type: 'object',
481
464
  properties: {
482
- proxyStatementRef: { type: "string" },
483
- formOfProxyRef: { type: "string" },
484
- annualReportRef: { type: "string", nullable: true },
465
+ proxyStatementRef: { type: 'string' },
466
+ formOfProxyRef: { type: 'string' },
467
+ annualReportRef: { type: 'string', nullable: true },
485
468
  },
486
469
  },
487
470
  },
488
471
  },
489
472
  Vote: {
490
- type: "object",
473
+ type: 'object',
491
474
  properties: {
492
- voteId: { type: "string" },
493
- agendaItemId: { type: "string" },
475
+ voteId: { type: 'string' },
476
+ agendaItemId: { type: 'string' },
494
477
  voterId: {
495
- type: "string",
496
- description: "Shareholder or proxy holder ID",
478
+ type: 'string',
479
+ description: 'Shareholder or proxy holder ID',
497
480
  },
498
- shareholderId: { type: "string", description: "Beneficial owner" },
499
- shareClass: { type: "string" },
500
- votesFor: { type: "integer", default: 0 },
501
- votesAgainst: { type: "integer", default: 0 },
502
- votesAbstain: { type: "integer", default: 0 },
481
+ shareholderId: { type: 'string', description: 'Beneficial owner' },
482
+ shareClass: { type: 'string' },
483
+ votesFor: { type: 'integer', default: 0 },
484
+ votesAgainst: { type: 'integer', default: 0 },
485
+ votesAbstain: { type: 'integer', default: 0 },
503
486
  votesWithhold: {
504
- type: "integer",
487
+ type: 'integer',
505
488
  default: 0,
506
- description: "For director elections",
489
+ description: 'For director elections',
507
490
  },
508
491
  cumulativeVoteAllocation: {
509
- type: "object",
510
- additionalProperties: { type: "integer" },
492
+ type: 'object',
493
+ additionalProperties: { type: 'integer' },
511
494
  nullable: true,
512
- description: "For cumulative voting: candidate ID -> votes allocated",
495
+ description: 'For cumulative voting: candidate ID -> votes allocated',
513
496
  },
514
- viaProxy: { type: "boolean", default: false },
515
- timestamp: { type: "string", format: "date-time" },
497
+ viaProxy: { type: 'boolean', default: false },
498
+ timestamp: { type: 'string', format: 'date-time' },
516
499
  },
517
500
  },
518
501
  VoteTally: {
519
- type: "object",
502
+ type: 'object',
520
503
  properties: {
521
- agendaItemId: { type: "string" },
522
- forVotes: { type: "integer", default: 0 },
523
- againstVotes: { type: "integer", default: 0 },
524
- abstainVotes: { type: "integer", default: 0 },
525
- withholdVotes: { type: "integer", default: 0 },
526
- brokerNonVotes: { type: "integer", default: 0 },
504
+ agendaItemId: { type: 'string' },
505
+ forVotes: { type: 'integer', default: 0 },
506
+ againstVotes: { type: 'integer', default: 0 },
507
+ abstainVotes: { type: 'integer', default: 0 },
508
+ withholdVotes: { type: 'integer', default: 0 },
509
+ brokerNonVotes: { type: 'integer', default: 0 },
527
510
  candidateVotes: {
528
- type: "object",
529
- additionalProperties: { type: "integer" },
511
+ type: 'object',
512
+ additionalProperties: { type: 'integer' },
530
513
  nullable: true,
531
- description: "For director elections: candidate ID -> total votes",
514
+ description: 'For director elections: candidate ID -> total votes',
532
515
  },
533
516
  result: {
534
- type: "string",
535
- enum: ["APPROVED", "REJECTED", "PENDING"],
517
+ type: 'string',
518
+ enum: ['APPROVED', 'REJECTED', 'PENDING'],
536
519
  },
537
- certified: { type: "boolean", default: false },
520
+ certified: { type: 'boolean', default: false },
538
521
  },
539
522
  },
540
523
  Inspector: {
541
- type: "object",
524
+ type: 'object',
542
525
  nullable: true,
543
526
  properties: {
544
- name: { type: "string" },
545
- company: { type: "string", nullable: true },
546
- appointedBy: { type: "string" },
547
- appointmentDate: { type: "string", format: "date" },
527
+ name: { type: 'string' },
528
+ company: { type: 'string', nullable: true },
529
+ appointedBy: { type: 'string' },
530
+ appointmentDate: { type: 'string', format: 'date' },
548
531
  },
549
532
  },
550
533
  SessionInfo: {
551
- type: "object",
534
+ type: 'object',
552
535
  nullable: true,
553
536
  properties: {
554
- openedAt: { type: "string", format: "date-time" },
555
- chairPerson: { type: "string" },
556
- secretaryPresent: { type: "string" },
557
- pollsOpenedAt: { type: "string", format: "date-time", nullable: true },
558
- pollsClosedAt: { type: "string", format: "date-time", nullable: true },
559
- adjournedAt: { type: "string", format: "date-time", nullable: true },
560
- minutesRef: { type: "string", nullable: true },
537
+ openedAt: { type: 'string', format: 'date-time' },
538
+ chairPerson: { type: 'string' },
539
+ secretaryPresent: { type: 'string' },
540
+ pollsOpenedAt: { type: 'string', format: 'date-time', nullable: true },
541
+ pollsClosedAt: { type: 'string', format: 'date-time', nullable: true },
542
+ adjournedAt: { type: 'string', format: 'date-time', nullable: true },
543
+ minutesRef: { type: 'string', nullable: true },
561
544
  },
562
545
  },
563
546
  Certification: {
564
- type: "object",
547
+ type: 'object',
565
548
  nullable: true,
566
549
  properties: {
567
- certifiedAt: { type: "string", format: "date-time" },
568
- certifiedBy: { type: "string" },
569
- certificateRef: { type: "string" },
550
+ certifiedAt: { type: 'string', format: 'date-time' },
551
+ certifiedBy: { type: 'string' },
552
+ certificateRef: { type: 'string' },
570
553
  },
571
554
  },
572
555
  },
573
556
  states: {
574
557
  SCHEDULED: {
575
- id: "SCHEDULED",
558
+ id: 'SCHEDULED',
576
559
  isFinal: false,
577
- description: "Meeting has been scheduled but record date not yet set",
560
+ description: 'Meeting has been scheduled but record date not yet set',
578
561
  },
579
562
  RECORD_DATE_SET: {
580
- id: "RECORD_DATE_SET",
563
+ id: 'RECORD_DATE_SET',
581
564
  isFinal: false,
582
- description: "Record date established; eligible shareholders determined",
565
+ description: 'Record date established; eligible shareholders determined',
583
566
  },
584
567
  PROXY_PERIOD: {
585
- id: "PROXY_PERIOD",
568
+ id: 'PROXY_PERIOD',
586
569
  isFinal: false,
587
- description: "Proxy materials distributed; shareholders may submit proxies",
570
+ description: 'Proxy materials distributed; shareholders may submit proxies',
588
571
  },
589
572
  IN_SESSION: {
590
- id: "IN_SESSION",
573
+ id: 'IN_SESSION',
591
574
  isFinal: false,
592
- description: "Meeting is convened and in progress",
575
+ description: 'Meeting is convened and in progress',
593
576
  },
594
577
  VOTING: {
595
- id: "VOTING",
578
+ id: 'VOTING',
596
579
  isFinal: false,
597
- description: "Polls are open for voting on agenda items",
580
+ description: 'Polls are open for voting on agenda items',
598
581
  },
599
582
  CLOSED: {
600
- id: "CLOSED",
583
+ id: 'CLOSED',
601
584
  isFinal: true,
602
- description: "Meeting concluded; results certified",
585
+ description: 'Meeting concluded; results certified',
603
586
  },
604
587
  },
605
- initialState: "SCHEDULED",
588
+ initialState: 'SCHEDULED',
606
589
  transitions: [
607
590
  // Initial creation transitions (from: null means creation)
608
- // schedule_annual -> SCHEDULED
591
+ // SCHEDULED -> SCHEDULED (propose_schedule_annual) — phase 1 (#24): bind the executing board-resolution
592
+ // fiber and record the pending meeting, so the next transition can read the resolution's state.
609
593
  {
610
- from: "SCHEDULED",
611
- to: "SCHEDULED",
612
- eventName: "schedule_annual",
613
- guard: { "==": [1, 1] },
614
- dependencies: [
615
- {
616
- machine: "corporate-resolution",
617
- instanceRef: { var: "event.boardResolutionRef" },
618
- requiredState: "EXECUTED",
619
- },
620
- ],
594
+ from: 'SCHEDULED',
595
+ to: 'SCHEDULED',
596
+ eventName: 'propose_schedule_annual',
597
+ guard: { '==': [1, 1] },
598
+ effect: {
599
+ merge: [
600
+ { var: 'state' },
601
+ {
602
+ pendingschedule_annual: {
603
+ meetingId: { var: 'event.meetingId' },
604
+ entityId: { var: 'event.entityId' },
605
+ fiscalYear: { var: 'event.fiscalYear' },
606
+ scheduledDate: { var: 'event.scheduledDate' },
607
+ location: { var: 'event.location' },
608
+ ref: { var: 'event.boardResolutionRef' },
609
+ proposedAt: { var: '$ordinal' },
610
+ },
611
+ },
612
+ // bind the resolution fiber so schedule_annual can assert its state next transition
613
+ (0, effects_js_1.addDependency)({ var: 'event.boardResolutionRef' }),
614
+ ],
615
+ },
616
+ dependencies: [],
617
+ },
618
+ // SCHEDULED -> SCHEDULED (schedule_annual) — phase 2 (#24): execute once the bound board resolution is
619
+ // EXECUTED. depInState replaces the dropped object-form dependency (which silently never gated).
620
+ {
621
+ from: 'SCHEDULED',
622
+ to: 'SCHEDULED',
623
+ eventName: 'schedule_annual',
624
+ guard: {
625
+ and: [
626
+ // the proposal must target this meeting, and its bound resolution must be EXECUTED
627
+ {
628
+ '==': [{ var: 'state.pendingschedule_annual.meetingId' }, { var: 'event.meetingId' }],
629
+ },
630
+ (0, guards_js_1.depInState)('state.pendingschedule_annual.ref', 'EXECUTED'),
631
+ ],
632
+ },
621
633
  effect: {
622
634
  merge: [
623
- { var: "state" },
635
+ { var: 'state' },
624
636
  {
625
- meetingId: { var: "event.meetingId" },
626
- entityId: { var: "event.entityId" },
627
- meetingType: "ANNUAL",
628
- fiscalYear: { var: "event.fiscalYear" },
629
- scheduledDate: { var: "event.scheduledDate" },
630
- location: { var: "event.location" },
637
+ meetingId: { var: 'event.meetingId' },
638
+ entityId: { var: 'event.entityId' },
639
+ meetingType: 'ANNUAL',
640
+ fiscalYear: { var: 'event.fiscalYear' },
641
+ scheduledDate: { var: 'event.scheduledDate' },
642
+ location: { var: 'event.location' },
631
643
  calledBy: {
632
- type: "BOARD",
633
- resolutionRef: { var: "event.boardResolutionRef" },
644
+ type: 'BOARD',
645
+ resolutionRef: { var: 'state.pendingschedule_annual.ref' },
634
646
  },
647
+ // clear the consumed proposal
648
+ pendingschedule_annual: null,
649
+ },
650
+ {
651
+ _emit: [{ name: 'SHAREHOLDER_MEETING_SCHEDULED', data: { var: 'event' }, destination: 'external' }],
635
652
  },
636
653
  ],
637
654
  },
638
- emits: ["SHAREHOLDER_MEETING_SCHEDULED"],
655
+ dependencies: [],
639
656
  },
640
657
  // schedule_special -> SCHEDULED
641
658
  {
642
- from: "SCHEDULED",
643
- to: "SCHEDULED",
644
- eventName: "schedule_special",
645
- guard: { "==": [1, 1] },
659
+ from: 'SCHEDULED',
660
+ to: 'SCHEDULED',
661
+ eventName: 'schedule_special',
662
+ guard: { '==': [1, 1] },
646
663
  effect: {
647
664
  merge: [
648
- { var: "state" },
665
+ { var: 'state' },
649
666
  {
650
- meetingId: { var: "event.meetingId" },
651
- entityId: { var: "event.entityId" },
652
- meetingType: "SPECIAL",
653
- scheduledDate: { var: "event.scheduledDate" },
667
+ meetingId: { var: 'event.meetingId' },
668
+ entityId: { var: 'event.entityId' },
669
+ meetingType: 'SPECIAL',
670
+ scheduledDate: { var: 'event.scheduledDate' },
654
671
  calledBy: {
655
- type: { var: "event.calledByType" },
672
+ type: { var: 'event.calledByType' },
656
673
  },
657
674
  },
675
+ {
676
+ _emit: [{ name: 'SPECIAL_MEETING_SCHEDULED', data: { var: 'event' }, destination: 'external' }],
677
+ },
658
678
  ],
659
679
  },
660
- emits: ["SPECIAL_MEETING_SCHEDULED"],
661
680
  },
662
681
  // SCHEDULED -> RECORD_DATE_SET
663
682
  {
664
- from: "SCHEDULED",
665
- to: "RECORD_DATE_SET",
666
- eventName: "set_record_date",
667
- guard: { "==": [1, 1] }, // validRecordDateTiming simplified
683
+ from: 'SCHEDULED',
684
+ to: 'RECORD_DATE_SET',
685
+ eventName: 'set_record_date',
686
+ guard: { '==': [1, 1] }, // validRecordDateTiming simplified
668
687
  effect: {
669
688
  merge: [
670
- { var: "state" },
689
+ { var: 'state' },
671
690
  {
672
- status: "RECORD_DATE_SET",
691
+ status: 'RECORD_DATE_SET',
673
692
  recordDate: {
674
- date: { var: "event.recordDate" },
675
- setByBoardOn: { var: "$timestamp" },
676
- resolutionRef: { var: "event.resolutionRef" },
693
+ date: { var: 'event.recordDate' },
694
+ setByBoardOn: { var: '$ordinal' },
695
+ resolutionRef: { var: 'event.resolutionRef' },
677
696
  },
678
697
  },
698
+ {
699
+ _emit: [{ name: 'RECORD_DATE_SET', data: { var: 'event' }, destination: 'external' }],
700
+ },
679
701
  ],
680
702
  },
681
- emits: ["RECORD_DATE_SET"],
682
703
  },
683
704
  // RECORD_DATE_SET -> RECORD_DATE_SET (register_eligible_shareholders)
684
705
  {
685
- from: "RECORD_DATE_SET",
686
- to: "RECORD_DATE_SET",
687
- eventName: "register_eligible_shareholders",
688
- guard: { "==": [1, 1] },
706
+ from: 'RECORD_DATE_SET',
707
+ to: 'RECORD_DATE_SET',
708
+ eventName: 'register_eligible_shareholders',
709
+ // authority gate only the pinned registrar may set the roster of record; an identity role attestation (ISSUER/BOARD_MEMBER/...) layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
710
+ guard: (0, guards_js_1.signerIsParty)('state.registrar'),
689
711
  effect: {
690
712
  merge: [
691
- { var: "state" },
713
+ { var: 'state' },
692
714
  {
693
- eligibleVoters: { var: "event.shareholders" },
715
+ eligibleVoters: { var: 'event.shareholders' },
694
716
  quorumRequirements: {
695
717
  merge: [
696
- { var: "state.quorumRequirements" },
718
+ { var: 'state.quorumRequirements' },
697
719
  {
698
720
  sharesRequired: {
699
- "*": [{ var: "event.totalSharesOutstanding" }, 0.5],
721
+ '*': [{ var: 'event.totalSharesOutstanding' }, 0.5],
700
722
  },
701
723
  },
702
724
  ],
@@ -707,62 +729,61 @@ exports.corpShareholdersDef = (0, fiber_app_js_1.defineFiberApp)({
707
729
  },
708
730
  // RECORD_DATE_SET -> PROXY_PERIOD
709
731
  {
710
- from: "RECORD_DATE_SET",
711
- to: "PROXY_PERIOD",
712
- eventName: "open_proxy_period",
713
- guard: { "==": [1, 1] },
732
+ from: 'RECORD_DATE_SET',
733
+ to: 'PROXY_PERIOD',
734
+ eventName: 'open_proxy_period',
735
+ guard: { '==': [1, 1] },
714
736
  effect: {
715
737
  merge: [
716
- { var: "state" },
738
+ { var: 'state' },
717
739
  {
718
- status: "PROXY_PERIOD",
740
+ status: 'PROXY_PERIOD',
719
741
  proxyPeriod: {
720
- startDate: { var: "event.startDate" },
721
- endDate: { var: "state.scheduledDate" },
742
+ startDate: { var: 'event.startDate' },
743
+ endDate: { var: 'state.scheduledDate' },
722
744
  proxyMaterials: {
723
- proxyStatementRef: { var: "event.proxyStatementRef" },
724
- formOfProxyRef: { var: "event.formOfProxyRef" },
725
- annualReportRef: { var: "event.annualReportRef" },
745
+ proxyStatementRef: { var: 'event.proxyStatementRef' },
746
+ formOfProxyRef: { var: 'event.formOfProxyRef' },
747
+ annualReportRef: { var: 'event.annualReportRef' },
726
748
  },
727
749
  },
728
- agenda: { var: "event.agenda" },
750
+ agenda: { var: 'event.agenda' },
729
751
  noticeInfo: {
730
- merge: [
731
- { var: "state.noticeInfo" },
732
- { noticeSentDate: { var: "event.startDate" } },
733
- ],
752
+ merge: [{ var: 'state.noticeInfo' }, { noticeSentDate: { var: 'event.startDate' } }],
734
753
  },
735
754
  },
755
+ {
756
+ _emit: [{ name: 'PROXY_PERIOD_OPENED', data: { var: 'event' }, destination: 'external' }],
757
+ },
736
758
  ],
737
759
  },
738
- emits: ["PROXY_PERIOD_OPENED"],
739
760
  },
740
761
  // add_agenda_item (can be from multiple states)
741
762
  {
742
- from: "SCHEDULED",
743
- to: "SCHEDULED",
744
- eventName: "add_agenda_item",
745
- guard: { "==": [1, 1] },
763
+ from: 'SCHEDULED',
764
+ to: 'SCHEDULED',
765
+ eventName: 'add_agenda_item',
766
+ guard: { '==': [1, 1] },
746
767
  effect: {
747
768
  merge: [
748
- { var: "state" },
769
+ { var: 'state' },
749
770
  {
750
771
  agenda: {
751
- cat: [
752
- { var: "state.agenda" },
772
+ merge: [
773
+ { var: 'state.agenda' },
753
774
  [
754
775
  {
755
- itemId: { var: "event.itemId" },
756
- itemNumber: { "+": [{ var: "state.agenda.length" }, 1] },
757
- title: { var: "event.title" },
758
- description: { var: "event.description" },
759
- type: { var: "event.type" },
760
- voteRequired: { var: "event.voteRequired" },
761
- eligibleClasses: { var: "event.eligibleClasses" },
776
+ itemId: { var: 'event.itemId' },
777
+ itemNumber: { '+': [{ length: [{ var: 'state.agenda' }] }, 1] },
778
+ title: { var: 'event.title' },
779
+ description: { var: 'event.description' },
780
+ type: { var: 'event.type' },
781
+ voteRequired: { var: 'event.voteRequired' },
782
+ eligibleClasses: { var: 'event.eligibleClasses' },
762
783
  allowCumulativeVoting: {
763
- var: "event.allowCumulativeVoting",
784
+ var: 'event.allowCumulativeVoting',
764
785
  },
765
- status: "PENDING",
786
+ status: 'PENDING',
766
787
  },
767
788
  ],
768
789
  ],
@@ -772,30 +793,30 @@ exports.corpShareholdersDef = (0, fiber_app_js_1.defineFiberApp)({
772
793
  },
773
794
  },
774
795
  {
775
- from: "RECORD_DATE_SET",
776
- to: "RECORD_DATE_SET",
777
- eventName: "add_agenda_item",
778
- guard: { "==": [1, 1] },
796
+ from: 'RECORD_DATE_SET',
797
+ to: 'RECORD_DATE_SET',
798
+ eventName: 'add_agenda_item',
799
+ guard: { '==': [1, 1] },
779
800
  effect: {
780
801
  merge: [
781
- { var: "state" },
802
+ { var: 'state' },
782
803
  {
783
804
  agenda: {
784
- cat: [
785
- { var: "state.agenda" },
805
+ merge: [
806
+ { var: 'state.agenda' },
786
807
  [
787
808
  {
788
- itemId: { var: "event.itemId" },
789
- itemNumber: { "+": [{ var: "state.agenda.length" }, 1] },
790
- title: { var: "event.title" },
791
- description: { var: "event.description" },
792
- type: { var: "event.type" },
793
- voteRequired: { var: "event.voteRequired" },
794
- eligibleClasses: { var: "event.eligibleClasses" },
809
+ itemId: { var: 'event.itemId' },
810
+ itemNumber: { '+': [{ length: [{ var: 'state.agenda' }] }, 1] },
811
+ title: { var: 'event.title' },
812
+ description: { var: 'event.description' },
813
+ type: { var: 'event.type' },
814
+ voteRequired: { var: 'event.voteRequired' },
815
+ eligibleClasses: { var: 'event.eligibleClasses' },
795
816
  allowCumulativeVoting: {
796
- var: "event.allowCumulativeVoting",
817
+ var: 'event.allowCumulativeVoting',
797
818
  },
798
- status: "PENDING",
819
+ status: 'PENDING',
799
820
  },
800
821
  ],
801
822
  ],
@@ -805,30 +826,30 @@ exports.corpShareholdersDef = (0, fiber_app_js_1.defineFiberApp)({
805
826
  },
806
827
  },
807
828
  {
808
- from: "PROXY_PERIOD",
809
- to: "PROXY_PERIOD",
810
- eventName: "add_agenda_item",
811
- guard: { "==": [1, 1] },
829
+ from: 'PROXY_PERIOD',
830
+ to: 'PROXY_PERIOD',
831
+ eventName: 'add_agenda_item',
832
+ guard: { '==': [1, 1] },
812
833
  effect: {
813
834
  merge: [
814
- { var: "state" },
835
+ { var: 'state' },
815
836
  {
816
837
  agenda: {
817
- cat: [
818
- { var: "state.agenda" },
838
+ merge: [
839
+ { var: 'state.agenda' },
819
840
  [
820
841
  {
821
- itemId: { var: "event.itemId" },
822
- itemNumber: { "+": [{ var: "state.agenda.length" }, 1] },
823
- title: { var: "event.title" },
824
- description: { var: "event.description" },
825
- type: { var: "event.type" },
826
- voteRequired: { var: "event.voteRequired" },
827
- eligibleClasses: { var: "event.eligibleClasses" },
842
+ itemId: { var: 'event.itemId' },
843
+ itemNumber: { '+': [{ length: [{ var: 'state.agenda' }] }, 1] },
844
+ title: { var: 'event.title' },
845
+ description: { var: 'event.description' },
846
+ type: { var: 'event.type' },
847
+ voteRequired: { var: 'event.voteRequired' },
848
+ eligibleClasses: { var: 'event.eligibleClasses' },
828
849
  allowCumulativeVoting: {
829
- var: "event.allowCumulativeVoting",
850
+ var: 'event.allowCumulativeVoting',
830
851
  },
831
- status: "PENDING",
852
+ status: 'PENDING',
832
853
  },
833
854
  ],
834
855
  ],
@@ -839,62 +860,58 @@ exports.corpShareholdersDef = (0, fiber_app_js_1.defineFiberApp)({
839
860
  },
840
861
  // PROXY_PERIOD -> IN_SESSION
841
862
  {
842
- from: "PROXY_PERIOD",
843
- to: "IN_SESSION",
844
- eventName: "open_meeting",
863
+ from: 'PROXY_PERIOD',
864
+ to: 'IN_SESSION',
865
+ eventName: 'open_meeting',
845
866
  guard: {
846
- ">=": [
847
- { var: "event.initialQuorumCount" },
848
- { var: "state.quorumRequirements.sharesRequired" },
849
- ],
867
+ '>=': [{ var: 'event.initialQuorumCount' }, { var: 'state.quorumRequirements.sharesRequired' }],
850
868
  },
851
869
  effect: {
852
870
  merge: [
853
- { var: "state" },
871
+ { var: 'state' },
854
872
  {
855
- status: "IN_SESSION",
873
+ status: 'IN_SESSION',
856
874
  sessionInfo: {
857
- openedAt: { var: "event.openedAt" },
858
- chairPerson: { var: "event.chairPerson" },
859
- secretaryPresent: { var: "event.secretaryPresent" },
875
+ openedAt: { var: 'event.openedAt' },
876
+ chairPerson: { var: 'event.chairPerson' },
877
+ secretaryPresent: { var: 'event.secretaryPresent' },
860
878
  },
861
- inspectorOfElections: { var: "event.inspectorOfElections" },
879
+ inspectorOfElections: { var: 'event.inspectorOfElections' },
862
880
  quorumRequirements: {
863
881
  merge: [
864
- { var: "state.quorumRequirements" },
882
+ { var: 'state.quorumRequirements' },
865
883
  {
866
- sharesRepresented: { var: "event.initialQuorumCount" },
884
+ sharesRepresented: { var: 'event.initialQuorumCount' },
867
885
  quorumMet: true,
868
886
  },
869
887
  ],
870
888
  },
871
889
  },
890
+ {
891
+ _emit: [{ name: 'SHAREHOLDER_MEETING_OPENED', data: { var: 'event' }, destination: 'external' }],
892
+ },
872
893
  ],
873
894
  },
874
- emits: ["SHAREHOLDER_MEETING_OPENED"],
875
895
  },
876
896
  // IN_SESSION -> VOTING
877
897
  {
878
- from: "IN_SESSION",
879
- to: "VOTING",
880
- eventName: "open_polls",
881
- guard: { "==": [1, 1] },
898
+ from: 'IN_SESSION',
899
+ to: 'VOTING',
900
+ eventName: 'open_polls',
901
+ guard: { '==': [1, 1] },
882
902
  effect: {
883
903
  merge: [
884
- { var: "state" },
904
+ { var: 'state' },
885
905
  {
886
- status: "VOTING",
906
+ status: 'VOTING',
887
907
  sessionInfo: {
888
- merge: [
889
- { var: "state.sessionInfo" },
890
- { pollsOpenedAt: { var: "event.pollsOpenedAt" } },
891
- ],
908
+ merge: [{ var: 'state.sessionInfo' }, { pollsOpenedAt: { var: 'event.pollsOpenedAt' } }],
892
909
  },
893
910
  agenda: {
894
911
  map: [
895
- { var: "state.agenda" },
912
+ { var: 'state.agenda' },
896
913
  {
897
- merge: [{ var: "" }, { status: "VOTING" }],
914
+ merge: [{ var: '' }, { status: 'VOTING' }],
898
915
  },
899
916
  ],
900
917
  },
@@ -904,39 +921,38 @@ exports.corpShareholdersDef = (0, fiber_app_js_1.defineFiberApp)({
904
921
  },
905
922
  // VOTING -> VOTING (cast_vote)
906
923
  {
907
- from: "VOTING",
908
- to: "VOTING",
909
- eventName: "cast_vote",
924
+ from: 'VOTING',
925
+ to: 'VOTING',
926
+ eventName: 'cast_vote',
927
+ // authority gate — the roster entry identified by event.shareholderId must carry an address that signed (address ∈ proofs[].address), so the recorded shareholderId is provably the matched entry's, not a forged one; an identity attestation layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
910
928
  guard: {
911
929
  and: [
912
930
  {
913
931
  some: [
914
- { var: "state.eligibleVoters" },
932
+ { var: 'state.eligibleVoters' },
915
933
  {
916
- "==": [
917
- { var: ".shareholderId" },
918
- { var: "event.shareholderId" },
934
+ and: [
935
+ {
936
+ '==': [{ var: 'shareholderId' }, { var: 'event.shareholderId' }],
937
+ },
938
+ {
939
+ in: [{ var: 'address' }, { map: [{ var: 'proofs' }, { var: 'address' }] }],
940
+ },
919
941
  ],
920
942
  },
921
943
  ],
922
944
  },
923
945
  {
924
- "!": {
946
+ '!': {
925
947
  some: [
926
- { var: "state.votes" },
948
+ { var: 'state.votes' },
927
949
  {
928
950
  and: [
929
951
  {
930
- "==": [
931
- { var: ".shareholderId" },
932
- { var: "event.shareholderId" },
933
- ],
952
+ '==': [{ var: 'shareholderId' }, { var: 'event.shareholderId' }],
934
953
  },
935
954
  {
936
- "==": [
937
- { var: ".agendaItemId" },
938
- { var: "event.agendaItemId" },
939
- ],
955
+ '==': [{ var: 'agendaItemId' }, { var: 'event.agendaItemId' }],
940
956
  },
941
957
  ],
942
958
  },
@@ -947,46 +963,43 @@ exports.corpShareholdersDef = (0, fiber_app_js_1.defineFiberApp)({
947
963
  },
948
964
  effect: {
949
965
  merge: [
950
- { var: "state" },
966
+ { var: 'state' },
951
967
  {
952
968
  votes: {
953
- cat: [
954
- { var: "state.votes" },
969
+ merge: [
970
+ { var: 'state.votes' },
955
971
  [
956
972
  {
957
- voteId: { var: "event.voteId" },
958
- agendaItemId: { var: "event.agendaItemId" },
959
- voterId: { var: "event.voterId" },
960
- shareholderId: { var: "event.shareholderId" },
961
- shareClass: { var: "event.shareClass" },
962
- votesFor: { var: "event.votesFor" },
963
- votesAgainst: { var: "event.votesAgainst" },
964
- votesAbstain: { var: "event.votesAbstain" },
965
- votesWithhold: { var: "event.votesWithhold" },
973
+ voteId: { var: 'event.voteId' },
974
+ agendaItemId: { var: 'event.agendaItemId' },
975
+ voterId: { var: 'event.voterId' },
976
+ shareholderId: { var: 'event.shareholderId' },
977
+ shareClass: { var: 'event.shareClass' },
978
+ votesFor: { var: 'event.votesFor' },
979
+ votesAgainst: { var: 'event.votesAgainst' },
980
+ votesAbstain: { var: 'event.votesAbstain' },
981
+ votesWithhold: { var: 'event.votesWithhold' },
966
982
  cumulativeVoteAllocation: {
967
- var: "event.cumulativeVoteAllocation",
983
+ var: 'event.cumulativeVoteAllocation',
968
984
  },
969
- viaProxy: { var: "event.viaProxy" },
970
- timestamp: { var: "$timestamp" },
985
+ viaProxy: { var: 'event.viaProxy' },
986
+ timestamp: { var: '$ordinal' },
971
987
  },
972
988
  ],
973
989
  ],
974
990
  },
975
991
  eligibleVoters: {
976
992
  map: [
977
- { var: "state.eligibleVoters" },
993
+ { var: 'state.eligibleVoters' },
978
994
  {
979
995
  if: [
980
996
  {
981
- "==": [
982
- { var: ".shareholderId" },
983
- { var: "event.shareholderId" },
984
- ],
997
+ '==': [{ var: 'shareholderId' }, { var: 'event.shareholderId' }],
985
998
  },
986
999
  {
987
- merge: [{ var: "" }, { hasVoted: true }],
1000
+ merge: [{ var: '' }, { hasVoted: true }],
988
1001
  },
989
- { var: "" },
1002
+ { var: '' },
990
1003
  ],
991
1004
  },
992
1005
  ],
@@ -997,26 +1010,23 @@ exports.corpShareholdersDef = (0, fiber_app_js_1.defineFiberApp)({
997
1010
  },
998
1011
  // VOTING -> IN_SESSION (close_polls)
999
1012
  {
1000
- from: "VOTING",
1001
- to: "IN_SESSION",
1002
- eventName: "close_polls",
1003
- guard: { "==": [1, 1] },
1013
+ from: 'VOTING',
1014
+ to: 'IN_SESSION',
1015
+ eventName: 'close_polls',
1016
+ guard: { '==': [1, 1] },
1004
1017
  effect: {
1005
1018
  merge: [
1006
- { var: "state" },
1019
+ { var: 'state' },
1007
1020
  {
1008
- status: "IN_SESSION",
1021
+ status: 'IN_SESSION',
1009
1022
  sessionInfo: {
1010
- merge: [
1011
- { var: "state.sessionInfo" },
1012
- { pollsClosedAt: { var: "event.pollsClosedAt" } },
1013
- ],
1023
+ merge: [{ var: 'state.sessionInfo' }, { pollsClosedAt: { var: 'event.pollsClosedAt' } }],
1014
1024
  },
1015
1025
  agenda: {
1016
1026
  map: [
1017
- { var: "state.agenda" },
1027
+ { var: 'state.agenda' },
1018
1028
  {
1019
- merge: [{ var: "" }, { status: "CLOSED" }],
1029
+ merge: [{ var: '' }, { status: 'CLOSED' }],
1020
1030
  },
1021
1031
  ],
1022
1032
  },
@@ -1026,77 +1036,77 @@ exports.corpShareholdersDef = (0, fiber_app_js_1.defineFiberApp)({
1026
1036
  },
1027
1037
  // IN_SESSION -> CLOSED (certify_results)
1028
1038
  {
1029
- from: "IN_SESSION",
1030
- to: "CLOSED",
1031
- eventName: "certify_results",
1032
- guard: { "==": [1, 1] },
1039
+ from: 'IN_SESSION',
1040
+ to: 'CLOSED',
1041
+ eventName: 'certify_results',
1042
+ guard: { '==': [1, 1] },
1033
1043
  effect: {
1034
1044
  merge: [
1035
- { var: "state" },
1045
+ { var: 'state' },
1036
1046
  {
1037
- status: "CLOSED",
1047
+ status: 'CLOSED',
1038
1048
  certification: {
1039
- certifiedAt: { var: "event.certifiedAt" },
1040
- certifiedBy: { var: "event.certifiedBy" },
1041
- certificateRef: { var: "event.certificateRef" },
1049
+ certifiedAt: { var: 'event.certifiedAt' },
1050
+ certifiedBy: { var: 'event.certifiedBy' },
1051
+ certificateRef: { var: 'event.certificateRef' },
1042
1052
  },
1043
1053
  sessionInfo: {
1044
1054
  merge: [
1045
- { var: "state.sessionInfo" },
1055
+ { var: 'state.sessionInfo' },
1046
1056
  {
1047
- adjournedAt: { var: "event.certifiedAt" },
1048
- minutesRef: { var: "event.minutesRef" },
1057
+ adjournedAt: { var: 'event.certifiedAt' },
1058
+ minutesRef: { var: 'event.minutesRef' },
1049
1059
  },
1050
1060
  ],
1051
1061
  },
1052
1062
  },
1063
+ {
1064
+ _emit: [{ name: 'MEETING_RESULTS_CERTIFIED', data: { var: 'event' }, destination: 'external' }],
1065
+ },
1053
1066
  ],
1054
1067
  },
1055
- emits: ["MEETING_RESULTS_CERTIFIED"],
1056
1068
  },
1057
1069
  // IN_SESSION -> CLOSED (adjourn_without_action)
1058
1070
  {
1059
- from: "IN_SESSION",
1060
- to: "CLOSED",
1061
- eventName: "adjourn_without_action",
1062
- guard: { "==": [1, 1] },
1071
+ from: 'IN_SESSION',
1072
+ to: 'CLOSED',
1073
+ eventName: 'adjourn_without_action',
1074
+ guard: { '==': [1, 1] },
1063
1075
  effect: {
1064
1076
  merge: [
1065
- { var: "state" },
1077
+ { var: 'state' },
1066
1078
  {
1067
- status: "CLOSED",
1079
+ status: 'CLOSED',
1068
1080
  sessionInfo: {
1069
- merge: [
1070
- { var: "state.sessionInfo" },
1071
- { adjournedAt: { var: "event.adjournedAt" } },
1072
- ],
1081
+ merge: [{ var: 'state.sessionInfo' }, { adjournedAt: { var: 'event.adjournedAt' } }],
1073
1082
  },
1074
1083
  },
1084
+ {
1085
+ _emit: [{ name: 'MEETING_ADJOURNED', data: { var: 'event' }, destination: 'external' }],
1086
+ },
1075
1087
  ],
1076
1088
  },
1077
- emits: ["MEETING_ADJOURNED"],
1078
1089
  },
1079
1090
  // VOTING -> CLOSED (adjourn_without_action)
1080
1091
  {
1081
- from: "VOTING",
1082
- to: "CLOSED",
1083
- eventName: "adjourn_without_action",
1084
- guard: { "==": [1, 1] },
1092
+ from: 'VOTING',
1093
+ to: 'CLOSED',
1094
+ eventName: 'adjourn_without_action',
1095
+ guard: { '==': [1, 1] },
1085
1096
  effect: {
1086
1097
  merge: [
1087
- { var: "state" },
1098
+ { var: 'state' },
1088
1099
  {
1089
- status: "CLOSED",
1100
+ status: 'CLOSED',
1090
1101
  sessionInfo: {
1091
- merge: [
1092
- { var: "state.sessionInfo" },
1093
- { adjournedAt: { var: "event.adjournedAt" } },
1094
- ],
1102
+ merge: [{ var: 'state.sessionInfo' }, { adjournedAt: { var: 'event.adjournedAt' } }],
1095
1103
  },
1096
1104
  },
1105
+ {
1106
+ _emit: [{ name: 'MEETING_ADJOURNED', data: { var: 'event' }, destination: 'external' }],
1107
+ },
1097
1108
  ],
1098
1109
  },
1099
- emits: ["MEETING_ADJOURNED"],
1100
1110
  },
1101
1111
  ],
1102
1112
  });