@ottochain/sdk 2.3.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/dist/cjs/apps/contracts/index.js +15 -8
  2. package/dist/cjs/apps/contracts/state-machines/contract-agreement.js +35 -40
  3. package/dist/cjs/apps/contracts/state-machines/contract-escrow.js +80 -37
  4. package/dist/cjs/apps/contracts/state-machines/contract-universal.js +4 -4
  5. package/dist/cjs/apps/corporate/index.js +2 -2
  6. package/dist/cjs/apps/corporate/state-machines/corp-board.js +169 -59
  7. package/dist/cjs/apps/corporate/state-machines/corp-entity.js +245 -47
  8. package/dist/cjs/apps/corporate/state-machines/corp-securities.js +407 -99
  9. package/dist/cjs/apps/corporate/state-machines/corp-shareholders.js +151 -37
  10. package/dist/cjs/apps/governance/index.js +14 -14
  11. package/dist/cjs/apps/governance/state-machines/dao-multisig.js +58 -40
  12. package/dist/cjs/apps/governance/state-machines/dao-reputation.js +46 -40
  13. package/dist/cjs/apps/governance/state-machines/dao-single.js +28 -11
  14. package/dist/cjs/apps/governance/state-machines/dao-token.js +67 -41
  15. package/dist/cjs/apps/governance/state-machines/governance-simple.js +93 -61
  16. package/dist/cjs/apps/governance/state-machines/governance-universal.js +2 -2
  17. package/dist/cjs/apps/identity/constants.js +55 -14
  18. package/dist/cjs/apps/identity/index.js +27 -11
  19. package/dist/cjs/apps/identity/state-machines/identity-agent.js +3 -3
  20. package/dist/cjs/apps/identity/state-machines/identity-oracle.js +25 -22
  21. package/dist/cjs/apps/identity/state-machines/identity-registry.js +288 -0
  22. package/dist/cjs/apps/identity/state-machines/identity-universal.js +3 -3
  23. package/dist/cjs/apps/identity/state-machines/index.js +3 -1
  24. package/dist/cjs/apps/index.js +19 -8
  25. package/dist/cjs/apps/lending/assets.js +223 -0
  26. package/dist/cjs/apps/lending/credit-scoring.js +87 -0
  27. package/dist/cjs/apps/lending/eligibility.js +121 -0
  28. package/dist/cjs/apps/lending/index.js +91 -0
  29. package/dist/cjs/apps/lending/state-machines/index.js +9 -0
  30. package/dist/cjs/apps/lending/state-machines/lending-zk-loan.js +412 -0
  31. package/dist/cjs/apps/markets/index.js +21 -11
  32. package/dist/cjs/apps/markets/state-machines/market-auction.js +14 -13
  33. package/dist/cjs/apps/markets/state-machines/market-crowdfund.js +29 -24
  34. package/dist/cjs/apps/markets/state-machines/market-group-buy.js +24 -26
  35. package/dist/cjs/apps/markets/state-machines/market-prediction.js +80 -53
  36. package/dist/cjs/apps/markets/state-machines/market-universal.js +5 -5
  37. package/dist/cjs/apps/oracles/index.js +2 -2
  38. package/dist/cjs/errors.js +3 -3
  39. package/dist/cjs/generated/google/protobuf/struct.js +4 -4
  40. package/dist/cjs/generated/index.js +11 -7
  41. package/dist/cjs/generated/openapi.js +6 -0
  42. package/dist/cjs/generated/ottochain/apps/contracts/v1/contract.js +50 -50
  43. package/dist/cjs/generated/ottochain/apps/corporate/v1/corporate.js +19 -20
  44. package/dist/cjs/generated/ottochain/apps/governance/v1/governance.js +13 -13
  45. package/dist/cjs/generated/ottochain/apps/identity/v1/attestation.js +4 -4
  46. package/dist/cjs/generated/ottochain/apps/identity/v1/identity.js +124 -130
  47. package/dist/cjs/generated/ottochain/apps/markets/v1/market.js +107 -107
  48. package/dist/cjs/generated/ottochain/v1/common.js +4 -4
  49. package/dist/cjs/generated/ottochain/v1/fiber.js +4 -4
  50. package/dist/cjs/index.js +41 -7
  51. package/dist/cjs/openapi.js +2 -0
  52. package/dist/cjs/ottochain/drop-nulls.js +1 -2
  53. package/dist/cjs/ottochain/genesis-manifest.js +11 -11
  54. package/dist/cjs/ottochain/index.js +23 -13
  55. package/dist/cjs/ottochain/metagraph-client.js +65 -8
  56. package/dist/cjs/ottochain/snapshot.js +11 -12
  57. package/dist/cjs/ottochain/transaction.js +57 -14
  58. package/dist/cjs/ottochain/types.js +16 -2
  59. package/dist/cjs/privacy/index.js +14 -0
  60. package/dist/cjs/privacy/sealed-bid.js +210 -0
  61. package/dist/cjs/privacy/shield-app.js +131 -0
  62. package/dist/cjs/schema/effects.js +40 -0
  63. package/dist/cjs/schema/fiber-app.js +19 -13
  64. package/dist/cjs/schema/guard-lint.js +352 -0
  65. package/dist/cjs/schema/guards.js +246 -0
  66. package/dist/cjs/signing.js +80 -0
  67. package/dist/cjs/types.js +2 -3
  68. package/dist/cjs/validation.js +8 -8
  69. package/dist/cjs/verify.js +9 -4
  70. package/dist/cjs/zk/commit.js +53 -0
  71. package/dist/cjs/zk/guard.js +107 -0
  72. package/dist/cjs/zk/index.js +48 -0
  73. package/dist/cjs/zk/preimage.js +37 -0
  74. package/dist/cjs/zk/prover.js +87 -0
  75. package/dist/cjs/zk/registry.js +62 -0
  76. package/dist/cjs/zk/types.js +28 -0
  77. package/dist/cjs/zk/witness.js +19 -0
  78. package/dist/esm/apps/contracts/index.js +7 -3
  79. package/dist/esm/apps/contracts/state-machines/contract-agreement.js +35 -40
  80. package/dist/esm/apps/contracts/state-machines/contract-escrow.js +80 -37
  81. package/dist/esm/apps/contracts/state-machines/contract-universal.js +4 -4
  82. package/dist/esm/apps/corporate/state-machines/corp-board.js +169 -59
  83. package/dist/esm/apps/corporate/state-machines/corp-entity.js +245 -47
  84. package/dist/esm/apps/corporate/state-machines/corp-securities.js +407 -99
  85. package/dist/esm/apps/corporate/state-machines/corp-shareholders.js +151 -37
  86. package/dist/esm/apps/governance/state-machines/dao-multisig.js +58 -40
  87. package/dist/esm/apps/governance/state-machines/dao-reputation.js +46 -40
  88. package/dist/esm/apps/governance/state-machines/dao-single.js +28 -11
  89. package/dist/esm/apps/governance/state-machines/dao-token.js +67 -41
  90. package/dist/esm/apps/governance/state-machines/governance-simple.js +93 -61
  91. package/dist/esm/apps/governance/state-machines/governance-universal.js +2 -2
  92. package/dist/esm/apps/identity/constants.js +51 -12
  93. package/dist/esm/apps/identity/index.js +12 -7
  94. package/dist/esm/apps/identity/state-machines/identity-agent.js +3 -3
  95. package/dist/esm/apps/identity/state-machines/identity-oracle.js +25 -22
  96. package/dist/esm/apps/identity/state-machines/identity-registry.js +285 -0
  97. package/dist/esm/apps/identity/state-machines/identity-universal.js +3 -3
  98. package/dist/esm/apps/identity/state-machines/index.js +1 -0
  99. package/dist/esm/apps/index.js +1 -0
  100. package/dist/esm/apps/lending/assets.js +207 -0
  101. package/dist/esm/apps/lending/credit-scoring.js +81 -0
  102. package/dist/esm/apps/lending/eligibility.js +115 -0
  103. package/dist/esm/apps/lending/index.js +69 -0
  104. package/dist/esm/apps/lending/state-machines/index.js +5 -0
  105. package/dist/esm/apps/lending/state-machines/lending-zk-loan.js +409 -0
  106. package/dist/esm/apps/markets/index.js +8 -4
  107. package/dist/esm/apps/markets/state-machines/market-auction.js +14 -13
  108. package/dist/esm/apps/markets/state-machines/market-crowdfund.js +29 -24
  109. package/dist/esm/apps/markets/state-machines/market-group-buy.js +24 -26
  110. package/dist/esm/apps/markets/state-machines/market-prediction.js +80 -53
  111. package/dist/esm/apps/markets/state-machines/market-universal.js +5 -5
  112. package/dist/esm/generated/index.js +9 -5
  113. package/dist/esm/generated/openapi.js +5 -0
  114. package/dist/esm/generated/ottochain/apps/contracts/v1/contract.js +46 -46
  115. package/dist/esm/generated/ottochain/apps/identity/v1/identity.js +114 -120
  116. package/dist/esm/generated/ottochain/apps/markets/v1/market.js +100 -100
  117. package/dist/esm/index.js +21 -2
  118. package/dist/esm/openapi.js +1 -0
  119. package/dist/esm/ottochain/genesis-manifest.js +9 -9
  120. package/dist/esm/ottochain/index.js +2 -3
  121. package/dist/esm/ottochain/metagraph-client.js +65 -8
  122. package/dist/esm/ottochain/snapshot.js +4 -4
  123. package/dist/esm/ottochain/transaction.js +43 -3
  124. package/dist/esm/ottochain/types.js +15 -1
  125. package/dist/esm/privacy/index.js +6 -0
  126. package/dist/esm/privacy/sealed-bid.js +206 -0
  127. package/dist/esm/privacy/shield-app.js +127 -0
  128. package/dist/esm/schema/effects.js +35 -0
  129. package/dist/esm/schema/fiber-app.js +13 -6
  130. package/dist/esm/schema/guard-lint.js +346 -0
  131. package/dist/esm/schema/guards.js +229 -0
  132. package/dist/esm/signing.js +74 -0
  133. package/dist/esm/verify.js +8 -2
  134. package/dist/esm/zk/commit.js +44 -0
  135. package/dist/esm/zk/guard.js +99 -0
  136. package/dist/esm/zk/index.js +19 -0
  137. package/dist/esm/zk/preimage.js +30 -0
  138. package/dist/esm/zk/prover.js +82 -0
  139. package/dist/esm/zk/registry.js +55 -0
  140. package/dist/esm/zk/types.js +25 -0
  141. package/dist/esm/zk/witness.js +15 -0
  142. package/dist/types/apps/contracts/index.d.ts +69 -209
  143. package/dist/types/apps/contracts/state-machines/contract-agreement.d.ts +20 -95
  144. package/dist/types/apps/contracts/state-machines/contract-escrow.d.ts +46 -112
  145. package/dist/types/apps/corporate/index.d.ts +1040 -304
  146. package/dist/types/apps/corporate/state-machines/corp-board.d.ts +188 -52
  147. package/dist/types/apps/corporate/state-machines/corp-entity.d.ts +267 -62
  148. package/dist/types/apps/corporate/state-machines/corp-securities.d.ts +355 -131
  149. package/dist/types/apps/corporate/state-machines/corp-shareholders.d.ts +225 -53
  150. package/dist/types/apps/governance/index.d.ts +296 -398
  151. package/dist/types/apps/governance/state-machines/dao-multisig.d.ts +77 -92
  152. package/dist/types/apps/governance/state-machines/dao-reputation.d.ts +42 -66
  153. package/dist/types/apps/governance/state-machines/dao-single.d.ts +25 -47
  154. package/dist/types/apps/governance/state-machines/dao-token.d.ts +60 -49
  155. package/dist/types/apps/governance/state-machines/governance-simple.d.ts +87 -117
  156. package/dist/types/apps/governance/state-machines/governance-universal.d.ts +2 -2
  157. package/dist/types/apps/identity/constants.d.ts +32 -4
  158. package/dist/types/apps/identity/index.d.ts +378 -94
  159. package/dist/types/apps/identity/state-machines/identity-oracle.d.ts +16 -87
  160. package/dist/types/apps/identity/state-machines/identity-registry.d.ts +379 -0
  161. package/dist/types/apps/identity/state-machines/index.d.ts +1 -0
  162. package/dist/types/apps/index.d.ts +1 -0
  163. package/dist/types/apps/lending/assets.d.ts +258 -0
  164. package/dist/types/apps/lending/credit-scoring.d.ts +80 -0
  165. package/dist/types/apps/lending/eligibility.d.ts +83 -0
  166. package/dist/types/apps/lending/index.d.ts +548 -0
  167. package/dist/types/apps/lending/state-machines/index.d.ts +5 -0
  168. package/dist/types/apps/lending/state-machines/lending-zk-loan.d.ts +528 -0
  169. package/dist/types/apps/markets/index.d.ts +108 -203
  170. package/dist/types/apps/markets/state-machines/market-auction.d.ts +13 -37
  171. package/dist/types/apps/markets/state-machines/market-crowdfund.d.ts +16 -34
  172. package/dist/types/apps/markets/state-machines/market-group-buy.d.ts +17 -43
  173. package/dist/types/apps/markets/state-machines/market-prediction.d.ts +51 -72
  174. package/dist/types/apps/markets/state-machines/market-universal.d.ts +5 -5
  175. package/dist/types/generated/index.d.ts +5 -5
  176. package/dist/types/generated/openapi.d.ts +1257 -0
  177. package/dist/types/generated/ottochain/apps/contracts/v1/contract.d.ts +5 -5
  178. package/dist/types/generated/ottochain/apps/identity/v1/identity.d.ts +12 -12
  179. package/dist/types/generated/ottochain/apps/markets/v1/market.d.ts +11 -11
  180. package/dist/types/index.d.ts +6 -2
  181. package/dist/types/openapi.d.ts +22 -0
  182. package/dist/types/ottochain/genesis-manifest.d.ts +5 -5
  183. package/dist/types/ottochain/index.d.ts +5 -6
  184. package/dist/types/ottochain/metagraph-client.d.ts +49 -7
  185. package/dist/types/ottochain/snapshot.d.ts +6 -6
  186. package/dist/types/ottochain/transaction.d.ts +33 -1
  187. package/dist/types/ottochain/types.d.ts +335 -30
  188. package/dist/types/privacy/index.d.ts +6 -0
  189. package/dist/types/privacy/sealed-bid.d.ts +348 -0
  190. package/dist/types/privacy/shield-app.d.ts +48 -0
  191. package/dist/types/schema/effects.d.ts +34 -0
  192. package/dist/types/schema/fiber-app.d.ts +1 -2
  193. package/dist/types/schema/guard-lint.d.ts +111 -0
  194. package/dist/types/schema/guards.d.ts +134 -0
  195. package/dist/types/signing.d.ts +45 -0
  196. package/dist/types/validation.d.ts +22 -217
  197. package/dist/types/verify.d.ts +4 -0
  198. package/dist/types/zk/commit.d.ts +28 -0
  199. package/dist/types/zk/guard.d.ts +46 -0
  200. package/dist/types/zk/index.d.ts +19 -0
  201. package/dist/types/zk/preimage.d.ts +10 -0
  202. package/dist/types/zk/prover.d.ts +34 -0
  203. package/dist/types/zk/registry.d.ts +34 -0
  204. package/dist/types/zk/types.d.ts +33 -0
  205. package/dist/types/zk/witness.d.ts +40 -0
  206. package/package.json +27 -13
  207. package/dist/cjs/ottochain/normalize.js +0 -186
  208. package/dist/esm/ottochain/normalize.js +0 -179
  209. package/dist/types/ottochain/normalize.d.ts +0 -79
@@ -2,6 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.corpShareholdersDef = void 0;
4
4
  const fiber_app_js_1 = require("../../../schema/fiber-app.js");
5
+ const guards_js_1 = require("../../../schema/guards.js");
6
+ const effects_js_1 = require("../../../schema/effects.js");
5
7
  /**
6
8
  * Shareholder meeting state machine managing annual/special meetings, record dates, proxy periods, voting, and certification of results.
7
9
  * Supports multiple share classes and cumulative voting.
@@ -37,7 +39,7 @@ exports.corpShareholdersDef = (0, fiber_app_js_1.defineFiberApp)({
37
39
  },
38
40
  },
39
41
  createSchema: {
40
- required: ["meetingId", "entityId"],
42
+ required: ["meetingId", "entityId", "registrar"],
41
43
  properties: {
42
44
  meetingId: {
43
45
  type: "string",
@@ -49,6 +51,11 @@ exports.corpShareholdersDef = (0, fiber_app_js_1.defineFiberApp)({
49
51
  description: "Reference to parent corporate-entity",
50
52
  immutable: true,
51
53
  },
54
+ registrar: {
55
+ type: "address",
56
+ description: "State-pinned DAG address of the transfer agent / registrar authorized to register the eligible-shareholder roster of record. Verified against proofs[].address.",
57
+ immutable: true,
58
+ },
52
59
  meetingType: {
53
60
  type: "string",
54
61
  enum: ["ANNUAL", "SPECIAL"],
@@ -76,6 +83,7 @@ exports.corpShareholdersDef = (0, fiber_app_js_1.defineFiberApp)({
76
83
  properties: {
77
84
  meetingId: { type: "string", immutable: true },
78
85
  entityId: { type: "string", immutable: true },
86
+ registrar: { type: "address", immutable: true },
79
87
  meetingType: { type: "string" },
80
88
  fiscalYear: { type: "integer" },
81
89
  scheduledDate: { type: "string", format: "date-time" },
@@ -145,11 +153,14 @@ exports.corpShareholdersDef = (0, fiber_app_js_1.defineFiberApp)({
145
153
  },
146
154
  createdAt: { type: "timestamp", computed: true },
147
155
  updatedAt: { type: "timestamp", computed: true },
156
+ // Two-phase scheduling (#24): propose_schedule_annual binds the board-resolution fiber + records the
157
+ // pending meeting here; schedule_annual asserts the bound resolution is EXECUTED, then clears this.
158
+ pendingschedule_annual: { type: "object", nullable: true, computed: true },
148
159
  },
149
160
  },
150
161
  eventSchemas: {
151
- schedule_annual: {
152
- description: "Schedule an annual shareholder meeting",
162
+ propose_schedule_annual: {
163
+ description: "Phase 1 of annual-meeting scheduling: bind the executing board-resolution fiber (#24 _addDependency) and record the pending meeting",
153
164
  required: [
154
165
  "meetingId",
155
166
  "entityId",
@@ -166,6 +177,22 @@ exports.corpShareholdersDef = (0, fiber_app_js_1.defineFiberApp)({
166
177
  boardResolutionRef: { type: "string" },
167
178
  },
168
179
  },
180
+ schedule_annual: {
181
+ description: "Phase 2 of annual-meeting scheduling: execute once the bound board resolution is EXECUTED",
182
+ required: [
183
+ "meetingId",
184
+ "entityId",
185
+ "fiscalYear",
186
+ "scheduledDate",
187
+ ],
188
+ properties: {
189
+ meetingId: { type: "string" },
190
+ entityId: { type: "string" },
191
+ fiscalYear: { type: "integer" },
192
+ scheduledDate: { type: "string", format: "date-time" },
193
+ location: { type: "object" },
194
+ },
195
+ },
169
196
  schedule_special: {
170
197
  description: "Schedule a special shareholder meeting",
171
198
  required: [
@@ -211,6 +238,10 @@ exports.corpShareholdersDef = (0, fiber_app_js_1.defineFiberApp)({
211
238
  properties: {
212
239
  shareholderId: { type: "string" },
213
240
  name: { type: "string" },
241
+ address: {
242
+ type: "address",
243
+ description: "DAG wallet address of record for this shareholder; the only key a verified signer can vote under.",
244
+ },
214
245
  shareholdings: { type: "array" },
215
246
  },
216
247
  },
@@ -372,6 +403,10 @@ exports.corpShareholdersDef = (0, fiber_app_js_1.defineFiberApp)({
372
403
  properties: {
373
404
  shareholderId: { type: "string" },
374
405
  name: { type: "string" },
406
+ address: {
407
+ type: "address",
408
+ description: "State-pinned DAG wallet address of record; cast_vote requires this address ∈ proofs[].address.",
409
+ },
375
410
  shareholdings: {
376
411
  type: "array",
377
412
  items: {
@@ -605,19 +640,51 @@ exports.corpShareholdersDef = (0, fiber_app_js_1.defineFiberApp)({
605
640
  initialState: "SCHEDULED",
606
641
  transitions: [
607
642
  // Initial creation transitions (from: null means creation)
608
- // schedule_annual -> SCHEDULED
643
+ // SCHEDULED -> SCHEDULED (propose_schedule_annual) — phase 1 (#24): bind the executing board-resolution
644
+ // fiber and record the pending meeting, so the next transition can read the resolution's state.
609
645
  {
610
646
  from: "SCHEDULED",
611
647
  to: "SCHEDULED",
612
- eventName: "schedule_annual",
648
+ eventName: "propose_schedule_annual",
613
649
  guard: { "==": [1, 1] },
614
- dependencies: [
615
- {
616
- machine: "corporate-resolution",
617
- instanceRef: { var: "event.boardResolutionRef" },
618
- requiredState: "EXECUTED",
619
- },
620
- ],
650
+ effect: {
651
+ merge: [
652
+ { var: "state" },
653
+ {
654
+ pendingschedule_annual: {
655
+ meetingId: { var: "event.meetingId" },
656
+ entityId: { var: "event.entityId" },
657
+ fiscalYear: { var: "event.fiscalYear" },
658
+ scheduledDate: { var: "event.scheduledDate" },
659
+ location: { var: "event.location" },
660
+ ref: { var: "event.boardResolutionRef" },
661
+ proposedAt: { var: "$ordinal" },
662
+ },
663
+ },
664
+ // bind the resolution fiber so schedule_annual can assert its state next transition
665
+ (0, effects_js_1.addDependency)({ var: "event.boardResolutionRef" }),
666
+ ],
667
+ },
668
+ dependencies: [],
669
+ },
670
+ // SCHEDULED -> SCHEDULED (schedule_annual) — phase 2 (#24): execute once the bound board resolution is
671
+ // EXECUTED. depInState replaces the dropped object-form dependency (which silently never gated).
672
+ {
673
+ from: "SCHEDULED",
674
+ to: "SCHEDULED",
675
+ eventName: "schedule_annual",
676
+ guard: {
677
+ and: [
678
+ // the proposal must target this meeting, and its bound resolution must be EXECUTED
679
+ {
680
+ "==": [
681
+ { var: "state.pendingschedule_annual.meetingId" },
682
+ { var: "event.meetingId" },
683
+ ],
684
+ },
685
+ (0, guards_js_1.depInState)("state.pendingschedule_annual.ref", "EXECUTED"),
686
+ ],
687
+ },
621
688
  effect: {
622
689
  merge: [
623
690
  { var: "state" },
@@ -630,12 +697,19 @@ exports.corpShareholdersDef = (0, fiber_app_js_1.defineFiberApp)({
630
697
  location: { var: "event.location" },
631
698
  calledBy: {
632
699
  type: "BOARD",
633
- resolutionRef: { var: "event.boardResolutionRef" },
700
+ resolutionRef: { var: "state.pendingschedule_annual.ref" },
634
701
  },
702
+ // clear the consumed proposal
703
+ pendingschedule_annual: null,
704
+ },
705
+ {
706
+ _emit: [
707
+ { name: "SHAREHOLDER_MEETING_SCHEDULED", data: { var: "event" }, destination: "external" },
708
+ ],
635
709
  },
636
710
  ],
637
711
  },
638
- emits: ["SHAREHOLDER_MEETING_SCHEDULED"],
712
+ dependencies: [],
639
713
  },
640
714
  // schedule_special -> SCHEDULED
641
715
  {
@@ -655,9 +729,13 @@ exports.corpShareholdersDef = (0, fiber_app_js_1.defineFiberApp)({
655
729
  type: { var: "event.calledByType" },
656
730
  },
657
731
  },
732
+ {
733
+ _emit: [
734
+ { name: "SPECIAL_MEETING_SCHEDULED", data: { var: "event" }, destination: "external" },
735
+ ],
736
+ },
658
737
  ],
659
738
  },
660
- emits: ["SPECIAL_MEETING_SCHEDULED"],
661
739
  },
662
740
  // SCHEDULED -> RECORD_DATE_SET
663
741
  {
@@ -672,20 +750,25 @@ exports.corpShareholdersDef = (0, fiber_app_js_1.defineFiberApp)({
672
750
  status: "RECORD_DATE_SET",
673
751
  recordDate: {
674
752
  date: { var: "event.recordDate" },
675
- setByBoardOn: { var: "$timestamp" },
753
+ setByBoardOn: { var: "$ordinal" },
676
754
  resolutionRef: { var: "event.resolutionRef" },
677
755
  },
678
756
  },
757
+ {
758
+ _emit: [
759
+ { name: "RECORD_DATE_SET", data: { var: "event" }, destination: "external" },
760
+ ],
761
+ },
679
762
  ],
680
763
  },
681
- emits: ["RECORD_DATE_SET"],
682
764
  },
683
765
  // RECORD_DATE_SET -> RECORD_DATE_SET (register_eligible_shareholders)
684
766
  {
685
767
  from: "RECORD_DATE_SET",
686
768
  to: "RECORD_DATE_SET",
687
769
  eventName: "register_eligible_shareholders",
688
- guard: { "==": [1, 1] },
770
+ // 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)
771
+ guard: (0, guards_js_1.signerIsParty)("state.registrar"),
689
772
  effect: {
690
773
  merge: [
691
774
  { var: "state" },
@@ -733,9 +816,13 @@ exports.corpShareholdersDef = (0, fiber_app_js_1.defineFiberApp)({
733
816
  ],
734
817
  },
735
818
  },
819
+ {
820
+ _emit: [
821
+ { name: "PROXY_PERIOD_OPENED", data: { var: "event" }, destination: "external" },
822
+ ],
823
+ },
736
824
  ],
737
825
  },
738
- emits: ["PROXY_PERIOD_OPENED"],
739
826
  },
740
827
  // add_agenda_item (can be from multiple states)
741
828
  {
@@ -748,12 +835,12 @@ exports.corpShareholdersDef = (0, fiber_app_js_1.defineFiberApp)({
748
835
  { var: "state" },
749
836
  {
750
837
  agenda: {
751
- cat: [
838
+ merge: [
752
839
  { var: "state.agenda" },
753
840
  [
754
841
  {
755
842
  itemId: { var: "event.itemId" },
756
- itemNumber: { "+": [{ var: "state.agenda.length" }, 1] },
843
+ itemNumber: { "+": [{ length: [{ var: "state.agenda" }] }, 1] },
757
844
  title: { var: "event.title" },
758
845
  description: { var: "event.description" },
759
846
  type: { var: "event.type" },
@@ -781,12 +868,12 @@ exports.corpShareholdersDef = (0, fiber_app_js_1.defineFiberApp)({
781
868
  { var: "state" },
782
869
  {
783
870
  agenda: {
784
- cat: [
871
+ merge: [
785
872
  { var: "state.agenda" },
786
873
  [
787
874
  {
788
875
  itemId: { var: "event.itemId" },
789
- itemNumber: { "+": [{ var: "state.agenda.length" }, 1] },
876
+ itemNumber: { "+": [{ length: [{ var: "state.agenda" }] }, 1] },
790
877
  title: { var: "event.title" },
791
878
  description: { var: "event.description" },
792
879
  type: { var: "event.type" },
@@ -814,12 +901,12 @@ exports.corpShareholdersDef = (0, fiber_app_js_1.defineFiberApp)({
814
901
  { var: "state" },
815
902
  {
816
903
  agenda: {
817
- cat: [
904
+ merge: [
818
905
  { var: "state.agenda" },
819
906
  [
820
907
  {
821
908
  itemId: { var: "event.itemId" },
822
- itemNumber: { "+": [{ var: "state.agenda.length" }, 1] },
909
+ itemNumber: { "+": [{ length: [{ var: "state.agenda" }] }, 1] },
823
910
  title: { var: "event.title" },
824
911
  description: { var: "event.description" },
825
912
  type: { var: "event.type" },
@@ -869,9 +956,13 @@ exports.corpShareholdersDef = (0, fiber_app_js_1.defineFiberApp)({
869
956
  ],
870
957
  },
871
958
  },
959
+ {
960
+ _emit: [
961
+ { name: "SHAREHOLDER_MEETING_OPENED", data: { var: "event" }, destination: "external" },
962
+ ],
963
+ },
872
964
  ],
873
965
  },
874
- emits: ["SHAREHOLDER_MEETING_OPENED"],
875
966
  },
876
967
  // IN_SESSION -> VOTING
877
968
  {
@@ -907,15 +998,26 @@ exports.corpShareholdersDef = (0, fiber_app_js_1.defineFiberApp)({
907
998
  from: "VOTING",
908
999
  to: "VOTING",
909
1000
  eventName: "cast_vote",
1001
+ // authority gate — the roster entry identified by event.shareholderId must carry an address that signed (address ∈ proofs[].address), so the recorded shareholderId is provably the matched entry's, not a forged one; an identity attestation layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
910
1002
  guard: {
911
1003
  and: [
912
1004
  {
913
1005
  some: [
914
1006
  { var: "state.eligibleVoters" },
915
1007
  {
916
- "==": [
917
- { var: ".shareholderId" },
918
- { var: "event.shareholderId" },
1008
+ and: [
1009
+ {
1010
+ "==": [
1011
+ { var: "shareholderId" },
1012
+ { var: "event.shareholderId" },
1013
+ ],
1014
+ },
1015
+ {
1016
+ in: [
1017
+ { var: "address" },
1018
+ { map: [{ var: "proofs" }, { var: "address" }] },
1019
+ ],
1020
+ },
919
1021
  ],
920
1022
  },
921
1023
  ],
@@ -928,13 +1030,13 @@ exports.corpShareholdersDef = (0, fiber_app_js_1.defineFiberApp)({
928
1030
  and: [
929
1031
  {
930
1032
  "==": [
931
- { var: ".shareholderId" },
1033
+ { var: "shareholderId" },
932
1034
  { var: "event.shareholderId" },
933
1035
  ],
934
1036
  },
935
1037
  {
936
1038
  "==": [
937
- { var: ".agendaItemId" },
1039
+ { var: "agendaItemId" },
938
1040
  { var: "event.agendaItemId" },
939
1041
  ],
940
1042
  },
@@ -950,7 +1052,7 @@ exports.corpShareholdersDef = (0, fiber_app_js_1.defineFiberApp)({
950
1052
  { var: "state" },
951
1053
  {
952
1054
  votes: {
953
- cat: [
1055
+ merge: [
954
1056
  { var: "state.votes" },
955
1057
  [
956
1058
  {
@@ -967,7 +1069,7 @@ exports.corpShareholdersDef = (0, fiber_app_js_1.defineFiberApp)({
967
1069
  var: "event.cumulativeVoteAllocation",
968
1070
  },
969
1071
  viaProxy: { var: "event.viaProxy" },
970
- timestamp: { var: "$timestamp" },
1072
+ timestamp: { var: "$ordinal" },
971
1073
  },
972
1074
  ],
973
1075
  ],
@@ -979,7 +1081,7 @@ exports.corpShareholdersDef = (0, fiber_app_js_1.defineFiberApp)({
979
1081
  if: [
980
1082
  {
981
1083
  "==": [
982
- { var: ".shareholderId" },
1084
+ { var: "shareholderId" },
983
1085
  { var: "event.shareholderId" },
984
1086
  ],
985
1087
  },
@@ -1050,9 +1152,13 @@ exports.corpShareholdersDef = (0, fiber_app_js_1.defineFiberApp)({
1050
1152
  ],
1051
1153
  },
1052
1154
  },
1155
+ {
1156
+ _emit: [
1157
+ { name: "MEETING_RESULTS_CERTIFIED", data: { var: "event" }, destination: "external" },
1158
+ ],
1159
+ },
1053
1160
  ],
1054
1161
  },
1055
- emits: ["MEETING_RESULTS_CERTIFIED"],
1056
1162
  },
1057
1163
  // IN_SESSION -> CLOSED (adjourn_without_action)
1058
1164
  {
@@ -1072,9 +1178,13 @@ exports.corpShareholdersDef = (0, fiber_app_js_1.defineFiberApp)({
1072
1178
  ],
1073
1179
  },
1074
1180
  },
1181
+ {
1182
+ _emit: [
1183
+ { name: "MEETING_ADJOURNED", data: { var: "event" }, destination: "external" },
1184
+ ],
1185
+ },
1075
1186
  ],
1076
1187
  },
1077
- emits: ["MEETING_ADJOURNED"],
1078
1188
  },
1079
1189
  // VOTING -> CLOSED (adjourn_without_action)
1080
1190
  {
@@ -1094,9 +1204,13 @@ exports.corpShareholdersDef = (0, fiber_app_js_1.defineFiberApp)({
1094
1204
  ],
1095
1205
  },
1096
1206
  },
1207
+ {
1208
+ _emit: [
1209
+ { name: "MEETING_ADJOURNED", data: { var: "event" }, destination: "external" },
1210
+ ],
1211
+ },
1097
1212
  ],
1098
1213
  },
1099
- emits: ["MEETING_ADJOURNED"],
1100
1214
  },
1101
1215
  ],
1102
1216
  });
@@ -21,7 +21,20 @@
21
21
  * @packageDocumentation
22
22
  */
23
23
  Object.defineProperty(exports, "__esModule", { value: true });
24
- exports.thresholdHasQuorum = exports.isMember = exports.meetsThreshold = exports.canPropose = exports.isPassing = exports.hasQuorum = exports.getVotingPower = exports.hasSigned = exports.isSigner = exports.signaturesNeeded = exports.isThresholdMet = exports.getDAODefinition = exports.getGovernanceDefinition = exports.GOVERNANCE_DEFINITIONS = exports.daoReputationDef = exports.daoTokenDef = exports.daoMultisigDef = exports.daoSingleDef = exports.govSimpleDef = exports.govUniversalDef = exports.voteChoiceToJSON = exports.voteChoiceFromJSON = exports.proposalStatusToJSON = exports.proposalStatusFromJSON = exports.dAOStatusToJSON = exports.dAOStatusFromJSON = exports.dAOTypeToJSON = exports.dAOTypeFromJSON = exports.ExecuteRequest = exports.VoteRequest = exports.ProposeRequest = exports.CreateDAORequest = exports.ThresholdHistoryEntry = exports.ThresholdVotes = exports.ThresholdDAO = exports.TokenProposalResult = exports.TokenDAO = exports.MultisigAction = exports.MultisigDAO = exports.OwnershipTransfer = exports.SingleOwnerAction = exports.SingleOwnerDAO = exports.VoteTally = exports.Vote = exports.Proposal = exports.DAOMetadata = exports.VoteChoice = exports.ProposalStatus = exports.DAOStatus = exports.DAOType = void 0;
24
+ exports.GOVERNANCE_DEFINITIONS = exports.daoReputationDef = exports.daoTokenDef = exports.daoMultisigDef = exports.daoSingleDef = exports.govSimpleDef = exports.govUniversalDef = exports.voteChoiceToJSON = exports.voteChoiceFromJSON = exports.proposalStatusToJSON = exports.proposalStatusFromJSON = exports.dAOStatusToJSON = exports.dAOStatusFromJSON = exports.dAOTypeToJSON = exports.dAOTypeFromJSON = exports.ExecuteRequest = exports.VoteRequest = exports.ProposeRequest = exports.CreateDAORequest = exports.ThresholdHistoryEntry = exports.ThresholdVotes = exports.ThresholdDAO = exports.TokenProposalResult = exports.TokenDAO = exports.MultisigAction = exports.MultisigDAO = exports.OwnershipTransfer = exports.SingleOwnerAction = exports.SingleOwnerDAO = exports.VoteTally = exports.Vote = exports.Proposal = exports.DAOMetadata = exports.VoteChoice = exports.ProposalStatus = exports.DAOStatus = exports.DAOType = void 0;
25
+ exports.getGovernanceDefinition = getGovernanceDefinition;
26
+ exports.getDAODefinition = getDAODefinition;
27
+ exports.isThresholdMet = isThresholdMet;
28
+ exports.signaturesNeeded = signaturesNeeded;
29
+ exports.isSigner = isSigner;
30
+ exports.hasSigned = hasSigned;
31
+ exports.getVotingPower = getVotingPower;
32
+ exports.hasQuorum = hasQuorum;
33
+ exports.isPassing = isPassing;
34
+ exports.canPropose = canPropose;
35
+ exports.meetsThreshold = meetsThreshold;
36
+ exports.isMember = isMember;
37
+ exports.thresholdHasQuorum = thresholdHasQuorum;
25
38
  // Re-export generated protobuf types (source of truth)
26
39
  var governance_js_1 = require("../../generated/ottochain/apps/governance/v1/governance.js");
27
40
  Object.defineProperty(exports, "DAOType", { enumerable: true, get: function () { return governance_js_1.DAOType; } });
@@ -80,7 +93,6 @@ exports.GOVERNANCE_DEFINITIONS = {
80
93
  function getGovernanceDefinition(type) {
81
94
  return exports.GOVERNANCE_DEFINITIONS[type];
82
95
  }
83
- exports.getGovernanceDefinition = getGovernanceDefinition;
84
96
  /** @deprecated Use getGovernanceDefinition('daoSingle' | 'daoMultisig' | 'daoToken' | 'daoReputation') */
85
97
  function getDAODefinition(daoType) {
86
98
  const map = {
@@ -91,35 +103,30 @@ function getDAODefinition(daoType) {
91
103
  };
92
104
  return exports.GOVERNANCE_DEFINITIONS[map[daoType]];
93
105
  }
94
- exports.getDAODefinition = getDAODefinition;
95
106
  /**
96
107
  * Check if multisig has enough signatures to execute
97
108
  */
98
109
  function isThresholdMet(state) {
99
110
  return Object.keys(state.signatures).length >= state.threshold;
100
111
  }
101
- exports.isThresholdMet = isThresholdMet;
102
112
  /**
103
113
  * Get remaining signatures needed
104
114
  */
105
115
  function signaturesNeeded(state) {
106
116
  return Math.max(0, state.threshold - Object.keys(state.signatures).length);
107
117
  }
108
- exports.signaturesNeeded = signaturesNeeded;
109
118
  /**
110
119
  * Check if agent is a signer
111
120
  */
112
121
  function isSigner(state, agent) {
113
122
  return state.signers.includes(agent);
114
123
  }
115
- exports.isSigner = isSigner;
116
124
  /**
117
125
  * Check if agent has signed current proposal
118
126
  */
119
127
  function hasSigned(state, agent) {
120
128
  return agent in state.signatures;
121
129
  }
122
- exports.hasSigned = hasSigned;
123
130
  /**
124
131
  * Get effective voting power (includes delegation)
125
132
  */
@@ -133,7 +140,6 @@ function getVotingPower(state, agent) {
133
140
  }
134
141
  return power;
135
142
  }
136
- exports.getVotingPower = getVotingPower;
137
143
  /**
138
144
  * Check if proposal has quorum
139
145
  */
@@ -143,7 +149,6 @@ function hasQuorum(state) {
143
149
  const totalVoted = state.votes.votesFor + state.votes.votesAgainst + state.votes.votesAbstain;
144
150
  return totalVoted >= state.quorum;
145
151
  }
146
- exports.hasQuorum = hasQuorum;
147
152
  /**
148
153
  * Check if proposal is passing
149
154
  */
@@ -152,14 +157,12 @@ function isPassing(state) {
152
157
  return false;
153
158
  return state.votes.votesFor > state.votes.votesAgainst && hasQuorum(state);
154
159
  }
155
- exports.isPassing = isPassing;
156
160
  /**
157
161
  * Check if agent can propose
158
162
  */
159
163
  function canPropose(state, agent) {
160
164
  return (state.balances[agent] ?? 0) >= state.proposalThreshold;
161
165
  }
162
- exports.canPropose = canPropose;
163
166
  /**
164
167
  * Check if agent meets threshold for action
165
168
  */
@@ -173,14 +176,12 @@ function meetsThreshold(state, reputation, action) {
173
176
  return reputation >= state.proposeThreshold;
174
177
  }
175
178
  }
176
- exports.meetsThreshold = meetsThreshold;
177
179
  /**
178
180
  * Check if agent is a member
179
181
  */
180
182
  function isMember(state, agent) {
181
183
  return state.members.includes(agent);
182
184
  }
183
- exports.isMember = isMember;
184
185
  /**
185
186
  * Check if threshold proposal has quorum
186
187
  */
@@ -190,4 +191,3 @@ function thresholdHasQuorum(state) {
190
191
  const totalVoted = state.votes.votesFor.length + state.votes.votesAgainst.length;
191
192
  return totalVoted >= state.quorum;
192
193
  }
193
- exports.thresholdHasQuorum = thresholdHasQuorum;