@ottochain/sdk 2.3.0 → 2.5.0

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