@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.
Files changed (214) hide show
  1. package/dist/cjs/abi/iZapper.js +62 -24
  2. package/dist/cjs/common-utils/utils/index.js +2 -0
  3. package/dist/cjs/{history/trace-utils.js → common-utils/utils/trace.js} +62 -5
  4. package/dist/cjs/dev/index.js +3 -1
  5. package/dist/cjs/dev/verifyTestnet.js +52 -0
  6. package/dist/cjs/history/assembleOperations.js +6 -6
  7. package/dist/cjs/history/classifyMulticallOperations.js +31 -25
  8. package/dist/cjs/history/index.js +0 -2
  9. package/dist/cjs/history/parseCreditAccountTransaction.js +5 -6
  10. package/dist/cjs/history/toLegacyOperation.js +5 -1
  11. package/dist/cjs/plugins/adapters/contracts/AbstractAdapter.js +25 -37
  12. package/dist/cjs/plugins/adapters/contracts/AccountMigratorAdapterContract.js +9 -0
  13. package/dist/cjs/{history/internal-types.js → plugins/adapters/transfers.js} +2 -2
  14. package/dist/cjs/preview/index.js +28 -0
  15. package/dist/cjs/preview/package.json +1 -0
  16. package/dist/cjs/preview/parse/classifyInnerOperations.js +92 -0
  17. package/dist/cjs/preview/parse/errors.js +50 -0
  18. package/dist/cjs/preview/parse/extractExpectedBalanceChanges.js +48 -0
  19. package/dist/cjs/preview/parse/index.js +34 -0
  20. package/dist/cjs/preview/parse/parseFacadeOperationCalldata.js +115 -0
  21. package/dist/cjs/preview/parse/parseOperationCalldata.js +75 -0
  22. package/dist/cjs/preview/parse/parsePoolOperationCalldata.js +85 -0
  23. package/dist/cjs/{history/inner-operations.js → preview/parse/types-adapters.js} +2 -2
  24. package/dist/cjs/preview/parse/types-facades.js +16 -0
  25. package/dist/cjs/preview/parse/types-pools.js +16 -0
  26. package/dist/cjs/preview/parse/types.js +37 -0
  27. package/dist/cjs/preview/prerequisites/AllowancePrerequisite.js +78 -0
  28. package/dist/cjs/preview/prerequisites/BalancePrerequisite.js +77 -0
  29. package/dist/cjs/preview/prerequisites/Prerequisite.js +85 -0
  30. package/dist/cjs/preview/prerequisites/buildPrerequisites.js +221 -0
  31. package/dist/cjs/preview/prerequisites/index.js +34 -0
  32. package/dist/cjs/preview/prerequisites/prepareAction.js +48 -0
  33. package/dist/cjs/preview/prerequisites/runPrerequisites.js +71 -0
  34. package/dist/cjs/preview/prerequisites/types.js +16 -0
  35. package/dist/cjs/preview/simulate/errors.js +91 -0
  36. package/dist/cjs/{sdk/market/zapper/Zapper.js → preview/simulate/holders.js} +21 -23
  37. package/dist/cjs/preview/simulate/index.js +37 -0
  38. package/dist/cjs/preview/simulate/simulateFacadeOperation.js +30 -0
  39. package/dist/cjs/preview/simulate/simulateOperation.js +37 -0
  40. package/dist/cjs/preview/simulate/simulatePoolOperation.js +187 -0
  41. package/dist/cjs/preview/simulate/types.js +16 -0
  42. package/dist/cjs/{history → preview/trace}/errors.js +0 -26
  43. package/dist/cjs/preview/trace/extractAdapterCallTraces.js +58 -0
  44. package/dist/cjs/{history → preview/trace}/extractTransfers.js +9 -12
  45. package/dist/cjs/{history → preview/trace}/findFacadeCalls.js +3 -3
  46. package/dist/cjs/preview/trace/index.js +30 -0
  47. package/dist/cjs/preview/trace/types.js +16 -0
  48. package/dist/cjs/sdk/MultichainSDK.js +1 -0
  49. package/dist/cjs/sdk/OnchainSDK.js +7 -3
  50. package/dist/cjs/sdk/accounts/CreditAccountsServiceV310.js +154 -0
  51. package/dist/cjs/sdk/market/MarketRegister.js +10 -5
  52. package/dist/cjs/sdk/market/ZapperRegister.js +54 -0
  53. package/dist/cjs/sdk/market/zapper/IERC20ZapperContract.js +3 -38
  54. package/dist/cjs/sdk/market/zapper/IETHZapperContract.js +3 -38
  55. package/dist/cjs/sdk/market/zapper/ZapperContract.js +109 -0
  56. package/dist/cjs/sdk/market/zapper/createZapper.js +12 -4
  57. package/dist/cjs/sdk/market/zapper/errors.js +37 -0
  58. package/dist/cjs/sdk/market/zapper/index.js +6 -2
  59. package/dist/cjs/sdk/market/zapper/types.js +16 -0
  60. package/dist/cjs/sdk/options.js +41 -17
  61. package/dist/esm/abi/iZapper.js +62 -24
  62. package/dist/esm/common-utils/utils/index.js +1 -0
  63. package/dist/esm/common-utils/utils/trace.js +93 -0
  64. package/dist/esm/dev/index.js +1 -0
  65. package/dist/esm/dev/verifyTestnet.js +27 -0
  66. package/dist/esm/history/assembleOperations.js +8 -6
  67. package/dist/esm/history/classifyMulticallOperations.js +29 -23
  68. package/dist/esm/history/index.js +0 -1
  69. package/dist/esm/history/parseCreditAccountTransaction.js +3 -4
  70. package/dist/esm/history/toLegacyOperation.js +5 -1
  71. package/dist/esm/plugins/adapters/contracts/AbstractAdapter.js +28 -38
  72. package/dist/esm/plugins/adapters/contracts/AccountMigratorAdapterContract.js +9 -0
  73. package/dist/esm/preview/index.js +4 -0
  74. package/dist/esm/preview/package.json +1 -0
  75. package/dist/esm/preview/parse/classifyInnerOperations.js +68 -0
  76. package/dist/esm/preview/parse/errors.js +24 -0
  77. package/dist/esm/preview/parse/extractExpectedBalanceChanges.js +24 -0
  78. package/dist/esm/preview/parse/index.js +7 -0
  79. package/dist/esm/preview/parse/parseFacadeOperationCalldata.js +91 -0
  80. package/dist/esm/preview/parse/parseOperationCalldata.js +55 -0
  81. package/dist/esm/preview/parse/parsePoolOperationCalldata.js +61 -0
  82. package/dist/esm/preview/parse/types-facades.js +0 -0
  83. package/dist/esm/preview/parse/types-pools.js +0 -0
  84. package/dist/esm/preview/parse/types.js +9 -0
  85. package/dist/esm/preview/prerequisites/AllowancePrerequisite.js +57 -0
  86. package/dist/esm/preview/prerequisites/BalancePrerequisite.js +56 -0
  87. package/dist/esm/preview/prerequisites/Prerequisite.js +63 -0
  88. package/dist/esm/preview/prerequisites/buildPrerequisites.js +197 -0
  89. package/dist/esm/preview/prerequisites/index.js +7 -0
  90. package/dist/esm/preview/prerequisites/prepareAction.js +23 -0
  91. package/dist/esm/preview/prerequisites/runPrerequisites.js +47 -0
  92. package/dist/esm/preview/prerequisites/types.js +0 -0
  93. package/dist/esm/preview/simulate/errors.js +69 -0
  94. package/dist/esm/preview/simulate/holders.js +21 -0
  95. package/dist/esm/preview/simulate/index.js +10 -0
  96. package/dist/esm/preview/simulate/simulateFacadeOperation.js +6 -0
  97. package/dist/esm/preview/simulate/simulateOperation.js +13 -0
  98. package/dist/esm/preview/simulate/simulatePoolOperation.js +166 -0
  99. package/dist/esm/preview/simulate/types.js +0 -0
  100. package/dist/esm/{history → preview/trace}/errors.js +0 -24
  101. package/dist/esm/preview/trace/extractAdapterCallTraces.js +40 -0
  102. package/dist/esm/{history → preview/trace}/extractTransfers.js +9 -12
  103. package/dist/esm/{history → preview/trace}/findFacadeCalls.js +4 -2
  104. package/dist/esm/preview/trace/index.js +5 -0
  105. package/dist/esm/preview/trace/types.js +0 -0
  106. package/dist/esm/sdk/MultichainSDK.js +1 -0
  107. package/dist/esm/sdk/OnchainSDK.js +7 -3
  108. package/dist/esm/sdk/accounts/CreditAccountsServiceV310.js +154 -0
  109. package/dist/esm/sdk/market/MarketRegister.js +10 -5
  110. package/dist/esm/sdk/market/ZapperRegister.js +54 -0
  111. package/dist/esm/sdk/market/zapper/IERC20ZapperContract.js +3 -38
  112. package/dist/esm/sdk/market/zapper/IETHZapperContract.js +3 -38
  113. package/dist/esm/sdk/market/zapper/ZapperContract.js +85 -0
  114. package/dist/esm/sdk/market/zapper/createZapper.js +12 -4
  115. package/dist/esm/sdk/market/zapper/errors.js +13 -0
  116. package/dist/esm/sdk/market/zapper/index.js +3 -1
  117. package/dist/esm/sdk/market/zapper/types.js +0 -0
  118. package/dist/esm/sdk/options.js +39 -15
  119. package/dist/types/abi/iERC20Zapper.d.ts +91 -23
  120. package/dist/types/abi/iETHZapper.d.ts +91 -23
  121. package/dist/types/abi/iZapper.d.ts +91 -23
  122. package/dist/types/common-utils/utils/index.d.ts +1 -0
  123. package/dist/types/common-utils/utils/trace.d.ts +73 -0
  124. package/dist/types/dev/index.d.ts +1 -0
  125. package/dist/types/dev/verifyTestnet.d.ts +24 -0
  126. package/dist/types/history/assembleOperations.d.ts +11 -6
  127. package/dist/types/history/classifyMulticallOperations.d.ts +21 -9
  128. package/dist/types/history/index.d.ts +0 -1
  129. package/dist/types/history/mapOperations.d.ts +7 -9
  130. package/dist/types/history/types.d.ts +22 -71
  131. package/dist/types/plugins/adapters/contracts/AbstractAdapter.d.ts +16 -17
  132. package/dist/types/plugins/adapters/contracts/AccountMigratorAdapterContract.d.ts +10 -1
  133. package/dist/types/plugins/adapters/contracts/ConvexV1BaseRewardPoolAdapterContract.d.ts +1 -1
  134. package/dist/types/plugins/adapters/contracts/ConvexV1BoosterAdapterContract.d.ts +1 -1
  135. package/dist/types/plugins/adapters/contracts/Curve2AssetsAdapterContract.d.ts +1 -1
  136. package/dist/types/plugins/adapters/contracts/Curve3AssetsAdapterContract.d.ts +1 -1
  137. package/dist/types/plugins/adapters/contracts/Curve4AssetsAdapterContract.d.ts +1 -1
  138. package/dist/types/plugins/adapters/contracts/CurveV1AdapterDeposit.d.ts +1 -1
  139. package/dist/types/plugins/adapters/contracts/CurveV1AdapterStETHContract.d.ts +1 -1
  140. package/dist/types/plugins/adapters/contracts/CurveV1StableNGAdapterContract.d.ts +1 -1
  141. package/dist/types/plugins/adapters/contracts/DaiUsdsAdapterContract.d.ts +1 -1
  142. package/dist/types/plugins/adapters/contracts/ERC4626AdapterContract.d.ts +1 -1
  143. package/dist/types/plugins/adapters/contracts/ERC4626ReferralAdapterContract.d.ts +1 -1
  144. package/dist/types/plugins/adapters/contracts/LidoV1AdapterContract.d.ts +1 -1
  145. package/dist/types/plugins/adapters/contracts/MellowDVVAdapterContract.d.ts +1 -1
  146. package/dist/types/plugins/adapters/contracts/MellowERC4626VaultAdapterContract.d.ts +1 -1
  147. package/dist/types/plugins/adapters/contracts/UniswapV2AdapterContract.d.ts +1 -1
  148. package/dist/types/plugins/adapters/contracts/UniswapV4AdapterContract.d.ts +1 -1
  149. package/dist/types/plugins/adapters/contracts/WstETHV1AdapterContract.d.ts +1 -1
  150. package/dist/types/plugins/adapters/transferHelpers.d.ts +1 -1
  151. package/dist/types/plugins/adapters/transfers.d.ts +17 -0
  152. package/dist/types/plugins/adapters/types.d.ts +8 -46
  153. package/dist/types/preview/index.d.ts +4 -0
  154. package/dist/types/preview/parse/classifyInnerOperations.d.ts +21 -0
  155. package/dist/types/preview/parse/errors.d.ts +18 -0
  156. package/dist/types/preview/parse/extractExpectedBalanceChanges.d.ts +22 -0
  157. package/dist/types/preview/parse/index.d.ts +7 -0
  158. package/dist/types/preview/parse/parseFacadeOperationCalldata.d.ts +19 -0
  159. package/dist/types/preview/parse/parseOperationCalldata.d.ts +23 -0
  160. package/dist/types/preview/parse/parsePoolOperationCalldata.d.ts +17 -0
  161. package/dist/types/preview/parse/types-adapters.d.ts +69 -0
  162. package/dist/types/preview/parse/types-facades.d.ts +158 -0
  163. package/dist/types/preview/parse/types-pools.d.ts +115 -0
  164. package/dist/types/preview/parse/types.d.ts +44 -0
  165. package/dist/types/preview/prerequisites/AllowancePrerequisite.d.ts +24 -0
  166. package/dist/types/preview/prerequisites/BalancePrerequisite.d.ts +23 -0
  167. package/dist/types/preview/prerequisites/Prerequisite.d.ts +60 -0
  168. package/dist/types/preview/prerequisites/buildPrerequisites.d.ts +16 -0
  169. package/dist/types/preview/prerequisites/index.d.ts +7 -0
  170. package/dist/types/preview/prerequisites/prepareAction.d.ts +52 -0
  171. package/dist/types/preview/prerequisites/runPrerequisites.d.ts +12 -0
  172. package/dist/types/preview/prerequisites/types.d.ts +78 -0
  173. package/dist/types/preview/simulate/errors.d.ts +45 -0
  174. package/dist/types/preview/simulate/holders.d.ts +7 -0
  175. package/dist/types/preview/simulate/index.d.ts +8 -0
  176. package/dist/types/preview/simulate/simulateFacadeOperation.d.ts +25 -0
  177. package/dist/types/preview/simulate/simulateOperation.d.ts +20 -0
  178. package/dist/types/preview/simulate/simulatePoolOperation.d.ts +26 -0
  179. package/dist/types/preview/simulate/types.d.ts +66 -0
  180. package/dist/types/{history → preview/trace}/errors.d.ts +0 -10
  181. package/dist/types/preview/trace/extractAdapterCallTraces.d.ts +23 -0
  182. package/dist/types/{history → preview/trace}/extractTransfers.d.ts +14 -5
  183. package/dist/types/{history → preview/trace}/findFacadeCalls.d.ts +3 -2
  184. package/dist/types/preview/trace/index.d.ts +5 -0
  185. package/dist/types/preview/trace/types.d.ts +21 -0
  186. package/dist/types/sdk/MultichainSDK.d.ts +5 -0
  187. package/dist/types/sdk/OnchainSDK.d.ts +4 -0
  188. package/dist/types/sdk/accounts/CreditAccountsServiceV310.d.ts +21 -1
  189. package/dist/types/sdk/accounts/types.d.ts +82 -0
  190. package/dist/types/sdk/market/MarketRegister.d.ts +15 -6
  191. package/dist/types/sdk/market/ZapperRegister.d.ts +25 -4
  192. package/dist/types/sdk/market/zapper/IERC20ZapperContract.d.ts +93 -39
  193. package/dist/types/sdk/market/zapper/IETHZapperContract.d.ts +93 -39
  194. package/dist/types/sdk/market/zapper/ZapperContract.d.ts +35 -0
  195. package/dist/types/sdk/market/zapper/createZapper.d.ts +2 -4
  196. package/dist/types/sdk/market/zapper/errors.d.ts +10 -0
  197. package/dist/types/sdk/market/zapper/index.d.ts +3 -1
  198. package/dist/types/sdk/market/zapper/types.d.ts +64 -0
  199. package/dist/types/sdk/options.d.ts +10 -5
  200. package/dist/types/sdk/pools/types.d.ts +3 -3
  201. package/dist/types/sdk/types/state-human.d.ts +9 -0
  202. package/dist/types/sdk/types/state.d.ts +7 -0
  203. package/package.json +8 -3
  204. package/dist/cjs/history/extractProtocolCalls.js +0 -53
  205. package/dist/esm/history/extractProtocolCalls.js +0 -32
  206. package/dist/esm/history/trace-utils.js +0 -36
  207. package/dist/esm/sdk/market/zapper/Zapper.js +0 -23
  208. package/dist/types/history/extractProtocolCalls.d.ts +0 -8
  209. package/dist/types/history/inner-operations.d.ts +0 -57
  210. package/dist/types/history/internal-types.d.ts +0 -47
  211. package/dist/types/history/trace-utils.d.ts +0 -12
  212. package/dist/types/sdk/market/zapper/Zapper.d.ts +0 -13
  213. /package/dist/esm/{history/inner-operations.js → plugins/adapters/transfers.js} +0 -0
  214. /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,4 @@
1
+ export * from "./parse/index.js";
2
+ export * from "./prerequisites/index.js";
3
+ export * from "./simulate/index.js";
4
+ export * from "./trace/index.js";
@@ -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
+ };