@centrifuge/sdk 1.9.1 → 1.12.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/Centrifuge.d.ts +1388 -5229
- 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/config/chains.d.ts +38 -9
- package/dist/config/chains.d.ts.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 +68 -74
- package/dist/entities/ShareClass.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 +3 -3
|
@@ -0,0 +1,577 @@
|
|
|
1
|
+
import { firstValueFrom } from 'rxjs';
|
|
2
|
+
import { encodeAbiParameters, parseAbi } from 'viem';
|
|
3
|
+
import { generateExecuteProof } from '../entities/OnchainPM.js';
|
|
4
|
+
import { ABI } from '../abi/index.js';
|
|
5
|
+
import { MessageType } from '../types/transaction.js';
|
|
6
|
+
import { AssetId, ShareClassId } from './types.js';
|
|
7
|
+
import { buildScript, fillRuntimeSlots, } from './weiroll.js';
|
|
8
|
+
import { computeScriptHash } from './scriptHash.js';
|
|
9
|
+
import { buildWorkflowDefinitionFromCatalog } from './catalog.js';
|
|
10
|
+
const INTEGER_TYPE_RE = /^u?int\d*$/;
|
|
11
|
+
const FIXED_BYTES_TYPE_RE = /^bytes([1-9]|[12]\d|3[0-2])$/;
|
|
12
|
+
const ADDRESS_RE = /^0x[0-9a-fA-F]{40}$/;
|
|
13
|
+
const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
|
|
14
|
+
const ADDRESS_UINT256_ARRAY_TYPE = '(address,uint256)[]';
|
|
15
|
+
const ADDRESS_ADDRESS_ARRAY_TYPE = '(address,address)[]';
|
|
16
|
+
const ACCOUNTING_TOKEN_LIABILITY_BIT = 1n << 255n;
|
|
17
|
+
const LIABILITY_ACCOUNTING_TOKEN_TEMPLATES = new Set([
|
|
18
|
+
'erc7540_requestDeposit',
|
|
19
|
+
'erc7540_claimDeposit',
|
|
20
|
+
'erc7540_requestRedeem',
|
|
21
|
+
'erc7540_claimRedeem',
|
|
22
|
+
]);
|
|
23
|
+
const REQUEST_MESSAGE_FUNCTION_NAMES = new Set([
|
|
24
|
+
'requestDeposit',
|
|
25
|
+
'requestRedeem',
|
|
26
|
+
'cancelDepositRequest',
|
|
27
|
+
'cancelRedeemRequest',
|
|
28
|
+
'enableLockDepositRequest',
|
|
29
|
+
'executeLockedDepositRequest',
|
|
30
|
+
'lockDepositRequest',
|
|
31
|
+
'unlockDepositRequest',
|
|
32
|
+
]);
|
|
33
|
+
const REQUEST_CALLBACK_MESSAGE_FUNCTION_NAMES = new Set([
|
|
34
|
+
'approveDeposits',
|
|
35
|
+
'approveRedeems',
|
|
36
|
+
'claimDeposit',
|
|
37
|
+
'claimRedeem',
|
|
38
|
+
'forceCancelDepositRequest',
|
|
39
|
+
'forceCancelRedeemRequest',
|
|
40
|
+
'issueShares',
|
|
41
|
+
'notifyDeposit',
|
|
42
|
+
'notifyRedeem',
|
|
43
|
+
'revokeShares',
|
|
44
|
+
]);
|
|
45
|
+
function getWorkflowAbiParameter(parameter) {
|
|
46
|
+
if (parameter === ADDRESS_UINT256_ARRAY_TYPE) {
|
|
47
|
+
return {
|
|
48
|
+
type: 'tuple[]',
|
|
49
|
+
components: [{ type: 'address' }, { type: 'uint256' }],
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
if (parameter === ADDRESS_ADDRESS_ARRAY_TYPE) {
|
|
53
|
+
return {
|
|
54
|
+
type: 'tuple[]',
|
|
55
|
+
components: [{ type: 'address' }, { type: 'address' }],
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
return { type: parameter };
|
|
59
|
+
}
|
|
60
|
+
const UPDATE_CONTRACT_SELECTOR = 'function updateContract(uint64,bytes16,bytes32,bytes,uint128,address)';
|
|
61
|
+
const ASYNC_REQUEST_DEPOSIT_SELECTOR = 'function requestDeposit(uint256,address,address)';
|
|
62
|
+
const SLIPPAGE_GUARD_ABI = parseAbi(['function onchainPMFactory() view returns (address)']);
|
|
63
|
+
const ACCOUNTING_TOKEN_MINTER_ABI = parseAbi(['function minters(uint64,address) view returns (bool)']);
|
|
64
|
+
function getSelectorFunctionName(selector) {
|
|
65
|
+
const match = selector.match(/^function\s+([^(]+)\(/);
|
|
66
|
+
if (!match?.[1]) {
|
|
67
|
+
throw new Error(`Unsupported function selector format: "${selector}"`);
|
|
68
|
+
}
|
|
69
|
+
return match[1];
|
|
70
|
+
}
|
|
71
|
+
function pad32left(hex) {
|
|
72
|
+
return `0x${hex.replace(/^0x/, '').toLowerCase().padStart(64, '0')}`;
|
|
73
|
+
}
|
|
74
|
+
function pad32right(hex) {
|
|
75
|
+
return `0x${hex.replace(/^0x/, '').toLowerCase().padEnd(64, '0')}`;
|
|
76
|
+
}
|
|
77
|
+
function encodeUint(value) {
|
|
78
|
+
return `0x${value.toString(16).padStart(64, '0')}`;
|
|
79
|
+
}
|
|
80
|
+
async function resolveWorkflowExecutorAddress(centrifuge, network) {
|
|
81
|
+
const deployedOnchainPM = await firstValueFrom(network.onchainPM());
|
|
82
|
+
if (deployedOnchainPM) {
|
|
83
|
+
return deployedOnchainPM.address;
|
|
84
|
+
}
|
|
85
|
+
const { onchainPMFactory } = await firstValueFrom(centrifuge._protocolAddresses(network.centrifugeId));
|
|
86
|
+
const client = await firstValueFrom(centrifuge.getClient(network.centrifugeId));
|
|
87
|
+
const predictedOnchainPM = await client.readContract({
|
|
88
|
+
address: onchainPMFactory,
|
|
89
|
+
abi: ABI.OnchainPMFactory,
|
|
90
|
+
functionName: 'getAddress',
|
|
91
|
+
args: [network.pool.id.raw],
|
|
92
|
+
});
|
|
93
|
+
if (!predictedOnchainPM || predictedOnchainPM.toLowerCase() === ZERO_ADDRESS) {
|
|
94
|
+
throw new Error(`Failed to resolve OnchainPM address for pool ${network.pool.id.toString()} on centrifugeId ${network.centrifugeId}`);
|
|
95
|
+
}
|
|
96
|
+
return predictedOnchainPM;
|
|
97
|
+
}
|
|
98
|
+
function resolveCatalogAddressValue(workflow, value) {
|
|
99
|
+
if (!value)
|
|
100
|
+
return undefined;
|
|
101
|
+
const resolved = value.startsWith('$') ? workflow.variables[value.slice(1)] : value;
|
|
102
|
+
return resolved && ADDRESS_RE.test(resolved) ? resolved : undefined;
|
|
103
|
+
}
|
|
104
|
+
function resolveWorkflowAssetAddress(workflow) {
|
|
105
|
+
const assetAddress = workflow.variables.asset;
|
|
106
|
+
if (!assetAddress || !ADDRESS_RE.test(assetAddress)) {
|
|
107
|
+
throw new Error(`Workflow "${workflow.workflowRef}" is missing a valid "asset" variable`);
|
|
108
|
+
}
|
|
109
|
+
return assetAddress;
|
|
110
|
+
}
|
|
111
|
+
function usesLiabilityAccountingToken(workflow) {
|
|
112
|
+
if (LIABILITY_ACCOUNTING_TOKEN_TEMPLATES.has(workflow.template)) {
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
throw new Error(`Workflow "${workflow.workflowRef}" uses accounting tokens, but template "${workflow.template}" has no accounting-token mapping`);
|
|
116
|
+
}
|
|
117
|
+
function toAccountingTokenId(poolIdRaw, assetAddress, liability) {
|
|
118
|
+
const baseId = (poolIdRaw << 160n) | BigInt(assetAddress);
|
|
119
|
+
return liability ? baseId | ACCOUNTING_TOKEN_LIABILITY_BIT : baseId;
|
|
120
|
+
}
|
|
121
|
+
function resolveWorkflowAccountingTokenId(network, workflow) {
|
|
122
|
+
// Prefer the workflow's own `toTokenId(poolId, asset, isLiability)` action, which
|
|
123
|
+
// declares the exact asset + liability flag the on-chain execution uses (e.g. the
|
|
124
|
+
// redeem templates hardcode `isLiability=false`). Fall back to the template guess.
|
|
125
|
+
const toTokenIdAction = workflow.actions.find((action) => action.selector.startsWith('function toTokenId('));
|
|
126
|
+
if (toTokenIdAction) {
|
|
127
|
+
const assetAddress = resolveCatalogAddressValue(workflow, toTokenIdAction.inputs[1]?.input?.[0]) ??
|
|
128
|
+
resolveWorkflowAssetAddress(workflow);
|
|
129
|
+
const liability = toTokenIdAction.inputs[2]?.input?.[0] === 'true';
|
|
130
|
+
return toAccountingTokenId(network.pool.id.raw, assetAddress, liability);
|
|
131
|
+
}
|
|
132
|
+
return toAccountingTokenId(network.pool.id.raw, resolveWorkflowAssetAddress(workflow), usesLiabilityAccountingToken(workflow));
|
|
133
|
+
}
|
|
134
|
+
function parseTupleArrayLines(rawValue) {
|
|
135
|
+
return rawValue
|
|
136
|
+
.split(/\r?\n/)
|
|
137
|
+
.map((line) => line.trim())
|
|
138
|
+
.filter(Boolean);
|
|
139
|
+
}
|
|
140
|
+
function parseAddressUint256Array(rawValue) {
|
|
141
|
+
const lines = parseTupleArrayLines(rawValue);
|
|
142
|
+
if (lines.length === 0)
|
|
143
|
+
return [];
|
|
144
|
+
return lines.map((line, index) => {
|
|
145
|
+
const [addressRaw, valueRaw, ...rest] = line.split(',').map((part) => part.trim());
|
|
146
|
+
if (!addressRaw || !valueRaw || rest.length > 0) {
|
|
147
|
+
throw new Error(`Expected "address, uint256" on line ${index + 1}, got "${line}"`);
|
|
148
|
+
}
|
|
149
|
+
if (!ADDRESS_RE.test(addressRaw)) {
|
|
150
|
+
throw new Error(`Expected address on line ${index + 1}, got "${addressRaw}"`);
|
|
151
|
+
}
|
|
152
|
+
return [addressRaw, BigInt(valueRaw)];
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
function parseAddressAddressArray(rawValue) {
|
|
156
|
+
const lines = parseTupleArrayLines(rawValue);
|
|
157
|
+
if (lines.length === 0)
|
|
158
|
+
return [];
|
|
159
|
+
return lines.map((line, index) => {
|
|
160
|
+
const [leftRaw, rightRaw, ...rest] = line.split(',').map((part) => part.trim());
|
|
161
|
+
if (!leftRaw || !rightRaw || rest.length > 0) {
|
|
162
|
+
throw new Error(`Expected "address, address" on line ${index + 1}, got "${line}"`);
|
|
163
|
+
}
|
|
164
|
+
if (!ADDRESS_RE.test(leftRaw)) {
|
|
165
|
+
throw new Error(`Expected first address on line ${index + 1}, got "${leftRaw}"`);
|
|
166
|
+
}
|
|
167
|
+
if (!ADDRESS_RE.test(rightRaw)) {
|
|
168
|
+
throw new Error(`Expected second address on line ${index + 1}, got "${rightRaw}"`);
|
|
169
|
+
}
|
|
170
|
+
return [leftRaw, rightRaw];
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
function normalizeExcludedActions(workflow, excludedActions = []) {
|
|
174
|
+
const normalized = [...excludedActions].sort((a, b) => a - b);
|
|
175
|
+
for (let index = 0; index < normalized.length; index += 1) {
|
|
176
|
+
const actionIndex = normalized[index];
|
|
177
|
+
if (!Number.isInteger(actionIndex) || actionIndex < 0 || actionIndex >= workflow.actions.length) {
|
|
178
|
+
throw new Error(`Workflow "${workflow.workflowRef}" excludes invalid action index ${actionIndex}`);
|
|
179
|
+
}
|
|
180
|
+
if (!workflow.actions[actionIndex]?.optional) {
|
|
181
|
+
throw new Error(`Workflow "${workflow.workflowRef}" action ${actionIndex} is not optional`);
|
|
182
|
+
}
|
|
183
|
+
if (index > 0 && normalized[index - 1] === actionIndex) {
|
|
184
|
+
throw new Error(`Workflow "${workflow.workflowRef}" excludes action ${actionIndex} more than once`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return normalized;
|
|
188
|
+
}
|
|
189
|
+
function hasConfigurableInputs(workflow) {
|
|
190
|
+
// The explicit-input-kinds format (centrifuge/workflows#86) dropped the per-input
|
|
191
|
+
// `configurable` flag — configurable inputs are now variables of `kind: 'configurable'`,
|
|
192
|
+
// surfaced as `configurable` state slots in the built definition. Treat a build failure
|
|
193
|
+
// as "has configurable" so the legacy workflowId fallback isn't used unsafely.
|
|
194
|
+
try {
|
|
195
|
+
return buildWorkflowDefinitionFromCatalog(workflow).state.some((slot) => slot.type === 'configurable');
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
return true;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
function canUseLegacyCatalogWorkflowIdFallback(workflow, entry) {
|
|
202
|
+
return (Object.keys(entry.configurableValues ?? {}).length === 0 &&
|
|
203
|
+
(entry.excludedActions?.length ?? 0) === 0 &&
|
|
204
|
+
!hasConfigurableInputs(workflow));
|
|
205
|
+
}
|
|
206
|
+
function getCatalogWorkflowIdOrThrow(workflow) {
|
|
207
|
+
if (!/^0x[0-9a-fA-F]{64}$/.test(workflow.workflowId)) {
|
|
208
|
+
throw new Error(`Workflow "${workflow.workflowRef}" is missing a valid catalog workflowId`);
|
|
209
|
+
}
|
|
210
|
+
return workflow.workflowId;
|
|
211
|
+
}
|
|
212
|
+
function collectRequiredMagicKeys(workflowDef) {
|
|
213
|
+
const keys = new Set();
|
|
214
|
+
workflowDef.state.forEach((slot) => {
|
|
215
|
+
if (slot.type === 'magic')
|
|
216
|
+
keys.add(slot.key);
|
|
217
|
+
if (slot.type === 'template') {
|
|
218
|
+
collectRequiredMagicKeys(slot.workflow).forEach((key) => keys.add(key));
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
workflowDef.actions.forEach((action) => {
|
|
222
|
+
if (typeof action.target !== 'string')
|
|
223
|
+
keys.add(action.target.key);
|
|
224
|
+
});
|
|
225
|
+
return keys;
|
|
226
|
+
}
|
|
227
|
+
function getPayableRuntimeSlots(workflowDef) {
|
|
228
|
+
return workflowDef.state
|
|
229
|
+
.filter((slot) => slot.type === 'runtime' && slot.system === 'payableValue')
|
|
230
|
+
.map((slot) => slot)
|
|
231
|
+
.sort((left, right) => (left.actionIndex ?? 0) - (right.actionIndex ?? 0));
|
|
232
|
+
}
|
|
233
|
+
async function estimateWorkflowActionValue(options) {
|
|
234
|
+
const { centrifuge, network, workflow, action } = options;
|
|
235
|
+
const functionName = getSelectorFunctionName(action.selector);
|
|
236
|
+
if (functionName === 'updateContract') {
|
|
237
|
+
return firstValueFrom(centrifuge._estimate(network.centrifugeId, network.pool.centrifugeId, {
|
|
238
|
+
type: MessageType.UntrustedContractUpdate,
|
|
239
|
+
poolId: network.pool.id,
|
|
240
|
+
}));
|
|
241
|
+
}
|
|
242
|
+
if (functionName === 'submitQueuedAssets') {
|
|
243
|
+
return firstValueFrom(centrifuge._estimate(network.centrifugeId, network.pool.centrifugeId, {
|
|
244
|
+
type: MessageType.UpdateHoldingAmount,
|
|
245
|
+
poolId: network.pool.id,
|
|
246
|
+
}));
|
|
247
|
+
}
|
|
248
|
+
if (functionName === 'crosschainTransferShares') {
|
|
249
|
+
const destinationCentrifugeId = Number(workflow.variables.destinationCentrifugeId);
|
|
250
|
+
if (!Number.isFinite(destinationCentrifugeId)) {
|
|
251
|
+
throw new Error(`Workflow "${workflow.workflowRef}" is missing a valid "destinationCentrifugeId" variable for cross-chain transfer`);
|
|
252
|
+
}
|
|
253
|
+
return firstValueFrom(centrifuge._estimate(network.centrifugeId, destinationCentrifugeId, {
|
|
254
|
+
type: MessageType.InitiateTransferShares,
|
|
255
|
+
poolId: network.pool.id,
|
|
256
|
+
}));
|
|
257
|
+
}
|
|
258
|
+
if (REQUEST_MESSAGE_FUNCTION_NAMES.has(functionName)) {
|
|
259
|
+
return firstValueFrom(centrifuge._estimate(network.centrifugeId, network.pool.centrifugeId, {
|
|
260
|
+
type: MessageType.Request,
|
|
261
|
+
poolId: network.pool.id,
|
|
262
|
+
}));
|
|
263
|
+
}
|
|
264
|
+
if (REQUEST_CALLBACK_MESSAGE_FUNCTION_NAMES.has(functionName)) {
|
|
265
|
+
const cfgAssetId = workflow.variables.cfgAssetId;
|
|
266
|
+
if (!cfgAssetId) {
|
|
267
|
+
throw new Error(`Workflow "${workflow.workflowRef}" action "${action.name ?? action.selector}" requires cfgAssetId to estimate a request callback fee`);
|
|
268
|
+
}
|
|
269
|
+
return firstValueFrom(centrifuge._estimate(network.centrifugeId, new AssetId(cfgAssetId).centrifugeId, {
|
|
270
|
+
type: MessageType.RequestCallback,
|
|
271
|
+
poolId: network.pool.id,
|
|
272
|
+
}));
|
|
273
|
+
}
|
|
274
|
+
throw new Error(`Workflow "${workflow.workflowRef}" action "${action.name ?? action.selector}" requires valueNonZero, but fee estimation is not implemented for selector "${action.selector}"`);
|
|
275
|
+
}
|
|
276
|
+
export function applyWorkflowExclusions(workflow, excludedActions = []) {
|
|
277
|
+
const normalized = normalizeExcludedActions(workflow, excludedActions);
|
|
278
|
+
if (normalized.length === 0)
|
|
279
|
+
return workflow;
|
|
280
|
+
const excluded = new Set(normalized);
|
|
281
|
+
return {
|
|
282
|
+
...workflow,
|
|
283
|
+
actions: workflow.actions.filter((_, index) => !excluded.has(index)),
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
export function buildPreparedWorkflowDefinition(workflow, excludedActions = []) {
|
|
287
|
+
const normalizedExcludedActions = normalizeExcludedActions(workflow, excludedActions);
|
|
288
|
+
const preparedWorkflow = applyWorkflowExclusions(workflow, normalizedExcludedActions);
|
|
289
|
+
return {
|
|
290
|
+
workflow: preparedWorkflow,
|
|
291
|
+
workflowDef: buildWorkflowDefinitionFromCatalog(preparedWorkflow),
|
|
292
|
+
excludedActions: normalizedExcludedActions,
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
export async function resolveWorkflowShareClassId(network, scId) {
|
|
296
|
+
if (scId)
|
|
297
|
+
return scId;
|
|
298
|
+
const details = await firstValueFrom(network.details());
|
|
299
|
+
const shareClasses = details.activeShareClasses;
|
|
300
|
+
if (shareClasses.length === 0) {
|
|
301
|
+
throw new Error('No active share classes found on this network');
|
|
302
|
+
}
|
|
303
|
+
if (shareClasses.length > 1) {
|
|
304
|
+
throw new Error('This group has no share class configured. Open the Groups tab, edit this group, and set a share class.');
|
|
305
|
+
}
|
|
306
|
+
return shareClasses[0].id.raw;
|
|
307
|
+
}
|
|
308
|
+
const HUB_PRICE_POOL_PER_ASSET_ABI = parseAbi([
|
|
309
|
+
'function pricePoolPerAsset(uint64,bytes16,uint128) view returns (uint128)',
|
|
310
|
+
]);
|
|
311
|
+
const ORACLE_HUB_ABI = parseAbi(['function hub() view returns (address)']);
|
|
312
|
+
const HUB_HOLDINGS_ABI = parseAbi(['function holdings() view returns (address)']);
|
|
313
|
+
const ASSET_TO_ID_SELECTOR = 'function assetToId(address,uint256)';
|
|
314
|
+
const HOLDINGS_IS_INITIALIZED_ABI = parseAbi(['function isInitialized(uint64,bytes16,uint128) view returns (bool)']);
|
|
315
|
+
export async function estimateWorkflowExecutionValue(options) {
|
|
316
|
+
const { centrifuge, network, workflow, workflowDef } = options;
|
|
317
|
+
const payableSlots = getPayableRuntimeSlots(workflowDef);
|
|
318
|
+
if (payableSlots.length === 0) {
|
|
319
|
+
return { runtimeValues: {}, totalValue: 0n };
|
|
320
|
+
}
|
|
321
|
+
const entries = await Promise.all(payableSlots.map(async (slot) => {
|
|
322
|
+
const actionIndex = slot.actionIndex;
|
|
323
|
+
if (actionIndex == null) {
|
|
324
|
+
throw new Error(`Workflow "${workflow.workflowRef}" is missing payable action metadata`);
|
|
325
|
+
}
|
|
326
|
+
const action = workflow.actions[actionIndex];
|
|
327
|
+
if (!action?.valueNonZero) {
|
|
328
|
+
throw new Error(`Workflow "${workflow.workflowRef}" payable slot "${slot.key}" does not map to a valueNonZero action`);
|
|
329
|
+
}
|
|
330
|
+
const estimate = await estimateWorkflowActionValue({
|
|
331
|
+
centrifuge,
|
|
332
|
+
network,
|
|
333
|
+
workflow,
|
|
334
|
+
action,
|
|
335
|
+
});
|
|
336
|
+
return [slot.key, encodeUint(estimate), estimate];
|
|
337
|
+
}));
|
|
338
|
+
return {
|
|
339
|
+
runtimeValues: Object.fromEntries(entries.map(([key, encoded]) => [key, encoded])),
|
|
340
|
+
totalValue: entries.reduce((sum, [, , value]) => sum + value, 0n),
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
export async function resolveWorkflowPoolContext(options) {
|
|
344
|
+
const { centrifuge, network, workflowDef, workflow, poolEscrowAddress, scId } = options;
|
|
345
|
+
const requiredMagicKeys = collectRequiredMagicKeys(workflowDef);
|
|
346
|
+
if (requiredMagicKeys.size === 0) {
|
|
347
|
+
return { poolContext: {} };
|
|
348
|
+
}
|
|
349
|
+
const poolContext = {};
|
|
350
|
+
if (requiredMagicKeys.has('$executor') || requiredMagicKeys.has('$onchainPM')) {
|
|
351
|
+
const executor = pad32left(await resolveWorkflowExecutorAddress(centrifuge, network));
|
|
352
|
+
if (requiredMagicKeys.has('$executor')) {
|
|
353
|
+
poolContext.$executor = executor;
|
|
354
|
+
}
|
|
355
|
+
if (requiredMagicKeys.has('$onchainPM')) {
|
|
356
|
+
poolContext.$onchainPM = executor;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
if (requiredMagicKeys.has('$poolId')) {
|
|
360
|
+
poolContext.$poolId = encodeUint(network.pool.id.raw);
|
|
361
|
+
}
|
|
362
|
+
if (requiredMagicKeys.has('$poolEscrow')) {
|
|
363
|
+
if (!poolEscrowAddress)
|
|
364
|
+
throw new Error('Pool escrow address is required for this workflow');
|
|
365
|
+
poolContext.$poolEscrow = pad32left(poolEscrowAddress);
|
|
366
|
+
}
|
|
367
|
+
const needsShareClass = requiredMagicKeys.has('$scId') ||
|
|
368
|
+
requiredMagicKeys.has('$onOffRamp') ||
|
|
369
|
+
requiredMagicKeys.has('$accountingTokenId') ||
|
|
370
|
+
requiredMagicKeys.has('$accountingTokenAssetId');
|
|
371
|
+
if (!needsShareClass) {
|
|
372
|
+
return { poolContext };
|
|
373
|
+
}
|
|
374
|
+
const resolvedScId = await resolveWorkflowShareClassId(network, scId);
|
|
375
|
+
const shareClassId = new ShareClassId(resolvedScId);
|
|
376
|
+
const details = await firstValueFrom(network.details());
|
|
377
|
+
const activeShareClass = details.activeShareClasses.find((shareClass) => shareClass.id.equals(resolvedScId));
|
|
378
|
+
if (!activeShareClass) {
|
|
379
|
+
throw new Error(`Share class ${resolvedScId} is not active on network ${network.centrifugeId}`);
|
|
380
|
+
}
|
|
381
|
+
if (requiredMagicKeys.has('$scId')) {
|
|
382
|
+
poolContext.$scId = pad32right(resolvedScId);
|
|
383
|
+
}
|
|
384
|
+
const needsAccountingToken = requiredMagicKeys.has('$accountingTokenId') || requiredMagicKeys.has('$accountingTokenAssetId');
|
|
385
|
+
const accountingTokenId = needsAccountingToken ? resolveWorkflowAccountingTokenId(network, workflow) : undefined;
|
|
386
|
+
if (requiredMagicKeys.has('$accountingTokenId')) {
|
|
387
|
+
if (accountingTokenId == null) {
|
|
388
|
+
throw new Error(`Workflow "${workflow.workflowRef}" is missing accounting token context`);
|
|
389
|
+
}
|
|
390
|
+
poolContext.$accountingTokenId = encodeUint(accountingTokenId);
|
|
391
|
+
}
|
|
392
|
+
if (requiredMagicKeys.has('$onOffRamp')) {
|
|
393
|
+
const onOffRampManager = await firstValueFrom(network.onOfframpManager(shareClassId));
|
|
394
|
+
poolContext.$onOffRamp = pad32left(onOffRampManager.onrampAddress);
|
|
395
|
+
}
|
|
396
|
+
if (requiredMagicKeys.has('$accountingTokenAssetId')) {
|
|
397
|
+
if (accountingTokenId == null) {
|
|
398
|
+
throw new Error(`Workflow "${workflow.workflowRef}" is missing accounting token context`);
|
|
399
|
+
}
|
|
400
|
+
const spokeAddress = workflow.variables.spoke;
|
|
401
|
+
if (!spokeAddress || !ADDRESS_RE.test(spokeAddress)) {
|
|
402
|
+
throw new Error(`Workflow "${workflow.workflowRef}" is missing a valid "spoke" variable`);
|
|
403
|
+
}
|
|
404
|
+
const accountingTokenAddress = workflow.variables.accountingToken;
|
|
405
|
+
if (!accountingTokenAddress || !ADDRESS_RE.test(accountingTokenAddress)) {
|
|
406
|
+
throw new Error(`Workflow "${workflow.workflowRef}" is missing a valid "accountingToken" variable`);
|
|
407
|
+
}
|
|
408
|
+
const client = await firstValueFrom(centrifuge.getClient(network.centrifugeId));
|
|
409
|
+
let assetId;
|
|
410
|
+
try {
|
|
411
|
+
assetId = await client.readContract({
|
|
412
|
+
address: spokeAddress,
|
|
413
|
+
abi: ABI.Spoke,
|
|
414
|
+
functionName: 'assetToId',
|
|
415
|
+
args: [accountingTokenAddress, accountingTokenId],
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
catch (error) {
|
|
419
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
420
|
+
if (message.includes('UnknownAsset')) {
|
|
421
|
+
throw new Error(`Workflow "${workflow.workflowRef}" requires accounting token ${accountingTokenAddress} with tokenId ${accountingTokenId.toString()}, but that asset is not registered on spoke ${spokeAddress}.`);
|
|
422
|
+
}
|
|
423
|
+
throw error;
|
|
424
|
+
}
|
|
425
|
+
poolContext.$accountingTokenAssetId = encodeUint(assetId);
|
|
426
|
+
}
|
|
427
|
+
return { poolContext, resolvedScId };
|
|
428
|
+
}
|
|
429
|
+
export async function buildWorkflowScriptBase(options) {
|
|
430
|
+
const { workflow: preparedWorkflow, workflowDef } = buildPreparedWorkflowDefinition(options.workflow, options.excludedActions);
|
|
431
|
+
const { poolContext, resolvedScId } = await resolveWorkflowPoolContext({
|
|
432
|
+
centrifuge: options.centrifuge,
|
|
433
|
+
network: options.network,
|
|
434
|
+
workflowDef,
|
|
435
|
+
workflow: preparedWorkflow,
|
|
436
|
+
strategist: options.strategist,
|
|
437
|
+
poolEscrowAddress: options.poolEscrowAddress,
|
|
438
|
+
scId: options.scId,
|
|
439
|
+
});
|
|
440
|
+
const { commands, state, stateBitmap } = buildScript(workflowDef, {
|
|
441
|
+
poolContext,
|
|
442
|
+
configurableValues: options.configurableValues,
|
|
443
|
+
});
|
|
444
|
+
return {
|
|
445
|
+
workflow: preparedWorkflow,
|
|
446
|
+
workflowDef,
|
|
447
|
+
commands,
|
|
448
|
+
state,
|
|
449
|
+
stateBitmap,
|
|
450
|
+
poolContext,
|
|
451
|
+
resolvedScId,
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
/**
|
|
455
|
+
* Builds the full `OnchainPM.execute` argument set (commands/state/stateBitmap/proof)
|
|
456
|
+
* plus the native `value` for a single added workflow. This is the same pipeline the
|
|
457
|
+
* execute view runs for one workflow — extracted so several workflows can be built and
|
|
458
|
+
* then batched through `OnchainPM.executeMultiple`. Runs the permission preflights
|
|
459
|
+
* (throwing if the workflow isn't fully set up) and fills any payable runtime slots.
|
|
460
|
+
*/
|
|
461
|
+
/**
|
|
462
|
+
* Build the full `OnchainPM.execute` argument set (commands/state/stateBitmap/proof) plus
|
|
463
|
+
* native `value` for a single whitelisted policy entry. Permission preflights are NOT run
|
|
464
|
+
* here — they live in the app; a keeper relies on `simulate`. `policy` is the strategist's
|
|
465
|
+
* full set of entries on this chain, needed to rebuild the Merkle proof tree.
|
|
466
|
+
*/
|
|
467
|
+
export async function buildWorkflowExecuteParams(options) {
|
|
468
|
+
const { centrifuge, network, entry, policy, strategist, scId, poolEscrowAddress, runtimeValues = {} } = options;
|
|
469
|
+
const { workflow: preparedWorkflow, workflowDef, commands, state: baseState, stateBitmap, } = await buildWorkflowScriptBase({
|
|
470
|
+
centrifuge,
|
|
471
|
+
network,
|
|
472
|
+
workflow: entry.workflow,
|
|
473
|
+
strategist,
|
|
474
|
+
poolEscrowAddress,
|
|
475
|
+
scId,
|
|
476
|
+
configurableValues: entry.configurableValues,
|
|
477
|
+
excludedActions: entry.excludedActions ?? [],
|
|
478
|
+
});
|
|
479
|
+
const { runtimeValues: estimatedValueRuntimeValues, totalValue } = await estimateWorkflowExecutionValue({
|
|
480
|
+
centrifuge,
|
|
481
|
+
network,
|
|
482
|
+
workflow: preparedWorkflow,
|
|
483
|
+
workflowDef,
|
|
484
|
+
});
|
|
485
|
+
const state = fillRuntimeSlots(baseState, workflowDef, { ...runtimeValues, ...estimatedValueRuntimeValues });
|
|
486
|
+
const currentScriptHash = computeScriptHash(commands, baseState, stateBitmap, []);
|
|
487
|
+
const allGroupScriptHashes = await computeWorkflowGroupScriptHashes({
|
|
488
|
+
centrifuge,
|
|
489
|
+
network,
|
|
490
|
+
policy,
|
|
491
|
+
strategist,
|
|
492
|
+
scId,
|
|
493
|
+
poolEscrowAddress,
|
|
494
|
+
});
|
|
495
|
+
const proof = await generateExecuteProof(currentScriptHash, allGroupScriptHashes);
|
|
496
|
+
return { commands, state, stateBitmap, callbacks: [], proof, value: totalValue };
|
|
497
|
+
}
|
|
498
|
+
export async function computeWorkflowScriptHash(options) {
|
|
499
|
+
const { workflow, workflowDef, commands, state, stateBitmap, resolvedScId } = await buildWorkflowScriptBase(options);
|
|
500
|
+
return {
|
|
501
|
+
workflow,
|
|
502
|
+
workflowDef,
|
|
503
|
+
resolvedScId,
|
|
504
|
+
scriptHash: computeScriptHash(commands, state, stateBitmap, []),
|
|
505
|
+
};
|
|
506
|
+
}
|
|
507
|
+
/**
|
|
508
|
+
* Compute one script hash per policy entry — the leaves of the strategist's on-chain
|
|
509
|
+
* Merkle root. `policy` is already this-chain only (the caller filters by chain). On a
|
|
510
|
+
* build failure for an entry with no configurable/excluded customization, falls back to
|
|
511
|
+
* the catalog's pre-computed `workflowId`.
|
|
512
|
+
*/
|
|
513
|
+
export async function computeWorkflowGroupScriptHashes(options) {
|
|
514
|
+
const { centrifuge, network, policy, strategist, scId, poolEscrowAddress } = options;
|
|
515
|
+
return Promise.all(policy.map(async (entry) => {
|
|
516
|
+
try {
|
|
517
|
+
const { scriptHash } = await computeWorkflowScriptHash({
|
|
518
|
+
centrifuge,
|
|
519
|
+
network,
|
|
520
|
+
workflow: entry.workflow,
|
|
521
|
+
strategist,
|
|
522
|
+
poolEscrowAddress,
|
|
523
|
+
scId,
|
|
524
|
+
configurableValues: entry.configurableValues ?? {},
|
|
525
|
+
excludedActions: entry.excludedActions ?? [],
|
|
526
|
+
});
|
|
527
|
+
return scriptHash;
|
|
528
|
+
}
|
|
529
|
+
catch (error) {
|
|
530
|
+
if (canUseLegacyCatalogWorkflowIdFallback(entry.workflow, entry)) {
|
|
531
|
+
return getCatalogWorkflowIdOrThrow(entry.workflow);
|
|
532
|
+
}
|
|
533
|
+
throw error;
|
|
534
|
+
}
|
|
535
|
+
}));
|
|
536
|
+
}
|
|
537
|
+
export function isWorkflowInputOptional(parameter) {
|
|
538
|
+
return parameter === ADDRESS_UINT256_ARRAY_TYPE || parameter === ADDRESS_ADDRESS_ARRAY_TYPE;
|
|
539
|
+
}
|
|
540
|
+
export function encodeWorkflowInputValue(parameter, rawValue) {
|
|
541
|
+
const value = rawValue.trim();
|
|
542
|
+
if (!value && !isWorkflowInputOptional(parameter)) {
|
|
543
|
+
throw new Error(`Missing value for ${parameter}`);
|
|
544
|
+
}
|
|
545
|
+
if (INTEGER_TYPE_RE.test(parameter)) {
|
|
546
|
+
return encodeAbiParameters([getWorkflowAbiParameter(parameter)], [BigInt(value)]);
|
|
547
|
+
}
|
|
548
|
+
if (parameter === 'address') {
|
|
549
|
+
if (!ADDRESS_RE.test(value)) {
|
|
550
|
+
throw new Error(`Expected address for ${parameter}, got "${rawValue}"`);
|
|
551
|
+
}
|
|
552
|
+
return encodeAbiParameters([getWorkflowAbiParameter(parameter)], [value]);
|
|
553
|
+
}
|
|
554
|
+
if (parameter === 'bool') {
|
|
555
|
+
if (value !== 'true' && value !== 'false') {
|
|
556
|
+
throw new Error(`Expected "true" or "false" for ${parameter}, got "${rawValue}"`);
|
|
557
|
+
}
|
|
558
|
+
return encodeAbiParameters([getWorkflowAbiParameter(parameter)], [value === 'true']);
|
|
559
|
+
}
|
|
560
|
+
if (parameter === ADDRESS_UINT256_ARRAY_TYPE) {
|
|
561
|
+
return encodeAbiParameters([getWorkflowAbiParameter(parameter)], [parseAddressUint256Array(value)]);
|
|
562
|
+
}
|
|
563
|
+
if (parameter === ADDRESS_ADDRESS_ARRAY_TYPE) {
|
|
564
|
+
return encodeAbiParameters([getWorkflowAbiParameter(parameter)], [parseAddressAddressArray(value)]);
|
|
565
|
+
}
|
|
566
|
+
if (FIXED_BYTES_TYPE_RE.test(parameter)) {
|
|
567
|
+
const size = Number(parameter.slice('bytes'.length));
|
|
568
|
+
const expectedLength = 2 + size * 2;
|
|
569
|
+
if (!new RegExp(`^0x[0-9a-fA-F]{${size * 2}}$`).test(value)) {
|
|
570
|
+
throw new Error(`Expected ${parameter} (${expectedLength} chars) for configurable value, got "${rawValue}"`);
|
|
571
|
+
}
|
|
572
|
+
return encodeAbiParameters([getWorkflowAbiParameter(parameter)], [value]);
|
|
573
|
+
}
|
|
574
|
+
throw new Error(`Unsupported workflow input type "${parameter}"`);
|
|
575
|
+
}
|
|
576
|
+
export const encodeConfigurableValue = encodeWorkflowInputValue;
|
|
577
|
+
//# sourceMappingURL=workflowExecute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflowExecute.js","sourceRoot":"","sources":["../../src/utils/workflowExecute.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflowExecute.test.d.ts","sourceRoot":"","sources":["../../src/utils/workflowExecute.test.ts"],"names":[],"mappings":""}
|