@ottochain/sdk 2.4.0 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +20 -3
- package/dist/cjs/ottochain/genesis-manifest.js +6 -0
- package/dist/cjs/ottochain/metagraph-client.js +16 -8
- 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 +117 -1
- package/dist/cjs/schema/fiber-app.js +132 -3
- 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 +16 -8
- 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 +110 -0
- package/dist/esm/schema/fiber-app.js +127 -3
- 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/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 +107 -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
|
@@ -21,39 +21,39 @@ const shield_app_js_1 = require("./shield-app.js");
|
|
|
21
21
|
/** The per-bidder PRIVATE state: a bid note `{ amount, bidder, nonce }`. */
|
|
22
22
|
exports.sealedBidAccountDef = (0, fiber_app_js_1.defineFiberApp)({
|
|
23
23
|
metadata: {
|
|
24
|
-
name:
|
|
25
|
-
app:
|
|
26
|
-
type:
|
|
27
|
-
version:
|
|
24
|
+
name: 'SealedBidAccount',
|
|
25
|
+
app: 'markets',
|
|
26
|
+
type: 'sealed-bid-account',
|
|
27
|
+
version: '1.0.0',
|
|
28
28
|
description: "A single bidder's sealed bid (private amount). Shielded via shieldApp.",
|
|
29
29
|
},
|
|
30
30
|
stateSchema: {
|
|
31
31
|
properties: {
|
|
32
|
-
amount: { type:
|
|
33
|
-
bidder: { type:
|
|
34
|
-
nonce: { type:
|
|
32
|
+
amount: { type: 'number', description: 'the (private) bid amount' },
|
|
33
|
+
bidder: { type: 'address' },
|
|
34
|
+
nonce: { type: 'number', description: 'per-note randomness; keeps the commitment hiding' },
|
|
35
35
|
},
|
|
36
36
|
},
|
|
37
37
|
eventSchemas: {
|
|
38
38
|
place_bid: {
|
|
39
|
-
description:
|
|
40
|
-
required: [
|
|
41
|
-
properties: { amount: { type:
|
|
39
|
+
description: 'Set the sealed bid amount',
|
|
40
|
+
required: ['amount'],
|
|
41
|
+
properties: { amount: { type: 'number', minimum: 1 } },
|
|
42
42
|
},
|
|
43
43
|
},
|
|
44
44
|
states: {
|
|
45
|
-
OPEN: { id:
|
|
46
|
-
BID: { id:
|
|
45
|
+
OPEN: { id: 'OPEN', isFinal: false, metadata: { label: 'Open', description: 'No bid yet', category: 'initial' } },
|
|
46
|
+
BID: { id: 'BID', isFinal: false, metadata: { label: 'Bid', description: 'Bid committed', category: 'active' } },
|
|
47
47
|
},
|
|
48
|
-
initialState:
|
|
48
|
+
initialState: 'OPEN',
|
|
49
49
|
transitions: [
|
|
50
50
|
{
|
|
51
51
|
// This effect is what the zk-jlvm-shielded circuit runs in-zkVM; `exprHash` pins it.
|
|
52
|
-
from:
|
|
53
|
-
to:
|
|
54
|
-
eventName:
|
|
55
|
-
guard: {
|
|
56
|
-
effect: { merge: [{ var:
|
|
52
|
+
from: 'OPEN',
|
|
53
|
+
to: 'BID',
|
|
54
|
+
eventName: 'place_bid',
|
|
55
|
+
guard: { '>': [{ var: 'event.amount' }, 0] },
|
|
56
|
+
effect: { merge: [{ var: 'state' }, { amount: { var: 'event.amount' } }] },
|
|
57
57
|
dependencies: [],
|
|
58
58
|
},
|
|
59
59
|
],
|
|
@@ -74,60 +74,69 @@ function shieldedSealedBidDef(opts) {
|
|
|
74
74
|
*/
|
|
75
75
|
exports.vickreyAuctionDef = (0, fiber_app_js_1.defineFiberApp)({
|
|
76
76
|
metadata: {
|
|
77
|
-
name:
|
|
78
|
-
app:
|
|
79
|
-
type:
|
|
80
|
-
version:
|
|
81
|
-
description:
|
|
82
|
-
crossReferences: { bidPool:
|
|
77
|
+
name: 'VickreyAuction',
|
|
78
|
+
app: 'markets',
|
|
79
|
+
type: 'vickrey-auction',
|
|
80
|
+
version: '1.0.0',
|
|
81
|
+
description: 'Sealed-bid second-price auction: public reveal-then-tally over shielded bids.',
|
|
82
|
+
crossReferences: { bidPool: 'the ShieldedSealedBidAccount pool holding the sealed bids' },
|
|
83
83
|
},
|
|
84
84
|
createSchema: {
|
|
85
|
-
required: [
|
|
85
|
+
required: ['seller', 'deadline'],
|
|
86
86
|
properties: {
|
|
87
|
-
seller: { type:
|
|
88
|
-
deadline: { type:
|
|
87
|
+
seller: { type: 'address', immutable: true },
|
|
88
|
+
deadline: { type: 'timestamp', immutable: true },
|
|
89
89
|
},
|
|
90
90
|
},
|
|
91
91
|
stateSchema: {
|
|
92
92
|
properties: {
|
|
93
|
-
seller: { type:
|
|
94
|
-
deadline: { type:
|
|
95
|
-
status: { type:
|
|
96
|
-
revealed: { type:
|
|
97
|
-
winner: { type:
|
|
98
|
-
clearingPrice: { type:
|
|
93
|
+
seller: { type: 'address', immutable: true },
|
|
94
|
+
deadline: { type: 'timestamp', immutable: true },
|
|
95
|
+
status: { type: 'string', computed: true },
|
|
96
|
+
revealed: { type: 'array', computed: true, description: 'opened bids [{bidder, amount}]' },
|
|
97
|
+
winner: { type: 'address', computed: true },
|
|
98
|
+
clearingPrice: { type: 'number', computed: true, description: 'second-highest bid (Vickrey)' },
|
|
99
99
|
},
|
|
100
100
|
},
|
|
101
101
|
eventSchemas: {
|
|
102
102
|
reveal: {
|
|
103
|
-
description:
|
|
104
|
-
required: [
|
|
105
|
-
properties: { bidder: { type:
|
|
103
|
+
description: 'Open a sealed bid after the deadline',
|
|
104
|
+
required: ['bidder', 'amount'],
|
|
105
|
+
properties: { bidder: { type: 'address' }, amount: { type: 'number', minimum: 1 } },
|
|
106
106
|
},
|
|
107
|
-
settle: { description:
|
|
107
|
+
settle: { description: 'Tally the revealed bids (winner + second price)' },
|
|
108
108
|
},
|
|
109
109
|
states: {
|
|
110
|
-
OPEN: {
|
|
111
|
-
|
|
112
|
-
|
|
110
|
+
OPEN: {
|
|
111
|
+
id: 'OPEN',
|
|
112
|
+
isFinal: false,
|
|
113
|
+
metadata: { label: 'Open', description: 'Bidding (sealed)', category: 'initial' },
|
|
114
|
+
},
|
|
115
|
+
REVEAL: {
|
|
116
|
+
id: 'REVEAL',
|
|
117
|
+
isFinal: false,
|
|
118
|
+
metadata: { label: 'Reveal', description: 'Opening bids', category: 'active' },
|
|
119
|
+
},
|
|
120
|
+
SETTLED: {
|
|
121
|
+
id: 'SETTLED',
|
|
122
|
+
isFinal: true,
|
|
123
|
+
metadata: { label: 'Settled', description: 'Winner + price set', category: 'terminal' },
|
|
124
|
+
},
|
|
113
125
|
},
|
|
114
|
-
initialState:
|
|
126
|
+
initialState: 'OPEN',
|
|
115
127
|
transitions: [
|
|
116
128
|
{
|
|
117
|
-
from:
|
|
118
|
-
to:
|
|
119
|
-
eventName:
|
|
120
|
-
guard: {
|
|
129
|
+
from: 'OPEN',
|
|
130
|
+
to: 'REVEAL',
|
|
131
|
+
eventName: 'reveal',
|
|
132
|
+
guard: { '>=': [{ var: '$timestamp' }, { var: 'state.deadline' }] },
|
|
121
133
|
effect: {
|
|
122
134
|
merge: [
|
|
123
|
-
{ var:
|
|
135
|
+
{ var: 'state' },
|
|
124
136
|
{
|
|
125
|
-
status:
|
|
137
|
+
status: 'REVEAL',
|
|
126
138
|
revealed: {
|
|
127
|
-
cat: [
|
|
128
|
-
{ var: "state.revealed" },
|
|
129
|
-
[{ bidder: { var: "event.bidder" }, amount: { var: "event.amount" } }],
|
|
130
|
-
],
|
|
139
|
+
cat: [{ var: 'state.revealed' }, [{ bidder: { var: 'event.bidder' }, amount: { var: 'event.amount' } }]],
|
|
131
140
|
},
|
|
132
141
|
},
|
|
133
142
|
],
|
|
@@ -135,19 +144,16 @@ exports.vickreyAuctionDef = (0, fiber_app_js_1.defineFiberApp)({
|
|
|
135
144
|
dependencies: [],
|
|
136
145
|
},
|
|
137
146
|
{
|
|
138
|
-
from:
|
|
139
|
-
to:
|
|
140
|
-
eventName:
|
|
141
|
-
guard: {
|
|
147
|
+
from: 'REVEAL',
|
|
148
|
+
to: 'REVEAL',
|
|
149
|
+
eventName: 'reveal',
|
|
150
|
+
guard: { '>=': [{ var: '$timestamp' }, { var: 'state.deadline' }] },
|
|
142
151
|
effect: {
|
|
143
152
|
merge: [
|
|
144
|
-
{ var:
|
|
153
|
+
{ var: 'state' },
|
|
145
154
|
{
|
|
146
155
|
revealed: {
|
|
147
|
-
cat: [
|
|
148
|
-
{ var: "state.revealed" },
|
|
149
|
-
[{ bidder: { var: "event.bidder" }, amount: { var: "event.amount" } }],
|
|
150
|
-
],
|
|
156
|
+
cat: [{ var: 'state.revealed' }, [{ bidder: { var: 'event.bidder' }, amount: { var: 'event.amount' } }]],
|
|
151
157
|
},
|
|
152
158
|
},
|
|
153
159
|
],
|
|
@@ -156,44 +162,41 @@ exports.vickreyAuctionDef = (0, fiber_app_js_1.defineFiberApp)({
|
|
|
156
162
|
},
|
|
157
163
|
{
|
|
158
164
|
// Vickrey tally: fold the revealed bids tracking (max, second, winner).
|
|
159
|
-
from:
|
|
160
|
-
to:
|
|
161
|
-
eventName:
|
|
162
|
-
guard: {
|
|
165
|
+
from: 'REVEAL',
|
|
166
|
+
to: 'SETTLED',
|
|
167
|
+
eventName: 'settle',
|
|
168
|
+
guard: { '>': [{ reduce: [{ var: 'state.revealed' }, { '+': [{ var: 'accumulator' }, 1] }, 0] }, 0] },
|
|
163
169
|
effect: {
|
|
164
170
|
merge: [
|
|
165
|
-
{ var:
|
|
171
|
+
{ var: 'state' },
|
|
166
172
|
{
|
|
167
|
-
status:
|
|
168
|
-
settledAt: { var:
|
|
173
|
+
status: 'SETTLED',
|
|
174
|
+
settledAt: { var: '$timestamp' },
|
|
169
175
|
winner: {
|
|
170
|
-
var: [
|
|
171
|
-
"tally.winner",
|
|
172
|
-
null,
|
|
173
|
-
],
|
|
176
|
+
var: ['tally.winner', null],
|
|
174
177
|
},
|
|
175
|
-
clearingPrice: { var: [
|
|
178
|
+
clearingPrice: { var: ['tally.second', 0] },
|
|
176
179
|
// compute the tally once and expose it for the two fields above
|
|
177
180
|
tally: {
|
|
178
181
|
reduce: [
|
|
179
|
-
{ var:
|
|
182
|
+
{ var: 'state.revealed' },
|
|
180
183
|
{
|
|
181
184
|
if: [
|
|
182
|
-
{
|
|
185
|
+
{ '>': [{ var: 'current.amount' }, { var: 'accumulator.max' }] },
|
|
183
186
|
{
|
|
184
|
-
max: { var:
|
|
185
|
-
second: { var:
|
|
186
|
-
winner: { var:
|
|
187
|
+
max: { var: 'current.amount' },
|
|
188
|
+
second: { var: 'accumulator.max' },
|
|
189
|
+
winner: { var: 'current.bidder' },
|
|
187
190
|
},
|
|
188
191
|
{
|
|
189
192
|
if: [
|
|
190
|
-
{
|
|
193
|
+
{ '>': [{ var: 'current.amount' }, { var: 'accumulator.second' }] },
|
|
191
194
|
{
|
|
192
|
-
max: { var:
|
|
193
|
-
second: { var:
|
|
194
|
-
winner: { var:
|
|
195
|
+
max: { var: 'accumulator.max' },
|
|
196
|
+
second: { var: 'current.amount' },
|
|
197
|
+
winner: { var: 'accumulator.winner' },
|
|
195
198
|
},
|
|
196
|
-
{ var:
|
|
199
|
+
{ var: 'accumulator' },
|
|
197
200
|
],
|
|
198
201
|
},
|
|
199
202
|
],
|
|
@@ -40,15 +40,15 @@ const pvField = (publicValues, hexOffset) => ({
|
|
|
40
40
|
});
|
|
41
41
|
/** Standard public state every shielded pool carries (the rest of the app state is private/off-chain). */
|
|
42
42
|
exports.SHIELDED_POOL_STATE = {
|
|
43
|
-
vkey: { type:
|
|
44
|
-
exprHash: { type:
|
|
45
|
-
rootWindow: { type:
|
|
46
|
-
currentRoot: { type:
|
|
47
|
-
knownRoots: { type:
|
|
48
|
-
nullifiers: { type:
|
|
49
|
-
commitments: { type:
|
|
50
|
-
leafCount: { type:
|
|
51
|
-
transitions: { type:
|
|
43
|
+
vkey: { type: 'hash', immutable: true },
|
|
44
|
+
exprHash: { type: 'hash', immutable: true },
|
|
45
|
+
rootWindow: { type: 'integer', immutable: true },
|
|
46
|
+
currentRoot: { type: 'hash', computed: true },
|
|
47
|
+
knownRoots: { type: 'array', computed: true, description: 'rolling window of valid anchors (hex)' },
|
|
48
|
+
nullifiers: { type: 'array', computed: true, description: 'spent set (hex); monotonic — see RFC §5.3' },
|
|
49
|
+
commitments: { type: 'array', computed: true, description: 'append-only log of output commitments (hex)' },
|
|
50
|
+
leafCount: { type: 'integer', computed: true, default: 0 },
|
|
51
|
+
transitions: { type: 'integer', computed: true, default: 0 },
|
|
52
52
|
};
|
|
53
53
|
/**
|
|
54
54
|
* Build the shielded-pool variant of `base`.
|
|
@@ -57,7 +57,7 @@ exports.SHIELDED_POOL_STATE = {
|
|
|
57
57
|
* @param opts the circuit vkey + the pinned `exprHash` + the anchor window.
|
|
58
58
|
*/
|
|
59
59
|
function shieldApp(base, opts) {
|
|
60
|
-
const publicValues = { var:
|
|
60
|
+
const publicValues = { var: 'event.publicValues' };
|
|
61
61
|
const anchor = pvField(publicValues, 2);
|
|
62
62
|
const nullifier = pvField(publicValues, 66);
|
|
63
63
|
const newCommitment = pvField(publicValues, 130);
|
|
@@ -66,13 +66,13 @@ function shieldApp(base, opts) {
|
|
|
66
66
|
const guard = {
|
|
67
67
|
and: [
|
|
68
68
|
// 1. the proof verifies against the pool's pinned vkey over EXACTLY these public bytes
|
|
69
|
-
{ groth16_verify: [{ var:
|
|
69
|
+
{ groth16_verify: [{ var: 'state.vkey' }, publicValues, { var: 'event.proof' }] },
|
|
70
70
|
// 2. it ran the app logic this pool pins (binds which effect produced the transition)
|
|
71
|
-
{
|
|
71
|
+
{ '===': [exprHash, { var: 'state.exprHash' }] },
|
|
72
72
|
// 3. the spent note was proven under an anchor we still honor
|
|
73
|
-
{ in: [anchor, { var:
|
|
73
|
+
{ in: [anchor, { var: 'state.knownRoots' }] },
|
|
74
74
|
// 4. inter-transfer double-spend guard: the nullifier is not already spent
|
|
75
|
-
{ none: [{ var:
|
|
75
|
+
{ none: [{ var: 'state.nullifiers' }, { '===': [{ var: '' }, nullifier] }] },
|
|
76
76
|
],
|
|
77
77
|
};
|
|
78
78
|
// EFFECT (combine): spend the nullifier, record the new commitment, advance counters.
|
|
@@ -80,52 +80,52 @@ function shieldApp(base, opts) {
|
|
|
80
80
|
// per RFC §6.2 / §10; the chain records the commitment + nullifier here.
|
|
81
81
|
const effect = {
|
|
82
82
|
merge: [
|
|
83
|
-
{ var:
|
|
83
|
+
{ var: 'state' },
|
|
84
84
|
{
|
|
85
|
-
nullifiers: { cat: [{ var:
|
|
86
|
-
commitments: { cat: [{ var:
|
|
87
|
-
leafCount: {
|
|
88
|
-
transitions: {
|
|
89
|
-
lastTransitionAt: { var:
|
|
85
|
+
nullifiers: { cat: [{ var: 'state.nullifiers' }, [nullifier]] },
|
|
86
|
+
commitments: { cat: [{ var: 'state.commitments' }, [newCommitment]] },
|
|
87
|
+
leafCount: { '+': [{ var: 'state.leafCount' }, 1] },
|
|
88
|
+
transitions: { '+': [{ var: 'state.transitions' }, 1] },
|
|
89
|
+
lastTransitionAt: { var: '$ordinal' },
|
|
90
90
|
},
|
|
91
91
|
],
|
|
92
92
|
};
|
|
93
93
|
return (0, fiber_app_js_1.defineFiberApp)({
|
|
94
94
|
metadata: {
|
|
95
95
|
name: `Shielded${base.metadata.name}`,
|
|
96
|
-
app:
|
|
96
|
+
app: 'privacy',
|
|
97
97
|
type: `shielded-${base.metadata.type}`,
|
|
98
98
|
version: base.metadata.version,
|
|
99
99
|
description: `Shielded (zk-jlvm-shielded) variant of ${base.metadata.name}: private state transitions ` +
|
|
100
100
|
`verified by a Groth16 proof; the nullifier set + anchors are public pool state.`,
|
|
101
101
|
},
|
|
102
102
|
createSchema: {
|
|
103
|
-
required: [
|
|
103
|
+
required: ['vkey', 'exprHash'],
|
|
104
104
|
properties: {
|
|
105
|
-
vkey: { type:
|
|
106
|
-
exprHash: { type:
|
|
107
|
-
rootWindow: { type:
|
|
105
|
+
vkey: { type: 'hash', immutable: true, default: opts.vkey },
|
|
106
|
+
exprHash: { type: 'hash', immutable: true, default: opts.exprHash },
|
|
107
|
+
rootWindow: { type: 'integer', immutable: true, default: opts.rootWindow ?? 64 },
|
|
108
108
|
},
|
|
109
109
|
},
|
|
110
110
|
stateSchema: { properties: { ...exports.SHIELDED_POOL_STATE } },
|
|
111
111
|
eventSchemas: {
|
|
112
112
|
transition: {
|
|
113
113
|
description: `A private state transition of ${base.metadata.name}, attested by a zk-jlvm-shielded Groth16 proof.`,
|
|
114
|
-
required: [
|
|
114
|
+
required: ['proof', 'publicValues'],
|
|
115
115
|
properties: {
|
|
116
|
-
proof: { type:
|
|
117
|
-
publicValues: { type:
|
|
116
|
+
proof: { type: 'string', description: 'Groth16 proof bytes (0x hex)' },
|
|
117
|
+
publicValues: { type: 'string', description: 'abi-encoded JlvmTransitionPublicValues (4×bytes32, 0x hex)' },
|
|
118
118
|
},
|
|
119
119
|
},
|
|
120
120
|
},
|
|
121
121
|
states: {
|
|
122
122
|
ACTIVE: {
|
|
123
|
-
id:
|
|
123
|
+
id: 'ACTIVE',
|
|
124
124
|
isFinal: false,
|
|
125
|
-
metadata: { label:
|
|
125
|
+
metadata: { label: 'Active', description: 'Pool accepts shielded transitions', category: 'active' },
|
|
126
126
|
},
|
|
127
127
|
},
|
|
128
|
-
initialState:
|
|
129
|
-
transitions: [{ from:
|
|
128
|
+
initialState: 'ACTIVE',
|
|
129
|
+
transitions: [{ from: 'ACTIVE', to: 'ACTIVE', eventName: 'transition', guard, effect, dependencies: [] }],
|
|
130
130
|
});
|
|
131
131
|
}
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
* ```
|
|
17
17
|
*/
|
|
18
18
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
-
exports.setDependencyActive = exports.addDependency = void 0;
|
|
19
|
+
exports.RESERVED_EFFECT_KEYS = exports.emit = exports.spawn = exports.triggers = exports.toWallet = exports.toFiber = exports.transferAsset = exports.setDependencyActive = exports.addDependency = void 0;
|
|
20
20
|
/**
|
|
21
21
|
* `_addDependency` (#24): add — or re-activate — a runtime DYNAMIC dependency on `fiberId`, so that
|
|
22
22
|
* fiber's state appears in `machines.<fiberId>` for SUBSEQUENT transitions of this fiber. `fiberId` may
|
|
@@ -38,3 +38,119 @@ const setDependencyActive = (fiberId, active) => ({
|
|
|
38
38
|
_setDependencyActive: [{ fiberId, active }],
|
|
39
39
|
});
|
|
40
40
|
exports.setDependencyActive = setDependencyActive;
|
|
41
|
+
/**
|
|
42
|
+
* `_transferAsset`: move one or more WHOLE asset instances the emitting fiber holds, each to a single
|
|
43
|
+
* recipient. The directive rides INSIDE a `merge` effect map (the engine extracts `_`-prefixed keys
|
|
44
|
+
* before merging into state); a transition-level `emits` block is silently stripped by
|
|
45
|
+
* `toProtoDefinition`, which would strand the asset.
|
|
46
|
+
*
|
|
47
|
+
* Each directive is `{ assetId, recipient }` ONLY — there is NO `amount` field. The combiner reassigns
|
|
48
|
+
* `holder := recipient` on the WHOLE asset record (`AssetCombiner.applyFiberTransfer`); value is moved
|
|
49
|
+
* one whole instance at a time, never split. `recipient` must resolve to the canonical `AssetHolder`
|
|
50
|
+
* OBJECT form — `{"Fiber":{"fiberId":..}}` / `{"Wallet":{"address":..}}` — built with {@link toFiber} /
|
|
51
|
+
* {@link toWallet}; the chain raises a graceful `CombineRejected` on a bare string or malformed object
|
|
52
|
+
* (`EffectExtractor.parseAssetTransfer`). `assetId` is a UUID; the holder id may be a literal or an
|
|
53
|
+
* expression (e.g. `{ var: "event.agent" }`).
|
|
54
|
+
*
|
|
55
|
+
* Combiner-side holder defense (R1) independently re-validates every directive: the asset must resolve,
|
|
56
|
+
* be held by `Fiber(self)`, be `behavior.transferable`, and (Fiber recipient) the recipient fiber must be
|
|
57
|
+
* live — else the whole transition is `CombineRejected`. There is a hard cap of 32 asset mutations per
|
|
58
|
+
* transition (all-or-nothing); keep emitting fibers at ≤1 transfer per transition for claim/withdraw/slash.
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* effect: { merge: [ { var: "state" }, {
|
|
62
|
+
* status: "SETTLED",
|
|
63
|
+
* ...transferAsset([{ assetId: { var: "event.rewardAssetId" }, recipient: toWallet({ var: "event.agent" }) }]),
|
|
64
|
+
* } ] }
|
|
65
|
+
*/
|
|
66
|
+
const transferAsset = (transfers) => ({ _transferAsset: transfers });
|
|
67
|
+
exports.transferAsset = transferAsset;
|
|
68
|
+
/**
|
|
69
|
+
* Build a `_transferAsset` `recipient` as the canonical `AssetHolder` OBJECT form. The chain requires the
|
|
70
|
+
* object form ONLY — `{"Fiber":{"fiberId":..}}` / `{"Wallet":{"address":..}}` — and raises a graceful
|
|
71
|
+
* `CombineRejected` on a bare string or a malformed object (`EffectExtractor.parseAssetTransfer`); the
|
|
72
|
+
* legacy bare-string UUID/DAG-address disambiguation has been removed. These mirror the typed
|
|
73
|
+
* {@link fiberHolder} / {@link walletHolder} `AssetHolder` builders (used for `MintAsset.holder` /
|
|
74
|
+
* `ApplyMorphism.recipient`) but accept a `JsonLogicValue`, so the id can be a runtime expression:
|
|
75
|
+
*
|
|
76
|
+
* ```ts
|
|
77
|
+
* transferAsset([{ assetId, recipient: toFiber({ var: "event.retailerId" }) }]); // → {"Fiber":{"fiberId":..}}
|
|
78
|
+
* transferAsset([{ assetId, recipient: toWallet({ var: "event.agent" }) }]); // → {"Wallet":{"address":..}}
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
const toFiber = (fiberId) => ({
|
|
82
|
+
Fiber: { fiberId },
|
|
83
|
+
});
|
|
84
|
+
exports.toFiber = toFiber;
|
|
85
|
+
/** See {@link toFiber}: a `transferAsset` recipient held by a wallet — `{"Wallet":{"address":..}}`. */
|
|
86
|
+
const toWallet = (address) => ({
|
|
87
|
+
Wallet: { address },
|
|
88
|
+
});
|
|
89
|
+
exports.toWallet = toWallet;
|
|
90
|
+
/**
|
|
91
|
+
* `_triggers` (F4): fire one or more CROSS-FIBER events. Each entry is projected to
|
|
92
|
+
* `{ targetMachineId, eventName, payload }` — the exact shape the chain's `EffectExtractor` reads
|
|
93
|
+
* (`ReservedKeys.scala`, `EffectExtractor.scala`). `target` is the recipient fiber id (a literal UUID
|
|
94
|
+
* or an expression, e.g. `{ var: "event.retailerId" }`); `event` is the event NAME to enqueue on it;
|
|
95
|
+
* `payload` is the event body — omit it and the builder emits `{}` (never `null`).
|
|
96
|
+
*
|
|
97
|
+
* Authoring this as a builder makes a typo'd `_trigger` / `triggres` a TypeScript error rather than a
|
|
98
|
+
* silently-merged state field (the F4 foot-gun). Place the fragment INSIDE the effect's state-update
|
|
99
|
+
* map so it rides in the evaluated result the extractor reads.
|
|
100
|
+
*
|
|
101
|
+
* @example
|
|
102
|
+
* effect: { merge: [ { var: "state" }, {
|
|
103
|
+
* status: "debt_current",
|
|
104
|
+
* ...triggers([{ target: { var: "event.retailerId" }, event: "process_sale",
|
|
105
|
+
* payload: { buyerId: { var: "machineId" }, quantity: { var: "event.quantity" } } }]),
|
|
106
|
+
* } ] }
|
|
107
|
+
*/
|
|
108
|
+
const triggers = (ts) => ({
|
|
109
|
+
_triggers: ts.map((t) => ({
|
|
110
|
+
targetMachineId: t.target,
|
|
111
|
+
eventName: t.event,
|
|
112
|
+
payload: t.payload ?? {},
|
|
113
|
+
})),
|
|
114
|
+
});
|
|
115
|
+
exports.triggers = triggers;
|
|
116
|
+
/**
|
|
117
|
+
* `_spawn`: create one or more CHILD fibers, each from a literal machine `definition`. Each entry is
|
|
118
|
+
* `{ childId, definition, initialData, owners }` (`ReservedKeys.scala`, `EffectExtractor.scala`).
|
|
119
|
+
*
|
|
120
|
+
* The chain extracts `_spawn` from the effect EXPRESSION, not the evaluated result, so `definition`
|
|
121
|
+
* MUST be a literal {@link ProtoStateMachineDefinition} (e.g. a nested `machine().wireDefinition()` /
|
|
122
|
+
* `toProtoDefinition(child)` output) — NOT an expression the engine would evaluate at runtime.
|
|
123
|
+
*
|
|
124
|
+
* F8 gotcha — `owners` is load-bearing. A spawned child's transitions are gated by
|
|
125
|
+
* `owners ∪ authorizedSigners` (`riverdale-economy/README.md`), so EVERY party that will later drive
|
|
126
|
+
* the child (e.g. every bidder on a spawned auction) MUST be listed in `owners`, or their events are
|
|
127
|
+
* rejected. `owners` may be a literal id array or an expression (e.g. `{ var: "event.auctionOwners" }`);
|
|
128
|
+
* `childId` / `initialData` likewise accept literals or expressions.
|
|
129
|
+
*/
|
|
130
|
+
const spawn = (ds) => ({ _spawn: ds });
|
|
131
|
+
exports.spawn = spawn;
|
|
132
|
+
/**
|
|
133
|
+
* `_emit`: emit one or more domain events to the fiber's outbox. Each entry is
|
|
134
|
+
* `{ name, data, destination? }` (`ReservedKeys.scala`, `EffectExtractor.scala`). `name` is the event
|
|
135
|
+
* name, `data` the body (a literal or an expression), and `destination` an OPTIONAL routing target —
|
|
136
|
+
* omit it when absent (callers never pass `null`, so it is simply absent on the wire).
|
|
137
|
+
*/
|
|
138
|
+
const emit = (es) => ({
|
|
139
|
+
_emit: es,
|
|
140
|
+
});
|
|
141
|
+
exports.emit = emit;
|
|
142
|
+
/**
|
|
143
|
+
* The complete set of `_`-prefixed RESERVED effect keys the chain's `EffectExtractor` consumes and
|
|
144
|
+
* `StateMerger` strips from state (`ReservedKeys.scala:12-49`). Exported so a validator (Proposal 01)
|
|
145
|
+
* can reject an unknown `_`-prefixed key (a typo'd directive) instead of letting it silently leak into
|
|
146
|
+
* persisted state.
|
|
147
|
+
*/
|
|
148
|
+
exports.RESERVED_EFFECT_KEYS = [
|
|
149
|
+
'_triggers',
|
|
150
|
+
'_spawn',
|
|
151
|
+
'_emit',
|
|
152
|
+
'_transferAsset',
|
|
153
|
+
'_scriptCall',
|
|
154
|
+
'_addDependency',
|
|
155
|
+
'_setDependencyActive',
|
|
156
|
+
];
|