@ottochain/sdk 2.2.5 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/dist/cjs/apps/contracts/index.js +15 -8
  2. package/dist/cjs/apps/contracts/state-machines/contract-agreement.js +89 -46
  3. package/dist/cjs/apps/contracts/state-machines/contract-escrow.js +152 -45
  4. package/dist/cjs/apps/contracts/state-machines/contract-universal.js +40 -8
  5. package/dist/cjs/apps/corporate/index.js +2 -2
  6. package/dist/cjs/apps/corporate/state-machines/corp-board.js +169 -59
  7. package/dist/cjs/apps/corporate/state-machines/corp-entity.js +245 -47
  8. package/dist/cjs/apps/corporate/state-machines/corp-securities.js +407 -99
  9. package/dist/cjs/apps/corporate/state-machines/corp-shareholders.js +151 -37
  10. package/dist/cjs/apps/governance/index.js +14 -14
  11. package/dist/cjs/apps/governance/state-machines/dao-multisig.js +85 -43
  12. package/dist/cjs/apps/governance/state-machines/dao-reputation.js +73 -43
  13. package/dist/cjs/apps/governance/state-machines/dao-single.js +55 -14
  14. package/dist/cjs/apps/governance/state-machines/dao-token.js +103 -45
  15. package/dist/cjs/apps/governance/state-machines/governance-simple.js +129 -65
  16. package/dist/cjs/apps/governance/state-machines/governance-universal.js +29 -5
  17. package/dist/cjs/apps/identity/constants.js +55 -14
  18. package/dist/cjs/apps/identity/index.js +27 -11
  19. package/dist/cjs/apps/identity/state-machines/identity-agent.js +57 -9
  20. package/dist/cjs/apps/identity/state-machines/identity-oracle.js +70 -27
  21. package/dist/cjs/apps/identity/state-machines/identity-registry.js +288 -0
  22. package/dist/cjs/apps/identity/state-machines/identity-universal.js +30 -6
  23. package/dist/cjs/apps/identity/state-machines/index.js +3 -1
  24. package/dist/cjs/apps/index.js +19 -8
  25. package/dist/cjs/apps/lending/assets.js +223 -0
  26. package/dist/cjs/apps/lending/credit-scoring.js +87 -0
  27. package/dist/cjs/apps/lending/eligibility.js +121 -0
  28. package/dist/cjs/apps/lending/index.js +91 -0
  29. package/dist/cjs/apps/lending/state-machines/index.js +9 -0
  30. package/dist/cjs/apps/lending/state-machines/lending-zk-loan.js +412 -0
  31. package/dist/cjs/apps/markets/index.js +21 -11
  32. package/dist/cjs/apps/markets/state-machines/market-auction.js +44 -19
  33. package/dist/cjs/apps/markets/state-machines/market-crowdfund.js +54 -29
  34. package/dist/cjs/apps/markets/state-machines/market-group-buy.js +53 -31
  35. package/dist/cjs/apps/markets/state-machines/market-prediction.js +120 -61
  36. package/dist/cjs/apps/markets/state-machines/market-universal.js +50 -10
  37. package/dist/cjs/apps/oracles/index.js +2 -2
  38. package/dist/cjs/errors.js +3 -3
  39. package/dist/cjs/generated/google/protobuf/struct.js +4 -4
  40. package/dist/cjs/generated/index.js +11 -7
  41. package/dist/cjs/generated/openapi.js +6 -0
  42. package/dist/cjs/generated/ottochain/apps/contracts/v1/contract.js +50 -50
  43. package/dist/cjs/generated/ottochain/apps/corporate/v1/corporate.js +19 -20
  44. package/dist/cjs/generated/ottochain/apps/governance/v1/governance.js +13 -13
  45. package/dist/cjs/generated/ottochain/apps/identity/v1/attestation.js +4 -4
  46. package/dist/cjs/generated/ottochain/apps/identity/v1/identity.js +124 -130
  47. package/dist/cjs/generated/ottochain/apps/markets/v1/market.js +107 -107
  48. package/dist/cjs/generated/ottochain/v1/common.js +1722 -1
  49. package/dist/cjs/generated/ottochain/v1/fiber.js +355 -5
  50. package/dist/cjs/generated/ottochain/v1/messages.js +775 -3
  51. package/dist/cjs/generated/ottochain/v1/records.js +350 -3
  52. package/dist/cjs/index.js +45 -7
  53. package/dist/cjs/openapi.js +2 -0
  54. package/dist/cjs/ottochain/drop-nulls.js +1 -2
  55. package/dist/cjs/ottochain/genesis-manifest.js +193 -0
  56. package/dist/cjs/ottochain/index.js +27 -13
  57. package/dist/cjs/ottochain/metagraph-client.js +65 -8
  58. package/dist/cjs/ottochain/snapshot.js +11 -12
  59. package/dist/cjs/ottochain/transaction.js +57 -14
  60. package/dist/cjs/ottochain/types.js +19 -1
  61. package/dist/cjs/privacy/index.js +14 -0
  62. package/dist/cjs/privacy/sealed-bid.js +210 -0
  63. package/dist/cjs/privacy/shield-app.js +131 -0
  64. package/dist/cjs/schema/effects.js +40 -0
  65. package/dist/cjs/schema/fiber-app.js +19 -13
  66. package/dist/cjs/schema/guard-lint.js +352 -0
  67. package/dist/cjs/schema/guards.js +246 -0
  68. package/dist/cjs/signing.js +80 -0
  69. package/dist/cjs/types.js +2 -3
  70. package/dist/cjs/validation.js +8 -8
  71. package/dist/cjs/verify.js +9 -4
  72. package/dist/cjs/zk/commit.js +53 -0
  73. package/dist/cjs/zk/guard.js +107 -0
  74. package/dist/cjs/zk/index.js +48 -0
  75. package/dist/cjs/zk/preimage.js +37 -0
  76. package/dist/cjs/zk/prover.js +87 -0
  77. package/dist/cjs/zk/registry.js +62 -0
  78. package/dist/cjs/zk/types.js +28 -0
  79. package/dist/cjs/zk/witness.js +19 -0
  80. package/dist/esm/apps/contracts/index.js +7 -3
  81. package/dist/esm/apps/contracts/state-machines/contract-agreement.js +89 -46
  82. package/dist/esm/apps/contracts/state-machines/contract-escrow.js +152 -45
  83. package/dist/esm/apps/contracts/state-machines/contract-universal.js +40 -8
  84. package/dist/esm/apps/corporate/state-machines/corp-board.js +169 -59
  85. package/dist/esm/apps/corporate/state-machines/corp-entity.js +245 -47
  86. package/dist/esm/apps/corporate/state-machines/corp-securities.js +407 -99
  87. package/dist/esm/apps/corporate/state-machines/corp-shareholders.js +151 -37
  88. package/dist/esm/apps/governance/state-machines/dao-multisig.js +85 -43
  89. package/dist/esm/apps/governance/state-machines/dao-reputation.js +73 -43
  90. package/dist/esm/apps/governance/state-machines/dao-single.js +55 -14
  91. package/dist/esm/apps/governance/state-machines/dao-token.js +103 -45
  92. package/dist/esm/apps/governance/state-machines/governance-simple.js +129 -65
  93. package/dist/esm/apps/governance/state-machines/governance-universal.js +29 -5
  94. package/dist/esm/apps/identity/constants.js +51 -12
  95. package/dist/esm/apps/identity/index.js +12 -7
  96. package/dist/esm/apps/identity/state-machines/identity-agent.js +57 -9
  97. package/dist/esm/apps/identity/state-machines/identity-oracle.js +70 -27
  98. package/dist/esm/apps/identity/state-machines/identity-registry.js +285 -0
  99. package/dist/esm/apps/identity/state-machines/identity-universal.js +30 -6
  100. package/dist/esm/apps/identity/state-machines/index.js +1 -0
  101. package/dist/esm/apps/index.js +1 -0
  102. package/dist/esm/apps/lending/assets.js +207 -0
  103. package/dist/esm/apps/lending/credit-scoring.js +81 -0
  104. package/dist/esm/apps/lending/eligibility.js +115 -0
  105. package/dist/esm/apps/lending/index.js +69 -0
  106. package/dist/esm/apps/lending/state-machines/index.js +5 -0
  107. package/dist/esm/apps/lending/state-machines/lending-zk-loan.js +409 -0
  108. package/dist/esm/apps/markets/index.js +8 -4
  109. package/dist/esm/apps/markets/state-machines/market-auction.js +44 -19
  110. package/dist/esm/apps/markets/state-machines/market-crowdfund.js +54 -29
  111. package/dist/esm/apps/markets/state-machines/market-group-buy.js +53 -31
  112. package/dist/esm/apps/markets/state-machines/market-prediction.js +120 -61
  113. package/dist/esm/apps/markets/state-machines/market-universal.js +50 -10
  114. package/dist/esm/generated/index.js +9 -5
  115. package/dist/esm/generated/openapi.js +5 -0
  116. package/dist/esm/generated/ottochain/apps/contracts/v1/contract.js +46 -46
  117. package/dist/esm/generated/ottochain/apps/identity/v1/identity.js +114 -120
  118. package/dist/esm/generated/ottochain/apps/markets/v1/market.js +100 -100
  119. package/dist/esm/generated/ottochain/v1/common.js +1718 -0
  120. package/dist/esm/generated/ottochain/v1/fiber.js +351 -1
  121. package/dist/esm/generated/ottochain/v1/messages.js +774 -2
  122. package/dist/esm/generated/ottochain/v1/records.js +349 -2
  123. package/dist/esm/index.js +23 -2
  124. package/dist/esm/openapi.js +1 -0
  125. package/dist/esm/ottochain/genesis-manifest.js +189 -0
  126. package/dist/esm/ottochain/index.js +4 -3
  127. package/dist/esm/ottochain/metagraph-client.js +65 -8
  128. package/dist/esm/ottochain/snapshot.js +4 -4
  129. package/dist/esm/ottochain/transaction.js +43 -3
  130. package/dist/esm/ottochain/types.js +18 -0
  131. package/dist/esm/privacy/index.js +6 -0
  132. package/dist/esm/privacy/sealed-bid.js +206 -0
  133. package/dist/esm/privacy/shield-app.js +127 -0
  134. package/dist/esm/schema/effects.js +35 -0
  135. package/dist/esm/schema/fiber-app.js +13 -6
  136. package/dist/esm/schema/guard-lint.js +346 -0
  137. package/dist/esm/schema/guards.js +229 -0
  138. package/dist/esm/signing.js +74 -0
  139. package/dist/esm/verify.js +8 -2
  140. package/dist/esm/zk/commit.js +44 -0
  141. package/dist/esm/zk/guard.js +99 -0
  142. package/dist/esm/zk/index.js +19 -0
  143. package/dist/esm/zk/preimage.js +30 -0
  144. package/dist/esm/zk/prover.js +82 -0
  145. package/dist/esm/zk/registry.js +55 -0
  146. package/dist/esm/zk/types.js +25 -0
  147. package/dist/esm/zk/witness.js +15 -0
  148. package/dist/types/apps/contracts/index.d.ts +159 -227
  149. package/dist/types/apps/contracts/state-machines/contract-agreement.d.ts +50 -101
  150. package/dist/types/apps/contracts/state-machines/contract-escrow.d.ts +86 -120
  151. package/dist/types/apps/contracts/state-machines/contract-universal.d.ts +20 -4
  152. package/dist/types/apps/corporate/index.d.ts +1040 -304
  153. package/dist/types/apps/corporate/state-machines/corp-board.d.ts +188 -52
  154. package/dist/types/apps/corporate/state-machines/corp-entity.d.ts +267 -62
  155. package/dist/types/apps/corporate/state-machines/corp-securities.d.ts +355 -131
  156. package/dist/types/apps/corporate/state-machines/corp-shareholders.d.ts +225 -53
  157. package/dist/types/apps/governance/index.d.ts +396 -417
  158. package/dist/types/apps/governance/state-machines/dao-multisig.d.ts +92 -95
  159. package/dist/types/apps/governance/state-machines/dao-reputation.d.ts +57 -69
  160. package/dist/types/apps/governance/state-machines/dao-single.d.ts +40 -50
  161. package/dist/types/apps/governance/state-machines/dao-token.d.ts +80 -53
  162. package/dist/types/apps/governance/state-machines/governance-simple.d.ts +107 -121
  163. package/dist/types/apps/governance/state-machines/governance-universal.d.ts +17 -5
  164. package/dist/types/apps/identity/constants.d.ts +32 -4
  165. package/dist/types/apps/identity/index.d.ts +449 -100
  166. package/dist/types/apps/identity/state-machines/identity-agent.d.ts +30 -0
  167. package/dist/types/apps/identity/state-machines/identity-oracle.d.ts +41 -87
  168. package/dist/types/apps/identity/state-machines/identity-registry.d.ts +379 -0
  169. package/dist/types/apps/identity/state-machines/identity-universal.d.ts +15 -0
  170. package/dist/types/apps/identity/state-machines/index.d.ts +1 -0
  171. package/dist/types/apps/index.d.ts +1 -0
  172. package/dist/types/apps/lending/assets.d.ts +258 -0
  173. package/dist/types/apps/lending/credit-scoring.d.ts +80 -0
  174. package/dist/types/apps/lending/eligibility.d.ts +83 -0
  175. package/dist/types/apps/lending/index.d.ts +548 -0
  176. package/dist/types/apps/lending/state-machines/index.d.ts +5 -0
  177. package/dist/types/apps/lending/state-machines/lending-zk-loan.d.ts +528 -0
  178. package/dist/types/apps/markets/index.d.ts +184 -204
  179. package/dist/types/apps/markets/state-machines/market-auction.d.ts +25 -37
  180. package/dist/types/apps/markets/state-machines/market-crowdfund.d.ts +26 -34
  181. package/dist/types/apps/markets/state-machines/market-group-buy.d.ts +31 -43
  182. package/dist/types/apps/markets/state-machines/market-prediction.d.ts +67 -72
  183. package/dist/types/apps/markets/state-machines/market-universal.d.ts +30 -10
  184. package/dist/types/generated/index.d.ts +5 -5
  185. package/dist/types/generated/openapi.d.ts +1257 -0
  186. package/dist/types/generated/ottochain/apps/contracts/v1/contract.d.ts +5 -5
  187. package/dist/types/generated/ottochain/apps/identity/v1/identity.d.ts +12 -12
  188. package/dist/types/generated/ottochain/apps/markets/v1/market.d.ts +11 -11
  189. package/dist/types/generated/ottochain/v1/common.d.ts +228 -0
  190. package/dist/types/generated/ottochain/v1/fiber.d.ts +32 -1
  191. package/dist/types/generated/ottochain/v1/messages.d.ts +84 -0
  192. package/dist/types/generated/ottochain/v1/records.d.ts +34 -0
  193. package/dist/types/index.d.ts +8 -2
  194. package/dist/types/openapi.d.ts +22 -0
  195. package/dist/types/ottochain/genesis-manifest.d.ts +130 -0
  196. package/dist/types/ottochain/index.d.ts +6 -5
  197. package/dist/types/ottochain/metagraph-client.d.ts +49 -7
  198. package/dist/types/ottochain/snapshot.d.ts +6 -6
  199. package/dist/types/ottochain/transaction.d.ts +33 -1
  200. package/dist/types/ottochain/types.d.ts +602 -11
  201. package/dist/types/privacy/index.d.ts +6 -0
  202. package/dist/types/privacy/sealed-bid.d.ts +348 -0
  203. package/dist/types/privacy/shield-app.d.ts +48 -0
  204. package/dist/types/schema/effects.d.ts +34 -0
  205. package/dist/types/schema/fiber-app.d.ts +41 -3
  206. package/dist/types/schema/guard-lint.d.ts +111 -0
  207. package/dist/types/schema/guards.d.ts +134 -0
  208. package/dist/types/signing.d.ts +45 -0
  209. package/dist/types/validation.d.ts +22 -217
  210. package/dist/types/verify.d.ts +4 -0
  211. package/dist/types/zk/commit.d.ts +28 -0
  212. package/dist/types/zk/guard.d.ts +46 -0
  213. package/dist/types/zk/index.d.ts +19 -0
  214. package/dist/types/zk/preimage.d.ts +10 -0
  215. package/dist/types/zk/prover.d.ts +34 -0
  216. package/dist/types/zk/registry.d.ts +34 -0
  217. package/dist/types/zk/types.d.ts +33 -0
  218. package/dist/types/zk/witness.d.ts +40 -0
  219. package/package.json +52 -35
  220. package/dist/cjs/ottochain/normalize.js +0 -186
  221. package/dist/esm/ottochain/normalize.js +0 -179
  222. package/dist/types/ottochain/normalize.d.ts +0 -79
@@ -1,4 +1,6 @@
1
1
  import { defineFiberApp } from "../../../schema/fiber-app.js";
2
+ import { signerIsParty, depInState } from "../../../schema/guards.js";
3
+ import { addDependency } from "../../../schema/effects.js";
2
4
  /**
3
5
  * 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.
@@ -34,7 +36,7 @@ export const corpShareholdersDef = defineFiberApp({
34
36
  },
35
37
  },
36
38
  createSchema: {
37
- required: ["meetingId", "entityId"],
39
+ required: ["meetingId", "entityId", "registrar"],
38
40
  properties: {
39
41
  meetingId: {
40
42
  type: "string",
@@ -46,6 +48,11 @@ export const corpShareholdersDef = defineFiberApp({
46
48
  description: "Reference to parent corporate-entity",
47
49
  immutable: true,
48
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.",
54
+ immutable: true,
55
+ },
49
56
  meetingType: {
50
57
  type: "string",
51
58
  enum: ["ANNUAL", "SPECIAL"],
@@ -73,6 +80,7 @@ export const corpShareholdersDef = defineFiberApp({
73
80
  properties: {
74
81
  meetingId: { type: "string", immutable: true },
75
82
  entityId: { type: "string", immutable: true },
83
+ registrar: { type: "address", immutable: true },
76
84
  meetingType: { type: "string" },
77
85
  fiscalYear: { type: "integer" },
78
86
  scheduledDate: { type: "string", format: "date-time" },
@@ -142,11 +150,14 @@ export const corpShareholdersDef = defineFiberApp({
142
150
  },
143
151
  createdAt: { type: "timestamp", computed: true },
144
152
  updatedAt: { type: "timestamp", computed: true },
153
+ // Two-phase scheduling (#24): propose_schedule_annual binds the board-resolution fiber + records the
154
+ // pending meeting here; schedule_annual asserts the bound resolution is EXECUTED, then clears this.
155
+ pendingschedule_annual: { type: "object", nullable: true, computed: true },
145
156
  },
146
157
  },
147
158
  eventSchemas: {
148
- schedule_annual: {
149
- description: "Schedule an annual shareholder meeting",
159
+ propose_schedule_annual: {
160
+ description: "Phase 1 of annual-meeting scheduling: bind the executing board-resolution fiber (#24 _addDependency) and record the pending meeting",
150
161
  required: [
151
162
  "meetingId",
152
163
  "entityId",
@@ -163,6 +174,22 @@ export const corpShareholdersDef = defineFiberApp({
163
174
  boardResolutionRef: { type: "string" },
164
175
  },
165
176
  },
177
+ schedule_annual: {
178
+ description: "Phase 2 of annual-meeting scheduling: execute once the bound board resolution is EXECUTED",
179
+ required: [
180
+ "meetingId",
181
+ "entityId",
182
+ "fiscalYear",
183
+ "scheduledDate",
184
+ ],
185
+ properties: {
186
+ meetingId: { type: "string" },
187
+ entityId: { type: "string" },
188
+ fiscalYear: { type: "integer" },
189
+ scheduledDate: { type: "string", format: "date-time" },
190
+ location: { type: "object" },
191
+ },
192
+ },
166
193
  schedule_special: {
167
194
  description: "Schedule a special shareholder meeting",
168
195
  required: [
@@ -208,6 +235,10 @@ export const corpShareholdersDef = defineFiberApp({
208
235
  properties: {
209
236
  shareholderId: { type: "string" },
210
237
  name: { type: "string" },
238
+ address: {
239
+ type: "address",
240
+ description: "DAG wallet address of record for this shareholder; the only key a verified signer can vote under.",
241
+ },
211
242
  shareholdings: { type: "array" },
212
243
  },
213
244
  },
@@ -369,6 +400,10 @@ export const corpShareholdersDef = defineFiberApp({
369
400
  properties: {
370
401
  shareholderId: { type: "string" },
371
402
  name: { type: "string" },
403
+ address: {
404
+ type: "address",
405
+ description: "State-pinned DAG wallet address of record; cast_vote requires this address ∈ proofs[].address.",
406
+ },
372
407
  shareholdings: {
373
408
  type: "array",
374
409
  items: {
@@ -602,19 +637,51 @@ export const corpShareholdersDef = defineFiberApp({
602
637
  initialState: "SCHEDULED",
603
638
  transitions: [
604
639
  // Initial creation transitions (from: null means creation)
605
- // schedule_annual -> SCHEDULED
640
+ // SCHEDULED -> SCHEDULED (propose_schedule_annual) — phase 1 (#24): bind the executing board-resolution
641
+ // fiber and record the pending meeting, so the next transition can read the resolution's state.
606
642
  {
607
643
  from: "SCHEDULED",
608
644
  to: "SCHEDULED",
609
- eventName: "schedule_annual",
645
+ eventName: "propose_schedule_annual",
610
646
  guard: { "==": [1, 1] },
611
- dependencies: [
612
- {
613
- machine: "corporate-resolution",
614
- instanceRef: { var: "event.boardResolutionRef" },
615
- requiredState: "EXECUTED",
616
- },
617
- ],
647
+ effect: {
648
+ merge: [
649
+ { var: "state" },
650
+ {
651
+ pendingschedule_annual: {
652
+ meetingId: { var: "event.meetingId" },
653
+ entityId: { var: "event.entityId" },
654
+ fiscalYear: { var: "event.fiscalYear" },
655
+ scheduledDate: { var: "event.scheduledDate" },
656
+ location: { var: "event.location" },
657
+ ref: { var: "event.boardResolutionRef" },
658
+ proposedAt: { var: "$ordinal" },
659
+ },
660
+ },
661
+ // bind the resolution fiber so schedule_annual can assert its state next transition
662
+ addDependency({ var: "event.boardResolutionRef" }),
663
+ ],
664
+ },
665
+ dependencies: [],
666
+ },
667
+ // SCHEDULED -> SCHEDULED (schedule_annual) — phase 2 (#24): execute once the bound board resolution is
668
+ // EXECUTED. depInState replaces the dropped object-form dependency (which silently never gated).
669
+ {
670
+ from: "SCHEDULED",
671
+ to: "SCHEDULED",
672
+ eventName: "schedule_annual",
673
+ guard: {
674
+ and: [
675
+ // the proposal must target this meeting, and its bound resolution must be EXECUTED
676
+ {
677
+ "==": [
678
+ { var: "state.pendingschedule_annual.meetingId" },
679
+ { var: "event.meetingId" },
680
+ ],
681
+ },
682
+ depInState("state.pendingschedule_annual.ref", "EXECUTED"),
683
+ ],
684
+ },
618
685
  effect: {
619
686
  merge: [
620
687
  { var: "state" },
@@ -627,12 +694,19 @@ export const corpShareholdersDef = defineFiberApp({
627
694
  location: { var: "event.location" },
628
695
  calledBy: {
629
696
  type: "BOARD",
630
- resolutionRef: { var: "event.boardResolutionRef" },
697
+ resolutionRef: { var: "state.pendingschedule_annual.ref" },
631
698
  },
699
+ // clear the consumed proposal
700
+ pendingschedule_annual: null,
701
+ },
702
+ {
703
+ _emit: [
704
+ { name: "SHAREHOLDER_MEETING_SCHEDULED", data: { var: "event" }, destination: "external" },
705
+ ],
632
706
  },
633
707
  ],
634
708
  },
635
- emits: ["SHAREHOLDER_MEETING_SCHEDULED"],
709
+ dependencies: [],
636
710
  },
637
711
  // schedule_special -> SCHEDULED
638
712
  {
@@ -652,9 +726,13 @@ export const corpShareholdersDef = defineFiberApp({
652
726
  type: { var: "event.calledByType" },
653
727
  },
654
728
  },
729
+ {
730
+ _emit: [
731
+ { name: "SPECIAL_MEETING_SCHEDULED", data: { var: "event" }, destination: "external" },
732
+ ],
733
+ },
655
734
  ],
656
735
  },
657
- emits: ["SPECIAL_MEETING_SCHEDULED"],
658
736
  },
659
737
  // SCHEDULED -> RECORD_DATE_SET
660
738
  {
@@ -669,20 +747,25 @@ export const corpShareholdersDef = defineFiberApp({
669
747
  status: "RECORD_DATE_SET",
670
748
  recordDate: {
671
749
  date: { var: "event.recordDate" },
672
- setByBoardOn: { var: "$timestamp" },
750
+ setByBoardOn: { var: "$ordinal" },
673
751
  resolutionRef: { var: "event.resolutionRef" },
674
752
  },
675
753
  },
754
+ {
755
+ _emit: [
756
+ { name: "RECORD_DATE_SET", data: { var: "event" }, destination: "external" },
757
+ ],
758
+ },
676
759
  ],
677
760
  },
678
- emits: ["RECORD_DATE_SET"],
679
761
  },
680
762
  // RECORD_DATE_SET -> RECORD_DATE_SET (register_eligible_shareholders)
681
763
  {
682
764
  from: "RECORD_DATE_SET",
683
765
  to: "RECORD_DATE_SET",
684
766
  eventName: "register_eligible_shareholders",
685
- guard: { "==": [1, 1] },
767
+ // 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)
768
+ guard: signerIsParty("state.registrar"),
686
769
  effect: {
687
770
  merge: [
688
771
  { var: "state" },
@@ -730,9 +813,13 @@ export const corpShareholdersDef = defineFiberApp({
730
813
  ],
731
814
  },
732
815
  },
816
+ {
817
+ _emit: [
818
+ { name: "PROXY_PERIOD_OPENED", data: { var: "event" }, destination: "external" },
819
+ ],
820
+ },
733
821
  ],
734
822
  },
735
- emits: ["PROXY_PERIOD_OPENED"],
736
823
  },
737
824
  // add_agenda_item (can be from multiple states)
738
825
  {
@@ -745,12 +832,12 @@ export const corpShareholdersDef = defineFiberApp({
745
832
  { var: "state" },
746
833
  {
747
834
  agenda: {
748
- cat: [
835
+ merge: [
749
836
  { var: "state.agenda" },
750
837
  [
751
838
  {
752
839
  itemId: { var: "event.itemId" },
753
- itemNumber: { "+": [{ var: "state.agenda.length" }, 1] },
840
+ itemNumber: { "+": [{ length: [{ var: "state.agenda" }] }, 1] },
754
841
  title: { var: "event.title" },
755
842
  description: { var: "event.description" },
756
843
  type: { var: "event.type" },
@@ -778,12 +865,12 @@ export const corpShareholdersDef = defineFiberApp({
778
865
  { var: "state" },
779
866
  {
780
867
  agenda: {
781
- cat: [
868
+ merge: [
782
869
  { var: "state.agenda" },
783
870
  [
784
871
  {
785
872
  itemId: { var: "event.itemId" },
786
- itemNumber: { "+": [{ var: "state.agenda.length" }, 1] },
873
+ itemNumber: { "+": [{ length: [{ var: "state.agenda" }] }, 1] },
787
874
  title: { var: "event.title" },
788
875
  description: { var: "event.description" },
789
876
  type: { var: "event.type" },
@@ -811,12 +898,12 @@ export const corpShareholdersDef = defineFiberApp({
811
898
  { var: "state" },
812
899
  {
813
900
  agenda: {
814
- cat: [
901
+ merge: [
815
902
  { var: "state.agenda" },
816
903
  [
817
904
  {
818
905
  itemId: { var: "event.itemId" },
819
- itemNumber: { "+": [{ var: "state.agenda.length" }, 1] },
906
+ itemNumber: { "+": [{ length: [{ var: "state.agenda" }] }, 1] },
820
907
  title: { var: "event.title" },
821
908
  description: { var: "event.description" },
822
909
  type: { var: "event.type" },
@@ -866,9 +953,13 @@ export const corpShareholdersDef = defineFiberApp({
866
953
  ],
867
954
  },
868
955
  },
956
+ {
957
+ _emit: [
958
+ { name: "SHAREHOLDER_MEETING_OPENED", data: { var: "event" }, destination: "external" },
959
+ ],
960
+ },
869
961
  ],
870
962
  },
871
- emits: ["SHAREHOLDER_MEETING_OPENED"],
872
963
  },
873
964
  // IN_SESSION -> VOTING
874
965
  {
@@ -904,15 +995,26 @@ export const corpShareholdersDef = defineFiberApp({
904
995
  from: "VOTING",
905
996
  to: "VOTING",
906
997
  eventName: "cast_vote",
998
+ // 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
999
  guard: {
908
1000
  and: [
909
1001
  {
910
1002
  some: [
911
1003
  { var: "state.eligibleVoters" },
912
1004
  {
913
- "==": [
914
- { var: ".shareholderId" },
915
- { var: "event.shareholderId" },
1005
+ and: [
1006
+ {
1007
+ "==": [
1008
+ { var: "shareholderId" },
1009
+ { var: "event.shareholderId" },
1010
+ ],
1011
+ },
1012
+ {
1013
+ in: [
1014
+ { var: "address" },
1015
+ { map: [{ var: "proofs" }, { var: "address" }] },
1016
+ ],
1017
+ },
916
1018
  ],
917
1019
  },
918
1020
  ],
@@ -925,13 +1027,13 @@ export const corpShareholdersDef = defineFiberApp({
925
1027
  and: [
926
1028
  {
927
1029
  "==": [
928
- { var: ".shareholderId" },
1030
+ { var: "shareholderId" },
929
1031
  { var: "event.shareholderId" },
930
1032
  ],
931
1033
  },
932
1034
  {
933
1035
  "==": [
934
- { var: ".agendaItemId" },
1036
+ { var: "agendaItemId" },
935
1037
  { var: "event.agendaItemId" },
936
1038
  ],
937
1039
  },
@@ -947,7 +1049,7 @@ export const corpShareholdersDef = defineFiberApp({
947
1049
  { var: "state" },
948
1050
  {
949
1051
  votes: {
950
- cat: [
1052
+ merge: [
951
1053
  { var: "state.votes" },
952
1054
  [
953
1055
  {
@@ -964,7 +1066,7 @@ export const corpShareholdersDef = defineFiberApp({
964
1066
  var: "event.cumulativeVoteAllocation",
965
1067
  },
966
1068
  viaProxy: { var: "event.viaProxy" },
967
- timestamp: { var: "$timestamp" },
1069
+ timestamp: { var: "$ordinal" },
968
1070
  },
969
1071
  ],
970
1072
  ],
@@ -976,7 +1078,7 @@ export const corpShareholdersDef = defineFiberApp({
976
1078
  if: [
977
1079
  {
978
1080
  "==": [
979
- { var: ".shareholderId" },
1081
+ { var: "shareholderId" },
980
1082
  { var: "event.shareholderId" },
981
1083
  ],
982
1084
  },
@@ -1047,9 +1149,13 @@ export const corpShareholdersDef = defineFiberApp({
1047
1149
  ],
1048
1150
  },
1049
1151
  },
1152
+ {
1153
+ _emit: [
1154
+ { name: "MEETING_RESULTS_CERTIFIED", data: { var: "event" }, destination: "external" },
1155
+ ],
1156
+ },
1050
1157
  ],
1051
1158
  },
1052
- emits: ["MEETING_RESULTS_CERTIFIED"],
1053
1159
  },
1054
1160
  // IN_SESSION -> CLOSED (adjourn_without_action)
1055
1161
  {
@@ -1069,9 +1175,13 @@ export const corpShareholdersDef = defineFiberApp({
1069
1175
  ],
1070
1176
  },
1071
1177
  },
1178
+ {
1179
+ _emit: [
1180
+ { name: "MEETING_ADJOURNED", data: { var: "event" }, destination: "external" },
1181
+ ],
1182
+ },
1072
1183
  ],
1073
1184
  },
1074
- emits: ["MEETING_ADJOURNED"],
1075
1185
  },
1076
1186
  // VOTING -> CLOSED (adjourn_without_action)
1077
1187
  {
@@ -1091,9 +1201,13 @@ export const corpShareholdersDef = defineFiberApp({
1091
1201
  ],
1092
1202
  },
1093
1203
  },
1204
+ {
1205
+ _emit: [
1206
+ { name: "MEETING_ADJOURNED", data: { var: "event" }, destination: "external" },
1207
+ ],
1208
+ },
1094
1209
  ],
1095
1210
  },
1096
- emits: ["MEETING_ADJOURNED"],
1097
1211
  },
1098
1212
  ],
1099
1213
  });