@ottochain/sdk 2.4.0 → 2.6.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.
- package/dist/cjs/apps/compute/index.js +33 -0
- package/dist/cjs/apps/compute/state-machines/compute-rule110.js +164 -0
- package/dist/cjs/apps/compute/state-machines/index.js +9 -0
- package/dist/cjs/apps/contracts/index.js +1 -1
- package/dist/cjs/apps/contracts/state-machines/contract-agreement.js +126 -148
- package/dist/cjs/apps/contracts/state-machines/contract-escrow.js +153 -174
- package/dist/cjs/apps/contracts/state-machines/contract-universal.js +46 -58
- package/dist/cjs/apps/corporate/state-machines/corp-board.js +415 -481
- package/dist/cjs/apps/corporate/state-machines/corp-entity.js +368 -440
- package/dist/cjs/apps/corporate/state-machines/corp-securities.js +532 -647
- package/dist/cjs/apps/corporate/state-machines/corp-shareholders.js +499 -603
- package/dist/cjs/apps/governance/index.js +7 -7
- package/dist/cjs/apps/governance/state-machines/dao-multisig.js +170 -209
- package/dist/cjs/apps/governance/state-machines/dao-reputation.js +161 -214
- package/dist/cjs/apps/governance/state-machines/dao-single.js +92 -92
- package/dist/cjs/apps/governance/state-machines/dao-token.js +169 -223
- package/dist/cjs/apps/governance/state-machines/governance-simple.js +185 -217
- package/dist/cjs/apps/governance/state-machines/governance-universal.js +64 -64
- package/dist/cjs/apps/identity/constants.js +16 -24
- package/dist/cjs/apps/identity/index.js +1 -1
- package/dist/cjs/apps/identity/state-machines/identity-agent.js +124 -158
- package/dist/cjs/apps/identity/state-machines/identity-oracle.js +151 -169
- package/dist/cjs/apps/identity/state-machines/identity-registry.js +89 -115
- package/dist/cjs/apps/identity/state-machines/identity-universal.js +51 -57
- package/dist/cjs/apps/index.js +4 -1
- package/dist/cjs/apps/lending/assets.js +41 -17
- package/dist/cjs/apps/lending/credit-scoring.js +4 -4
- package/dist/cjs/apps/lending/eligibility.js +9 -25
- package/dist/cjs/apps/lending/index.js +1 -1
- package/dist/cjs/apps/lending/state-machines/lending-zk-loan.js +177 -156
- package/dist/cjs/apps/markets/index.js +1 -1
- package/dist/cjs/apps/markets/state-machines/market-auction.js +115 -134
- package/dist/cjs/apps/markets/state-machines/market-crowdfund.js +122 -137
- package/dist/cjs/apps/markets/state-machines/market-group-buy.js +158 -177
- package/dist/cjs/apps/markets/state-machines/market-prediction.js +193 -227
- package/dist/cjs/apps/markets/state-machines/market-universal.js +65 -80
- package/dist/cjs/apps/oracles/index.js +1 -1
- package/dist/cjs/apps/privacy/index.js +67 -0
- package/dist/cjs/apps/privacy/state-machines/index.js +17 -0
- package/dist/cjs/apps/privacy/state-machines/mixer-ddhRing.js +286 -0
- package/dist/cjs/apps/privacy/state-machines/note-pool.js +476 -0
- package/dist/cjs/apps/staked-pool/assets.js +103 -0
- package/dist/cjs/apps/staked-pool/base.js +498 -0
- package/dist/cjs/apps/staked-pool/consumer.js +55 -0
- package/dist/cjs/apps/staked-pool/index.js +83 -0
- package/dist/cjs/apps/staked-pool/state-machines/index.js +12 -0
- package/dist/cjs/apps/staked-pool/state-machines/staked-pool-base.js +49 -0
- package/dist/cjs/apps/staked-pool/state-machines/staked-pool-oracle.js +131 -0
- package/dist/cjs/generated/google/protobuf/struct.js +1 -1
- package/dist/cjs/generated/google/protobuf/timestamp.js +1 -1
- package/dist/cjs/generated/ottochain/apps/contracts/v1/contract.js +1 -1
- package/dist/cjs/generated/ottochain/apps/corporate/v1/corporate.js +1 -1
- package/dist/cjs/generated/ottochain/apps/governance/v1/governance.js +1 -1
- package/dist/cjs/generated/ottochain/apps/identity/v1/attestation.js +1 -1
- package/dist/cjs/generated/ottochain/apps/identity/v1/identity.js +1 -1
- package/dist/cjs/generated/ottochain/apps/markets/v1/market.js +1 -1
- package/dist/cjs/generated/ottochain/v1/common.js +1 -1
- package/dist/cjs/generated/ottochain/v1/fiber.js +40 -2
- package/dist/cjs/generated/ottochain/v1/messages.js +1 -1
- package/dist/cjs/generated/ottochain/v1/records.js +1 -1
- package/dist/cjs/index.js +21 -3
- package/dist/cjs/ottochain/genesis-manifest.js +6 -0
- package/dist/cjs/ottochain/metagraph-client.js +63 -11
- package/dist/cjs/ottochain/snapshot.js +2 -4
- package/dist/cjs/ottochain/transaction.js +10 -0
- package/dist/cjs/privacy/sealed-bid.js +85 -82
- package/dist/cjs/privacy/shield-app.js +32 -32
- package/dist/cjs/schema/effects.js +145 -1
- package/dist/cjs/schema/fiber-app.js +139 -5
- package/dist/cjs/schema/guard-lint.js +3 -12
- package/dist/cjs/schema/guards.js +38 -38
- package/dist/cjs/templates/asset-policy.js +190 -0
- package/dist/cjs/templates/index.js +86 -0
- package/dist/cjs/templates/machine.js +130 -0
- package/dist/cjs/templates/migration.js +39 -0
- package/dist/cjs/templates/state-shape.js +38 -0
- package/dist/cjs/validation.js +1 -3
- package/dist/esm/apps/compute/index.js +29 -0
- package/dist/esm/apps/compute/state-machines/compute-rule110.js +161 -0
- package/dist/esm/apps/compute/state-machines/index.js +5 -0
- package/dist/esm/apps/contracts/index.js +4 -4
- package/dist/esm/apps/contracts/state-machines/contract-agreement.js +128 -150
- package/dist/esm/apps/contracts/state-machines/contract-escrow.js +155 -176
- package/dist/esm/apps/contracts/state-machines/contract-universal.js +47 -59
- package/dist/esm/apps/corporate/index.js +2 -2
- package/dist/esm/apps/corporate/state-machines/corp-board.js +418 -484
- package/dist/esm/apps/corporate/state-machines/corp-entity.js +371 -443
- package/dist/esm/apps/corporate/state-machines/corp-securities.js +535 -650
- package/dist/esm/apps/corporate/state-machines/corp-shareholders.js +502 -606
- package/dist/esm/apps/governance/index.js +10 -10
- package/dist/esm/apps/governance/state-machines/dao-multisig.js +172 -211
- package/dist/esm/apps/governance/state-machines/dao-reputation.js +163 -216
- package/dist/esm/apps/governance/state-machines/dao-single.js +94 -94
- package/dist/esm/apps/governance/state-machines/dao-token.js +171 -225
- package/dist/esm/apps/governance/state-machines/governance-simple.js +187 -219
- package/dist/esm/apps/governance/state-machines/governance-universal.js +65 -65
- package/dist/esm/apps/identity/constants.js +18 -26
- package/dist/esm/apps/identity/index.js +8 -8
- package/dist/esm/apps/identity/state-machines/identity-agent.js +125 -159
- package/dist/esm/apps/identity/state-machines/identity-oracle.js +153 -171
- package/dist/esm/apps/identity/state-machines/identity-registry.js +91 -117
- package/dist/esm/apps/identity/state-machines/identity-universal.js +52 -58
- package/dist/esm/apps/index.js +9 -6
- package/dist/esm/apps/lending/assets.js +41 -17
- package/dist/esm/apps/lending/credit-scoring.js +6 -6
- package/dist/esm/apps/lending/eligibility.js +10 -26
- package/dist/esm/apps/lending/index.js +5 -5
- package/dist/esm/apps/lending/state-machines/lending-zk-loan.js +178 -157
- package/dist/esm/apps/markets/index.js +5 -5
- package/dist/esm/apps/markets/state-machines/market-auction.js +117 -136
- package/dist/esm/apps/markets/state-machines/market-crowdfund.js +124 -139
- package/dist/esm/apps/markets/state-machines/market-group-buy.js +160 -179
- package/dist/esm/apps/markets/state-machines/market-prediction.js +195 -229
- package/dist/esm/apps/markets/state-machines/market-universal.js +66 -81
- package/dist/esm/apps/oracles/index.js +3 -3
- package/dist/esm/apps/privacy/index.js +56 -0
- package/dist/esm/apps/privacy/state-machines/index.js +6 -0
- package/dist/esm/apps/privacy/state-machines/mixer-ddhRing.js +282 -0
- package/dist/esm/apps/privacy/state-machines/note-pool.js +470 -0
- package/dist/esm/apps/staked-pool/assets.js +91 -0
- package/dist/esm/apps/staked-pool/base.js +493 -0
- package/dist/esm/apps/staked-pool/consumer.js +49 -0
- package/dist/esm/apps/staked-pool/index.js +60 -0
- package/dist/esm/apps/staked-pool/state-machines/index.js +6 -0
- package/dist/esm/apps/staked-pool/state-machines/staked-pool-base.js +46 -0
- package/dist/esm/apps/staked-pool/state-machines/staked-pool-oracle.js +127 -0
- package/dist/esm/generated/google/protobuf/struct.js +1 -1
- package/dist/esm/generated/google/protobuf/timestamp.js +1 -1
- package/dist/esm/generated/ottochain/apps/contracts/v1/contract.js +1 -1
- package/dist/esm/generated/ottochain/apps/corporate/v1/corporate.js +1 -1
- package/dist/esm/generated/ottochain/apps/governance/v1/governance.js +1 -1
- package/dist/esm/generated/ottochain/apps/identity/v1/attestation.js +1 -1
- package/dist/esm/generated/ottochain/apps/identity/v1/identity.js +1 -1
- package/dist/esm/generated/ottochain/apps/markets/v1/market.js +1 -1
- package/dist/esm/generated/ottochain/v1/common.js +1 -1
- package/dist/esm/generated/ottochain/v1/fiber.js +40 -2
- package/dist/esm/generated/ottochain/v1/messages.js +1 -1
- package/dist/esm/generated/ottochain/v1/records.js +1 -1
- package/dist/esm/index.js +10 -4
- package/dist/esm/ottochain/genesis-manifest.js +6 -0
- package/dist/esm/ottochain/metagraph-client.js +63 -11
- package/dist/esm/ottochain/snapshot.js +2 -4
- package/dist/esm/ottochain/transaction.js +8 -0
- package/dist/esm/privacy/index.js +2 -2
- package/dist/esm/privacy/sealed-bid.js +87 -84
- package/dist/esm/privacy/shield-app.js +33 -33
- package/dist/esm/schema/effects.js +137 -0
- package/dist/esm/schema/fiber-app.js +134 -5
- package/dist/esm/schema/guard-lint.js +3 -12
- package/dist/esm/schema/guards.js +36 -37
- package/dist/esm/templates/asset-policy.js +182 -0
- package/dist/esm/templates/index.js +41 -0
- package/dist/esm/templates/machine.js +125 -0
- package/dist/esm/templates/migration.js +34 -0
- package/dist/esm/templates/state-shape.js +34 -0
- package/dist/esm/validation.js +1 -3
- package/dist/esm/zk/index.js +4 -4
- package/dist/types/apps/compute/index.d.ts +176 -0
- package/dist/types/apps/compute/state-machines/compute-rule110.d.ts +157 -0
- package/dist/types/apps/compute/state-machines/index.d.ts +5 -0
- package/dist/types/apps/contracts/index.d.ts +14 -14
- package/dist/types/apps/contracts/state-machines/contract-agreement.d.ts +3 -3
- package/dist/types/apps/contracts/state-machines/contract-escrow.d.ts +3 -3
- package/dist/types/apps/contracts/state-machines/contract-universal.d.ts +4 -4
- package/dist/types/apps/corporate/index.d.ts +162 -162
- package/dist/types/apps/corporate/state-machines/corp-board.d.ts +88 -88
- package/dist/types/apps/corporate/state-machines/corp-entity.d.ts +14 -14
- package/dist/types/apps/corporate/state-machines/corp-securities.d.ts +18 -18
- package/dist/types/apps/corporate/state-machines/corp-shareholders.d.ts +43 -43
- package/dist/types/apps/governance/index.d.ts +81 -81
- package/dist/types/apps/governance/state-machines/dao-multisig.d.ts +16 -16
- package/dist/types/apps/governance/state-machines/dao-reputation.d.ts +22 -22
- package/dist/types/apps/governance/state-machines/dao-token.d.ts +21 -21
- package/dist/types/apps/governance/state-machines/governance-simple.d.ts +11 -11
- package/dist/types/apps/governance/state-machines/governance-universal.d.ts +4 -4
- package/dist/types/apps/identity/constants.d.ts +2 -2
- package/dist/types/apps/identity/index.d.ts +70 -70
- package/dist/types/apps/identity/state-machines/identity-agent.d.ts +23 -23
- package/dist/types/apps/identity/state-machines/identity-oracle.d.ts +11 -11
- package/dist/types/apps/identity/state-machines/identity-registry.d.ts +27 -27
- package/dist/types/apps/identity/state-machines/identity-universal.d.ts +4 -4
- package/dist/types/apps/index.d.ts +9 -6
- package/dist/types/apps/lending/assets.d.ts +2 -2
- package/dist/types/apps/lending/credit-scoring.d.ts +5 -5
- package/dist/types/apps/lending/eligibility.d.ts +2 -2
- package/dist/types/apps/lending/index.d.ts +20 -12
- package/dist/types/apps/lending/state-machines/lending-zk-loan.d.ts +15 -7
- package/dist/types/apps/markets/index.d.ts +76 -76
- package/dist/types/apps/markets/state-machines/market-auction.d.ts +12 -12
- package/dist/types/apps/markets/state-machines/market-crowdfund.d.ts +19 -19
- package/dist/types/apps/markets/state-machines/market-group-buy.d.ts +18 -18
- package/dist/types/apps/markets/state-machines/market-prediction.d.ts +15 -15
- package/dist/types/apps/markets/state-machines/market-universal.d.ts +7 -7
- package/dist/types/apps/oracles/index.d.ts +1 -1
- package/dist/types/apps/privacy/index.d.ts +328 -0
- package/dist/types/apps/privacy/state-machines/index.d.ts +6 -0
- package/dist/types/apps/privacy/state-machines/mixer-ddhRing.d.ts +337 -0
- package/dist/types/apps/privacy/state-machines/note-pool.d.ts +196 -0
- package/dist/types/apps/staked-pool/assets.d.ts +53 -0
- package/dist/types/apps/staked-pool/base.d.ts +80 -0
- package/dist/types/apps/staked-pool/consumer.d.ts +29 -0
- package/dist/types/apps/staked-pool/index.d.ts +51 -0
- package/dist/types/apps/staked-pool/state-machines/index.d.ts +6 -0
- package/dist/types/apps/staked-pool/state-machines/staked-pool-base.d.ts +8 -0
- package/dist/types/apps/staked-pool/state-machines/staked-pool-oracle.d.ts +34 -0
- package/dist/types/generated/openapi.d.ts +13 -0
- package/dist/types/generated/ottochain/v1/fiber.d.ts +7 -0
- package/dist/types/index.d.ts +3 -3
- package/dist/types/openapi.d.ts +4 -2
- package/dist/types/ottochain/genesis-manifest.d.ts +6 -0
- package/dist/types/ottochain/index.d.ts +1 -1
- package/dist/types/ottochain/metagraph-client.d.ts +69 -15
- package/dist/types/ottochain/transaction.d.ts +9 -1
- package/dist/types/ottochain/types.d.ts +1 -1
- package/dist/types/privacy/index.d.ts +2 -2
- package/dist/types/privacy/sealed-bid.d.ts +9 -9
- package/dist/types/privacy/shield-app.d.ts +1 -1
- package/dist/types/schema/effects.d.ts +132 -0
- package/dist/types/schema/fiber-app.d.ts +281 -0
- package/dist/types/schema/guards.d.ts +12 -0
- package/dist/types/templates/asset-policy.d.ts +119 -0
- package/dist/types/templates/index.d.ts +26 -0
- package/dist/types/templates/machine.d.ts +139 -0
- package/dist/types/templates/migration.d.ts +34 -0
- package/dist/types/templates/state-shape.d.ts +30 -0
- package/dist/types/zk/index.d.ts +4 -4
- package/package.json +31 -13
|
@@ -1,624 +1,566 @@
|
|
|
1
|
-
import { defineFiberApp } from
|
|
2
|
-
import { signerIsParty, depInState } from
|
|
3
|
-
import { addDependency } from
|
|
1
|
+
import { defineFiberApp } from '../../../schema/fiber-app.js';
|
|
2
|
+
import { signerIsParty, depInState } from '../../../schema/guards.js';
|
|
3
|
+
import { addDependency } from '../../../schema/effects.js';
|
|
4
4
|
/**
|
|
5
5
|
* Securities state machine tracking the lifecycle of equity from authorization through issuance, transfer, and retirement.
|
|
6
6
|
* Manages stock certificates, book entry positions, and restricted securities.
|
|
7
7
|
*/
|
|
8
8
|
export const corpSecuritiesDef = defineFiberApp({
|
|
9
9
|
metadata: {
|
|
10
|
-
name:
|
|
11
|
-
app:
|
|
12
|
-
type:
|
|
13
|
-
version:
|
|
14
|
-
description:
|
|
10
|
+
name: 'CorpSecurities',
|
|
11
|
+
app: 'corporate',
|
|
12
|
+
type: 'securities',
|
|
13
|
+
version: '1.0.0',
|
|
14
|
+
description: 'Securities state machine tracking the lifecycle of equity from authorization through issuance, transfer, and retirement. Manages stock certificates, book entry positions, and restricted securities.',
|
|
15
15
|
crossReferences: {
|
|
16
16
|
entity: {
|
|
17
|
-
machine:
|
|
18
|
-
description:
|
|
19
|
-
foreignKey:
|
|
17
|
+
machine: 'corporate-entity',
|
|
18
|
+
description: 'Parent corporate entity with share class definitions',
|
|
19
|
+
foreignKey: 'entityId',
|
|
20
20
|
},
|
|
21
21
|
resolutions: {
|
|
22
|
-
machine:
|
|
23
|
-
description:
|
|
24
|
-
foreignKey:
|
|
22
|
+
machine: 'corporate-resolution',
|
|
23
|
+
description: 'Board resolutions authorizing securities actions',
|
|
24
|
+
foreignKey: 'entityId',
|
|
25
25
|
},
|
|
26
26
|
shareholders: {
|
|
27
|
-
machine:
|
|
28
|
-
description:
|
|
29
|
-
foreignKey:
|
|
27
|
+
machine: 'corporate-shareholders',
|
|
28
|
+
description: 'Shareholder meetings for determining voting rights',
|
|
29
|
+
foreignKey: 'entityId',
|
|
30
30
|
},
|
|
31
31
|
},
|
|
32
32
|
},
|
|
33
33
|
createSchema: {
|
|
34
34
|
required: [
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
35
|
+
'securityId',
|
|
36
|
+
'entityId',
|
|
37
|
+
'issuerAddress',
|
|
38
|
+
'shareClass',
|
|
39
|
+
'shareClassName',
|
|
40
|
+
'shareCount',
|
|
41
|
+
'parValue',
|
|
42
42
|
],
|
|
43
43
|
properties: {
|
|
44
44
|
securityId: {
|
|
45
|
-
type:
|
|
46
|
-
description:
|
|
45
|
+
type: 'string',
|
|
46
|
+
description: 'Unique identifier for this security lot/certificate',
|
|
47
47
|
immutable: true,
|
|
48
48
|
},
|
|
49
49
|
entityId: {
|
|
50
|
-
type:
|
|
51
|
-
description:
|
|
50
|
+
type: 'string',
|
|
51
|
+
description: 'Reference to parent corporate-entity',
|
|
52
52
|
immutable: true,
|
|
53
53
|
},
|
|
54
54
|
issuerAddress: {
|
|
55
|
-
type:
|
|
56
|
-
description:
|
|
55
|
+
type: 'address',
|
|
56
|
+
description: 'State-pinned DAG address of the issuing authority (the corporation / transfer agent). Verified against proofs[].address to gate issuer-privileged transitions.',
|
|
57
57
|
immutable: true,
|
|
58
58
|
},
|
|
59
59
|
shareClass: {
|
|
60
|
-
type:
|
|
61
|
-
description:
|
|
60
|
+
type: 'string',
|
|
61
|
+
description: 'Share class ID from corporate-entity',
|
|
62
62
|
},
|
|
63
63
|
shareClassName: {
|
|
64
|
-
type:
|
|
65
|
-
description:
|
|
64
|
+
type: 'string',
|
|
65
|
+
description: 'Human-readable class name',
|
|
66
66
|
},
|
|
67
67
|
shareCount: {
|
|
68
|
-
type:
|
|
69
|
-
description:
|
|
68
|
+
type: 'integer',
|
|
69
|
+
description: 'Number of shares in this lot',
|
|
70
70
|
},
|
|
71
71
|
parValue: {
|
|
72
|
-
type:
|
|
73
|
-
description:
|
|
72
|
+
type: 'number',
|
|
73
|
+
description: 'Par value per share',
|
|
74
74
|
},
|
|
75
75
|
},
|
|
76
76
|
},
|
|
77
77
|
stateSchema: {
|
|
78
78
|
properties: {
|
|
79
|
-
securityId: { type:
|
|
80
|
-
entityId: { type:
|
|
81
|
-
issuerAddress: { type:
|
|
82
|
-
shareClass: { type:
|
|
83
|
-
shareClassName: { type:
|
|
79
|
+
securityId: { type: 'string', immutable: true },
|
|
80
|
+
entityId: { type: 'string', immutable: true },
|
|
81
|
+
issuerAddress: { type: 'address', immutable: true },
|
|
82
|
+
shareClass: { type: 'string' },
|
|
83
|
+
shareClassName: { type: 'string' },
|
|
84
84
|
certificateNumber: {
|
|
85
|
-
type:
|
|
85
|
+
type: 'string',
|
|
86
86
|
nullable: true,
|
|
87
|
-
description:
|
|
87
|
+
description: 'For certificated shares',
|
|
88
88
|
},
|
|
89
89
|
cusip: {
|
|
90
|
-
type:
|
|
90
|
+
type: 'string',
|
|
91
91
|
nullable: true,
|
|
92
|
-
description:
|
|
92
|
+
description: 'CUSIP number if assigned',
|
|
93
93
|
},
|
|
94
|
-
shareCount: { type:
|
|
95
|
-
parValue: { type:
|
|
94
|
+
shareCount: { type: 'integer' },
|
|
95
|
+
parValue: { type: 'number' },
|
|
96
96
|
issuancePrice: {
|
|
97
|
-
type:
|
|
97
|
+
type: 'number',
|
|
98
98
|
nullable: true,
|
|
99
|
-
description:
|
|
99
|
+
description: 'Price per share at issuance',
|
|
100
100
|
computed: true,
|
|
101
101
|
},
|
|
102
102
|
issuanceDate: {
|
|
103
|
-
type:
|
|
104
|
-
format:
|
|
103
|
+
type: 'string',
|
|
104
|
+
format: 'date',
|
|
105
105
|
nullable: true,
|
|
106
106
|
computed: true,
|
|
107
107
|
},
|
|
108
108
|
form: {
|
|
109
|
-
type:
|
|
110
|
-
enum: [
|
|
111
|
-
description:
|
|
109
|
+
type: 'string',
|
|
110
|
+
enum: ['CERTIFICATED', 'BOOK_ENTRY', 'DRS'],
|
|
111
|
+
description: 'Physical certificate, book entry, or Direct Registration System',
|
|
112
112
|
computed: true,
|
|
113
113
|
},
|
|
114
|
-
holder: { $ref:
|
|
115
|
-
restrictions: { $ref:
|
|
114
|
+
holder: { $ref: '#/definitions/Holder', nullable: true, computed: true },
|
|
115
|
+
restrictions: { $ref: '#/definitions/Restrictions', computed: true },
|
|
116
116
|
authorization: {
|
|
117
|
-
$ref:
|
|
117
|
+
$ref: '#/definitions/Authorization',
|
|
118
118
|
nullable: true,
|
|
119
119
|
computed: true,
|
|
120
120
|
},
|
|
121
121
|
issuanceDetails: {
|
|
122
|
-
$ref:
|
|
122
|
+
$ref: '#/definitions/IssuanceDetails',
|
|
123
123
|
nullable: true,
|
|
124
124
|
computed: true,
|
|
125
125
|
},
|
|
126
126
|
transferHistory: {
|
|
127
|
-
type:
|
|
128
|
-
items: { $ref:
|
|
127
|
+
type: 'array',
|
|
128
|
+
items: { $ref: '#/definitions/TransferRecord' },
|
|
129
129
|
computed: true,
|
|
130
130
|
},
|
|
131
131
|
corporateActions: {
|
|
132
|
-
type:
|
|
133
|
-
items: { $ref:
|
|
132
|
+
type: 'array',
|
|
133
|
+
items: { $ref: '#/definitions/CorporateAction' },
|
|
134
134
|
computed: true,
|
|
135
135
|
},
|
|
136
136
|
retirementDetails: {
|
|
137
|
-
$ref:
|
|
137
|
+
$ref: '#/definitions/RetirementDetails',
|
|
138
138
|
nullable: true,
|
|
139
139
|
computed: true,
|
|
140
140
|
},
|
|
141
141
|
status: {
|
|
142
|
-
type:
|
|
143
|
-
enum: [
|
|
144
|
-
"AUTHORIZED",
|
|
145
|
-
"ISSUED",
|
|
146
|
-
"TREASURY",
|
|
147
|
-
"TRANSFERRED",
|
|
148
|
-
"RETIRED",
|
|
149
|
-
],
|
|
142
|
+
type: 'string',
|
|
143
|
+
enum: ['AUTHORIZED', 'ISSUED', 'TREASURY', 'TRANSFERRED', 'RETIRED'],
|
|
150
144
|
computed: true,
|
|
151
145
|
},
|
|
152
|
-
createdAt: { type:
|
|
153
|
-
updatedAt: { type:
|
|
146
|
+
createdAt: { type: 'timestamp', computed: true },
|
|
147
|
+
updatedAt: { type: 'timestamp', computed: true },
|
|
154
148
|
// Two-phase resolution gating (#24): each propose_<X> binds the executing resolution (and, for
|
|
155
149
|
// issuance, the parent entity) fiber via _addDependency and records the pending action here; the
|
|
156
150
|
// gated <X> then asserts the bound dependency state via depInState and clears the pending object.
|
|
157
151
|
// The dropped object-form dependencies (which the chain silently never gated) are replaced this way.
|
|
158
|
-
pendingIssue: { type:
|
|
159
|
-
pendingRepurchase: { type:
|
|
160
|
-
pendingReissue: { type:
|
|
161
|
-
pendingRetire: { type:
|
|
162
|
-
pendingDividend: { type:
|
|
152
|
+
pendingIssue: { type: 'object', nullable: true, computed: true },
|
|
153
|
+
pendingRepurchase: { type: 'object', nullable: true, computed: true },
|
|
154
|
+
pendingReissue: { type: 'object', nullable: true, computed: true },
|
|
155
|
+
pendingRetire: { type: 'object', nullable: true, computed: true },
|
|
156
|
+
pendingDividend: { type: 'object', nullable: true, computed: true },
|
|
163
157
|
},
|
|
164
158
|
},
|
|
165
159
|
eventSchemas: {
|
|
166
160
|
authorize_shares: {
|
|
167
|
-
description:
|
|
161
|
+
description: 'Record shares as authorized per charter/amendment',
|
|
168
162
|
required: [
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
163
|
+
'securityId',
|
|
164
|
+
'entityId',
|
|
165
|
+
'shareClass',
|
|
166
|
+
'shareClassName',
|
|
167
|
+
'shareCount',
|
|
168
|
+
'parValue',
|
|
169
|
+
'authorizedDate',
|
|
176
170
|
],
|
|
177
171
|
properties: {
|
|
178
|
-
securityId: { type:
|
|
179
|
-
entityId: { type:
|
|
180
|
-
shareClass: { type:
|
|
181
|
-
shareClassName: { type:
|
|
182
|
-
shareCount: { type:
|
|
183
|
-
parValue: { type:
|
|
184
|
-
authorizedDate: { type:
|
|
185
|
-
charterProvision: { type:
|
|
172
|
+
securityId: { type: 'string' },
|
|
173
|
+
entityId: { type: 'string' },
|
|
174
|
+
shareClass: { type: 'string' },
|
|
175
|
+
shareClassName: { type: 'string' },
|
|
176
|
+
shareCount: { type: 'integer' },
|
|
177
|
+
parValue: { type: 'number' },
|
|
178
|
+
authorizedDate: { type: 'string', format: 'date' },
|
|
179
|
+
charterProvision: { type: 'string' },
|
|
186
180
|
},
|
|
187
181
|
},
|
|
188
182
|
propose_issue: {
|
|
189
|
-
description:
|
|
190
|
-
required: [
|
|
183
|
+
description: 'Phase 1 of issuance (#24): bind the executing board resolution + parent entity fibers (_addDependency) and record the pending issuance',
|
|
184
|
+
required: ['holderId', 'boardResolutionRef'],
|
|
191
185
|
properties: {
|
|
192
|
-
holderId: { type:
|
|
193
|
-
boardResolutionRef: { type:
|
|
186
|
+
holderId: { type: 'string' },
|
|
187
|
+
boardResolutionRef: { type: 'string' },
|
|
194
188
|
},
|
|
195
189
|
},
|
|
196
190
|
issue_shares: {
|
|
197
|
-
description:
|
|
198
|
-
required: [
|
|
199
|
-
"holderId",
|
|
200
|
-
"holderType",
|
|
201
|
-
"holderName",
|
|
202
|
-
"issuanceDate",
|
|
203
|
-
"form",
|
|
204
|
-
"consideration",
|
|
205
|
-
],
|
|
191
|
+
description: 'Issue shares to a holder',
|
|
192
|
+
required: ['holderId', 'holderType', 'holderName', 'issuanceDate', 'form', 'consideration'],
|
|
206
193
|
properties: {
|
|
207
|
-
holderId: { type:
|
|
208
|
-
holderType: { type:
|
|
209
|
-
holderName: { type:
|
|
194
|
+
holderId: { type: 'string' },
|
|
195
|
+
holderType: { type: 'string' },
|
|
196
|
+
holderName: { type: 'string' },
|
|
210
197
|
holderWallet: {
|
|
211
|
-
type:
|
|
212
|
-
description:
|
|
198
|
+
type: 'address',
|
|
199
|
+
description: 'DAG wallet address the holder controls; pinned so holder-initiated transfer/repurchase can be authorized via proofs[].address.',
|
|
213
200
|
},
|
|
214
|
-
address: { type:
|
|
215
|
-
issuanceDate: { type:
|
|
216
|
-
issuancePrice: { type:
|
|
201
|
+
address: { type: 'object' },
|
|
202
|
+
issuanceDate: { type: 'string', format: 'date' },
|
|
203
|
+
issuancePrice: { type: 'number' },
|
|
217
204
|
form: {
|
|
218
|
-
type:
|
|
219
|
-
enum: [
|
|
205
|
+
type: 'string',
|
|
206
|
+
enum: ['CERTIFICATED', 'BOOK_ENTRY', 'DRS'],
|
|
220
207
|
},
|
|
221
|
-
certificateNumber: { type:
|
|
222
|
-
consideration: { type:
|
|
223
|
-
isRestricted: { type:
|
|
224
|
-
restrictionType: { type:
|
|
225
|
-
legends: { type:
|
|
226
|
-
exemptionUsed: { type:
|
|
227
|
-
accreditedInvestor: { type:
|
|
208
|
+
certificateNumber: { type: 'string' },
|
|
209
|
+
consideration: { type: 'object' },
|
|
210
|
+
isRestricted: { type: 'boolean', default: false },
|
|
211
|
+
restrictionType: { type: 'array' },
|
|
212
|
+
legends: { type: 'array' },
|
|
213
|
+
exemptionUsed: { type: 'string' },
|
|
214
|
+
accreditedInvestor: { type: 'boolean' },
|
|
228
215
|
},
|
|
229
216
|
},
|
|
230
217
|
initiate_transfer: {
|
|
231
|
-
description:
|
|
232
|
-
required: [
|
|
233
|
-
"transferId",
|
|
234
|
-
"toHolderId",
|
|
235
|
-
"toHolderName",
|
|
236
|
-
"toHolderType",
|
|
237
|
-
"transferType",
|
|
238
|
-
"transferDate",
|
|
239
|
-
],
|
|
218
|
+
description: 'Begin transfer of shares to new holder',
|
|
219
|
+
required: ['transferId', 'toHolderId', 'toHolderName', 'toHolderType', 'transferType', 'transferDate'],
|
|
240
220
|
properties: {
|
|
241
|
-
transferId: { type:
|
|
242
|
-
toHolderId: { type:
|
|
243
|
-
toHolderName: { type:
|
|
244
|
-
toHolderType: { type:
|
|
245
|
-
toAddress: { type:
|
|
246
|
-
transferType: { type:
|
|
247
|
-
pricePerShare: { type:
|
|
248
|
-
transferDate: { type:
|
|
221
|
+
transferId: { type: 'string' },
|
|
222
|
+
toHolderId: { type: 'string' },
|
|
223
|
+
toHolderName: { type: 'string' },
|
|
224
|
+
toHolderType: { type: 'string' },
|
|
225
|
+
toAddress: { type: 'object' },
|
|
226
|
+
transferType: { type: 'string' },
|
|
227
|
+
pricePerShare: { type: 'number' },
|
|
228
|
+
transferDate: { type: 'string', format: 'date' },
|
|
249
229
|
},
|
|
250
230
|
},
|
|
251
231
|
complete_transfer: {
|
|
252
|
-
description:
|
|
253
|
-
required: [
|
|
254
|
-
"toHolderId",
|
|
255
|
-
"toHolderName",
|
|
256
|
-
"toHolderType",
|
|
257
|
-
"completedDate",
|
|
258
|
-
],
|
|
232
|
+
description: 'Complete the transfer, update holder',
|
|
233
|
+
required: ['toHolderId', 'toHolderName', 'toHolderType', 'completedDate'],
|
|
259
234
|
properties: {
|
|
260
|
-
transferAgentConfirmation: { type:
|
|
261
|
-
newCertificateNumber: { type:
|
|
262
|
-
toHolderId: { type:
|
|
263
|
-
toHolderName: { type:
|
|
264
|
-
toHolderType: { type:
|
|
235
|
+
transferAgentConfirmation: { type: 'string' },
|
|
236
|
+
newCertificateNumber: { type: 'string' },
|
|
237
|
+
toHolderId: { type: 'string' },
|
|
238
|
+
toHolderName: { type: 'string' },
|
|
239
|
+
toHolderType: { type: 'string' },
|
|
265
240
|
toHolderWallet: {
|
|
266
|
-
type:
|
|
267
|
-
description:
|
|
241
|
+
type: 'address',
|
|
242
|
+
description: 'DAG wallet address the new holder controls.',
|
|
268
243
|
},
|
|
269
|
-
toAddress: { type:
|
|
270
|
-
completedDate: { type:
|
|
271
|
-
costBasis: { type:
|
|
244
|
+
toAddress: { type: 'object' },
|
|
245
|
+
completedDate: { type: 'string', format: 'date' },
|
|
246
|
+
costBasis: { type: 'number' },
|
|
272
247
|
},
|
|
273
248
|
},
|
|
274
249
|
propose_repurchase: {
|
|
275
|
-
description:
|
|
276
|
-
required: [
|
|
250
|
+
description: 'Phase 1 of repurchase (#24): bind the executing board resolution fiber (_addDependency) and record the pending repurchase',
|
|
251
|
+
required: ['repurchaseDate', 'boardResolutionRef'],
|
|
277
252
|
properties: {
|
|
278
|
-
repurchaseDate: { type:
|
|
279
|
-
boardResolutionRef: { type:
|
|
253
|
+
repurchaseDate: { type: 'string', format: 'date' },
|
|
254
|
+
boardResolutionRef: { type: 'string' },
|
|
280
255
|
},
|
|
281
256
|
},
|
|
282
257
|
repurchase: {
|
|
283
|
-
description:
|
|
284
|
-
required: [
|
|
258
|
+
description: 'Company repurchases shares from holder',
|
|
259
|
+
required: ['repurchaseDate', 'pricePerShare'],
|
|
285
260
|
properties: {
|
|
286
|
-
repurchaseDate: { type:
|
|
287
|
-
pricePerShare: { type:
|
|
288
|
-
repurchaseAgreementRef: { type:
|
|
261
|
+
repurchaseDate: { type: 'string', format: 'date' },
|
|
262
|
+
pricePerShare: { type: 'number' },
|
|
263
|
+
repurchaseAgreementRef: { type: 'string' },
|
|
289
264
|
},
|
|
290
265
|
},
|
|
291
266
|
propose_reissue: {
|
|
292
|
-
description:
|
|
293
|
-
required: [
|
|
267
|
+
description: 'Phase 1 of treasury reissue (#24): bind the executing board resolution fiber (_addDependency) and record the pending reissue',
|
|
268
|
+
required: ['holderId', 'boardResolutionRef'],
|
|
294
269
|
properties: {
|
|
295
|
-
holderId: { type:
|
|
296
|
-
boardResolutionRef: { type:
|
|
270
|
+
holderId: { type: 'string' },
|
|
271
|
+
boardResolutionRef: { type: 'string' },
|
|
297
272
|
},
|
|
298
273
|
},
|
|
299
274
|
reissue_from_treasury: {
|
|
300
|
-
description:
|
|
301
|
-
required: [
|
|
302
|
-
"holderId",
|
|
303
|
-
"holderName",
|
|
304
|
-
"holderType",
|
|
305
|
-
"reissueDate",
|
|
306
|
-
],
|
|
275
|
+
description: 'Reissue treasury shares to a new holder',
|
|
276
|
+
required: ['holderId', 'holderName', 'holderType', 'reissueDate'],
|
|
307
277
|
properties: {
|
|
308
|
-
holderId: { type:
|
|
309
|
-
holderName: { type:
|
|
310
|
-
holderType: { type:
|
|
278
|
+
holderId: { type: 'string' },
|
|
279
|
+
holderName: { type: 'string' },
|
|
280
|
+
holderType: { type: 'string' },
|
|
311
281
|
holderWallet: {
|
|
312
|
-
type:
|
|
313
|
-
description:
|
|
282
|
+
type: 'address',
|
|
283
|
+
description: 'DAG wallet address the reissued holder controls.',
|
|
314
284
|
},
|
|
315
|
-
address: { type:
|
|
316
|
-
reissueDate: { type:
|
|
317
|
-
issuancePrice: { type:
|
|
285
|
+
address: { type: 'object' },
|
|
286
|
+
reissueDate: { type: 'string', format: 'date' },
|
|
287
|
+
issuancePrice: { type: 'number' },
|
|
318
288
|
},
|
|
319
289
|
},
|
|
320
290
|
propose_retire: {
|
|
321
|
-
description:
|
|
322
|
-
required: [
|
|
291
|
+
description: 'Phase 1 of retirement (#24): bind the executing board resolution fiber (_addDependency) and record the pending retirement (from ISSUED or TREASURY)',
|
|
292
|
+
required: ['retiredDate', 'boardResolutionRef'],
|
|
323
293
|
properties: {
|
|
324
|
-
retiredDate: { type:
|
|
325
|
-
boardResolutionRef: { type:
|
|
294
|
+
retiredDate: { type: 'string', format: 'date' },
|
|
295
|
+
boardResolutionRef: { type: 'string' },
|
|
326
296
|
},
|
|
327
297
|
},
|
|
328
298
|
retire: {
|
|
329
|
-
description:
|
|
330
|
-
required: [
|
|
299
|
+
description: 'Retire shares (cancel them)',
|
|
300
|
+
required: ['retiredDate', 'retirementMethod'],
|
|
331
301
|
properties: {
|
|
332
|
-
retiredDate: { type:
|
|
333
|
-
retirementMethod: { type:
|
|
334
|
-
repurchasePrice: { type:
|
|
302
|
+
retiredDate: { type: 'string', format: 'date' },
|
|
303
|
+
retirementMethod: { type: 'string' },
|
|
304
|
+
repurchasePrice: { type: 'number' },
|
|
335
305
|
},
|
|
336
306
|
},
|
|
337
307
|
stock_split: {
|
|
338
|
-
description:
|
|
339
|
-
required: [
|
|
340
|
-
"actionId",
|
|
341
|
-
"splitRatio",
|
|
342
|
-
"effectiveDate",
|
|
343
|
-
"resolutionRef",
|
|
344
|
-
"newShareCount",
|
|
345
|
-
],
|
|
308
|
+
description: 'Apply stock split to this lot',
|
|
309
|
+
required: ['actionId', 'splitRatio', 'effectiveDate', 'resolutionRef', 'newShareCount'],
|
|
346
310
|
properties: {
|
|
347
|
-
actionId: { type:
|
|
311
|
+
actionId: { type: 'string' },
|
|
348
312
|
splitRatio: {
|
|
349
|
-
type:
|
|
313
|
+
type: 'string',
|
|
350
314
|
description: "e.g., '2:1' for 2-for-1 split",
|
|
351
315
|
},
|
|
352
|
-
effectiveDate: { type:
|
|
353
|
-
resolutionRef: { type:
|
|
354
|
-
newShareCount: { type:
|
|
316
|
+
effectiveDate: { type: 'string', format: 'date' },
|
|
317
|
+
resolutionRef: { type: 'string' },
|
|
318
|
+
newShareCount: { type: 'integer' },
|
|
355
319
|
},
|
|
356
320
|
},
|
|
357
321
|
propose_dividend: {
|
|
358
|
-
description:
|
|
359
|
-
required: [
|
|
322
|
+
description: 'Phase 1 of dividend declaration (#24): bind the executing board resolution fiber (_addDependency) and record the pending declaration',
|
|
323
|
+
required: ['actionId', 'resolutionRef'],
|
|
360
324
|
properties: {
|
|
361
|
-
actionId: { type:
|
|
362
|
-
resolutionRef: { type:
|
|
325
|
+
actionId: { type: 'string' },
|
|
326
|
+
resolutionRef: { type: 'string' },
|
|
363
327
|
},
|
|
364
328
|
},
|
|
365
329
|
declare_dividend: {
|
|
366
|
-
description:
|
|
367
|
-
required: [
|
|
368
|
-
"actionId",
|
|
369
|
-
"dividendType",
|
|
370
|
-
"recordDate",
|
|
371
|
-
"paymentDate",
|
|
372
|
-
],
|
|
330
|
+
description: 'Record dividend declaration affecting this lot (for stock dividends)',
|
|
331
|
+
required: ['actionId', 'dividendType', 'recordDate', 'paymentDate'],
|
|
373
332
|
properties: {
|
|
374
|
-
actionId: { type:
|
|
375
|
-
dividendType: { type:
|
|
376
|
-
recordDate: { type:
|
|
377
|
-
paymentDate: { type:
|
|
378
|
-
cashAmount: { type:
|
|
379
|
-
stockShares: { type:
|
|
333
|
+
actionId: { type: 'string' },
|
|
334
|
+
dividendType: { type: 'string', enum: ['CASH', 'STOCK'] },
|
|
335
|
+
recordDate: { type: 'string', format: 'date' },
|
|
336
|
+
paymentDate: { type: 'string', format: 'date' },
|
|
337
|
+
cashAmount: { type: 'number' },
|
|
338
|
+
stockShares: { type: 'integer' },
|
|
380
339
|
},
|
|
381
340
|
},
|
|
382
341
|
remove_restriction: {
|
|
383
|
-
description:
|
|
384
|
-
required: [
|
|
342
|
+
description: 'Remove or update restrictions on the shares',
|
|
343
|
+
required: ['restrictionType', 'removedDate'],
|
|
385
344
|
properties: {
|
|
386
|
-
restrictionType: { type:
|
|
387
|
-
removedDate: { type:
|
|
388
|
-
reason: { type:
|
|
389
|
-
legalOpinionRef: { type:
|
|
345
|
+
restrictionType: { type: 'string' },
|
|
346
|
+
removedDate: { type: 'string', format: 'date' },
|
|
347
|
+
reason: { type: 'string' },
|
|
348
|
+
legalOpinionRef: { type: 'string' },
|
|
390
349
|
},
|
|
391
350
|
},
|
|
392
351
|
},
|
|
393
352
|
definitions: {
|
|
394
353
|
Holder: {
|
|
395
|
-
type:
|
|
354
|
+
type: 'object',
|
|
396
355
|
nullable: true,
|
|
397
356
|
properties: {
|
|
398
|
-
holderId: { type:
|
|
357
|
+
holderId: { type: 'string' },
|
|
399
358
|
holderType: {
|
|
400
|
-
type:
|
|
401
|
-
enum: [
|
|
359
|
+
type: 'string',
|
|
360
|
+
enum: ['INDIVIDUAL', 'ENTITY', 'TRUST', 'TREASURY'],
|
|
402
361
|
},
|
|
403
|
-
name: { type:
|
|
404
|
-
taxId: { type:
|
|
362
|
+
name: { type: 'string' },
|
|
363
|
+
taxId: { type: 'string', nullable: true },
|
|
405
364
|
walletAddress: {
|
|
406
|
-
type:
|
|
365
|
+
type: 'address',
|
|
407
366
|
nullable: true,
|
|
408
|
-
description:
|
|
367
|
+
description: 'State-pinned DAG wallet address controlled by this holder; verified against proofs[].address to gate holder-initiated transfer/repurchase.',
|
|
409
368
|
},
|
|
410
|
-
address: { type:
|
|
411
|
-
acquisitionDate: { type:
|
|
369
|
+
address: { type: 'object', nullable: true },
|
|
370
|
+
acquisitionDate: { type: 'string', format: 'date' },
|
|
412
371
|
acquisitionMethod: {
|
|
413
|
-
type:
|
|
372
|
+
type: 'string',
|
|
414
373
|
enum: [
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
374
|
+
'ORIGINAL_ISSUANCE',
|
|
375
|
+
'PURCHASE',
|
|
376
|
+
'GIFT',
|
|
377
|
+
'INHERITANCE',
|
|
378
|
+
'STOCK_SPLIT',
|
|
379
|
+
'CONVERSION',
|
|
380
|
+
'EXERCISE',
|
|
422
381
|
],
|
|
423
382
|
},
|
|
424
|
-
costBasis: { type:
|
|
383
|
+
costBasis: { type: 'number', nullable: true },
|
|
425
384
|
},
|
|
426
385
|
},
|
|
427
386
|
Restrictions: {
|
|
428
|
-
type:
|
|
387
|
+
type: 'object',
|
|
429
388
|
properties: {
|
|
430
|
-
isRestricted: { type:
|
|
389
|
+
isRestricted: { type: 'boolean', default: false },
|
|
431
390
|
restrictionType: {
|
|
432
|
-
type:
|
|
391
|
+
type: 'array',
|
|
433
392
|
items: {
|
|
434
|
-
type:
|
|
393
|
+
type: 'string',
|
|
435
394
|
enum: [
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
395
|
+
'RULE_144',
|
|
396
|
+
'SECTION_4(a)(2)',
|
|
397
|
+
'REG_D',
|
|
398
|
+
'REG_S',
|
|
399
|
+
'LOCK_UP',
|
|
400
|
+
'VESTING',
|
|
401
|
+
'RIGHT_OF_FIRST_REFUSAL',
|
|
443
402
|
],
|
|
444
403
|
},
|
|
445
404
|
},
|
|
446
|
-
restrictionEndDate: { type:
|
|
405
|
+
restrictionEndDate: { type: 'string', format: 'date', nullable: true },
|
|
447
406
|
legends: {
|
|
448
|
-
type:
|
|
449
|
-
items: { type:
|
|
450
|
-
description:
|
|
407
|
+
type: 'array',
|
|
408
|
+
items: { type: 'string' },
|
|
409
|
+
description: 'Legend text on certificates',
|
|
451
410
|
},
|
|
452
411
|
vestingSchedule: {
|
|
453
|
-
type:
|
|
412
|
+
type: 'object',
|
|
454
413
|
nullable: true,
|
|
455
414
|
properties: {
|
|
456
|
-
vestingStartDate: { type:
|
|
457
|
-
totalShares: { type:
|
|
458
|
-
vestedShares: { type:
|
|
459
|
-
vestingScheduleRef: { type:
|
|
415
|
+
vestingStartDate: { type: 'string', format: 'date' },
|
|
416
|
+
totalShares: { type: 'integer' },
|
|
417
|
+
vestedShares: { type: 'integer' },
|
|
418
|
+
vestingScheduleRef: { type: 'string' },
|
|
460
419
|
},
|
|
461
420
|
},
|
|
462
|
-
lockUpExpiration: { type:
|
|
421
|
+
lockUpExpiration: { type: 'string', format: 'date', nullable: true },
|
|
463
422
|
rofr: {
|
|
464
|
-
type:
|
|
423
|
+
type: 'object',
|
|
465
424
|
nullable: true,
|
|
466
|
-
description:
|
|
425
|
+
description: 'Right of First Refusal',
|
|
467
426
|
properties: {
|
|
468
|
-
holderIds: { type:
|
|
469
|
-
noticePeriodDays: { type:
|
|
427
|
+
holderIds: { type: 'array', items: { type: 'string' } },
|
|
428
|
+
noticePeriodDays: { type: 'integer' },
|
|
470
429
|
},
|
|
471
430
|
},
|
|
472
431
|
},
|
|
473
432
|
},
|
|
474
433
|
Authorization: {
|
|
475
|
-
type:
|
|
434
|
+
type: 'object',
|
|
476
435
|
nullable: true,
|
|
477
|
-
description:
|
|
436
|
+
description: 'For shares in AUTHORIZED state',
|
|
478
437
|
properties: {
|
|
479
|
-
authorizedDate: { type:
|
|
480
|
-
charterProvision: { type:
|
|
481
|
-
authorizedShares: { type:
|
|
438
|
+
authorizedDate: { type: 'string', format: 'date' },
|
|
439
|
+
charterProvision: { type: 'string' },
|
|
440
|
+
authorizedShares: { type: 'integer' },
|
|
482
441
|
},
|
|
483
442
|
},
|
|
484
443
|
IssuanceDetails: {
|
|
485
|
-
type:
|
|
444
|
+
type: 'object',
|
|
486
445
|
nullable: true,
|
|
487
446
|
properties: {
|
|
488
|
-
boardResolutionRef: { type:
|
|
489
|
-
issuanceAgreementRef: { type:
|
|
447
|
+
boardResolutionRef: { type: 'string' },
|
|
448
|
+
issuanceAgreementRef: { type: 'string' },
|
|
490
449
|
consideration: {
|
|
491
|
-
type:
|
|
450
|
+
type: 'object',
|
|
492
451
|
properties: {
|
|
493
452
|
type: {
|
|
494
|
-
type:
|
|
495
|
-
enum: [
|
|
496
|
-
"CASH",
|
|
497
|
-
"PROPERTY",
|
|
498
|
-
"SERVICES",
|
|
499
|
-
"DEBT_CONVERSION",
|
|
500
|
-
"STOCK_CONVERSION",
|
|
501
|
-
],
|
|
453
|
+
type: 'string',
|
|
454
|
+
enum: ['CASH', 'PROPERTY', 'SERVICES', 'DEBT_CONVERSION', 'STOCK_CONVERSION'],
|
|
502
455
|
},
|
|
503
|
-
value: { type:
|
|
504
|
-
description: { type:
|
|
456
|
+
value: { type: 'number' },
|
|
457
|
+
description: { type: 'string' },
|
|
505
458
|
},
|
|
506
459
|
},
|
|
507
|
-
exemptionUsed: { type:
|
|
508
|
-
accreditedInvestor: { type:
|
|
460
|
+
exemptionUsed: { type: 'string', nullable: true },
|
|
461
|
+
accreditedInvestor: { type: 'boolean', nullable: true },
|
|
509
462
|
},
|
|
510
463
|
},
|
|
511
464
|
TransferRecord: {
|
|
512
|
-
type:
|
|
465
|
+
type: 'object',
|
|
513
466
|
properties: {
|
|
514
|
-
transferId: { type:
|
|
515
|
-
transferDate: { type:
|
|
516
|
-
fromHolderId: { type:
|
|
517
|
-
toHolderId: { type:
|
|
518
|
-
shares: { type:
|
|
467
|
+
transferId: { type: 'string' },
|
|
468
|
+
transferDate: { type: 'string', format: 'date' },
|
|
469
|
+
fromHolderId: { type: 'string' },
|
|
470
|
+
toHolderId: { type: 'string' },
|
|
471
|
+
shares: { type: 'integer' },
|
|
519
472
|
transferType: {
|
|
520
|
-
type:
|
|
521
|
-
enum: [
|
|
473
|
+
type: 'string',
|
|
474
|
+
enum: ['SALE', 'GIFT', 'INHERITANCE', 'INTERNAL'],
|
|
522
475
|
},
|
|
523
|
-
pricePerShare: { type:
|
|
524
|
-
transferAgentConfirmation: { type:
|
|
476
|
+
pricePerShare: { type: 'number', nullable: true },
|
|
477
|
+
transferAgentConfirmation: { type: 'string', nullable: true },
|
|
525
478
|
},
|
|
526
479
|
},
|
|
527
480
|
CorporateAction: {
|
|
528
|
-
type:
|
|
529
|
-
description:
|
|
481
|
+
type: 'object',
|
|
482
|
+
description: 'Stock splits, dividends, etc. affecting this lot',
|
|
530
483
|
properties: {
|
|
531
|
-
actionId: { type:
|
|
484
|
+
actionId: { type: 'string' },
|
|
532
485
|
actionType: {
|
|
533
|
-
type:
|
|
534
|
-
enum: [
|
|
535
|
-
"STOCK_SPLIT",
|
|
536
|
-
"REVERSE_SPLIT",
|
|
537
|
-
"STOCK_DIVIDEND",
|
|
538
|
-
"CONVERSION",
|
|
539
|
-
"RECLASSIFICATION",
|
|
540
|
-
],
|
|
486
|
+
type: 'string',
|
|
487
|
+
enum: ['STOCK_SPLIT', 'REVERSE_SPLIT', 'STOCK_DIVIDEND', 'CONVERSION', 'RECLASSIFICATION'],
|
|
541
488
|
},
|
|
542
|
-
actionDate: { type:
|
|
489
|
+
actionDate: { type: 'string', format: 'date' },
|
|
543
490
|
ratio: {
|
|
544
|
-
type:
|
|
491
|
+
type: 'string',
|
|
545
492
|
nullable: true,
|
|
546
|
-
description:
|
|
493
|
+
description: 'e.g., 2:1 for split',
|
|
547
494
|
},
|
|
548
|
-
sharesBeforeAction: { type:
|
|
549
|
-
sharesAfterAction: { type:
|
|
550
|
-
resolutionRef: { type:
|
|
495
|
+
sharesBeforeAction: { type: 'integer' },
|
|
496
|
+
sharesAfterAction: { type: 'integer' },
|
|
497
|
+
resolutionRef: { type: 'string' },
|
|
551
498
|
},
|
|
552
499
|
},
|
|
553
500
|
RetirementDetails: {
|
|
554
|
-
type:
|
|
501
|
+
type: 'object',
|
|
555
502
|
nullable: true,
|
|
556
503
|
properties: {
|
|
557
|
-
retiredDate: { type:
|
|
504
|
+
retiredDate: { type: 'string', format: 'date' },
|
|
558
505
|
retirementMethod: {
|
|
559
|
-
type:
|
|
560
|
-
enum: [
|
|
561
|
-
"REPURCHASE",
|
|
562
|
-
"REDEMPTION",
|
|
563
|
-
"CANCELLATION",
|
|
564
|
-
"CONVERSION",
|
|
565
|
-
],
|
|
506
|
+
type: 'string',
|
|
507
|
+
enum: ['REPURCHASE', 'REDEMPTION', 'CANCELLATION', 'CONVERSION'],
|
|
566
508
|
},
|
|
567
|
-
repurchasePrice: { type:
|
|
568
|
-
boardResolutionRef: { type:
|
|
509
|
+
repurchasePrice: { type: 'number', nullable: true },
|
|
510
|
+
boardResolutionRef: { type: 'string' },
|
|
569
511
|
},
|
|
570
512
|
},
|
|
571
513
|
},
|
|
572
514
|
states: {
|
|
573
515
|
AUTHORIZED: {
|
|
574
|
-
id:
|
|
516
|
+
id: 'AUTHORIZED',
|
|
575
517
|
isFinal: false,
|
|
576
|
-
description:
|
|
518
|
+
description: 'Shares authorized by charter but not yet issued',
|
|
577
519
|
},
|
|
578
520
|
ISSUED: {
|
|
579
|
-
id:
|
|
521
|
+
id: 'ISSUED',
|
|
580
522
|
isFinal: false,
|
|
581
|
-
description:
|
|
523
|
+
description: 'Shares issued and held by a shareholder',
|
|
582
524
|
},
|
|
583
525
|
TREASURY: {
|
|
584
|
-
id:
|
|
526
|
+
id: 'TREASURY',
|
|
585
527
|
isFinal: false,
|
|
586
|
-
description:
|
|
528
|
+
description: 'Shares repurchased and held by the company',
|
|
587
529
|
},
|
|
588
530
|
TRANSFERRED: {
|
|
589
|
-
id:
|
|
531
|
+
id: 'TRANSFERRED',
|
|
590
532
|
isFinal: false,
|
|
591
|
-
description:
|
|
533
|
+
description: 'Transitional state during transfer between holders',
|
|
592
534
|
},
|
|
593
535
|
RETIRED: {
|
|
594
|
-
id:
|
|
536
|
+
id: 'RETIRED',
|
|
595
537
|
isFinal: true,
|
|
596
|
-
description:
|
|
538
|
+
description: 'Shares cancelled and returned to authorized but unissued',
|
|
597
539
|
},
|
|
598
540
|
},
|
|
599
|
-
initialState:
|
|
541
|
+
initialState: 'AUTHORIZED',
|
|
600
542
|
transitions: [
|
|
601
543
|
// Initial authorization (creation)
|
|
602
544
|
{
|
|
603
|
-
from:
|
|
604
|
-
to:
|
|
605
|
-
eventName:
|
|
545
|
+
from: 'AUTHORIZED',
|
|
546
|
+
to: 'AUTHORIZED',
|
|
547
|
+
eventName: 'authorize_shares',
|
|
606
548
|
// authority gate — an identity role attestation (ISSUER/BOARD_MEMBER/...) layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
|
|
607
|
-
guard: signerIsParty(
|
|
549
|
+
guard: signerIsParty('state.issuerAddress'),
|
|
608
550
|
effect: {
|
|
609
551
|
merge: [
|
|
610
|
-
{ var:
|
|
552
|
+
{ var: 'state' },
|
|
611
553
|
{
|
|
612
|
-
securityId: { var:
|
|
613
|
-
entityId: { var:
|
|
614
|
-
shareClass: { var:
|
|
615
|
-
shareClassName: { var:
|
|
616
|
-
shareCount: { var:
|
|
617
|
-
parValue: { var:
|
|
554
|
+
securityId: { var: 'event.securityId' },
|
|
555
|
+
entityId: { var: 'event.entityId' },
|
|
556
|
+
shareClass: { var: 'event.shareClass' },
|
|
557
|
+
shareClassName: { var: 'event.shareClassName' },
|
|
558
|
+
shareCount: { var: 'event.shareCount' },
|
|
559
|
+
parValue: { var: 'event.parValue' },
|
|
618
560
|
authorization: {
|
|
619
|
-
authorizedDate: { var:
|
|
620
|
-
charterProvision: { var:
|
|
621
|
-
authorizedShares: { var:
|
|
561
|
+
authorizedDate: { var: 'event.authorizedDate' },
|
|
562
|
+
charterProvision: { var: 'event.charterProvision' },
|
|
563
|
+
authorizedShares: { var: 'event.shareCount' },
|
|
622
564
|
},
|
|
623
565
|
transferHistory: [],
|
|
624
566
|
corporateActions: [],
|
|
@@ -629,25 +571,25 @@ export const corpSecuritiesDef = defineFiberApp({
|
|
|
629
571
|
// AUTHORIZED -> AUTHORIZED (propose_issue) — phase 1 (#24): bind the executing resolution + parent
|
|
630
572
|
// entity fibers and record the pending issuance, so issue_shares can read their state next transition.
|
|
631
573
|
{
|
|
632
|
-
from:
|
|
633
|
-
to:
|
|
634
|
-
eventName:
|
|
574
|
+
from: 'AUTHORIZED',
|
|
575
|
+
to: 'AUTHORIZED',
|
|
576
|
+
eventName: 'propose_issue',
|
|
635
577
|
// authority gate — an identity role attestation (ISSUER/BOARD_MEMBER/...) layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
|
|
636
|
-
guard: signerIsParty(
|
|
578
|
+
guard: signerIsParty('state.issuerAddress'),
|
|
637
579
|
effect: {
|
|
638
580
|
merge: [
|
|
639
|
-
{ var:
|
|
581
|
+
{ var: 'state' },
|
|
640
582
|
{
|
|
641
583
|
pendingIssue: {
|
|
642
|
-
holderId: { var:
|
|
643
|
-
ref: { var:
|
|
644
|
-
proposedAt: { var:
|
|
584
|
+
holderId: { var: 'event.holderId' },
|
|
585
|
+
ref: { var: 'event.boardResolutionRef' },
|
|
586
|
+
proposedAt: { var: '$ordinal' },
|
|
645
587
|
},
|
|
646
588
|
},
|
|
647
589
|
// bind the resolution fiber so issue_shares can assert its state next transition
|
|
648
|
-
addDependency({ var:
|
|
590
|
+
addDependency({ var: 'event.boardResolutionRef' }),
|
|
649
591
|
// bind the parent entity fiber so issue_shares can assert it is ACTIVE
|
|
650
|
-
addDependency({ var:
|
|
592
|
+
addDependency({ var: 'state.entityId' }),
|
|
651
593
|
],
|
|
652
594
|
},
|
|
653
595
|
dependencies: [],
|
|
@@ -655,66 +597,58 @@ export const corpSecuritiesDef = defineFiberApp({
|
|
|
655
597
|
// AUTHORIZED -> ISSUED — phase 2 (#24): issue once the bound resolution is EXECUTED and the parent
|
|
656
598
|
// entity is ACTIVE. depInState replaces the dropped object-form dependencies (which never gated).
|
|
657
599
|
{
|
|
658
|
-
from:
|
|
659
|
-
to:
|
|
660
|
-
eventName:
|
|
600
|
+
from: 'AUTHORIZED',
|
|
601
|
+
to: 'ISSUED',
|
|
602
|
+
eventName: 'issue_shares',
|
|
661
603
|
// authority gate — an identity role attestation (ISSUER/BOARD_MEMBER/...) layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
|
|
662
604
|
guard: {
|
|
663
605
|
and: [
|
|
664
|
-
signerIsParty(
|
|
606
|
+
signerIsParty('state.issuerAddress'),
|
|
665
607
|
// the proposal must target this holder, and its bound resolution must be EXECUTED
|
|
666
608
|
{
|
|
667
|
-
|
|
668
|
-
{ var: "state.pendingIssue.holderId" },
|
|
669
|
-
{ var: "event.holderId" },
|
|
670
|
-
],
|
|
609
|
+
'==': [{ var: 'state.pendingIssue.holderId' }, { var: 'event.holderId' }],
|
|
671
610
|
},
|
|
672
|
-
depInState(
|
|
673
|
-
depInState(
|
|
611
|
+
depInState('state.pendingIssue.ref', 'EXECUTED'),
|
|
612
|
+
depInState('state.entityId', 'ACTIVE'),
|
|
674
613
|
],
|
|
675
614
|
},
|
|
676
615
|
effect: {
|
|
677
616
|
merge: [
|
|
678
|
-
{ var:
|
|
617
|
+
{ var: 'state' },
|
|
679
618
|
{
|
|
680
|
-
status:
|
|
681
|
-
form: { var:
|
|
682
|
-
certificateNumber: { var:
|
|
683
|
-
issuanceDate: { var:
|
|
684
|
-
issuancePrice: { var:
|
|
619
|
+
status: 'ISSUED',
|
|
620
|
+
form: { var: 'event.form' },
|
|
621
|
+
certificateNumber: { var: 'event.certificateNumber' },
|
|
622
|
+
issuanceDate: { var: 'event.issuanceDate' },
|
|
623
|
+
issuancePrice: { var: 'event.issuancePrice' },
|
|
685
624
|
holder: {
|
|
686
|
-
holderId: { var:
|
|
687
|
-
holderType: { var:
|
|
688
|
-
name: { var:
|
|
689
|
-
walletAddress: { var:
|
|
690
|
-
address: { var:
|
|
691
|
-
acquisitionDate: { var:
|
|
692
|
-
acquisitionMethod:
|
|
625
|
+
holderId: { var: 'event.holderId' },
|
|
626
|
+
holderType: { var: 'event.holderType' },
|
|
627
|
+
name: { var: 'event.holderName' },
|
|
628
|
+
walletAddress: { var: 'event.holderWallet' },
|
|
629
|
+
address: { var: 'event.address' },
|
|
630
|
+
acquisitionDate: { var: 'event.issuanceDate' },
|
|
631
|
+
acquisitionMethod: 'ORIGINAL_ISSUANCE',
|
|
693
632
|
costBasis: {
|
|
694
|
-
|
|
695
|
-
{ var: "event.issuancePrice" },
|
|
696
|
-
{ var: "state.shareCount" },
|
|
697
|
-
],
|
|
633
|
+
'*': [{ var: 'event.issuancePrice' }, { var: 'state.shareCount' }],
|
|
698
634
|
},
|
|
699
635
|
},
|
|
700
636
|
restrictions: {
|
|
701
|
-
isRestricted: { var:
|
|
702
|
-
restrictionType: { var:
|
|
703
|
-
legends: { var:
|
|
637
|
+
isRestricted: { var: 'event.isRestricted' },
|
|
638
|
+
restrictionType: { var: 'event.restrictionType' },
|
|
639
|
+
legends: { var: 'event.legends' },
|
|
704
640
|
},
|
|
705
641
|
issuanceDetails: {
|
|
706
|
-
boardResolutionRef: { var:
|
|
707
|
-
consideration: { var:
|
|
708
|
-
exemptionUsed: { var:
|
|
709
|
-
accreditedInvestor: { var:
|
|
642
|
+
boardResolutionRef: { var: 'state.pendingIssue.ref' },
|
|
643
|
+
consideration: { var: 'event.consideration' },
|
|
644
|
+
exemptionUsed: { var: 'event.exemptionUsed' },
|
|
645
|
+
accreditedInvestor: { var: 'event.accreditedInvestor' },
|
|
710
646
|
},
|
|
711
647
|
// clear the consumed proposal
|
|
712
648
|
pendingIssue: null,
|
|
713
649
|
},
|
|
714
650
|
{
|
|
715
|
-
_emit: [
|
|
716
|
-
{ name: "SHARES_ISSUED", data: { var: "event" }, destination: "external" },
|
|
717
|
-
],
|
|
651
|
+
_emit: [{ name: 'SHARES_ISSUED', data: { var: 'event' }, destination: 'external' }],
|
|
718
652
|
},
|
|
719
653
|
],
|
|
720
654
|
},
|
|
@@ -722,94 +656,87 @@ export const corpSecuritiesDef = defineFiberApp({
|
|
|
722
656
|
},
|
|
723
657
|
// ISSUED -> TRANSFERRED
|
|
724
658
|
{
|
|
725
|
-
from:
|
|
726
|
-
to:
|
|
727
|
-
eventName:
|
|
659
|
+
from: 'ISSUED',
|
|
660
|
+
to: 'TRANSFERRED',
|
|
661
|
+
eventName: 'initiate_transfer',
|
|
728
662
|
guard: {
|
|
729
663
|
and: [
|
|
730
664
|
// authority gate — an identity role attestation (ISSUER/BOARD_MEMBER/...) layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
|
|
731
|
-
signerIsParty(
|
|
665
|
+
signerIsParty('state.holder.walletAddress'),
|
|
732
666
|
{
|
|
733
667
|
or: [
|
|
734
|
-
{
|
|
668
|
+
{ '==': [{ var: 'state.restrictions.isRestricted' }, false] },
|
|
735
669
|
{
|
|
736
|
-
|
|
670
|
+
'==': [{ var: 'state.restrictions.restrictionEndDate' }, null],
|
|
737
671
|
},
|
|
738
672
|
{
|
|
739
|
-
|
|
740
|
-
{ var: "$ordinal" },
|
|
741
|
-
{ var: "state.restrictions.restrictionEndDate" },
|
|
742
|
-
],
|
|
673
|
+
'>=': [{ var: '$ordinal' }, { var: 'state.restrictions.restrictionEndDate' }],
|
|
743
674
|
},
|
|
744
675
|
],
|
|
745
676
|
},
|
|
746
|
-
{
|
|
677
|
+
{ '==': [{ var: 'state.restrictions.rofr' }, null] },
|
|
747
678
|
],
|
|
748
679
|
},
|
|
749
680
|
effect: {
|
|
750
681
|
merge: [
|
|
751
|
-
{ var:
|
|
682
|
+
{ var: 'state' },
|
|
752
683
|
{
|
|
753
|
-
status:
|
|
684
|
+
status: 'TRANSFERRED',
|
|
754
685
|
transferHistory: {
|
|
755
686
|
merge: [
|
|
756
|
-
{ var:
|
|
687
|
+
{ var: 'state.transferHistory' },
|
|
757
688
|
[
|
|
758
689
|
{
|
|
759
|
-
transferId: { var:
|
|
760
|
-
transferDate: { var:
|
|
761
|
-
fromHolderId: { var:
|
|
762
|
-
toHolderId: { var:
|
|
763
|
-
shares: { var:
|
|
764
|
-
transferType: { var:
|
|
765
|
-
pricePerShare: { var:
|
|
690
|
+
transferId: { var: 'event.transferId' },
|
|
691
|
+
transferDate: { var: 'event.transferDate' },
|
|
692
|
+
fromHolderId: { var: 'state.holder.holderId' },
|
|
693
|
+
toHolderId: { var: 'event.toHolderId' },
|
|
694
|
+
shares: { var: 'state.shareCount' },
|
|
695
|
+
transferType: { var: 'event.transferType' },
|
|
696
|
+
pricePerShare: { var: 'event.pricePerShare' },
|
|
766
697
|
},
|
|
767
698
|
],
|
|
768
699
|
],
|
|
769
700
|
},
|
|
770
701
|
},
|
|
771
702
|
{
|
|
772
|
-
_emit: [
|
|
773
|
-
{ name: "TRANSFER_INITIATED", data: { var: "event" }, destination: "external" },
|
|
774
|
-
],
|
|
703
|
+
_emit: [{ name: 'TRANSFER_INITIATED', data: { var: 'event' }, destination: 'external' }],
|
|
775
704
|
},
|
|
776
705
|
],
|
|
777
706
|
},
|
|
778
707
|
},
|
|
779
708
|
// TRANSFERRED -> ISSUED
|
|
780
709
|
{
|
|
781
|
-
from:
|
|
782
|
-
to:
|
|
783
|
-
eventName:
|
|
710
|
+
from: 'TRANSFERRED',
|
|
711
|
+
to: 'ISSUED',
|
|
712
|
+
eventName: 'complete_transfer',
|
|
784
713
|
// authority gate — an identity role attestation (ISSUER/BOARD_MEMBER/...) layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
|
|
785
|
-
guard: signerIsParty(
|
|
714
|
+
guard: signerIsParty('state.issuerAddress'),
|
|
786
715
|
effect: {
|
|
787
716
|
merge: [
|
|
788
|
-
{ var:
|
|
717
|
+
{ var: 'state' },
|
|
789
718
|
{
|
|
790
|
-
status:
|
|
719
|
+
status: 'ISSUED',
|
|
791
720
|
holder: {
|
|
792
|
-
holderId: { var:
|
|
793
|
-
holderType: { var:
|
|
794
|
-
name: { var:
|
|
795
|
-
walletAddress: { var:
|
|
796
|
-
address: { var:
|
|
797
|
-
acquisitionDate: { var:
|
|
798
|
-
acquisitionMethod:
|
|
799
|
-
costBasis: { var:
|
|
721
|
+
holderId: { var: 'event.toHolderId' },
|
|
722
|
+
holderType: { var: 'event.toHolderType' },
|
|
723
|
+
name: { var: 'event.toHolderName' },
|
|
724
|
+
walletAddress: { var: 'event.toHolderWallet' },
|
|
725
|
+
address: { var: 'event.toAddress' },
|
|
726
|
+
acquisitionDate: { var: 'event.completedDate' },
|
|
727
|
+
acquisitionMethod: 'PURCHASE',
|
|
728
|
+
costBasis: { var: 'event.costBasis' },
|
|
800
729
|
},
|
|
801
730
|
certificateNumber: {
|
|
802
731
|
if: [
|
|
803
|
-
{
|
|
804
|
-
{ var:
|
|
805
|
-
{ var:
|
|
732
|
+
{ '!=': [{ var: 'event.newCertificateNumber' }, null] },
|
|
733
|
+
{ var: 'event.newCertificateNumber' },
|
|
734
|
+
{ var: 'state.certificateNumber' },
|
|
806
735
|
],
|
|
807
736
|
},
|
|
808
737
|
},
|
|
809
738
|
{
|
|
810
|
-
_emit: [
|
|
811
|
-
{ name: "TRANSFER_COMPLETED", data: { var: "event" }, destination: "external" },
|
|
812
|
-
],
|
|
739
|
+
_emit: [{ name: 'TRANSFER_COMPLETED', data: { var: 'event' }, destination: 'external' }],
|
|
813
740
|
},
|
|
814
741
|
],
|
|
815
742
|
},
|
|
@@ -817,89 +744,81 @@ export const corpSecuritiesDef = defineFiberApp({
|
|
|
817
744
|
// ISSUED -> ISSUED (propose_repurchase) — phase 1 (#24): bind the executing resolution fiber and
|
|
818
745
|
// record the pending repurchase, so repurchase can read the resolution's state next transition.
|
|
819
746
|
{
|
|
820
|
-
from:
|
|
821
|
-
to:
|
|
822
|
-
eventName:
|
|
747
|
+
from: 'ISSUED',
|
|
748
|
+
to: 'ISSUED',
|
|
749
|
+
eventName: 'propose_repurchase',
|
|
823
750
|
// authority gate — the selling holder must sign; an identity role attestation (ISSUER/BOARD_MEMBER/...) layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
|
|
824
|
-
guard: signerIsParty(
|
|
751
|
+
guard: signerIsParty('state.holder.walletAddress'),
|
|
825
752
|
effect: {
|
|
826
753
|
merge: [
|
|
827
|
-
{ var:
|
|
754
|
+
{ var: 'state' },
|
|
828
755
|
{
|
|
829
756
|
pendingRepurchase: {
|
|
830
|
-
repurchaseDate: { var:
|
|
831
|
-
ref: { var:
|
|
832
|
-
proposedAt: { var:
|
|
757
|
+
repurchaseDate: { var: 'event.repurchaseDate' },
|
|
758
|
+
ref: { var: 'event.boardResolutionRef' },
|
|
759
|
+
proposedAt: { var: '$ordinal' },
|
|
833
760
|
},
|
|
834
761
|
},
|
|
835
762
|
// bind the resolution fiber so repurchase can assert its state next transition
|
|
836
|
-
addDependency({ var:
|
|
763
|
+
addDependency({ var: 'event.boardResolutionRef' }),
|
|
837
764
|
],
|
|
838
765
|
},
|
|
839
766
|
dependencies: [],
|
|
840
767
|
},
|
|
841
768
|
// ISSUED -> TREASURY — phase 2 (#24): repurchase once the bound resolution is EXECUTED.
|
|
842
769
|
{
|
|
843
|
-
from:
|
|
844
|
-
to:
|
|
845
|
-
eventName:
|
|
770
|
+
from: 'ISSUED',
|
|
771
|
+
to: 'TREASURY',
|
|
772
|
+
eventName: 'repurchase',
|
|
846
773
|
// authority gate — the selling holder must sign; an identity role attestation (ISSUER/BOARD_MEMBER/...) layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
|
|
847
774
|
guard: {
|
|
848
775
|
and: [
|
|
849
|
-
signerIsParty(
|
|
776
|
+
signerIsParty('state.holder.walletAddress'),
|
|
850
777
|
// the proposal must match this repurchase, and its bound resolution must be EXECUTED
|
|
851
778
|
{
|
|
852
|
-
|
|
853
|
-
{ var: "state.pendingRepurchase.repurchaseDate" },
|
|
854
|
-
{ var: "event.repurchaseDate" },
|
|
855
|
-
],
|
|
779
|
+
'==': [{ var: 'state.pendingRepurchase.repurchaseDate' }, { var: 'event.repurchaseDate' }],
|
|
856
780
|
},
|
|
857
|
-
depInState(
|
|
781
|
+
depInState('state.pendingRepurchase.ref', 'EXECUTED'),
|
|
858
782
|
],
|
|
859
783
|
},
|
|
860
784
|
effect: {
|
|
861
785
|
merge: [
|
|
862
|
-
{ var:
|
|
786
|
+
{ var: 'state' },
|
|
863
787
|
{
|
|
864
|
-
status:
|
|
788
|
+
status: 'TREASURY',
|
|
865
789
|
transferHistory: {
|
|
866
790
|
merge: [
|
|
867
|
-
{ var:
|
|
791
|
+
{ var: 'state.transferHistory' },
|
|
868
792
|
[
|
|
869
793
|
{
|
|
870
794
|
transferId: {
|
|
871
|
-
cat: [
|
|
795
|
+
cat: ['REPURCHASE-', { var: 'event.repurchaseDate' }],
|
|
872
796
|
},
|
|
873
|
-
transferDate: { var:
|
|
874
|
-
fromHolderId: { var:
|
|
875
|
-
toHolderId:
|
|
876
|
-
shares: { var:
|
|
877
|
-
transferType:
|
|
878
|
-
pricePerShare: { var:
|
|
797
|
+
transferDate: { var: 'event.repurchaseDate' },
|
|
798
|
+
fromHolderId: { var: 'state.holder.holderId' },
|
|
799
|
+
toHolderId: 'TREASURY',
|
|
800
|
+
shares: { var: 'state.shareCount' },
|
|
801
|
+
transferType: 'INTERNAL',
|
|
802
|
+
pricePerShare: { var: 'event.pricePerShare' },
|
|
879
803
|
},
|
|
880
804
|
],
|
|
881
805
|
],
|
|
882
806
|
},
|
|
883
807
|
holder: {
|
|
884
|
-
holderId:
|
|
885
|
-
holderType:
|
|
886
|
-
name:
|
|
887
|
-
acquisitionDate: { var:
|
|
888
|
-
acquisitionMethod:
|
|
808
|
+
holderId: 'TREASURY',
|
|
809
|
+
holderType: 'TREASURY',
|
|
810
|
+
name: 'Treasury Stock',
|
|
811
|
+
acquisitionDate: { var: 'event.repurchaseDate' },
|
|
812
|
+
acquisitionMethod: 'PURCHASE',
|
|
889
813
|
costBasis: {
|
|
890
|
-
|
|
891
|
-
{ var: "event.pricePerShare" },
|
|
892
|
-
{ var: "state.shareCount" },
|
|
893
|
-
],
|
|
814
|
+
'*': [{ var: 'event.pricePerShare' }, { var: 'state.shareCount' }],
|
|
894
815
|
},
|
|
895
816
|
},
|
|
896
817
|
// clear the consumed proposal
|
|
897
818
|
pendingRepurchase: null,
|
|
898
819
|
},
|
|
899
820
|
{
|
|
900
|
-
_emit: [
|
|
901
|
-
{ name: "SHARES_REPURCHASED", data: { var: "event" }, destination: "external" },
|
|
902
|
-
],
|
|
821
|
+
_emit: [{ name: 'SHARES_REPURCHASED', data: { var: 'event' }, destination: 'external' }],
|
|
903
822
|
},
|
|
904
823
|
],
|
|
905
824
|
},
|
|
@@ -908,73 +827,65 @@ export const corpSecuritiesDef = defineFiberApp({
|
|
|
908
827
|
// TREASURY -> TREASURY (propose_reissue) — phase 1 (#24): bind the executing resolution fiber and
|
|
909
828
|
// record the pending reissue, so reissue_from_treasury can read the resolution's state next transition.
|
|
910
829
|
{
|
|
911
|
-
from:
|
|
912
|
-
to:
|
|
913
|
-
eventName:
|
|
830
|
+
from: 'TREASURY',
|
|
831
|
+
to: 'TREASURY',
|
|
832
|
+
eventName: 'propose_reissue',
|
|
914
833
|
// authority gate — an identity role attestation (ISSUER/BOARD_MEMBER/...) layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
|
|
915
|
-
guard: signerIsParty(
|
|
834
|
+
guard: signerIsParty('state.issuerAddress'),
|
|
916
835
|
effect: {
|
|
917
836
|
merge: [
|
|
918
|
-
{ var:
|
|
837
|
+
{ var: 'state' },
|
|
919
838
|
{
|
|
920
839
|
pendingReissue: {
|
|
921
|
-
holderId: { var:
|
|
922
|
-
ref: { var:
|
|
923
|
-
proposedAt: { var:
|
|
840
|
+
holderId: { var: 'event.holderId' },
|
|
841
|
+
ref: { var: 'event.boardResolutionRef' },
|
|
842
|
+
proposedAt: { var: '$ordinal' },
|
|
924
843
|
},
|
|
925
844
|
},
|
|
926
845
|
// bind the resolution fiber so reissue_from_treasury can assert its state next transition
|
|
927
|
-
addDependency({ var:
|
|
846
|
+
addDependency({ var: 'event.boardResolutionRef' }),
|
|
928
847
|
],
|
|
929
848
|
},
|
|
930
849
|
dependencies: [],
|
|
931
850
|
},
|
|
932
851
|
// TREASURY -> ISSUED — phase 2 (#24): reissue once the bound resolution is EXECUTED.
|
|
933
852
|
{
|
|
934
|
-
from:
|
|
935
|
-
to:
|
|
936
|
-
eventName:
|
|
853
|
+
from: 'TREASURY',
|
|
854
|
+
to: 'ISSUED',
|
|
855
|
+
eventName: 'reissue_from_treasury',
|
|
937
856
|
// authority gate — an identity role attestation (ISSUER/BOARD_MEMBER/...) layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
|
|
938
857
|
guard: {
|
|
939
858
|
and: [
|
|
940
|
-
signerIsParty(
|
|
859
|
+
signerIsParty('state.issuerAddress'),
|
|
941
860
|
// the proposal must target this holder, and its bound resolution must be EXECUTED
|
|
942
861
|
{
|
|
943
|
-
|
|
944
|
-
{ var: "state.pendingReissue.holderId" },
|
|
945
|
-
{ var: "event.holderId" },
|
|
946
|
-
],
|
|
862
|
+
'==': [{ var: 'state.pendingReissue.holderId' }, { var: 'event.holderId' }],
|
|
947
863
|
},
|
|
948
|
-
depInState(
|
|
864
|
+
depInState('state.pendingReissue.ref', 'EXECUTED'),
|
|
949
865
|
],
|
|
950
866
|
},
|
|
951
867
|
effect: {
|
|
952
868
|
merge: [
|
|
953
|
-
{ var:
|
|
869
|
+
{ var: 'state' },
|
|
954
870
|
{
|
|
955
|
-
status:
|
|
871
|
+
status: 'ISSUED',
|
|
956
872
|
holder: {
|
|
957
|
-
holderId: { var:
|
|
958
|
-
holderType: { var:
|
|
959
|
-
name: { var:
|
|
960
|
-
walletAddress: { var:
|
|
961
|
-
address: { var:
|
|
962
|
-
acquisitionDate: { var:
|
|
963
|
-
acquisitionMethod:
|
|
873
|
+
holderId: { var: 'event.holderId' },
|
|
874
|
+
holderType: { var: 'event.holderType' },
|
|
875
|
+
name: { var: 'event.holderName' },
|
|
876
|
+
walletAddress: { var: 'event.holderWallet' },
|
|
877
|
+
address: { var: 'event.address' },
|
|
878
|
+
acquisitionDate: { var: 'event.reissueDate' },
|
|
879
|
+
acquisitionMethod: 'PURCHASE',
|
|
964
880
|
costBasis: {
|
|
965
|
-
|
|
966
|
-
{ var: "event.issuancePrice" },
|
|
967
|
-
{ var: "state.shareCount" },
|
|
968
|
-
],
|
|
881
|
+
'*': [{ var: 'event.issuancePrice' }, { var: 'state.shareCount' }],
|
|
969
882
|
},
|
|
970
883
|
},
|
|
971
884
|
// clear the consumed proposal
|
|
972
885
|
pendingReissue: null,
|
|
973
886
|
},
|
|
974
887
|
{
|
|
975
|
-
_emit: [
|
|
976
|
-
{ name: "TREASURY_SHARES_REISSUED", data: { var: "event" }, destination: "external" },
|
|
977
|
-
],
|
|
888
|
+
_emit: [{ name: 'TREASURY_SHARES_REISSUED', data: { var: 'event' }, destination: 'external' }],
|
|
978
889
|
},
|
|
979
890
|
],
|
|
980
891
|
},
|
|
@@ -983,23 +894,23 @@ export const corpSecuritiesDef = defineFiberApp({
|
|
|
983
894
|
// ISSUED -> ISSUED (propose_retire) — phase 1 (#24): bind the executing resolution fiber and record
|
|
984
895
|
// the pending retirement, so the retire transition can read the resolution's state next transition.
|
|
985
896
|
{
|
|
986
|
-
from:
|
|
987
|
-
to:
|
|
988
|
-
eventName:
|
|
897
|
+
from: 'ISSUED',
|
|
898
|
+
to: 'ISSUED',
|
|
899
|
+
eventName: 'propose_retire',
|
|
989
900
|
// authority gate — an identity role attestation (ISSUER/BOARD_MEMBER/...) layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
|
|
990
|
-
guard: signerIsParty(
|
|
901
|
+
guard: signerIsParty('state.issuerAddress'),
|
|
991
902
|
effect: {
|
|
992
903
|
merge: [
|
|
993
|
-
{ var:
|
|
904
|
+
{ var: 'state' },
|
|
994
905
|
{
|
|
995
906
|
pendingRetire: {
|
|
996
|
-
retiredDate: { var:
|
|
997
|
-
ref: { var:
|
|
998
|
-
proposedAt: { var:
|
|
907
|
+
retiredDate: { var: 'event.retiredDate' },
|
|
908
|
+
ref: { var: 'event.boardResolutionRef' },
|
|
909
|
+
proposedAt: { var: '$ordinal' },
|
|
999
910
|
},
|
|
1000
911
|
},
|
|
1001
912
|
// bind the resolution fiber so retire can assert its state next transition
|
|
1002
|
-
addDependency({ var:
|
|
913
|
+
addDependency({ var: 'event.boardResolutionRef' }),
|
|
1003
914
|
],
|
|
1004
915
|
},
|
|
1005
916
|
dependencies: [],
|
|
@@ -1007,65 +918,60 @@ export const corpSecuritiesDef = defineFiberApp({
|
|
|
1007
918
|
// TREASURY -> TREASURY (propose_retire) — phase 1 (#24): the treasury-side counterpart, binding the
|
|
1008
919
|
// executing resolution fiber and recording the pending retirement before retire executes.
|
|
1009
920
|
{
|
|
1010
|
-
from:
|
|
1011
|
-
to:
|
|
1012
|
-
eventName:
|
|
921
|
+
from: 'TREASURY',
|
|
922
|
+
to: 'TREASURY',
|
|
923
|
+
eventName: 'propose_retire',
|
|
1013
924
|
// authority gate — an identity role attestation (ISSUER/BOARD_MEMBER/...) layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
|
|
1014
|
-
guard: signerIsParty(
|
|
925
|
+
guard: signerIsParty('state.issuerAddress'),
|
|
1015
926
|
effect: {
|
|
1016
927
|
merge: [
|
|
1017
|
-
{ var:
|
|
928
|
+
{ var: 'state' },
|
|
1018
929
|
{
|
|
1019
930
|
pendingRetire: {
|
|
1020
|
-
retiredDate: { var:
|
|
1021
|
-
ref: { var:
|
|
1022
|
-
proposedAt: { var:
|
|
931
|
+
retiredDate: { var: 'event.retiredDate' },
|
|
932
|
+
ref: { var: 'event.boardResolutionRef' },
|
|
933
|
+
proposedAt: { var: '$ordinal' },
|
|
1023
934
|
},
|
|
1024
935
|
},
|
|
1025
936
|
// bind the resolution fiber so retire can assert its state next transition
|
|
1026
|
-
addDependency({ var:
|
|
937
|
+
addDependency({ var: 'event.boardResolutionRef' }),
|
|
1027
938
|
],
|
|
1028
939
|
},
|
|
1029
940
|
dependencies: [],
|
|
1030
941
|
},
|
|
1031
942
|
// ISSUED -> RETIRED — phase 2 (#24): retire once the bound resolution is EXECUTED.
|
|
1032
943
|
{
|
|
1033
|
-
from:
|
|
1034
|
-
to:
|
|
1035
|
-
eventName:
|
|
944
|
+
from: 'ISSUED',
|
|
945
|
+
to: 'RETIRED',
|
|
946
|
+
eventName: 'retire',
|
|
1036
947
|
// authority gate — an identity role attestation (ISSUER/BOARD_MEMBER/...) layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
|
|
1037
948
|
guard: {
|
|
1038
949
|
and: [
|
|
1039
|
-
signerIsParty(
|
|
950
|
+
signerIsParty('state.issuerAddress'),
|
|
1040
951
|
// the proposal must match this retirement, and its bound resolution must be EXECUTED
|
|
1041
952
|
{
|
|
1042
|
-
|
|
1043
|
-
{ var: "state.pendingRetire.retiredDate" },
|
|
1044
|
-
{ var: "event.retiredDate" },
|
|
1045
|
-
],
|
|
953
|
+
'==': [{ var: 'state.pendingRetire.retiredDate' }, { var: 'event.retiredDate' }],
|
|
1046
954
|
},
|
|
1047
|
-
depInState(
|
|
955
|
+
depInState('state.pendingRetire.ref', 'EXECUTED'),
|
|
1048
956
|
],
|
|
1049
957
|
},
|
|
1050
958
|
effect: {
|
|
1051
959
|
merge: [
|
|
1052
|
-
{ var:
|
|
960
|
+
{ var: 'state' },
|
|
1053
961
|
{
|
|
1054
|
-
status:
|
|
962
|
+
status: 'RETIRED',
|
|
1055
963
|
retirementDetails: {
|
|
1056
|
-
retiredDate: { var:
|
|
1057
|
-
retirementMethod: { var:
|
|
1058
|
-
repurchasePrice: { var:
|
|
1059
|
-
boardResolutionRef: { var:
|
|
964
|
+
retiredDate: { var: 'event.retiredDate' },
|
|
965
|
+
retirementMethod: { var: 'event.retirementMethod' },
|
|
966
|
+
repurchasePrice: { var: 'event.repurchasePrice' },
|
|
967
|
+
boardResolutionRef: { var: 'state.pendingRetire.ref' },
|
|
1060
968
|
},
|
|
1061
969
|
holder: null,
|
|
1062
970
|
// clear the consumed proposal
|
|
1063
971
|
pendingRetire: null,
|
|
1064
972
|
},
|
|
1065
973
|
{
|
|
1066
|
-
_emit: [
|
|
1067
|
-
{ name: "SHARES_RETIRED", data: { var: "event" }, destination: "external" },
|
|
1068
|
-
],
|
|
974
|
+
_emit: [{ name: 'SHARES_RETIRED', data: { var: 'event' }, destination: 'external' }],
|
|
1069
975
|
},
|
|
1070
976
|
],
|
|
1071
977
|
},
|
|
@@ -1073,42 +979,37 @@ export const corpSecuritiesDef = defineFiberApp({
|
|
|
1073
979
|
},
|
|
1074
980
|
// TREASURY -> RETIRED — phase 2 (#24): retire once the bound resolution is EXECUTED.
|
|
1075
981
|
{
|
|
1076
|
-
from:
|
|
1077
|
-
to:
|
|
1078
|
-
eventName:
|
|
982
|
+
from: 'TREASURY',
|
|
983
|
+
to: 'RETIRED',
|
|
984
|
+
eventName: 'retire',
|
|
1079
985
|
// authority gate — an identity role attestation (ISSUER/BOARD_MEMBER/...) layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
|
|
1080
986
|
guard: {
|
|
1081
987
|
and: [
|
|
1082
|
-
signerIsParty(
|
|
988
|
+
signerIsParty('state.issuerAddress'),
|
|
1083
989
|
// the proposal must match this retirement, and its bound resolution must be EXECUTED
|
|
1084
990
|
{
|
|
1085
|
-
|
|
1086
|
-
{ var: "state.pendingRetire.retiredDate" },
|
|
1087
|
-
{ var: "event.retiredDate" },
|
|
1088
|
-
],
|
|
991
|
+
'==': [{ var: 'state.pendingRetire.retiredDate' }, { var: 'event.retiredDate' }],
|
|
1089
992
|
},
|
|
1090
|
-
depInState(
|
|
993
|
+
depInState('state.pendingRetire.ref', 'EXECUTED'),
|
|
1091
994
|
],
|
|
1092
995
|
},
|
|
1093
996
|
effect: {
|
|
1094
997
|
merge: [
|
|
1095
|
-
{ var:
|
|
998
|
+
{ var: 'state' },
|
|
1096
999
|
{
|
|
1097
|
-
status:
|
|
1000
|
+
status: 'RETIRED',
|
|
1098
1001
|
retirementDetails: {
|
|
1099
|
-
retiredDate: { var:
|
|
1100
|
-
retirementMethod: { var:
|
|
1101
|
-
repurchasePrice: { var:
|
|
1102
|
-
boardResolutionRef: { var:
|
|
1002
|
+
retiredDate: { var: 'event.retiredDate' },
|
|
1003
|
+
retirementMethod: { var: 'event.retirementMethod' },
|
|
1004
|
+
repurchasePrice: { var: 'event.repurchasePrice' },
|
|
1005
|
+
boardResolutionRef: { var: 'state.pendingRetire.ref' },
|
|
1103
1006
|
},
|
|
1104
1007
|
holder: null,
|
|
1105
1008
|
// clear the consumed proposal
|
|
1106
1009
|
pendingRetire: null,
|
|
1107
1010
|
},
|
|
1108
1011
|
{
|
|
1109
|
-
_emit: [
|
|
1110
|
-
{ name: "SHARES_RETIRED", data: { var: "event" }, destination: "external" },
|
|
1111
|
-
],
|
|
1012
|
+
_emit: [{ name: 'SHARES_RETIRED', data: { var: 'event' }, destination: 'external' }],
|
|
1112
1013
|
},
|
|
1113
1014
|
],
|
|
1114
1015
|
},
|
|
@@ -1116,37 +1017,35 @@ export const corpSecuritiesDef = defineFiberApp({
|
|
|
1116
1017
|
},
|
|
1117
1018
|
// ISSUED -> ISSUED (stock_split)
|
|
1118
1019
|
{
|
|
1119
|
-
from:
|
|
1120
|
-
to:
|
|
1121
|
-
eventName:
|
|
1020
|
+
from: 'ISSUED',
|
|
1021
|
+
to: 'ISSUED',
|
|
1022
|
+
eventName: 'stock_split',
|
|
1122
1023
|
// authority gate — an identity role attestation (ISSUER/BOARD_MEMBER/...) layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
|
|
1123
|
-
guard: signerIsParty(
|
|
1024
|
+
guard: signerIsParty('state.issuerAddress'),
|
|
1124
1025
|
effect: {
|
|
1125
1026
|
merge: [
|
|
1126
|
-
{ var:
|
|
1027
|
+
{ var: 'state' },
|
|
1127
1028
|
{
|
|
1128
1029
|
corporateActions: {
|
|
1129
1030
|
merge: [
|
|
1130
|
-
{ var:
|
|
1031
|
+
{ var: 'state.corporateActions' },
|
|
1131
1032
|
[
|
|
1132
1033
|
{
|
|
1133
|
-
actionId: { var:
|
|
1134
|
-
actionType:
|
|
1135
|
-
actionDate: { var:
|
|
1136
|
-
ratio: { var:
|
|
1137
|
-
sharesBeforeAction: { var:
|
|
1138
|
-
sharesAfterAction: { var:
|
|
1139
|
-
resolutionRef: { var:
|
|
1034
|
+
actionId: { var: 'event.actionId' },
|
|
1035
|
+
actionType: 'STOCK_SPLIT',
|
|
1036
|
+
actionDate: { var: 'event.effectiveDate' },
|
|
1037
|
+
ratio: { var: 'event.splitRatio' },
|
|
1038
|
+
sharesBeforeAction: { var: 'state.shareCount' },
|
|
1039
|
+
sharesAfterAction: { var: 'event.newShareCount' },
|
|
1040
|
+
resolutionRef: { var: 'event.resolutionRef' },
|
|
1140
1041
|
},
|
|
1141
1042
|
],
|
|
1142
1043
|
],
|
|
1143
1044
|
},
|
|
1144
|
-
shareCount: { var:
|
|
1045
|
+
shareCount: { var: 'event.newShareCount' },
|
|
1145
1046
|
},
|
|
1146
1047
|
{
|
|
1147
|
-
_emit: [
|
|
1148
|
-
{ name: "STOCK_SPLIT_APPLIED", data: { var: "event" }, destination: "external" },
|
|
1149
|
-
],
|
|
1048
|
+
_emit: [{ name: 'STOCK_SPLIT_APPLIED', data: { var: 'event' }, destination: 'external' }],
|
|
1150
1049
|
},
|
|
1151
1050
|
],
|
|
1152
1051
|
},
|
|
@@ -1154,23 +1053,23 @@ export const corpSecuritiesDef = defineFiberApp({
|
|
|
1154
1053
|
// ISSUED -> ISSUED (propose_dividend) — phase 1 (#24): bind the executing resolution fiber and record
|
|
1155
1054
|
// the pending declaration, so declare_dividend can read the resolution's state next transition.
|
|
1156
1055
|
{
|
|
1157
|
-
from:
|
|
1158
|
-
to:
|
|
1159
|
-
eventName:
|
|
1056
|
+
from: 'ISSUED',
|
|
1057
|
+
to: 'ISSUED',
|
|
1058
|
+
eventName: 'propose_dividend',
|
|
1160
1059
|
// authority gate — an identity role attestation (ISSUER/BOARD_MEMBER/...) layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
|
|
1161
|
-
guard: signerIsParty(
|
|
1060
|
+
guard: signerIsParty('state.issuerAddress'),
|
|
1162
1061
|
effect: {
|
|
1163
1062
|
merge: [
|
|
1164
|
-
{ var:
|
|
1063
|
+
{ var: 'state' },
|
|
1165
1064
|
{
|
|
1166
1065
|
pendingDividend: {
|
|
1167
|
-
actionId: { var:
|
|
1168
|
-
ref: { var:
|
|
1169
|
-
proposedAt: { var:
|
|
1066
|
+
actionId: { var: 'event.actionId' },
|
|
1067
|
+
ref: { var: 'event.resolutionRef' },
|
|
1068
|
+
proposedAt: { var: '$ordinal' },
|
|
1170
1069
|
},
|
|
1171
1070
|
},
|
|
1172
1071
|
// bind the resolution fiber so declare_dividend can assert its state next transition
|
|
1173
|
-
addDependency({ var:
|
|
1072
|
+
addDependency({ var: 'event.resolutionRef' }),
|
|
1174
1073
|
],
|
|
1175
1074
|
},
|
|
1176
1075
|
dependencies: [],
|
|
@@ -1178,55 +1077,46 @@ export const corpSecuritiesDef = defineFiberApp({
|
|
|
1178
1077
|
// ISSUED -> ISSUED (declare_dividend) — phase 2 (#24): stock dividend handling once the bound
|
|
1179
1078
|
// resolution is EXECUTED.
|
|
1180
1079
|
{
|
|
1181
|
-
from:
|
|
1182
|
-
to:
|
|
1183
|
-
eventName:
|
|
1080
|
+
from: 'ISSUED',
|
|
1081
|
+
to: 'ISSUED',
|
|
1082
|
+
eventName: 'declare_dividend',
|
|
1184
1083
|
// authority gate — an identity role attestation (ISSUER/BOARD_MEMBER/...) layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
|
|
1185
1084
|
guard: {
|
|
1186
1085
|
and: [
|
|
1187
|
-
signerIsParty(
|
|
1086
|
+
signerIsParty('state.issuerAddress'),
|
|
1188
1087
|
// the proposal must target this action, and its bound resolution must be EXECUTED
|
|
1189
1088
|
{
|
|
1190
|
-
|
|
1191
|
-
{ var: "state.pendingDividend.actionId" },
|
|
1192
|
-
{ var: "event.actionId" },
|
|
1193
|
-
],
|
|
1089
|
+
'==': [{ var: 'state.pendingDividend.actionId' }, { var: 'event.actionId' }],
|
|
1194
1090
|
},
|
|
1195
|
-
depInState(
|
|
1091
|
+
depInState('state.pendingDividend.ref', 'EXECUTED'),
|
|
1196
1092
|
],
|
|
1197
1093
|
},
|
|
1198
1094
|
effect: {
|
|
1199
1095
|
if: [
|
|
1200
|
-
{
|
|
1096
|
+
{ '==': [{ var: 'event.dividendType' }, 'STOCK'] },
|
|
1201
1097
|
{
|
|
1202
1098
|
merge: [
|
|
1203
|
-
{ var:
|
|
1099
|
+
{ var: 'state' },
|
|
1204
1100
|
{
|
|
1205
1101
|
corporateActions: {
|
|
1206
1102
|
merge: [
|
|
1207
|
-
{ var:
|
|
1103
|
+
{ var: 'state.corporateActions' },
|
|
1208
1104
|
[
|
|
1209
1105
|
{
|
|
1210
|
-
actionId: { var:
|
|
1211
|
-
actionType:
|
|
1212
|
-
actionDate: { var:
|
|
1213
|
-
sharesBeforeAction: { var:
|
|
1106
|
+
actionId: { var: 'event.actionId' },
|
|
1107
|
+
actionType: 'STOCK_DIVIDEND',
|
|
1108
|
+
actionDate: { var: 'event.paymentDate' },
|
|
1109
|
+
sharesBeforeAction: { var: 'state.shareCount' },
|
|
1214
1110
|
sharesAfterAction: {
|
|
1215
|
-
|
|
1216
|
-
{ var: "state.shareCount" },
|
|
1217
|
-
{ var: "event.stockShares" },
|
|
1218
|
-
],
|
|
1111
|
+
'+': [{ var: 'state.shareCount' }, { var: 'event.stockShares' }],
|
|
1219
1112
|
},
|
|
1220
|
-
resolutionRef: { var:
|
|
1113
|
+
resolutionRef: { var: 'state.pendingDividend.ref' },
|
|
1221
1114
|
},
|
|
1222
1115
|
],
|
|
1223
1116
|
],
|
|
1224
1117
|
},
|
|
1225
1118
|
shareCount: {
|
|
1226
|
-
|
|
1227
|
-
{ var: "state.shareCount" },
|
|
1228
|
-
{ var: "event.stockShares" },
|
|
1229
|
-
],
|
|
1119
|
+
'+': [{ var: 'state.shareCount' }, { var: 'event.stockShares' }],
|
|
1230
1120
|
},
|
|
1231
1121
|
// clear the consumed proposal
|
|
1232
1122
|
pendingDividend: null,
|
|
@@ -1235,7 +1125,7 @@ export const corpSecuritiesDef = defineFiberApp({
|
|
|
1235
1125
|
},
|
|
1236
1126
|
{
|
|
1237
1127
|
merge: [
|
|
1238
|
-
{ var:
|
|
1128
|
+
{ var: 'state' },
|
|
1239
1129
|
// cash dividend: no share change, but still clear the consumed proposal
|
|
1240
1130
|
{ pendingDividend: null },
|
|
1241
1131
|
],
|
|
@@ -1246,41 +1136,38 @@ export const corpSecuritiesDef = defineFiberApp({
|
|
|
1246
1136
|
},
|
|
1247
1137
|
// ISSUED -> ISSUED (remove_restriction)
|
|
1248
1138
|
{
|
|
1249
|
-
from:
|
|
1250
|
-
to:
|
|
1251
|
-
eventName:
|
|
1139
|
+
from: 'ISSUED',
|
|
1140
|
+
to: 'ISSUED',
|
|
1141
|
+
eventName: 'remove_restriction',
|
|
1252
1142
|
// authority gate — an identity role attestation (ISSUER/BOARD_MEMBER/...) layers on additively when the identity registry lands (docs/design/app-hardening-identity-integration.md §4.2)
|
|
1253
|
-
guard: signerIsParty(
|
|
1143
|
+
guard: signerIsParty('state.issuerAddress'),
|
|
1254
1144
|
effect: {
|
|
1255
1145
|
merge: [
|
|
1256
|
-
{ var:
|
|
1146
|
+
{ var: 'state' },
|
|
1257
1147
|
{
|
|
1258
1148
|
restrictions: {
|
|
1259
1149
|
merge: [
|
|
1260
|
-
{ var:
|
|
1150
|
+
{ var: 'state.restrictions' },
|
|
1261
1151
|
{
|
|
1262
1152
|
restrictionType: {
|
|
1263
1153
|
filter: [
|
|
1264
|
-
{ var:
|
|
1265
|
-
{
|
|
1154
|
+
{ var: 'state.restrictions.restrictionType' },
|
|
1155
|
+
{ '!=': [{ var: '' }, { var: 'event.restrictionType' }] },
|
|
1266
1156
|
],
|
|
1267
1157
|
},
|
|
1268
1158
|
isRestricted: {
|
|
1269
|
-
|
|
1159
|
+
'>': [
|
|
1270
1160
|
{
|
|
1271
1161
|
reduce: [
|
|
1272
1162
|
{
|
|
1273
1163
|
filter: [
|
|
1274
|
-
{ var:
|
|
1164
|
+
{ var: 'state.restrictions.restrictionType' },
|
|
1275
1165
|
{
|
|
1276
|
-
|
|
1277
|
-
{ var: "" },
|
|
1278
|
-
{ var: "event.restrictionType" },
|
|
1279
|
-
],
|
|
1166
|
+
'!=': [{ var: '' }, { var: 'event.restrictionType' }],
|
|
1280
1167
|
},
|
|
1281
1168
|
],
|
|
1282
1169
|
},
|
|
1283
|
-
{
|
|
1170
|
+
{ '+': [{ var: 'accumulator' }, 1] },
|
|
1284
1171
|
0,
|
|
1285
1172
|
],
|
|
1286
1173
|
},
|
|
@@ -1292,9 +1179,7 @@ export const corpSecuritiesDef = defineFiberApp({
|
|
|
1292
1179
|
},
|
|
1293
1180
|
},
|
|
1294
1181
|
{
|
|
1295
|
-
_emit: [
|
|
1296
|
-
{ name: "RESTRICTION_REMOVED", data: { var: "event" }, destination: "external" },
|
|
1297
|
-
],
|
|
1182
|
+
_emit: [{ name: 'RESTRICTION_REMOVED', data: { var: 'event' }, destination: 'external' }],
|
|
1298
1183
|
},
|
|
1299
1184
|
],
|
|
1300
1185
|
},
|