@gearbox-protocol/sdk 14.11.3 → 14.12.0-next.2
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/abi/iZapper.js +62 -24
- package/dist/cjs/common-utils/utils/index.js +2 -0
- package/dist/cjs/{history/trace-utils.js → common-utils/utils/trace.js} +62 -5
- package/dist/cjs/dev/index.js +3 -1
- package/dist/cjs/dev/verifyTestnet.js +52 -0
- package/dist/cjs/history/assembleOperations.js +6 -6
- package/dist/cjs/history/classifyMulticallOperations.js +31 -25
- package/dist/cjs/history/index.js +0 -2
- package/dist/cjs/history/parseCreditAccountTransaction.js +5 -6
- package/dist/cjs/history/toLegacyOperation.js +5 -1
- package/dist/cjs/plugins/adapters/contracts/AbstractAdapter.js +25 -37
- package/dist/cjs/plugins/adapters/contracts/AccountMigratorAdapterContract.js +9 -0
- package/dist/cjs/{history/internal-types.js → plugins/adapters/transfers.js} +2 -2
- package/dist/cjs/preview/index.js +28 -0
- package/dist/cjs/preview/package.json +1 -0
- package/dist/cjs/preview/parse/classifyInnerOperations.js +92 -0
- package/dist/cjs/preview/parse/errors.js +50 -0
- package/dist/cjs/preview/parse/extractExpectedBalanceChanges.js +48 -0
- package/dist/cjs/preview/parse/index.js +34 -0
- package/dist/cjs/preview/parse/parseFacadeOperationCalldata.js +115 -0
- package/dist/cjs/preview/parse/parseOperationCalldata.js +75 -0
- package/dist/cjs/preview/parse/parsePoolOperationCalldata.js +85 -0
- package/dist/cjs/{history/inner-operations.js → preview/parse/types-adapters.js} +2 -2
- package/dist/cjs/preview/parse/types-facades.js +16 -0
- package/dist/cjs/preview/parse/types-pools.js +16 -0
- package/dist/cjs/preview/parse/types.js +37 -0
- package/dist/cjs/preview/prerequisites/AllowancePrerequisite.js +78 -0
- package/dist/cjs/preview/prerequisites/BalancePrerequisite.js +77 -0
- package/dist/cjs/preview/prerequisites/Prerequisite.js +85 -0
- package/dist/cjs/preview/prerequisites/buildPrerequisites.js +221 -0
- package/dist/cjs/preview/prerequisites/index.js +34 -0
- package/dist/cjs/preview/prerequisites/prepareAction.js +48 -0
- package/dist/cjs/preview/prerequisites/runPrerequisites.js +71 -0
- package/dist/cjs/preview/prerequisites/types.js +16 -0
- package/dist/cjs/preview/simulate/errors.js +91 -0
- package/dist/cjs/{sdk/market/zapper/Zapper.js → preview/simulate/holders.js} +21 -23
- package/dist/cjs/preview/simulate/index.js +37 -0
- package/dist/cjs/preview/simulate/simulateFacadeOperation.js +30 -0
- package/dist/cjs/preview/simulate/simulateOperation.js +37 -0
- package/dist/cjs/preview/simulate/simulatePoolOperation.js +187 -0
- package/dist/cjs/preview/simulate/types.js +16 -0
- package/dist/cjs/{history → preview/trace}/errors.js +0 -26
- package/dist/cjs/preview/trace/extractAdapterCallTraces.js +58 -0
- package/dist/cjs/{history → preview/trace}/extractTransfers.js +9 -12
- package/dist/cjs/{history → preview/trace}/findFacadeCalls.js +3 -3
- package/dist/cjs/preview/trace/index.js +30 -0
- package/dist/cjs/preview/trace/types.js +16 -0
- package/dist/cjs/sdk/MultichainSDK.js +1 -0
- package/dist/cjs/sdk/OnchainSDK.js +7 -3
- package/dist/cjs/sdk/accounts/CreditAccountsServiceV310.js +154 -0
- package/dist/cjs/sdk/market/MarketRegister.js +10 -5
- package/dist/cjs/sdk/market/ZapperRegister.js +54 -0
- package/dist/cjs/sdk/market/zapper/IERC20ZapperContract.js +3 -38
- package/dist/cjs/sdk/market/zapper/IETHZapperContract.js +3 -38
- package/dist/cjs/sdk/market/zapper/ZapperContract.js +109 -0
- package/dist/cjs/sdk/market/zapper/createZapper.js +12 -4
- package/dist/cjs/sdk/market/zapper/errors.js +37 -0
- package/dist/cjs/sdk/market/zapper/index.js +6 -2
- package/dist/cjs/sdk/market/zapper/types.js +16 -0
- package/dist/cjs/sdk/options.js +41 -17
- package/dist/esm/abi/iZapper.js +62 -24
- package/dist/esm/common-utils/utils/index.js +1 -0
- package/dist/esm/common-utils/utils/trace.js +93 -0
- package/dist/esm/dev/index.js +1 -0
- package/dist/esm/dev/verifyTestnet.js +27 -0
- package/dist/esm/history/assembleOperations.js +8 -6
- package/dist/esm/history/classifyMulticallOperations.js +29 -23
- package/dist/esm/history/index.js +0 -1
- package/dist/esm/history/parseCreditAccountTransaction.js +3 -4
- package/dist/esm/history/toLegacyOperation.js +5 -1
- package/dist/esm/plugins/adapters/contracts/AbstractAdapter.js +28 -38
- package/dist/esm/plugins/adapters/contracts/AccountMigratorAdapterContract.js +9 -0
- package/dist/esm/preview/index.js +4 -0
- package/dist/esm/preview/package.json +1 -0
- package/dist/esm/preview/parse/classifyInnerOperations.js +68 -0
- package/dist/esm/preview/parse/errors.js +24 -0
- package/dist/esm/preview/parse/extractExpectedBalanceChanges.js +24 -0
- package/dist/esm/preview/parse/index.js +7 -0
- package/dist/esm/preview/parse/parseFacadeOperationCalldata.js +91 -0
- package/dist/esm/preview/parse/parseOperationCalldata.js +55 -0
- package/dist/esm/preview/parse/parsePoolOperationCalldata.js +61 -0
- package/dist/esm/preview/parse/types-facades.js +0 -0
- package/dist/esm/preview/parse/types-pools.js +0 -0
- package/dist/esm/preview/parse/types.js +9 -0
- package/dist/esm/preview/prerequisites/AllowancePrerequisite.js +57 -0
- package/dist/esm/preview/prerequisites/BalancePrerequisite.js +56 -0
- package/dist/esm/preview/prerequisites/Prerequisite.js +63 -0
- package/dist/esm/preview/prerequisites/buildPrerequisites.js +197 -0
- package/dist/esm/preview/prerequisites/index.js +7 -0
- package/dist/esm/preview/prerequisites/prepareAction.js +23 -0
- package/dist/esm/preview/prerequisites/runPrerequisites.js +47 -0
- package/dist/esm/preview/prerequisites/types.js +0 -0
- package/dist/esm/preview/simulate/errors.js +69 -0
- package/dist/esm/preview/simulate/holders.js +21 -0
- package/dist/esm/preview/simulate/index.js +10 -0
- package/dist/esm/preview/simulate/simulateFacadeOperation.js +6 -0
- package/dist/esm/preview/simulate/simulateOperation.js +13 -0
- package/dist/esm/preview/simulate/simulatePoolOperation.js +166 -0
- package/dist/esm/preview/simulate/types.js +0 -0
- package/dist/esm/{history → preview/trace}/errors.js +0 -24
- package/dist/esm/preview/trace/extractAdapterCallTraces.js +40 -0
- package/dist/esm/{history → preview/trace}/extractTransfers.js +9 -12
- package/dist/esm/{history → preview/trace}/findFacadeCalls.js +4 -2
- package/dist/esm/preview/trace/index.js +5 -0
- package/dist/esm/preview/trace/types.js +0 -0
- package/dist/esm/sdk/MultichainSDK.js +1 -0
- package/dist/esm/sdk/OnchainSDK.js +7 -3
- package/dist/esm/sdk/accounts/CreditAccountsServiceV310.js +154 -0
- package/dist/esm/sdk/market/MarketRegister.js +10 -5
- package/dist/esm/sdk/market/ZapperRegister.js +54 -0
- package/dist/esm/sdk/market/zapper/IERC20ZapperContract.js +3 -38
- package/dist/esm/sdk/market/zapper/IETHZapperContract.js +3 -38
- package/dist/esm/sdk/market/zapper/ZapperContract.js +85 -0
- package/dist/esm/sdk/market/zapper/createZapper.js +12 -4
- package/dist/esm/sdk/market/zapper/errors.js +13 -0
- package/dist/esm/sdk/market/zapper/index.js +3 -1
- package/dist/esm/sdk/market/zapper/types.js +0 -0
- package/dist/esm/sdk/options.js +39 -15
- package/dist/types/abi/iERC20Zapper.d.ts +91 -23
- package/dist/types/abi/iETHZapper.d.ts +91 -23
- package/dist/types/abi/iZapper.d.ts +91 -23
- package/dist/types/common-utils/utils/index.d.ts +1 -0
- package/dist/types/common-utils/utils/trace.d.ts +73 -0
- package/dist/types/dev/index.d.ts +1 -0
- package/dist/types/dev/verifyTestnet.d.ts +24 -0
- package/dist/types/history/assembleOperations.d.ts +11 -6
- package/dist/types/history/classifyMulticallOperations.d.ts +21 -9
- package/dist/types/history/index.d.ts +0 -1
- package/dist/types/history/mapOperations.d.ts +7 -9
- package/dist/types/history/types.d.ts +22 -71
- package/dist/types/plugins/adapters/contracts/AbstractAdapter.d.ts +16 -17
- package/dist/types/plugins/adapters/contracts/AccountMigratorAdapterContract.d.ts +10 -1
- package/dist/types/plugins/adapters/contracts/ConvexV1BaseRewardPoolAdapterContract.d.ts +1 -1
- package/dist/types/plugins/adapters/contracts/ConvexV1BoosterAdapterContract.d.ts +1 -1
- package/dist/types/plugins/adapters/contracts/Curve2AssetsAdapterContract.d.ts +1 -1
- package/dist/types/plugins/adapters/contracts/Curve3AssetsAdapterContract.d.ts +1 -1
- package/dist/types/plugins/adapters/contracts/Curve4AssetsAdapterContract.d.ts +1 -1
- package/dist/types/plugins/adapters/contracts/CurveV1AdapterDeposit.d.ts +1 -1
- package/dist/types/plugins/adapters/contracts/CurveV1AdapterStETHContract.d.ts +1 -1
- package/dist/types/plugins/adapters/contracts/CurveV1StableNGAdapterContract.d.ts +1 -1
- package/dist/types/plugins/adapters/contracts/DaiUsdsAdapterContract.d.ts +1 -1
- package/dist/types/plugins/adapters/contracts/ERC4626AdapterContract.d.ts +1 -1
- package/dist/types/plugins/adapters/contracts/ERC4626ReferralAdapterContract.d.ts +1 -1
- package/dist/types/plugins/adapters/contracts/LidoV1AdapterContract.d.ts +1 -1
- package/dist/types/plugins/adapters/contracts/MellowDVVAdapterContract.d.ts +1 -1
- package/dist/types/plugins/adapters/contracts/MellowERC4626VaultAdapterContract.d.ts +1 -1
- package/dist/types/plugins/adapters/contracts/UniswapV2AdapterContract.d.ts +1 -1
- package/dist/types/plugins/adapters/contracts/UniswapV4AdapterContract.d.ts +1 -1
- package/dist/types/plugins/adapters/contracts/WstETHV1AdapterContract.d.ts +1 -1
- package/dist/types/plugins/adapters/transferHelpers.d.ts +1 -1
- package/dist/types/plugins/adapters/transfers.d.ts +17 -0
- package/dist/types/plugins/adapters/types.d.ts +8 -46
- package/dist/types/preview/index.d.ts +4 -0
- package/dist/types/preview/parse/classifyInnerOperations.d.ts +21 -0
- package/dist/types/preview/parse/errors.d.ts +18 -0
- package/dist/types/preview/parse/extractExpectedBalanceChanges.d.ts +22 -0
- package/dist/types/preview/parse/index.d.ts +7 -0
- package/dist/types/preview/parse/parseFacadeOperationCalldata.d.ts +19 -0
- package/dist/types/preview/parse/parseOperationCalldata.d.ts +23 -0
- package/dist/types/preview/parse/parsePoolOperationCalldata.d.ts +17 -0
- package/dist/types/preview/parse/types-adapters.d.ts +69 -0
- package/dist/types/preview/parse/types-facades.d.ts +158 -0
- package/dist/types/preview/parse/types-pools.d.ts +115 -0
- package/dist/types/preview/parse/types.d.ts +44 -0
- package/dist/types/preview/prerequisites/AllowancePrerequisite.d.ts +24 -0
- package/dist/types/preview/prerequisites/BalancePrerequisite.d.ts +23 -0
- package/dist/types/preview/prerequisites/Prerequisite.d.ts +60 -0
- package/dist/types/preview/prerequisites/buildPrerequisites.d.ts +16 -0
- package/dist/types/preview/prerequisites/index.d.ts +7 -0
- package/dist/types/preview/prerequisites/prepareAction.d.ts +52 -0
- package/dist/types/preview/prerequisites/runPrerequisites.d.ts +12 -0
- package/dist/types/preview/prerequisites/types.d.ts +78 -0
- package/dist/types/preview/simulate/errors.d.ts +45 -0
- package/dist/types/preview/simulate/holders.d.ts +7 -0
- package/dist/types/preview/simulate/index.d.ts +8 -0
- package/dist/types/preview/simulate/simulateFacadeOperation.d.ts +25 -0
- package/dist/types/preview/simulate/simulateOperation.d.ts +20 -0
- package/dist/types/preview/simulate/simulatePoolOperation.d.ts +26 -0
- package/dist/types/preview/simulate/types.d.ts +66 -0
- package/dist/types/{history → preview/trace}/errors.d.ts +0 -10
- package/dist/types/preview/trace/extractAdapterCallTraces.d.ts +23 -0
- package/dist/types/{history → preview/trace}/extractTransfers.d.ts +14 -5
- package/dist/types/{history → preview/trace}/findFacadeCalls.d.ts +3 -2
- package/dist/types/preview/trace/index.d.ts +5 -0
- package/dist/types/preview/trace/types.d.ts +21 -0
- package/dist/types/sdk/MultichainSDK.d.ts +5 -0
- package/dist/types/sdk/OnchainSDK.d.ts +4 -0
- package/dist/types/sdk/accounts/CreditAccountsServiceV310.d.ts +21 -1
- package/dist/types/sdk/accounts/types.d.ts +82 -0
- package/dist/types/sdk/market/MarketRegister.d.ts +15 -6
- package/dist/types/sdk/market/ZapperRegister.d.ts +25 -4
- package/dist/types/sdk/market/zapper/IERC20ZapperContract.d.ts +93 -39
- package/dist/types/sdk/market/zapper/IETHZapperContract.d.ts +93 -39
- package/dist/types/sdk/market/zapper/ZapperContract.d.ts +35 -0
- package/dist/types/sdk/market/zapper/createZapper.d.ts +2 -4
- package/dist/types/sdk/market/zapper/errors.d.ts +10 -0
- package/dist/types/sdk/market/zapper/index.d.ts +3 -1
- package/dist/types/sdk/market/zapper/types.d.ts +64 -0
- package/dist/types/sdk/options.d.ts +10 -5
- package/dist/types/sdk/pools/types.d.ts +3 -3
- package/dist/types/sdk/types/state-human.d.ts +9 -0
- package/dist/types/sdk/types/state.d.ts +7 -0
- package/package.json +8 -3
- package/dist/cjs/history/extractProtocolCalls.js +0 -53
- package/dist/esm/history/extractProtocolCalls.js +0 -32
- package/dist/esm/history/trace-utils.js +0 -36
- package/dist/esm/sdk/market/zapper/Zapper.js +0 -23
- package/dist/types/history/extractProtocolCalls.d.ts +0 -8
- package/dist/types/history/inner-operations.d.ts +0 -57
- package/dist/types/history/internal-types.d.ts +0 -47
- package/dist/types/history/trace-utils.d.ts +0 -12
- package/dist/types/sdk/market/zapper/Zapper.d.ts +0 -13
- /package/dist/esm/{history/inner-operations.js → plugins/adapters/transfers.js} +0 -0
- /package/dist/esm/{history/internal-types.js → preview/parse/types-adapters.js} +0 -0
|
@@ -12,6 +12,15 @@ class AccountMigratorAdapterContract extends AbstractAdapterContract {
|
|
|
12
12
|
`classifyLegacyOperation is not supported for legacy adapter: ${this.contractType}`
|
|
13
13
|
);
|
|
14
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* The account-migrator adapter's `execute` targets the migrator bot, not an
|
|
17
|
+
* external protocol, so there is no protocol-level call to recover. Returning
|
|
18
|
+
* `undefined` keeps the `protocol` field aligned with its external-protocol
|
|
19
|
+
* semantics (see {@link TraceAdapterExt}).
|
|
20
|
+
*/
|
|
21
|
+
parseProtocolCall(_trace, _strict) {
|
|
22
|
+
return void 0;
|
|
23
|
+
}
|
|
15
24
|
}
|
|
16
25
|
export {
|
|
17
26
|
AccountMigratorAdapterContract
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type": "module","sideEffects":false}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { AbstractAdapterContract } from "../../plugins/adapters/index.js";
|
|
2
|
+
function classifyInnerOperations(calls, props) {
|
|
3
|
+
const { sdk, underlying } = props;
|
|
4
|
+
const result = [];
|
|
5
|
+
for (const call of calls) {
|
|
6
|
+
const contract = sdk.getContract(call.target);
|
|
7
|
+
if (contract instanceof AbstractAdapterContract || contract === void 0) {
|
|
8
|
+
result.push({
|
|
9
|
+
operation: "Execute",
|
|
10
|
+
adapter: call.target,
|
|
11
|
+
adapterType: call.contractType,
|
|
12
|
+
version: call.version,
|
|
13
|
+
label: call.label,
|
|
14
|
+
adapterFunctionName: call.functionName,
|
|
15
|
+
adapterArgs: call.rawArgs
|
|
16
|
+
});
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
const op = classifyFacadeInnerCall(call, underlying);
|
|
20
|
+
if (op) {
|
|
21
|
+
result.push(op);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
function classifyFacadeInnerCall(call, underlying) {
|
|
27
|
+
const functionName = call.functionName.split("(")[0];
|
|
28
|
+
const { rawArgs } = call;
|
|
29
|
+
switch (functionName) {
|
|
30
|
+
case "increaseDebt":
|
|
31
|
+
return {
|
|
32
|
+
operation: "IncreaseBorrowedAmount",
|
|
33
|
+
token: underlying,
|
|
34
|
+
amount: rawArgs.amount
|
|
35
|
+
};
|
|
36
|
+
case "decreaseDebt":
|
|
37
|
+
return {
|
|
38
|
+
operation: "DecreaseBorrowedAmount",
|
|
39
|
+
token: underlying,
|
|
40
|
+
amount: rawArgs.amount
|
|
41
|
+
};
|
|
42
|
+
case "addCollateral":
|
|
43
|
+
case "addCollateralWithPermit":
|
|
44
|
+
return {
|
|
45
|
+
operation: "AddCollateral",
|
|
46
|
+
token: rawArgs.token,
|
|
47
|
+
amount: rawArgs.amount
|
|
48
|
+
};
|
|
49
|
+
case "withdrawCollateral":
|
|
50
|
+
return {
|
|
51
|
+
operation: "WithdrawCollateral",
|
|
52
|
+
token: rawArgs.token,
|
|
53
|
+
amount: rawArgs.amount,
|
|
54
|
+
to: rawArgs.to
|
|
55
|
+
};
|
|
56
|
+
case "updateQuota":
|
|
57
|
+
return {
|
|
58
|
+
operation: "UpdateQuota",
|
|
59
|
+
token: rawArgs.token,
|
|
60
|
+
change: rawArgs.quotaChange
|
|
61
|
+
};
|
|
62
|
+
default:
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export {
|
|
67
|
+
classifyInnerOperations
|
|
68
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { UnsupportedZapperFunctionError } from "../../sdk/index.js";
|
|
2
|
+
class UnsupportedTargetError extends Error {
|
|
3
|
+
target;
|
|
4
|
+
constructor(target) {
|
|
5
|
+
super(`unsupported transaction target: ${target}`);
|
|
6
|
+
this.name = "UnsupportedTargetError";
|
|
7
|
+
this.target = target;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
class UnsupportedPoolFunctionError extends Error {
|
|
11
|
+
pool;
|
|
12
|
+
functionName;
|
|
13
|
+
constructor(pool, functionName) {
|
|
14
|
+
super(`unsupported pool function "${functionName}" on ${pool}`);
|
|
15
|
+
this.name = "UnsupportedPoolFunctionError";
|
|
16
|
+
this.pool = pool;
|
|
17
|
+
this.functionName = functionName;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export {
|
|
21
|
+
UnsupportedPoolFunctionError,
|
|
22
|
+
UnsupportedTargetError,
|
|
23
|
+
UnsupportedZapperFunctionError
|
|
24
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
function extractExpectedBalanceChanges(innerCalls) {
|
|
2
|
+
const calls = innerCalls.filter(
|
|
3
|
+
(call) => functionName(call) !== "onDemandPriceUpdates"
|
|
4
|
+
);
|
|
5
|
+
if (calls.length === 0) {
|
|
6
|
+
return void 0;
|
|
7
|
+
}
|
|
8
|
+
const first = calls[0];
|
|
9
|
+
const last = calls[calls.length - 1];
|
|
10
|
+
if (functionName(first) !== "storeExpectedBalances" || functionName(last) !== "compareBalances") {
|
|
11
|
+
return void 0;
|
|
12
|
+
}
|
|
13
|
+
const balanceDeltas = first.rawArgs.balanceDeltas;
|
|
14
|
+
if (!balanceDeltas) {
|
|
15
|
+
return void 0;
|
|
16
|
+
}
|
|
17
|
+
return balanceDeltas.map(({ token, amount }) => ({ token, delta: amount }));
|
|
18
|
+
}
|
|
19
|
+
function functionName(call) {
|
|
20
|
+
return call.functionName.split("(")[0];
|
|
21
|
+
}
|
|
22
|
+
export {
|
|
23
|
+
extractExpectedBalanceChanges
|
|
24
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from "./classifyInnerOperations.js";
|
|
2
|
+
export * from "./errors.js";
|
|
3
|
+
export * from "./extractExpectedBalanceChanges.js";
|
|
4
|
+
export * from "./parseFacadeOperationCalldata.js";
|
|
5
|
+
export * from "./parseOperationCalldata.js";
|
|
6
|
+
export * from "./parsePoolOperationCalldata.js";
|
|
7
|
+
export * from "./types.js";
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { isAddressEqual, zeroAddress } from "viem";
|
|
2
|
+
import { classifyInnerOperations } from "./classifyInnerOperations.js";
|
|
3
|
+
import { extractExpectedBalanceChanges } from "./extractExpectedBalanceChanges.js";
|
|
4
|
+
function parseFacadeOperationCalldata(props) {
|
|
5
|
+
const { sdk, facade, calldata } = props;
|
|
6
|
+
const parsed = sdk.parseFunctionDataV2(facade.address, calldata);
|
|
7
|
+
const functionName = parsed.functionName.split("(")[0];
|
|
8
|
+
const { rawArgs } = parsed;
|
|
9
|
+
const suite = sdk.marketRegister.creditManagers.find(
|
|
10
|
+
(cm) => isAddressEqual(cm.creditFacade.address, facade.address)
|
|
11
|
+
);
|
|
12
|
+
if (!suite) {
|
|
13
|
+
throw new Error(`no credit suite found for facade ${facade.address}`);
|
|
14
|
+
}
|
|
15
|
+
const metadata = {
|
|
16
|
+
creditManager: suite.creditManager.address,
|
|
17
|
+
creditFacade: facade.address
|
|
18
|
+
};
|
|
19
|
+
const innerCalls = rawArgs.calls ?? [];
|
|
20
|
+
const multicall = classifyInnerOperations(innerCalls, {
|
|
21
|
+
sdk,
|
|
22
|
+
underlying: suite.underlying
|
|
23
|
+
});
|
|
24
|
+
const expectedBalanceChanges = extractExpectedBalanceChanges(innerCalls);
|
|
25
|
+
switch (functionName) {
|
|
26
|
+
case "multicall":
|
|
27
|
+
return {
|
|
28
|
+
...metadata,
|
|
29
|
+
operation: "MultiCall",
|
|
30
|
+
creditAccount: rawArgs.creditAccount,
|
|
31
|
+
multicall,
|
|
32
|
+
expectedBalanceChanges
|
|
33
|
+
};
|
|
34
|
+
case "botMulticall":
|
|
35
|
+
return {
|
|
36
|
+
...metadata,
|
|
37
|
+
operation: "BotMulticall",
|
|
38
|
+
creditAccount: rawArgs.creditAccount,
|
|
39
|
+
multicall,
|
|
40
|
+
expectedBalanceChanges
|
|
41
|
+
};
|
|
42
|
+
case "openCreditAccount":
|
|
43
|
+
return {
|
|
44
|
+
...metadata,
|
|
45
|
+
operation: "OpenCreditAccount",
|
|
46
|
+
creditAccount: zeroAddress,
|
|
47
|
+
onBehalfOf: rawArgs.onBehalfOf,
|
|
48
|
+
referralCode: rawArgs.referralCode,
|
|
49
|
+
multicall,
|
|
50
|
+
expectedBalanceChanges
|
|
51
|
+
};
|
|
52
|
+
case "closeCreditAccount":
|
|
53
|
+
return {
|
|
54
|
+
...metadata,
|
|
55
|
+
operation: "CloseCreditAccount",
|
|
56
|
+
creditAccount: rawArgs.creditAccount,
|
|
57
|
+
multicall,
|
|
58
|
+
expectedBalanceChanges
|
|
59
|
+
};
|
|
60
|
+
case "liquidateCreditAccount":
|
|
61
|
+
return {
|
|
62
|
+
...metadata,
|
|
63
|
+
operation: "LiquidateCreditAccount",
|
|
64
|
+
creditAccount: rawArgs.creditAccount,
|
|
65
|
+
to: rawArgs.to,
|
|
66
|
+
// `token` and `remainingFunds` are only emitted on-chain during
|
|
67
|
+
// liquidation, so they are not recoverable from raw calldata.
|
|
68
|
+
token: zeroAddress,
|
|
69
|
+
remainingFunds: 0n,
|
|
70
|
+
multicall,
|
|
71
|
+
expectedBalanceChanges
|
|
72
|
+
};
|
|
73
|
+
case "partiallyLiquidateCreditAccount":
|
|
74
|
+
return {
|
|
75
|
+
...metadata,
|
|
76
|
+
operation: "PartiallyLiquidateCreditAccount",
|
|
77
|
+
creditAccount: rawArgs.creditAccount,
|
|
78
|
+
token: rawArgs.token,
|
|
79
|
+
repaidAmount: rawArgs.repaidAmount,
|
|
80
|
+
minSeizedAmount: rawArgs.minSeizedAmount,
|
|
81
|
+
to: rawArgs.to
|
|
82
|
+
};
|
|
83
|
+
default:
|
|
84
|
+
throw new Error(
|
|
85
|
+
`unsupported credit facade function "${parsed.functionName}" on ${facade.address}`
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
export {
|
|
90
|
+
parseFacadeOperationCalldata
|
|
91
|
+
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CreditFacadeV310Contract,
|
|
3
|
+
PoolV310Contract,
|
|
4
|
+
ZapperContract
|
|
5
|
+
} from "../../sdk/index.js";
|
|
6
|
+
import { UnsupportedTargetError } from "./errors.js";
|
|
7
|
+
import { parseFacadeOperationCalldata } from "./parseFacadeOperationCalldata.js";
|
|
8
|
+
import { parsePoolOperationCalldata } from "./parsePoolOperationCalldata.js";
|
|
9
|
+
function parseOperationCalldata(input) {
|
|
10
|
+
const { sdk, to, calldata, value, sender } = input;
|
|
11
|
+
const contract = sdk.getContract(to);
|
|
12
|
+
if (contract instanceof PoolV310Contract) {
|
|
13
|
+
return parsePoolOperationCalldata({ sdk, pool: contract, calldata });
|
|
14
|
+
}
|
|
15
|
+
if (contract instanceof ZapperContract) {
|
|
16
|
+
const parsed = contract.parseOperation(calldata, value);
|
|
17
|
+
if (parsed.operation === "Deposit") {
|
|
18
|
+
const op2 = {
|
|
19
|
+
operation: "Deposit",
|
|
20
|
+
pool: parsed.pool,
|
|
21
|
+
receiver: parsed.receiver,
|
|
22
|
+
assets: parsed.assets,
|
|
23
|
+
underlying: parsed.underlying,
|
|
24
|
+
tokenIn: parsed.token,
|
|
25
|
+
zapper: parsed.zapper,
|
|
26
|
+
referralCode: parsed.referralCode
|
|
27
|
+
};
|
|
28
|
+
return op2;
|
|
29
|
+
}
|
|
30
|
+
const op = {
|
|
31
|
+
operation: "Redeem",
|
|
32
|
+
pool: parsed.pool,
|
|
33
|
+
receiver: parsed.receiver,
|
|
34
|
+
// The zapper burns the caller's pool shares, so the share owner is the
|
|
35
|
+
// transaction sender.
|
|
36
|
+
owner: sender,
|
|
37
|
+
shares: parsed.shares,
|
|
38
|
+
underlying: parsed.underlying,
|
|
39
|
+
tokenOut: parsed.token,
|
|
40
|
+
zapper: parsed.zapper
|
|
41
|
+
};
|
|
42
|
+
return op;
|
|
43
|
+
}
|
|
44
|
+
if (contract instanceof CreditFacadeV310Contract) {
|
|
45
|
+
return parseFacadeOperationCalldata({
|
|
46
|
+
sdk,
|
|
47
|
+
facade: contract,
|
|
48
|
+
calldata
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
throw new UnsupportedTargetError(to);
|
|
52
|
+
}
|
|
53
|
+
export {
|
|
54
|
+
parseOperationCalldata
|
|
55
|
+
};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { UnsupportedPoolFunctionError } from "./errors.js";
|
|
2
|
+
function parsePoolOperationCalldata(props) {
|
|
3
|
+
const { sdk, pool, calldata } = props;
|
|
4
|
+
const parsed = sdk.parseFunctionDataV2(pool.address, calldata);
|
|
5
|
+
const functionName = parsed.functionName.split("(")[0];
|
|
6
|
+
const { rawArgs } = parsed;
|
|
7
|
+
const underlying = pool.underlying;
|
|
8
|
+
switch (functionName) {
|
|
9
|
+
case "deposit":
|
|
10
|
+
case "depositWithReferral":
|
|
11
|
+
return {
|
|
12
|
+
operation: "Deposit",
|
|
13
|
+
pool: pool.address,
|
|
14
|
+
receiver: rawArgs.receiver,
|
|
15
|
+
assets: rawArgs.assets,
|
|
16
|
+
underlying,
|
|
17
|
+
tokenIn: underlying,
|
|
18
|
+
zapper: void 0,
|
|
19
|
+
referralCode: functionName === "depositWithReferral" ? rawArgs.referralCode : void 0
|
|
20
|
+
};
|
|
21
|
+
case "mint":
|
|
22
|
+
case "mintWithReferral":
|
|
23
|
+
return {
|
|
24
|
+
operation: "Mint",
|
|
25
|
+
pool: pool.address,
|
|
26
|
+
receiver: rawArgs.receiver,
|
|
27
|
+
shares: rawArgs.shares,
|
|
28
|
+
underlying,
|
|
29
|
+
tokenIn: underlying,
|
|
30
|
+
zapper: void 0,
|
|
31
|
+
referralCode: functionName === "mintWithReferral" ? rawArgs.referralCode : void 0
|
|
32
|
+
};
|
|
33
|
+
case "withdraw":
|
|
34
|
+
return {
|
|
35
|
+
operation: "Withdraw",
|
|
36
|
+
pool: pool.address,
|
|
37
|
+
receiver: rawArgs.receiver,
|
|
38
|
+
owner: rawArgs.owner,
|
|
39
|
+
assets: rawArgs.assets,
|
|
40
|
+
underlying,
|
|
41
|
+
tokenOut: underlying,
|
|
42
|
+
zapper: void 0
|
|
43
|
+
};
|
|
44
|
+
case "redeem":
|
|
45
|
+
return {
|
|
46
|
+
operation: "Redeem",
|
|
47
|
+
pool: pool.address,
|
|
48
|
+
receiver: rawArgs.receiver,
|
|
49
|
+
owner: rawArgs.owner,
|
|
50
|
+
shares: rawArgs.shares,
|
|
51
|
+
underlying,
|
|
52
|
+
tokenOut: underlying,
|
|
53
|
+
zapper: void 0
|
|
54
|
+
};
|
|
55
|
+
default:
|
|
56
|
+
throw new UnsupportedPoolFunctionError(pool.address, parsed.functionName);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export {
|
|
60
|
+
parsePoolOperationCalldata
|
|
61
|
+
};
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from "./types-adapters.js";
|
|
2
|
+
export * from "./types-facades.js";
|
|
3
|
+
export * from "./types-pools.js";
|
|
4
|
+
function isPoolOperation(tx) {
|
|
5
|
+
return tx.operation === "Deposit" || tx.operation === "Mint" || tx.operation === "Withdraw" || tx.operation === "Redeem";
|
|
6
|
+
}
|
|
7
|
+
export {
|
|
8
|
+
isPoolOperation
|
|
9
|
+
};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { erc20Abi } from "viem";
|
|
2
|
+
import {
|
|
3
|
+
Prerequisite,
|
|
4
|
+
toPrerequisiteError
|
|
5
|
+
} from "./Prerequisite.js";
|
|
6
|
+
class AllowancePrerequisite extends Prerequisite {
|
|
7
|
+
_id;
|
|
8
|
+
_title;
|
|
9
|
+
_detail;
|
|
10
|
+
constructor(props) {
|
|
11
|
+
super();
|
|
12
|
+
this._id = props.id ?? `allowance:${props.token}:${props.owner}:${props.spender}`;
|
|
13
|
+
this._title = props.title ?? "Token approval";
|
|
14
|
+
this._detail = {
|
|
15
|
+
token: props.token,
|
|
16
|
+
owner: props.owner,
|
|
17
|
+
spender: props.spender,
|
|
18
|
+
required: props.required
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
get id() {
|
|
22
|
+
return this._id;
|
|
23
|
+
}
|
|
24
|
+
get kind() {
|
|
25
|
+
return "allowance";
|
|
26
|
+
}
|
|
27
|
+
get title() {
|
|
28
|
+
return this._title;
|
|
29
|
+
}
|
|
30
|
+
get detail() {
|
|
31
|
+
return this._detail;
|
|
32
|
+
}
|
|
33
|
+
calls() {
|
|
34
|
+
return [
|
|
35
|
+
{
|
|
36
|
+
address: this._detail.token,
|
|
37
|
+
abi: erc20Abi,
|
|
38
|
+
functionName: "allowance",
|
|
39
|
+
args: [this._detail.owner, this._detail.spender]
|
|
40
|
+
}
|
|
41
|
+
];
|
|
42
|
+
}
|
|
43
|
+
resolve(slice) {
|
|
44
|
+
const res = slice[0];
|
|
45
|
+
if (!res || res.status === "failure") {
|
|
46
|
+
return this.errorResult(toPrerequisiteError(res?.error));
|
|
47
|
+
}
|
|
48
|
+
const actual = res.result;
|
|
49
|
+
return this.satisfiedResult(actual >= this._detail.required, {
|
|
50
|
+
...this._detail,
|
|
51
|
+
actual
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export {
|
|
56
|
+
AllowancePrerequisite
|
|
57
|
+
};
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { erc20Abi } from "viem";
|
|
2
|
+
import {
|
|
3
|
+
Prerequisite,
|
|
4
|
+
toPrerequisiteError
|
|
5
|
+
} from "./Prerequisite.js";
|
|
6
|
+
class BalancePrerequisite extends Prerequisite {
|
|
7
|
+
_id;
|
|
8
|
+
_title;
|
|
9
|
+
_detail;
|
|
10
|
+
constructor(props) {
|
|
11
|
+
super();
|
|
12
|
+
this._id = props.id ?? `balance:${props.token}:${props.owner}`;
|
|
13
|
+
this._title = props.title ?? "Sufficient balance";
|
|
14
|
+
this._detail = {
|
|
15
|
+
token: props.token,
|
|
16
|
+
owner: props.owner,
|
|
17
|
+
required: props.required
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
get id() {
|
|
21
|
+
return this._id;
|
|
22
|
+
}
|
|
23
|
+
get kind() {
|
|
24
|
+
return "balance";
|
|
25
|
+
}
|
|
26
|
+
get title() {
|
|
27
|
+
return this._title;
|
|
28
|
+
}
|
|
29
|
+
get detail() {
|
|
30
|
+
return this._detail;
|
|
31
|
+
}
|
|
32
|
+
calls() {
|
|
33
|
+
return [
|
|
34
|
+
{
|
|
35
|
+
address: this._detail.token,
|
|
36
|
+
abi: erc20Abi,
|
|
37
|
+
functionName: "balanceOf",
|
|
38
|
+
args: [this._detail.owner]
|
|
39
|
+
}
|
|
40
|
+
];
|
|
41
|
+
}
|
|
42
|
+
resolve(slice) {
|
|
43
|
+
const res = slice[0];
|
|
44
|
+
if (!res || res.status === "failure") {
|
|
45
|
+
return this.errorResult(toPrerequisiteError(res?.error));
|
|
46
|
+
}
|
|
47
|
+
const actual = res.result;
|
|
48
|
+
return this.satisfiedResult(actual >= this._detail.required, {
|
|
49
|
+
...this._detail,
|
|
50
|
+
actual
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export {
|
|
55
|
+
BalancePrerequisite
|
|
56
|
+
};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import {
|
|
2
|
+
BaseError,
|
|
3
|
+
ContractFunctionRevertedError
|
|
4
|
+
} from "viem";
|
|
5
|
+
function toPrerequisiteError(cause) {
|
|
6
|
+
if (cause instanceof BaseError) {
|
|
7
|
+
const reverted = cause.walk(
|
|
8
|
+
(e) => e instanceof ContractFunctionRevertedError
|
|
9
|
+
);
|
|
10
|
+
if (reverted instanceof ContractFunctionRevertedError) {
|
|
11
|
+
return {
|
|
12
|
+
reason: reverted.data?.errorName ?? reverted.shortMessage ?? "reverted",
|
|
13
|
+
cause
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
return { reason: cause.shortMessage ?? cause.name, cause };
|
|
17
|
+
}
|
|
18
|
+
if (cause instanceof Error) {
|
|
19
|
+
return { reason: cause.message, cause };
|
|
20
|
+
}
|
|
21
|
+
return { reason: "unknown error", cause };
|
|
22
|
+
}
|
|
23
|
+
class Prerequisite {
|
|
24
|
+
/**
|
|
25
|
+
* Verifies this prerequisite on its own using an `allowFailure` multicall.
|
|
26
|
+
* Prefer `verifyPrerequisites` to batch several checks into one round-trip.
|
|
27
|
+
*/
|
|
28
|
+
async verify(ctx) {
|
|
29
|
+
const calls = this.calls(ctx);
|
|
30
|
+
const results = await ctx.sdk.client.multicall({
|
|
31
|
+
allowFailure: true,
|
|
32
|
+
contracts: calls,
|
|
33
|
+
// `undefined` lets viem read at `latest`; `blockNumber` is only set for
|
|
34
|
+
// testnet forks pinned to a specific block.
|
|
35
|
+
blockNumber: ctx.blockNumber
|
|
36
|
+
});
|
|
37
|
+
return this.resolve(results);
|
|
38
|
+
}
|
|
39
|
+
/** Builds a successful result; `detail` carries the on-chain `actual`. */
|
|
40
|
+
satisfiedResult(satisfied, detail) {
|
|
41
|
+
return {
|
|
42
|
+
id: this.id,
|
|
43
|
+
kind: this.kind,
|
|
44
|
+
title: this.title,
|
|
45
|
+
detail,
|
|
46
|
+
satisfied
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/** Builds a failed result from a decoded read error. */
|
|
50
|
+
errorResult(error) {
|
|
51
|
+
return {
|
|
52
|
+
id: this.id,
|
|
53
|
+
kind: this.kind,
|
|
54
|
+
title: this.title,
|
|
55
|
+
detail: this.detail,
|
|
56
|
+
error
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export {
|
|
61
|
+
Prerequisite,
|
|
62
|
+
toPrerequisiteError
|
|
63
|
+
};
|