@centrifuge/sdk 1.10.0 → 1.12.1
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/Centrifuge.d.ts +38 -0
- package/dist/Centrifuge.d.ts.map +1 -1
- package/dist/Centrifuge.js +163 -0
- package/dist/Centrifuge.js.map +1 -1
- package/dist/Centrifuge.test.js +219 -0
- package/dist/Centrifuge.test.js.map +1 -1
- package/dist/abi/MultiAdapter.abi.d.ts +1 -1
- package/dist/abi/MultiAdapter.abi.js +1 -1
- package/dist/abi/MultiAdapter.abi.js.map +1 -1
- package/dist/abi/OnchainPM.abi.d.ts +3 -0
- package/dist/abi/OnchainPM.abi.d.ts.map +1 -0
- package/dist/abi/OnchainPM.abi.js +14 -0
- package/dist/abi/OnchainPM.abi.js.map +1 -0
- package/dist/abi/OnchainPMFactory.abi.d.ts +3 -0
- package/dist/abi/OnchainPMFactory.abi.d.ts.map +1 -0
- package/dist/abi/OnchainPMFactory.abi.js +6 -0
- package/dist/abi/OnchainPMFactory.abi.js.map +1 -0
- package/dist/abi/OracleValuation.abi.d.ts +3 -0
- package/dist/abi/OracleValuation.abi.d.ts.map +1 -0
- package/dist/abi/OracleValuation.abi.js +9 -0
- package/dist/abi/OracleValuation.abi.js.map +1 -0
- package/dist/abi/ScriptHelpers.abi.d.ts +3 -0
- package/dist/abi/ScriptHelpers.abi.d.ts.map +1 -0
- package/dist/abi/ScriptHelpers.abi.js +5 -0
- package/dist/abi/ScriptHelpers.abi.js.map +1 -0
- package/dist/abi/index.d.ts +281 -0
- package/dist/abi/index.d.ts.map +1 -1
- package/dist/abi/index.js +8 -0
- package/dist/abi/index.js.map +1 -1
- package/dist/entities/OnchainPM.d.ts +203 -0
- package/dist/entities/OnchainPM.d.ts.map +1 -0
- package/dist/entities/OnchainPM.js +315 -0
- package/dist/entities/OnchainPM.js.map +1 -0
- package/dist/entities/OnchainPM.test.d.ts +2 -0
- package/dist/entities/OnchainPM.test.d.ts.map +1 -0
- package/dist/entities/OnchainPM.test.js +155 -0
- package/dist/entities/OnchainPM.test.js.map +1 -0
- package/dist/entities/Pool.d.ts +81 -3
- package/dist/entities/Pool.d.ts.map +1 -1
- package/dist/entities/Pool.js +207 -18
- package/dist/entities/Pool.js.map +1 -1
- package/dist/entities/PoolNetwork.d.ts +37 -0
- package/dist/entities/PoolNetwork.d.ts.map +1 -1
- package/dist/entities/PoolNetwork.js +136 -12
- package/dist/entities/PoolNetwork.js.map +1 -1
- package/dist/entities/PoolNetwork.test.js +134 -1
- package/dist/entities/PoolNetwork.test.js.map +1 -1
- package/dist/entities/ShareClass.d.ts.map +1 -1
- package/dist/entities/ShareClass.js +151 -126
- package/dist/entities/ShareClass.js.map +1 -1
- package/dist/entities/Vault.test.js +0 -5
- package/dist/entities/Vault.test.js.map +1 -1
- package/dist/entities/crosschainMessages.d.ts +127 -0
- package/dist/entities/crosschainMessages.d.ts.map +1 -0
- package/dist/entities/crosschainMessages.js +204 -0
- package/dist/entities/crosschainMessages.js.map +1 -0
- package/dist/index.d.ts +16 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/poolMetadata.d.ts +28 -0
- package/dist/types/poolMetadata.d.ts.map +1 -1
- package/dist/types/transaction.d.ts +5 -1
- package/dist/types/transaction.d.ts.map +1 -1
- package/dist/types/transaction.js.map +1 -1
- package/dist/types/workflow.d.ts +151 -0
- package/dist/types/workflow.d.ts.map +1 -0
- package/dist/types/workflow.js +5 -0
- package/dist/types/workflow.js.map +1 -0
- package/dist/utils/catalog.d.ts +29 -0
- package/dist/utils/catalog.d.ts.map +1 -0
- package/dist/utils/catalog.js +396 -0
- package/dist/utils/catalog.js.map +1 -0
- package/dist/utils/catalog.test.d.ts +2 -0
- package/dist/utils/catalog.test.d.ts.map +1 -0
- package/dist/utils/catalog.test.js +291 -0
- package/dist/utils/catalog.test.js.map +1 -0
- package/dist/utils/scriptHash.d.ts +32 -0
- package/dist/utils/scriptHash.d.ts.map +1 -0
- package/dist/utils/scriptHash.js +67 -0
- package/dist/utils/scriptHash.js.map +1 -0
- package/dist/utils/scriptHash.test.d.ts +2 -0
- package/dist/utils/scriptHash.test.d.ts.map +1 -0
- package/dist/utils/scriptHash.test.js +97 -0
- package/dist/utils/scriptHash.test.js.map +1 -0
- package/dist/utils/variables.d.ts +78 -0
- package/dist/utils/variables.d.ts.map +1 -0
- package/dist/utils/variables.js +105 -0
- package/dist/utils/variables.js.map +1 -0
- package/dist/utils/variables.test.d.ts +2 -0
- package/dist/utils/variables.test.d.ts.map +1 -0
- package/dist/utils/variables.test.js +110 -0
- package/dist/utils/variables.test.js.map +1 -0
- package/dist/utils/weiroll.d.ts +176 -0
- package/dist/utils/weiroll.d.ts.map +1 -0
- package/dist/utils/weiroll.js +341 -0
- package/dist/utils/weiroll.js.map +1 -0
- package/dist/utils/weiroll.test.d.ts +2 -0
- package/dist/utils/weiroll.test.d.ts.map +1 -0
- package/dist/utils/weiroll.test.js +430 -0
- package/dist/utils/weiroll.test.js.map +1 -0
- package/dist/utils/workflowExecute.d.ts +121 -0
- package/dist/utils/workflowExecute.d.ts.map +1 -0
- package/dist/utils/workflowExecute.js +577 -0
- package/dist/utils/workflowExecute.js.map +1 -0
- package/dist/utils/workflowExecute.test.d.ts +2 -0
- package/dist/utils/workflowExecute.test.d.ts.map +1 -0
- package/dist/utils/workflowExecute.test.js +117 -0
- package/dist/utils/workflowExecute.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
import { combineLatest, firstValueFrom, from, map, switchMap } from 'rxjs';
|
|
2
|
+
import { encodeFunctionData, parseAbi, toHex } from 'viem';
|
|
3
|
+
import { ABI } from '../abi/index.js';
|
|
4
|
+
import { addressToBytes32, encode } from '../utils/index.js';
|
|
5
|
+
import { buildWorkflowExecuteParams, computeWorkflowGroupScriptHashes } from '../utils/workflowExecute.js';
|
|
6
|
+
import { wrapTransaction } from '../utils/transaction.js';
|
|
7
|
+
import { MessageType } from '../types/transaction.js';
|
|
8
|
+
import { Entity } from './Entity.js';
|
|
9
|
+
export class OnchainPM extends Entity {
|
|
10
|
+
network;
|
|
11
|
+
/** Deployed contract address on this chain. */
|
|
12
|
+
address;
|
|
13
|
+
/** @internal */
|
|
14
|
+
constructor(_root, network, address) {
|
|
15
|
+
super(_root, ['onchainPM', network.centrifugeId, network.pool.id.toString()]);
|
|
16
|
+
this.network = network;
|
|
17
|
+
this.address = address.toLowerCase();
|
|
18
|
+
}
|
|
19
|
+
/** Current policy root for the given strategist. `bytes32(0)` means no policy is set. */
|
|
20
|
+
policy(strategist) {
|
|
21
|
+
return this._query(['policy', strategist.toLowerCase()], () => from(this._root.getClient(this.network.centrifugeId)).pipe(switchMap((client) => from(client.readContract({
|
|
22
|
+
address: this.address,
|
|
23
|
+
abi: ABI.OnchainPM,
|
|
24
|
+
functionName: 'policy',
|
|
25
|
+
args: [strategist],
|
|
26
|
+
})))));
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Whether this OnchainPM is fully authorized to run workflows for the pool —
|
|
30
|
+
* i.e. it is both a balance sheet manager and a minter on the pool's
|
|
31
|
+
* accounting token. `authorizeOnchainPM` grants both; surface this so the UI
|
|
32
|
+
* can detect a partial/stale state and re-authorize.
|
|
33
|
+
*/
|
|
34
|
+
isAuthorized() {
|
|
35
|
+
const self = this;
|
|
36
|
+
return this._query(['isAuthorized'], () => combineLatest([
|
|
37
|
+
from(this._root._protocolAddresses(this.network.centrifugeId)),
|
|
38
|
+
from(this._root.getClient(this.network.centrifugeId)),
|
|
39
|
+
this.network.pool.isBalanceSheetManager(this.network.centrifugeId, this.address),
|
|
40
|
+
]).pipe(switchMap(([{ accountingToken }, client, isBalanceSheetManager]) => from(client.readContract({
|
|
41
|
+
address: accountingToken,
|
|
42
|
+
abi: parseAbi(['function minters(uint64, address) view returns (bool)']),
|
|
43
|
+
functionName: 'minters',
|
|
44
|
+
args: [self.network.pool.id.raw, self.address],
|
|
45
|
+
})).pipe(map((isMinter) => Boolean(isBalanceSheetManager) && Boolean(isMinter))))));
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Executes a whitelisted weiroll script on-chain.
|
|
49
|
+
*
|
|
50
|
+
* Build the arguments with:
|
|
51
|
+
* - `buildScript()` → `{ commands, state, stateBitmap }`
|
|
52
|
+
* - `fillRuntimeSlots()` → final `state` with runtime values filled in
|
|
53
|
+
* - `generateExecuteProof()` → `proof`
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```typescript
|
|
57
|
+
* const { commands, state: rawState, stateBitmap } = buildScript(workflow, { poolContext, configurableValues })
|
|
58
|
+
* const state = fillRuntimeSlots(rawState, workflow, { amount: '0x...' })
|
|
59
|
+
* const proof = await generateExecuteProof(computeScriptHash(commands, rawState, stateBitmap, []), allGroupScriptHashes)
|
|
60
|
+
* await onchainPM.execute({ commands, state, stateBitmap, callbacks: [], proof })
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
execute(params, options = {}) {
|
|
64
|
+
const self = this;
|
|
65
|
+
return this._transact(async function* (ctx) {
|
|
66
|
+
yield* wrapTransaction('Execute workflow', ctx, {
|
|
67
|
+
contract: self.address,
|
|
68
|
+
data: encodeFunctionData({
|
|
69
|
+
abi: ABI.OnchainPM,
|
|
70
|
+
functionName: 'execute',
|
|
71
|
+
args: [params.commands, params.state, params.stateBitmap, params.callbacks, params.proof],
|
|
72
|
+
}),
|
|
73
|
+
value: options.value,
|
|
74
|
+
}, { simulate: options.simulate ?? false });
|
|
75
|
+
}, this.network.centrifugeId);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Runs several whitelisted weiroll scripts in a single transaction via the
|
|
79
|
+
* OnchainPM's `multicall` — used to batch a strategist's "account"/accounting
|
|
80
|
+
* workflows (e.g. price updates) into one atomic accounting update. Each item is
|
|
81
|
+
* built exactly like {@link execute}'s argument; the items are ABI-encoded as
|
|
82
|
+
* `execute(...)` calls and batched, so they all succeed or revert together.
|
|
83
|
+
* `value` is the total native value forwarded to the multicall (sum of the
|
|
84
|
+
* individual workflows' values).
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* ```typescript
|
|
88
|
+
* await onchainPM.executeAccountingBatch([
|
|
89
|
+
* { commands, state, stateBitmap, callbacks: [], proof },
|
|
90
|
+
* { commands: c2, state: s2, stateBitmap: b2, callbacks: [], proof: p2 },
|
|
91
|
+
* ])
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
executeRawBatch(items, options = {}) {
|
|
95
|
+
const self = this;
|
|
96
|
+
return this._transact(async function* (ctx) {
|
|
97
|
+
const calls = items.map((p) => encodeFunctionData({
|
|
98
|
+
abi: ABI.OnchainPM,
|
|
99
|
+
functionName: 'execute',
|
|
100
|
+
args: [p.commands, p.state, p.stateBitmap, p.callbacks, p.proof],
|
|
101
|
+
}));
|
|
102
|
+
yield* wrapTransaction('Accounting update', ctx, {
|
|
103
|
+
contract: self.address,
|
|
104
|
+
data: encodeFunctionData({
|
|
105
|
+
abi: ABI.OnchainPM,
|
|
106
|
+
functionName: 'multicall',
|
|
107
|
+
args: [calls],
|
|
108
|
+
}),
|
|
109
|
+
value: options.value,
|
|
110
|
+
}, { simulate: options.simulate ?? false });
|
|
111
|
+
}, this.network.centrifugeId);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Build and run several whitelisted workflows in one atomic `multicall` — the accounting
|
|
115
|
+
* update. The SDK builds each `run` entry's script/proof from `policy` (the strategist's
|
|
116
|
+
* full whitelisted set on this chain, which defines the Merkle proof tree), derives the
|
|
117
|
+
* pool escrow, and sums the native value. Permission preflights are the caller's concern;
|
|
118
|
+
* a reverted workflow surfaces via `simulate`.
|
|
119
|
+
*/
|
|
120
|
+
executeAccountingBatch(input, options = {}) {
|
|
121
|
+
const self = this;
|
|
122
|
+
return this._transact(async function* (ctx) {
|
|
123
|
+
const poolEscrowAddress = await firstValueFrom(self.network.pool._escrow());
|
|
124
|
+
const built = await Promise.all(input.run.map((index) => buildWorkflowExecuteParams({
|
|
125
|
+
centrifuge: self._root,
|
|
126
|
+
network: self.network,
|
|
127
|
+
entry: input.policy[index],
|
|
128
|
+
policy: input.policy,
|
|
129
|
+
strategist: input.strategist,
|
|
130
|
+
scId: input.scId,
|
|
131
|
+
poolEscrowAddress,
|
|
132
|
+
runtimeValues: input.runtimeValues?.[index],
|
|
133
|
+
})));
|
|
134
|
+
const calls = built.map((p) => encodeFunctionData({
|
|
135
|
+
abi: ABI.OnchainPM,
|
|
136
|
+
functionName: 'execute',
|
|
137
|
+
args: [p.commands, p.state, p.stateBitmap, p.callbacks, p.proof],
|
|
138
|
+
}));
|
|
139
|
+
const value = built.reduce((sum, p) => sum + p.value, 0n);
|
|
140
|
+
yield* wrapTransaction('Accounting update', ctx, {
|
|
141
|
+
contract: self.address,
|
|
142
|
+
data: encodeFunctionData({ abi: ABI.OnchainPM, functionName: 'multicall', args: [calls] }),
|
|
143
|
+
value,
|
|
144
|
+
}, { simulate: options.simulate ?? false });
|
|
145
|
+
}, this.network.centrifugeId);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Build and run a single whitelisted workflow. `policy` is the strategist's full
|
|
149
|
+
* whitelisted set on this chain (needed for the proof tree); `run` indexes the entry to
|
|
150
|
+
* execute. `runtimeValues` are the strategist's per-execution inputs (encoded).
|
|
151
|
+
*/
|
|
152
|
+
executeWorkflow(input, options = {}) {
|
|
153
|
+
const self = this;
|
|
154
|
+
return this._transact(async function* (ctx) {
|
|
155
|
+
const poolEscrowAddress = await firstValueFrom(self.network.pool._escrow());
|
|
156
|
+
const p = await buildWorkflowExecuteParams({
|
|
157
|
+
centrifuge: self._root,
|
|
158
|
+
network: self.network,
|
|
159
|
+
entry: input.policy[input.run],
|
|
160
|
+
policy: input.policy,
|
|
161
|
+
strategist: input.strategist,
|
|
162
|
+
scId: input.scId,
|
|
163
|
+
poolEscrowAddress,
|
|
164
|
+
runtimeValues: input.runtimeValues,
|
|
165
|
+
});
|
|
166
|
+
yield* wrapTransaction('Execute workflow', ctx, {
|
|
167
|
+
contract: self.address,
|
|
168
|
+
data: encodeFunctionData({
|
|
169
|
+
abi: ABI.OnchainPM,
|
|
170
|
+
functionName: 'execute',
|
|
171
|
+
args: [p.commands, p.state, p.stateBitmap, p.callbacks, p.proof],
|
|
172
|
+
}),
|
|
173
|
+
value: p.value,
|
|
174
|
+
}, { simulate: options.simulate ?? false });
|
|
175
|
+
}, this.network.centrifugeId);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Submits a Hub.updateContract() transaction to update this OnchainPM's
|
|
179
|
+
* policy root for a strategist. Called whenever workflows are added to or
|
|
180
|
+
* removed from a group.
|
|
181
|
+
*
|
|
182
|
+
* Rebuilds the Merkle root from `scriptHashes` and routes the update:
|
|
183
|
+
* Hub → Spoke contractUpdater → OnchainPM.trustedCall()
|
|
184
|
+
*
|
|
185
|
+
* Pass `scriptHashes: []` to set root to bytes32(0), which disables the strategist.
|
|
186
|
+
*
|
|
187
|
+
* The transaction is signed on the hub chain (pool.centrifugeId).
|
|
188
|
+
*/
|
|
189
|
+
updatePolicy(params) {
|
|
190
|
+
const self = this;
|
|
191
|
+
return this._transact(async function* (ctx) {
|
|
192
|
+
const { hub } = await self._root._protocolAddresses(self.network.pool.centrifugeId);
|
|
193
|
+
let scriptHashes = params.scriptHashes;
|
|
194
|
+
if (scriptHashes === undefined) {
|
|
195
|
+
if (!params.policy)
|
|
196
|
+
throw new Error('updatePolicy requires either `policy` or `scriptHashes`');
|
|
197
|
+
const poolEscrowAddress = await firstValueFrom(self.network.pool._escrow());
|
|
198
|
+
scriptHashes = await computeWorkflowGroupScriptHashes({
|
|
199
|
+
centrifuge: self._root,
|
|
200
|
+
network: self.network,
|
|
201
|
+
policy: params.policy,
|
|
202
|
+
strategist: params.strategist,
|
|
203
|
+
scId: params.scId,
|
|
204
|
+
poolEscrowAddress,
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
const { calldata } = await buildPolicyUpdate({
|
|
208
|
+
hub,
|
|
209
|
+
poolId: self.network.pool.id.raw,
|
|
210
|
+
scId: params.scId,
|
|
211
|
+
centrifugeId: self.network.centrifugeId,
|
|
212
|
+
onchainPM: self.address,
|
|
213
|
+
strategist: params.strategist,
|
|
214
|
+
scriptHashes,
|
|
215
|
+
refund: params.refund,
|
|
216
|
+
});
|
|
217
|
+
yield* wrapTransaction('Update workflow policy', ctx, {
|
|
218
|
+
contract: hub,
|
|
219
|
+
data: calldata,
|
|
220
|
+
messages: { [self.network.centrifugeId]: [{ type: MessageType.TrustedContractUpdate, poolId: self.network.pool.id }] },
|
|
221
|
+
});
|
|
222
|
+
}, this.network.pool.centrifugeId);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Builds an unsigned `Hub.updateContract()` call to update an OnchainPM
|
|
227
|
+
* strategist's policy root.
|
|
228
|
+
*
|
|
229
|
+
* The Merkle root is computed over `scriptHashes` using `SimpleMerkleTree`
|
|
230
|
+
* (order-invariant, compatible with `MerkleProofLib` on-chain). Routing:
|
|
231
|
+
*
|
|
232
|
+
* ```
|
|
233
|
+
* Hub.updateContract()
|
|
234
|
+
* → Spoke contractUpdater.trustedCall()
|
|
235
|
+
* → OnchainPM.trustedCall()
|
|
236
|
+
* → policy[strategist] = newRoot
|
|
237
|
+
* ```
|
|
238
|
+
*
|
|
239
|
+
* **Usage** (BE calls this whenever workflows are added to / removed from a group):
|
|
240
|
+
*
|
|
241
|
+
* ```typescript
|
|
242
|
+
* const { root, calldata } = await buildPolicyUpdate({
|
|
243
|
+
* hub, poolId, scId, centrifugeId, onchainPM, strategist,
|
|
244
|
+
* scriptHashes: workflows.map(w => computeScriptHash(w.commands, w.state, w.stateBitmap, [])),
|
|
245
|
+
* })
|
|
246
|
+
* // Return calldata + hub to FE → Hub manager (Safe) signs and executes
|
|
247
|
+
* ```
|
|
248
|
+
*/
|
|
249
|
+
export async function buildPolicyUpdate(req) {
|
|
250
|
+
const { poolId, scId, centrifugeId, onchainPM, strategist, scriptHashes, refund } = req;
|
|
251
|
+
// Normalise case before building the Merkle tree so the root is deterministic
|
|
252
|
+
// regardless of whether callers pass checksummed or lowercase hashes.
|
|
253
|
+
const normalizedHashes = scriptHashes.map((h) => h.toLowerCase());
|
|
254
|
+
// 1. Build Merkle root over script hashes.
|
|
255
|
+
// Empty set → bytes32(0) which disables the strategist entirely.
|
|
256
|
+
let root;
|
|
257
|
+
if (normalizedHashes.length === 0) {
|
|
258
|
+
root = toHex(0, { size: 32 });
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
const { SimpleMerkleTree } = await loadMerkleTree();
|
|
262
|
+
root = SimpleMerkleTree.of(normalizedHashes).root;
|
|
263
|
+
}
|
|
264
|
+
// 2. Payload: strategist address (right-padded, Centrifuge cross-chain encoding) + new root.
|
|
265
|
+
const payload = encode([strategist, root]);
|
|
266
|
+
// 3. Encode Hub.updateContract() call.
|
|
267
|
+
// - target: OnchainPM address (right-padded to bytes32)
|
|
268
|
+
// - extraGasLimit: 0 (covered by Hub's default gas estimate)
|
|
269
|
+
// - refund: receives unused cross-chain gas; defaults to strategist
|
|
270
|
+
const calldata = encodeFunctionData({
|
|
271
|
+
abi: ABI.Hub,
|
|
272
|
+
functionName: 'updateContract',
|
|
273
|
+
args: [poolId, scId, centrifugeId, addressToBytes32(onchainPM), payload, 0n, refund ?? strategist],
|
|
274
|
+
});
|
|
275
|
+
return { root, calldata };
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Generates the Merkle inclusion proof required by `OnchainPM.execute()`.
|
|
279
|
+
*
|
|
280
|
+
* Rebuilds the same `SimpleMerkleTree` that `buildPolicyUpdate()` committed
|
|
281
|
+
* on-chain and returns `tree.getProof(index)` for the given `scriptHash`.
|
|
282
|
+
* Pass the result as the `proof` argument:
|
|
283
|
+
*
|
|
284
|
+
* ```typescript
|
|
285
|
+
* const proof = await generateExecuteProof(scriptHash, allGroupScriptHashes)
|
|
286
|
+
* // submit: OnchainPM.execute(commands, filledState, stateBitmap, [], proof)
|
|
287
|
+
* ```
|
|
288
|
+
*
|
|
289
|
+
* For a group with a single workflow the proof is `[]` — the Merkle root is
|
|
290
|
+
* the script hash itself, so no siblings are needed.
|
|
291
|
+
*
|
|
292
|
+
* @throws if `allScriptHashes` is empty (strategist has no whitelisted workflows)
|
|
293
|
+
* @throws if `scriptHash` is not present in `allScriptHashes`
|
|
294
|
+
*/
|
|
295
|
+
export async function generateExecuteProof(scriptHash, allScriptHashes) {
|
|
296
|
+
if (allScriptHashes.length === 0) {
|
|
297
|
+
throw new Error('generateExecuteProof: allScriptHashes is empty — strategist has no whitelisted workflows');
|
|
298
|
+
}
|
|
299
|
+
// Normalise case so proof generation is consistent with buildPolicyUpdate(),
|
|
300
|
+
// which also lowercases before building the tree.
|
|
301
|
+
const normalizedHash = scriptHash.toLowerCase();
|
|
302
|
+
const normalizedAll = allScriptHashes.map((h) => h.toLowerCase());
|
|
303
|
+
const index = normalizedAll.indexOf(normalizedHash);
|
|
304
|
+
if (index === -1) {
|
|
305
|
+
throw new Error(`generateExecuteProof: scriptHash ${scriptHash} not found in allScriptHashes`);
|
|
306
|
+
}
|
|
307
|
+
const { SimpleMerkleTree } = await loadMerkleTree();
|
|
308
|
+
return SimpleMerkleTree.of(normalizedAll).getProof(index);
|
|
309
|
+
}
|
|
310
|
+
// Dynamic import for CJS/ESM compatibility (same pattern as MerkleProofManager).
|
|
311
|
+
async function loadMerkleTree() {
|
|
312
|
+
const mod = await import('@openzeppelin/merkle-tree');
|
|
313
|
+
return (mod.default ?? mod);
|
|
314
|
+
}
|
|
315
|
+
//# sourceMappingURL=OnchainPM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OnchainPM.js","sourceRoot":"","sources":["../../src/entities/OnchainPM.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OnchainPM.test.d.ts","sourceRoot":"","sources":["../../src/entities/OnchainPM.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { expect } from 'chai';
|
|
2
|
+
import { decodeFunctionData } from 'viem';
|
|
3
|
+
import { ABI } from '../abi/index.js';
|
|
4
|
+
import { buildPolicyUpdate, generateExecuteProof } from './OnchainPM.js';
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// Fixtures
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
const HUB = '0x1111111111111111111111111111111111111111';
|
|
9
|
+
const ONCHAIN_PM = '0x2222222222222222222222222222222222222222';
|
|
10
|
+
const STRATEGIST = '0x3333333333333333333333333333333333333333';
|
|
11
|
+
const REFUND = '0x4444444444444444444444444444444444444444';
|
|
12
|
+
const POOL_ID = 1n;
|
|
13
|
+
const SC_ID = '0x00010000000000010000000000000001';
|
|
14
|
+
const CENTRIFUGE_ID = 1;
|
|
15
|
+
const HASH_A = '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
|
|
16
|
+
const HASH_B = '0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb';
|
|
17
|
+
const HASH_C = '0xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc';
|
|
18
|
+
const BASE = {
|
|
19
|
+
hub: HUB,
|
|
20
|
+
poolId: POOL_ID,
|
|
21
|
+
scId: SC_ID,
|
|
22
|
+
centrifugeId: CENTRIFUGE_ID,
|
|
23
|
+
onchainPM: ONCHAIN_PM,
|
|
24
|
+
strategist: STRATEGIST,
|
|
25
|
+
scriptHashes: [HASH_A],
|
|
26
|
+
};
|
|
27
|
+
describe('entities/OnchainPM', () => {
|
|
28
|
+
describe('buildPolicyUpdate', () => {
|
|
29
|
+
it('returns bytes32(0) root and calldata when scriptHashes is empty', async () => {
|
|
30
|
+
const { root, calldata } = await buildPolicyUpdate({ ...BASE, scriptHashes: [] });
|
|
31
|
+
expect(root).to.equal(`0x${'0'.repeat(64)}`);
|
|
32
|
+
expect(calldata).to.match(/^0x[0-9a-f]+$/);
|
|
33
|
+
});
|
|
34
|
+
it('returns a non-zero 32-byte root for a single script hash', async () => {
|
|
35
|
+
const { root } = await buildPolicyUpdate(BASE);
|
|
36
|
+
expect(root).to.match(/^0x[0-9a-f]{64}$/);
|
|
37
|
+
expect(root).to.not.equal(`0x${'0'.repeat(64)}`);
|
|
38
|
+
});
|
|
39
|
+
it('is deterministic — same hashes produce same root', async () => {
|
|
40
|
+
const r1 = await buildPolicyUpdate(BASE);
|
|
41
|
+
const r2 = await buildPolicyUpdate(BASE);
|
|
42
|
+
expect(r1.root).to.equal(r2.root);
|
|
43
|
+
expect(r1.calldata).to.equal(r2.calldata);
|
|
44
|
+
});
|
|
45
|
+
it('root changes when script hashes change', async () => {
|
|
46
|
+
const { root: r1 } = await buildPolicyUpdate({ ...BASE, scriptHashes: [HASH_A] });
|
|
47
|
+
const { root: r2 } = await buildPolicyUpdate({ ...BASE, scriptHashes: [HASH_B] });
|
|
48
|
+
expect(r1).to.not.equal(r2);
|
|
49
|
+
});
|
|
50
|
+
it('root is order-invariant (same leaves → same root regardless of input order)', async () => {
|
|
51
|
+
const { root: r1 } = await buildPolicyUpdate({ ...BASE, scriptHashes: [HASH_A, HASH_B] });
|
|
52
|
+
const { root: r2 } = await buildPolicyUpdate({ ...BASE, scriptHashes: [HASH_B, HASH_A] });
|
|
53
|
+
expect(r1).to.equal(r2);
|
|
54
|
+
});
|
|
55
|
+
it('root changes when a hash is added', async () => {
|
|
56
|
+
const { root: r1 } = await buildPolicyUpdate({ ...BASE, scriptHashes: [HASH_A] });
|
|
57
|
+
const { root: r2 } = await buildPolicyUpdate({ ...BASE, scriptHashes: [HASH_A, HASH_B] });
|
|
58
|
+
expect(r1).to.not.equal(r2);
|
|
59
|
+
});
|
|
60
|
+
it('root changes when a hash is removed', async () => {
|
|
61
|
+
const { root: r1 } = await buildPolicyUpdate({ ...BASE, scriptHashes: [HASH_A, HASH_B] });
|
|
62
|
+
const { root: r2 } = await buildPolicyUpdate({ ...BASE, scriptHashes: [HASH_A] });
|
|
63
|
+
expect(r1).to.not.equal(r2);
|
|
64
|
+
});
|
|
65
|
+
it('encodes a valid Hub.updateContract() calldata', async () => {
|
|
66
|
+
const { calldata } = await buildPolicyUpdate(BASE);
|
|
67
|
+
const decoded = decodeFunctionData({ abi: ABI.Hub, data: calldata });
|
|
68
|
+
expect(decoded.functionName).to.equal('updateContract');
|
|
69
|
+
});
|
|
70
|
+
it('calldata encodes poolId, scId, and centrifugeId correctly', async () => {
|
|
71
|
+
const { calldata } = await buildPolicyUpdate(BASE);
|
|
72
|
+
const decoded = decodeFunctionData({ abi: ABI.Hub, data: calldata });
|
|
73
|
+
const args = decoded.args;
|
|
74
|
+
expect(args[0]).to.equal(POOL_ID);
|
|
75
|
+
expect(String(args[1]).toLowerCase()).to.equal(SC_ID.toLowerCase());
|
|
76
|
+
expect(args[2]).to.equal(CENTRIFUGE_ID);
|
|
77
|
+
});
|
|
78
|
+
it('calldata extraGasLimit is 0n', async () => {
|
|
79
|
+
const { calldata } = await buildPolicyUpdate(BASE);
|
|
80
|
+
const decoded = decodeFunctionData({ abi: ABI.Hub, data: calldata });
|
|
81
|
+
const args = decoded.args;
|
|
82
|
+
expect(args[5]).to.equal(0n);
|
|
83
|
+
});
|
|
84
|
+
it('uses strategist as refund when refund is not provided', async () => {
|
|
85
|
+
const { calldata } = await buildPolicyUpdate(BASE);
|
|
86
|
+
const decoded = decodeFunctionData({ abi: ABI.Hub, data: calldata });
|
|
87
|
+
const args = decoded.args;
|
|
88
|
+
expect(String(args[6]).toLowerCase()).to.equal(STRATEGIST.toLowerCase());
|
|
89
|
+
});
|
|
90
|
+
it('uses the explicit refund address when provided', async () => {
|
|
91
|
+
const { calldata } = await buildPolicyUpdate({ ...BASE, refund: REFUND });
|
|
92
|
+
const decoded = decodeFunctionData({ abi: ABI.Hub, data: calldata });
|
|
93
|
+
const args = decoded.args;
|
|
94
|
+
expect(String(args[6]).toLowerCase()).to.equal(REFUND.toLowerCase());
|
|
95
|
+
});
|
|
96
|
+
it('produces a 32-byte hex string root', async () => {
|
|
97
|
+
const { root } = await buildPolicyUpdate({ ...BASE, scriptHashes: [HASH_A, HASH_B, HASH_C] });
|
|
98
|
+
expect(root).to.match(/^0x[0-9a-f]{64}$/);
|
|
99
|
+
});
|
|
100
|
+
it('calldata is a hex string', async () => {
|
|
101
|
+
const { calldata } = await buildPolicyUpdate(BASE);
|
|
102
|
+
expect(calldata).to.match(/^0x[0-9a-f]+$/);
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
describe('generateExecuteProof', () => {
|
|
106
|
+
it('returns an empty proof for a single-workflow group (root IS the hash)', async () => {
|
|
107
|
+
const proof = await generateExecuteProof(HASH_A, [HASH_A]);
|
|
108
|
+
expect(proof).to.deep.equal([]);
|
|
109
|
+
});
|
|
110
|
+
it('returns a non-empty proof for a two-workflow group', async () => {
|
|
111
|
+
const proof = await generateExecuteProof(HASH_A, [HASH_A, HASH_B]);
|
|
112
|
+
expect(proof).to.be.an('array').with.lengthOf.greaterThan(0);
|
|
113
|
+
for (const sibling of proof) {
|
|
114
|
+
expect(sibling).to.match(/^0x[0-9a-f]{64}$/);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
it('returns different proofs for different leaves in the same tree', async () => {
|
|
118
|
+
const allHashes = [HASH_A, HASH_B, HASH_C];
|
|
119
|
+
const proofA = await generateExecuteProof(HASH_A, allHashes);
|
|
120
|
+
const proofB = await generateExecuteProof(HASH_B, allHashes);
|
|
121
|
+
expect(proofA).to.not.deep.equal(proofB);
|
|
122
|
+
});
|
|
123
|
+
it('proof is consistent with the root produced by buildPolicyUpdate', async () => {
|
|
124
|
+
const allHashes = [HASH_A, HASH_B, HASH_C];
|
|
125
|
+
const { root } = await buildPolicyUpdate({ ...BASE, scriptHashes: allHashes });
|
|
126
|
+
const proof = await generateExecuteProof(HASH_B, allHashes);
|
|
127
|
+
expect(root).to.match(/^0x[0-9a-f]{64}$/);
|
|
128
|
+
expect(proof).to.be.an('array');
|
|
129
|
+
});
|
|
130
|
+
it('is deterministic — same inputs produce same proof', async () => {
|
|
131
|
+
const p1 = await generateExecuteProof(HASH_A, [HASH_A, HASH_B]);
|
|
132
|
+
const p2 = await generateExecuteProof(HASH_A, [HASH_A, HASH_B]);
|
|
133
|
+
expect(p1).to.deep.equal(p2);
|
|
134
|
+
});
|
|
135
|
+
it('throws when allScriptHashes is empty', async () => {
|
|
136
|
+
try {
|
|
137
|
+
await generateExecuteProof(HASH_A, []);
|
|
138
|
+
expect.fail('expected an error');
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
expect(err.message).to.include('allScriptHashes is empty');
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
it('throws when scriptHash is not in allScriptHashes', async () => {
|
|
145
|
+
try {
|
|
146
|
+
await generateExecuteProof(HASH_C, [HASH_A, HASH_B]);
|
|
147
|
+
expect.fail('expected an error');
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
expect(err.message).to.include('not found in allScriptHashes');
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
//# sourceMappingURL=OnchainPM.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OnchainPM.test.js","sourceRoot":"","sources":["../../src/entities/OnchainPM.test.ts"],"names":[],"mappings":"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"}
|
package/dist/entities/Pool.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ import { Entity } from './Entity.js';
|
|
|
6
6
|
import { PoolNetwork } from './PoolNetwork.js';
|
|
7
7
|
import { PoolReports } from './Reports/PoolReports.js';
|
|
8
8
|
import { ShareClass } from './ShareClass.js';
|
|
9
|
+
import { type CrosschainMessagesFilter } from './crosschainMessages.js';
|
|
9
10
|
export declare class Pool extends Entity {
|
|
10
11
|
id: PoolId;
|
|
11
12
|
get centrifugeId(): CentrifugeId;
|
|
@@ -136,6 +137,61 @@ export declare class Pool extends Entity {
|
|
|
136
137
|
* Get the networks where a pool is active. It doesn't mean that any vaults are deployed there necessarily.
|
|
137
138
|
*/
|
|
138
139
|
activeNetworks(): import("../index.js").Query<PoolNetwork[]>;
|
|
140
|
+
/** List the workflows whitelisted for a strategist, across chains. */
|
|
141
|
+
listWorkflows(opts: {
|
|
142
|
+
strategist: HexString;
|
|
143
|
+
}): Promise<{
|
|
144
|
+
workflowRef: string;
|
|
145
|
+
name: string;
|
|
146
|
+
group?: string;
|
|
147
|
+
chainId: number;
|
|
148
|
+
centrifugeId: number;
|
|
149
|
+
runtimeVariables: string[];
|
|
150
|
+
}[]>;
|
|
151
|
+
/**
|
|
152
|
+
* Run one whitelisted workflow by `workflowRef`. Resolves the chain + OnchainPM and the
|
|
153
|
+
* proof tree from the strategist's policy, then submits via the OnchainPM. Awaiting the
|
|
154
|
+
* returned promise executes the transaction (or simulates it when `simulate` is set).
|
|
155
|
+
*/
|
|
156
|
+
executeWorkflow(input: {
|
|
157
|
+
strategist: HexString;
|
|
158
|
+
workflowRef: string;
|
|
159
|
+
runtimeValues?: Record<string, HexString>;
|
|
160
|
+
scId?: HexString;
|
|
161
|
+
}, options?: {
|
|
162
|
+
simulate?: boolean;
|
|
163
|
+
}): Promise<import("../types/transaction.js").OperationStatus>;
|
|
164
|
+
/**
|
|
165
|
+
* Plan an accounting update: every `account`-group workflow whitelisted for the strategist,
|
|
166
|
+
* grouped per chain. Returns one handle per chain whose `execute()`/`simulate()` build and
|
|
167
|
+
* submit that chain's atomic multicall. Multi-chain pools yield multiple handles.
|
|
168
|
+
*/
|
|
169
|
+
planAccountingUpdate(opts: {
|
|
170
|
+
strategist: HexString;
|
|
171
|
+
}): Promise<{
|
|
172
|
+
centrifugeId: number;
|
|
173
|
+
workflowRefs: string[];
|
|
174
|
+
execute: () => unknown;
|
|
175
|
+
simulate: () => unknown;
|
|
176
|
+
}[]>;
|
|
177
|
+
/**
|
|
178
|
+
* Whitelist a workflow for a strategist. Reads the current policy from the pool metadata,
|
|
179
|
+
* appends (or replaces) the entry, and updates both the metadata and the OnchainPM Merkle
|
|
180
|
+
* root for the workflow's chain in one transaction. Awaiting the result submits it.
|
|
181
|
+
*/
|
|
182
|
+
addToPolicy(input: {
|
|
183
|
+
strategist: HexString;
|
|
184
|
+
workflowRef: string;
|
|
185
|
+
configurableValues?: Record<string, HexString>;
|
|
186
|
+
excludedActions?: number[];
|
|
187
|
+
scId?: HexString;
|
|
188
|
+
}): Promise<import("../types/transaction.js").OperationStatus>;
|
|
189
|
+
/** Remove a whitelisted workflow from a strategist's policy (metadata + on-chain root). */
|
|
190
|
+
removeFromPolicy(input: {
|
|
191
|
+
strategist: HexString;
|
|
192
|
+
workflowRef: string;
|
|
193
|
+
scId?: HexString;
|
|
194
|
+
}): Promise<import("../types/transaction.js").OperationStatus>;
|
|
139
195
|
/**
|
|
140
196
|
* Get a specific vault for a given network, share class, and asset.
|
|
141
197
|
* @param centrifugeId - The centrifuge ID of the network
|
|
@@ -178,6 +234,10 @@ export declare class Pool extends Entity {
|
|
|
178
234
|
address: HexString;
|
|
179
235
|
canManage: boolean;
|
|
180
236
|
}[]): import("../types/transaction.js").Transaction;
|
|
237
|
+
/**
|
|
238
|
+
* Update an OracleValuation feeder on the hub chain for this pool.
|
|
239
|
+
*/
|
|
240
|
+
updateOracleValuationFeeder(oracleValuation: HexString, centrifugeId: CentrifugeId, feeder: HexString, canFeed: boolean): import("../types/transaction.js").Transaction;
|
|
181
241
|
/**
|
|
182
242
|
* Set adapters for multiple networks at once.
|
|
183
243
|
*/
|
|
@@ -189,10 +249,28 @@ export declare class Pool extends Entity {
|
|
|
189
249
|
recoveryIndex?: number;
|
|
190
250
|
}[]): import("../types/transaction.js").Transaction;
|
|
191
251
|
/**
|
|
192
|
-
* Get the configured
|
|
193
|
-
*
|
|
252
|
+
* Get the configured adapter set and signature threshold for this pool on a
|
|
253
|
+
* specific network. Reads the MultiAdapter on the pool's hub chain.
|
|
254
|
+
*
|
|
255
|
+
* Use `centrifuge.globalAdapters(hub, target)` for the default (pool 0) set.
|
|
256
|
+
*
|
|
257
|
+
* @param centrifugeId - The centrifuge ID of the destination network
|
|
258
|
+
*/
|
|
259
|
+
adapters(centrifugeId: CentrifugeId): import("../index.js").Query<{
|
|
260
|
+
adapters: `0x${string}`[];
|
|
261
|
+
threshold: number;
|
|
262
|
+
}>;
|
|
263
|
+
/**
|
|
264
|
+
* Query cross-chain messages (indexer-side: `CrosschainPayload`) for this
|
|
265
|
+
* pool. Without a filter, returns the most recent batch across all routes
|
|
266
|
+
* and statuses; `filter.status` is the common case (e.g. `'InTransit'` for
|
|
267
|
+
* pending in-flight messages).
|
|
268
|
+
*
|
|
269
|
+
* Use `filter.include` to opt into nested data (pool, token, blockchains,
|
|
270
|
+
* inner messages, adapter participations). For paginating very long lists,
|
|
271
|
+
* pass `before`/`after` cursors from a previous page's `pageInfo`.
|
|
194
272
|
*/
|
|
195
|
-
|
|
273
|
+
crosschainMessages(filter?: Omit<CrosschainMessagesFilter, 'poolId'>): import("../index.js").Query<import("./crosschainMessages.js").CrosschainMessagesPage>;
|
|
196
274
|
createAccounts(accounts: {
|
|
197
275
|
accountId: bigint;
|
|
198
276
|
isDebitNormal: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Pool.d.ts","sourceRoot":"","sources":["../../src/entities/Pool.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAC1E,OAAO,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"Pool.d.ts","sourceRoot":"","sources":["../../src/entities/Pool.ts"],"names":[],"mappings":"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"}
|