@gearbox-protocol/sdk 14.12.0-next.7 → 14.12.0-next.9

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 (180) hide show
  1. package/dist/cjs/dev/AccountOpener.js +7 -13
  2. package/dist/cjs/history/classifyMulticallOperations.js +2 -0
  3. package/dist/cjs/history/mapOperations.js +7 -0
  4. package/dist/cjs/plugins/adapters/abi/iConvexV1BoosterAdapter.js +143 -0
  5. package/dist/cjs/plugins/adapters/abi/index.js +2 -0
  6. package/dist/cjs/plugins/adapters/contracts/AbstractAdapter.js +36 -0
  7. package/dist/cjs/plugins/adapters/contracts/AbstractCurveAdapter.js +66 -0
  8. package/dist/cjs/plugins/adapters/contracts/BalancerV3RouterAdapterContract.js +19 -0
  9. package/dist/cjs/plugins/adapters/contracts/BalancerV3WrapperAdapterContract.js +15 -0
  10. package/dist/cjs/plugins/adapters/contracts/CamelotV3AdapterContract.js +20 -0
  11. package/dist/cjs/plugins/adapters/contracts/ConvexV1BaseRewardPoolAdapterContract.js +18 -0
  12. package/dist/cjs/plugins/adapters/contracts/ConvexV1BoosterAdapterContract.js +28 -2
  13. package/dist/cjs/plugins/adapters/contracts/Curve2AssetsAdapterContract.js +2 -7
  14. package/dist/cjs/plugins/adapters/contracts/Curve3AssetsAdapterContract.js +2 -7
  15. package/dist/cjs/plugins/adapters/contracts/Curve4AssetsAdapterContract.js +2 -7
  16. package/dist/cjs/plugins/adapters/contracts/CurveV1AdapterDeposit.js +2 -2
  17. package/dist/cjs/plugins/adapters/contracts/CurveV1AdapterStETHContract.js +2 -7
  18. package/dist/cjs/plugins/adapters/contracts/CurveV1StableNGAdapterContract.js +2 -7
  19. package/dist/cjs/plugins/adapters/contracts/DaiUsdsAdapterContract.js +14 -0
  20. package/dist/cjs/plugins/adapters/contracts/ERC4626AdapterContract.js +15 -0
  21. package/dist/cjs/plugins/adapters/contracts/ERC4626ReferralAdapterContract.js +14 -0
  22. package/dist/cjs/plugins/adapters/contracts/FluidDexAdapterContract.js +15 -0
  23. package/dist/cjs/plugins/adapters/contracts/InfinifiGatewayAdapterContract.js +21 -0
  24. package/dist/cjs/plugins/adapters/contracts/KelpLRTDepositPoolAdapterContract.js +10 -0
  25. package/dist/cjs/plugins/adapters/contracts/LidoV1AdapterContract.js +11 -0
  26. package/dist/cjs/plugins/adapters/contracts/MellowDVVAdapterContract.js +15 -0
  27. package/dist/cjs/plugins/adapters/contracts/MellowERC4626VaultAdapterContract.js +15 -0
  28. package/dist/cjs/plugins/adapters/contracts/MellowWrapperAdapterContract.js +11 -0
  29. package/dist/cjs/plugins/adapters/contracts/MidasIssuanceVaultAdapterContract.js +10 -0
  30. package/dist/cjs/plugins/adapters/contracts/MidasRedemptionVaultAdapterContract.js +12 -0
  31. package/dist/cjs/plugins/adapters/contracts/PendleRouterAdapterContract.js +58 -0
  32. package/dist/cjs/plugins/adapters/contracts/SecuritizeOnRampAdapterContract.js +11 -0
  33. package/dist/cjs/plugins/adapters/contracts/SecuritizeSwapAdapterContract.js +22 -1
  34. package/dist/cjs/plugins/adapters/contracts/StakingRewardsAdapterContract.js +17 -0
  35. package/dist/cjs/plugins/adapters/contracts/TraderJoeRouterAdapterContract.js +10 -0
  36. package/dist/cjs/plugins/adapters/contracts/UniswapV2AdapterContract.js +10 -0
  37. package/dist/cjs/plugins/adapters/contracts/UniswapV3AdapterContract.js +20 -0
  38. package/dist/cjs/plugins/adapters/contracts/UniswapV4AdapterContract.js +15 -0
  39. package/dist/cjs/plugins/adapters/contracts/UpshiftVaultAdapterContract.js +14 -0
  40. package/dist/cjs/plugins/adapters/contracts/VelodromeV2AdapterContract.js +10 -0
  41. package/dist/cjs/plugins/adapters/contracts/WstETHV1AdapterContract.js +15 -0
  42. package/dist/cjs/preview/parse/classifyInnerOperations.js +14 -1
  43. package/dist/cjs/preview/prerequisites/buildPrerequisites.js +3 -8
  44. package/dist/cjs/preview/preview/errors.js +16 -0
  45. package/dist/cjs/preview/preview/previewOpenCreditAccount.js +56 -25
  46. package/dist/cjs/preview/preview/{extractExpectedBalanceChanges.js → unwrapNativeCollateral.js} +20 -23
  47. package/dist/cjs/sdk/accounts/CreditAccountsServiceV310.js +3 -4
  48. package/dist/cjs/sdk/base/BaseContract.js +4 -2
  49. package/dist/cjs/sdk/base/ChainContractsRegister.js +1 -0
  50. package/dist/cjs/sdk/router/AbstractRouterContract.js +21 -27
  51. package/dist/cjs/sdk/router/RouterV310Contract.js +11 -12
  52. package/dist/cjs/sdk/router/helpers.js +0 -5
  53. package/dist/cjs/sdk/utils/AddressMap.js +6 -0
  54. package/dist/cjs/sdk/utils/AssetsMap.js +61 -0
  55. package/dist/cjs/sdk/utils/index.js +2 -0
  56. package/dist/esm/dev/AccountOpener.js +8 -13
  57. package/dist/esm/history/classifyMulticallOperations.js +2 -0
  58. package/dist/esm/history/mapOperations.js +7 -0
  59. package/dist/esm/plugins/adapters/abi/iConvexV1BoosterAdapter.js +119 -0
  60. package/dist/esm/plugins/adapters/abi/index.js +1 -0
  61. package/dist/esm/plugins/adapters/contracts/AbstractAdapter.js +36 -0
  62. package/dist/esm/plugins/adapters/contracts/AbstractCurveAdapter.js +42 -0
  63. package/dist/esm/plugins/adapters/contracts/BalancerV3RouterAdapterContract.js +22 -1
  64. package/dist/esm/plugins/adapters/contracts/BalancerV3WrapperAdapterContract.js +18 -1
  65. package/dist/esm/plugins/adapters/contracts/CamelotV3AdapterContract.js +23 -1
  66. package/dist/esm/plugins/adapters/contracts/ConvexV1BaseRewardPoolAdapterContract.js +22 -1
  67. package/dist/esm/plugins/adapters/contracts/ConvexV1BoosterAdapterContract.js +30 -2
  68. package/dist/esm/plugins/adapters/contracts/Curve2AssetsAdapterContract.js +2 -7
  69. package/dist/esm/plugins/adapters/contracts/Curve3AssetsAdapterContract.js +2 -7
  70. package/dist/esm/plugins/adapters/contracts/Curve4AssetsAdapterContract.js +2 -7
  71. package/dist/esm/plugins/adapters/contracts/CurveV1AdapterDeposit.js +2 -2
  72. package/dist/esm/plugins/adapters/contracts/CurveV1AdapterStETHContract.js +2 -7
  73. package/dist/esm/plugins/adapters/contracts/CurveV1StableNGAdapterContract.js +2 -7
  74. package/dist/esm/plugins/adapters/contracts/DaiUsdsAdapterContract.js +17 -1
  75. package/dist/esm/plugins/adapters/contracts/ERC4626AdapterContract.js +19 -1
  76. package/dist/esm/plugins/adapters/contracts/ERC4626ReferralAdapterContract.js +17 -1
  77. package/dist/esm/plugins/adapters/contracts/FluidDexAdapterContract.js +18 -1
  78. package/dist/esm/plugins/adapters/contracts/InfinifiGatewayAdapterContract.js +24 -1
  79. package/dist/esm/plugins/adapters/contracts/KelpLRTDepositPoolAdapterContract.js +13 -1
  80. package/dist/esm/plugins/adapters/contracts/LidoV1AdapterContract.js +14 -1
  81. package/dist/esm/plugins/adapters/contracts/MellowDVVAdapterContract.js +18 -1
  82. package/dist/esm/plugins/adapters/contracts/MellowERC4626VaultAdapterContract.js +18 -1
  83. package/dist/esm/plugins/adapters/contracts/MellowWrapperAdapterContract.js +14 -1
  84. package/dist/esm/plugins/adapters/contracts/MidasIssuanceVaultAdapterContract.js +13 -1
  85. package/dist/esm/plugins/adapters/contracts/MidasRedemptionVaultAdapterContract.js +15 -1
  86. package/dist/esm/plugins/adapters/contracts/PendleRouterAdapterContract.js +61 -1
  87. package/dist/esm/plugins/adapters/contracts/SecuritizeOnRampAdapterContract.js +14 -1
  88. package/dist/esm/plugins/adapters/contracts/SecuritizeSwapAdapterContract.js +25 -2
  89. package/dist/esm/plugins/adapters/contracts/StakingRewardsAdapterContract.js +20 -1
  90. package/dist/esm/plugins/adapters/contracts/TraderJoeRouterAdapterContract.js +13 -1
  91. package/dist/esm/plugins/adapters/contracts/UniswapV2AdapterContract.js +10 -0
  92. package/dist/esm/plugins/adapters/contracts/UniswapV3AdapterContract.js +20 -0
  93. package/dist/esm/plugins/adapters/contracts/UniswapV4AdapterContract.js +18 -1
  94. package/dist/esm/plugins/adapters/contracts/UpshiftVaultAdapterContract.js +17 -1
  95. package/dist/esm/plugins/adapters/contracts/VelodromeV2AdapterContract.js +13 -1
  96. package/dist/esm/plugins/adapters/contracts/WstETHV1AdapterContract.js +18 -1
  97. package/dist/esm/preview/parse/classifyInnerOperations.js +14 -1
  98. package/dist/esm/preview/prerequisites/buildPrerequisites.js +4 -8
  99. package/dist/esm/preview/preview/errors.js +15 -0
  100. package/dist/esm/preview/preview/previewOpenCreditAccount.js +59 -26
  101. package/dist/esm/preview/preview/unwrapNativeCollateral.js +21 -0
  102. package/dist/esm/sdk/accounts/CreditAccountsServiceV310.js +4 -5
  103. package/dist/esm/sdk/base/BaseContract.js +4 -2
  104. package/dist/esm/sdk/base/ChainContractsRegister.js +1 -0
  105. package/dist/esm/sdk/router/AbstractRouterContract.js +25 -29
  106. package/dist/esm/sdk/router/RouterV310Contract.js +11 -12
  107. package/dist/esm/sdk/router/helpers.js +0 -4
  108. package/dist/esm/sdk/utils/AddressMap.js +6 -0
  109. package/dist/esm/sdk/utils/AssetsMap.js +37 -0
  110. package/dist/esm/sdk/utils/index.js +1 -0
  111. package/dist/types/common-utils/utils/strategies/assets/assets.d.ts +1 -1
  112. package/dist/types/common-utils/utils/strategies/credit-managers/get-wallet-balances-allowed-on-cm.d.ts +1 -1
  113. package/dist/types/common-utils/utils/strategies/strategy-info/calculate-total-apy.d.ts +1 -1
  114. package/dist/types/common-utils/utils/strategies/strategy-info/calculate-total-points.d.ts +1 -1
  115. package/dist/types/common-utils/utils/strategies/tokens/add-amount-in-target.d.ts +1 -1
  116. package/dist/types/common-utils/utils/strategies/tokens/get-list-with-amount-in-target.d.ts +1 -1
  117. package/dist/types/common-utils/utils/strategies/types/strategy-earnings.d.ts +1 -1
  118. package/dist/types/common-utils/utils/validation/validate-balances.d.ts +1 -1
  119. package/dist/types/common-utils/utils/validation/validate-open-account.d.ts +1 -1
  120. package/dist/types/common-utils/utils/validation/validate-quota.d.ts +1 -1
  121. package/dist/types/common-utils/utils/validation/validate-token-to-obtain.d.ts +1 -1
  122. package/dist/types/plugins/adapters/abi/iConvexV1BoosterAdapter.d.ts +204 -0
  123. package/dist/types/plugins/adapters/abi/index.d.ts +1 -0
  124. package/dist/types/plugins/adapters/contracts/AbstractAdapter.d.ts +21 -3
  125. package/dist/types/plugins/adapters/contracts/AbstractCurveAdapter.d.ts +18 -0
  126. package/dist/types/plugins/adapters/contracts/BalancerV3RouterAdapterContract.d.ts +4 -2
  127. package/dist/types/plugins/adapters/contracts/BalancerV3WrapperAdapterContract.d.ts +4 -2
  128. package/dist/types/plugins/adapters/contracts/CamelotV3AdapterContract.d.ts +4 -2
  129. package/dist/types/plugins/adapters/contracts/ConvexV1BaseRewardPoolAdapterContract.d.ts +4 -2
  130. package/dist/types/plugins/adapters/contracts/ConvexV1BoosterAdapterContract.d.ts +8 -6
  131. package/dist/types/plugins/adapters/contracts/Curve2AssetsAdapterContract.d.ts +3 -6
  132. package/dist/types/plugins/adapters/contracts/Curve3AssetsAdapterContract.d.ts +3 -6
  133. package/dist/types/plugins/adapters/contracts/Curve4AssetsAdapterContract.d.ts +3 -6
  134. package/dist/types/plugins/adapters/contracts/CurveV1AdapterDeposit.d.ts +2 -2
  135. package/dist/types/plugins/adapters/contracts/CurveV1AdapterStETHContract.d.ts +3 -6
  136. package/dist/types/plugins/adapters/contracts/CurveV1StableNGAdapterContract.d.ts +3 -6
  137. package/dist/types/plugins/adapters/contracts/DaiUsdsAdapterContract.d.ts +4 -2
  138. package/dist/types/plugins/adapters/contracts/ERC4626AdapterContract.d.ts +4 -2
  139. package/dist/types/plugins/adapters/contracts/ERC4626ReferralAdapterContract.d.ts +4 -2
  140. package/dist/types/plugins/adapters/contracts/FluidDexAdapterContract.d.ts +4 -2
  141. package/dist/types/plugins/adapters/contracts/InfinifiGatewayAdapterContract.d.ts +4 -2
  142. package/dist/types/plugins/adapters/contracts/KelpLRTDepositPoolAdapterContract.d.ts +4 -2
  143. package/dist/types/plugins/adapters/contracts/LidoV1AdapterContract.d.ts +4 -2
  144. package/dist/types/plugins/adapters/contracts/MellowDVVAdapterContract.d.ts +4 -2
  145. package/dist/types/plugins/adapters/contracts/MellowERC4626VaultAdapterContract.d.ts +4 -2
  146. package/dist/types/plugins/adapters/contracts/MellowWrapperAdapterContract.d.ts +4 -2
  147. package/dist/types/plugins/adapters/contracts/MidasIssuanceVaultAdapterContract.d.ts +4 -2
  148. package/dist/types/plugins/adapters/contracts/MidasRedemptionVaultAdapterContract.d.ts +4 -2
  149. package/dist/types/plugins/adapters/contracts/PendleRouterAdapterContract.d.ts +4 -2
  150. package/dist/types/plugins/adapters/contracts/SecuritizeOnRampAdapterContract.d.ts +4 -2
  151. package/dist/types/plugins/adapters/contracts/SecuritizeSwapAdapterContract.d.ts +15 -3
  152. package/dist/types/plugins/adapters/contracts/StakingRewardsAdapterContract.d.ts +4 -2
  153. package/dist/types/plugins/adapters/contracts/TraderJoeRouterAdapterContract.d.ts +4 -2
  154. package/dist/types/plugins/adapters/contracts/UniswapV2AdapterContract.d.ts +3 -1
  155. package/dist/types/plugins/adapters/contracts/UniswapV3AdapterContract.d.ts +3 -1
  156. package/dist/types/plugins/adapters/contracts/UniswapV4AdapterContract.d.ts +4 -2
  157. package/dist/types/plugins/adapters/contracts/UpshiftVaultAdapterContract.d.ts +4 -2
  158. package/dist/types/plugins/adapters/contracts/VelodromeV2AdapterContract.d.ts +4 -2
  159. package/dist/types/plugins/adapters/contracts/WstETHV1AdapterContract.d.ts +4 -2
  160. package/dist/types/plugins/adapters/types.d.ts +10 -0
  161. package/dist/types/preview/parse/types-adapters.d.ts +5 -1
  162. package/dist/types/preview/parse/types-facades.d.ts +23 -1
  163. package/dist/types/preview/preview/errors.d.ts +12 -0
  164. package/dist/types/preview/preview/types.d.ts +9 -1
  165. package/dist/types/preview/preview/unwrapNativeCollateral.d.ts +20 -0
  166. package/dist/types/sdk/accounts/CreditAccountsServiceV310.d.ts +1 -1
  167. package/dist/types/sdk/accounts/types.d.ts +2 -2
  168. package/dist/types/sdk/base/BaseContract.d.ts +1 -1
  169. package/dist/types/sdk/base/TokensMeta.d.ts +1 -1
  170. package/dist/types/sdk/base/types.d.ts +18 -0
  171. package/dist/types/sdk/pools/types.d.ts +1 -1
  172. package/dist/types/sdk/router/AbstractRouterContract.d.ts +5 -5
  173. package/dist/types/sdk/router/helpers.d.ts +1 -2
  174. package/dist/types/sdk/router/types.d.ts +1 -15
  175. package/dist/types/sdk/utils/AddressMap.d.ts +4 -0
  176. package/dist/types/sdk/utils/AssetsMap.d.ts +26 -0
  177. package/dist/types/sdk/utils/index.d.ts +1 -0
  178. package/package.json +1 -1
  179. package/dist/esm/preview/preview/extractExpectedBalanceChanges.js +0 -24
  180. package/dist/types/preview/preview/extractExpectedBalanceChanges.d.ts +0 -21
@@ -21,61 +21,92 @@ __export(previewOpenCreditAccount_exports, {
21
21
  previewOpenCreditAccount: () => previewOpenCreditAccount
22
22
  });
23
23
  module.exports = __toCommonJS(previewOpenCreditAccount_exports);
24
+ var import_adapters = require("../../plugins/adapters/index.js");
24
25
  var import_sdk = require("../../sdk/index.js");
25
- var import_extractExpectedBalanceChanges = require("./extractExpectedBalanceChanges.js");
26
+ var import_unwrapNativeCollateral = require("./unwrapNativeCollateral.js");
26
27
  function previewOpenCreditAccount(input, operation) {
27
- const { sdk, to, calldata } = input;
28
+ const { sdk, value = 0n } = input;
28
29
  const market = sdk.marketRegister.findByCreditManager(
29
30
  operation.creditManager
30
31
  );
31
- const collateralByToken = new import_sdk.AddressMap();
32
- const balances = new import_sdk.AddressMap();
33
- const addBalance = (token, amount) => {
34
- balances.upsert(token, (balances.get(token) ?? 0n) + amount);
35
- };
32
+ const collateralBalances = new import_sdk.AssetsMap();
33
+ const balances = new import_sdk.AssetsMap();
36
34
  let debt = 0n;
37
35
  const quotas = [];
36
+ let inBracket = false;
37
+ let storeSeen = false;
38
38
  for (const op of operation.multicall) {
39
39
  switch (op.operation) {
40
- case "AddCollateral": {
41
- const balance = collateralByToken.get(op.token)?.balance ?? 0n;
42
- collateralByToken.upsert(op.token, {
43
- token: op.token,
44
- balance: balance + op.amount
45
- });
46
- addBalance(op.token, op.amount);
40
+ case "AddCollateral":
41
+ collateralBalances.inc(op.token, op.amount);
42
+ balances.inc(op.token, op.amount);
47
43
  break;
48
- }
49
44
  case "WithdrawCollateral":
50
- addBalance(op.token, -op.amount);
45
+ balances.dec(op.token, op.amount);
51
46
  break;
52
47
  case "IncreaseBorrowedAmount":
53
48
  debt += op.amount;
54
- addBalance(op.token, op.amount);
49
+ balances.inc(op.token, op.amount);
55
50
  break;
56
51
  case "DecreaseBorrowedAmount":
57
52
  debt -= op.amount;
58
- addBalance(op.token, -op.amount);
53
+ balances.dec(op.token, op.amount);
59
54
  break;
60
55
  case "UpdateQuota":
61
56
  quotas.push({ token: op.token, balance: op.change });
62
57
  break;
58
+ case "StoreExpectedBalances":
59
+ if (storeSeen) {
60
+ throw new Error(
61
+ "malformed multicall: duplicate storeExpectedBalances call"
62
+ );
63
+ }
64
+ storeSeen = true;
65
+ inBracket = true;
66
+ for (const { token, balance } of op.deltas) {
67
+ balances.inc(token, balance);
68
+ }
69
+ break;
70
+ case "CompareBalances":
71
+ if (!inBracket) {
72
+ throw new Error(
73
+ "malformed multicall: compareBalances without a preceding storeExpectedBalances"
74
+ );
75
+ }
76
+ inBracket = false;
77
+ break;
78
+ case "Execute":
79
+ if (inBracket) {
80
+ const adapter = sdk.getContract(op.adapter);
81
+ if (!(adapter instanceof import_adapters.AbstractAdapterContract)) {
82
+ throw new Error(
83
+ `call to ${op.adapter} between storeExpectedBalances and compareBalances is not an adapter call`
84
+ );
85
+ }
86
+ adapter.previewBalanceChanges(balances, op.calldata);
87
+ }
88
+ break;
63
89
  }
64
90
  }
65
- const collateral = collateralByToken.values();
91
+ if (inBracket) {
92
+ throw new Error(
93
+ "malformed multicall: storeExpectedBalances without a matching compareBalances"
94
+ );
95
+ }
96
+ let collateral = collateralBalances.toAssets();
66
97
  const collateralValue = collateral.reduce(
67
98
  (acc, { token, balance }) => acc + market.priceOracle.convert(token, market.underlying, balance),
68
99
  0n
69
100
  );
70
- const parsed = sdk.parseFunctionDataV2(to, calldata);
71
- const innerCalls = parsed.rawArgs.calls ?? [];
72
- const deltas = (0, import_extractExpectedBalanceChanges.extractExpectedBalanceChanges)(innerCalls) ?? [];
73
- for (const { token, balance } of deltas) {
74
- addBalance(token, balance);
75
- }
101
+ collateral = (0, import_unwrapNativeCollateral.unwrapNativeCollateral)(
102
+ collateral,
103
+ value,
104
+ sdk.addressProvider.getAddress(import_sdk.AP_WETH_TOKEN, import_sdk.NO_VERSION)
105
+ );
76
106
  const assets = balances.entries().filter(([, balance]) => balance > 1n).map(([token, balance]) => ({ token, balance }));
77
107
  return {
78
108
  operation: operation.operation,
109
+ creditManager: operation.creditManager,
79
110
  target: inferTargetAsset(operation.multicall, balances),
80
111
  collateral,
81
112
  collateralValue,
@@ -16,33 +16,30 @@ var __copyProps = (to, from, except, desc) => {
16
16
  return to;
17
17
  };
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var extractExpectedBalanceChanges_exports = {};
20
- __export(extractExpectedBalanceChanges_exports, {
21
- extractExpectedBalanceChanges: () => extractExpectedBalanceChanges
19
+ var unwrapNativeCollateral_exports = {};
20
+ __export(unwrapNativeCollateral_exports, {
21
+ unwrapNativeCollateral: () => unwrapNativeCollateral
22
22
  });
23
- module.exports = __toCommonJS(extractExpectedBalanceChanges_exports);
24
- function extractExpectedBalanceChanges(innerCalls) {
25
- const calls = innerCalls.filter(
26
- (call) => functionName(call) !== "onDemandPriceUpdates"
27
- );
28
- if (calls.length === 0) {
29
- return void 0;
30
- }
31
- const first = calls[0];
32
- const last = calls[calls.length - 1];
33
- if (functionName(first) !== "storeExpectedBalances" || functionName(last) !== "compareBalances") {
34
- return void 0;
23
+ module.exports = __toCommonJS(unwrapNativeCollateral_exports);
24
+ var import_sdk = require("../../sdk/index.js");
25
+ var import_errors = require("./errors.js");
26
+ function unwrapNativeCollateral(collateral, nativeAmount, wethToken) {
27
+ if (nativeAmount === 0n) {
28
+ return collateral;
35
29
  }
36
- const balanceDeltas = first.rawArgs.balanceDeltas;
37
- if (!balanceDeltas) {
38
- return void 0;
30
+ const balances = new import_sdk.AssetsMap(collateral);
31
+ const wethBalance = balances.get(wethToken) ?? 0n;
32
+ if (wethBalance < nativeAmount) {
33
+ throw new import_errors.InvalidTransactionValueError(nativeAmount, wethBalance);
39
34
  }
40
- return balanceDeltas.map(({ token, amount }) => ({ token, balance: amount }));
41
- }
42
- function functionName(call) {
43
- return call.functionName.split("(")[0];
35
+ balances.upsert(
36
+ wethToken,
37
+ wethBalance === nativeAmount ? void 0 : wethBalance - nativeAmount
38
+ );
39
+ balances.inc(import_sdk.NATIVE_ADDRESS, nativeAmount);
40
+ return balances.toAssets();
44
41
  }
45
42
  // Annotate the CommonJS export names for ESM import in node:
46
43
  0 && (module.exports = {
47
- extractExpectedBalanceChanges
44
+ unwrapNativeCollateral
48
45
  });
@@ -36,7 +36,6 @@ var import_base = require("../base/index.js");
36
36
  var import_chains = require("../chain/chains.js");
37
37
  var import_constants = require("../constants/index.js");
38
38
  var import_market = require("../market/index.js");
39
- var import_router = require("../router/index.js");
40
39
  var import_utils = require("../utils/index.js");
41
40
  var import_viem2 = require("../utils/viem/index.js");
42
41
  var import_multicall_utils = require("./multicall-utils.js");
@@ -1723,10 +1722,10 @@ class CreditAccountsServiceV310 extends import_base.SDKConstruct {
1723
1722
  return calls;
1724
1723
  }
1725
1724
  #prepareUpdateQuotas(creditFacade, { averageQuota, minQuota }) {
1726
- const minRecord = (0, import_router.assetsMap)(minQuota);
1725
+ const minRecord = new import_utils.AssetsMap(minQuota);
1727
1726
  const calls = averageQuota.map((q) => {
1728
- const minAsset = minRecord.get(q.token);
1729
- const min = minAsset && minAsset?.balance > 0 ? minAsset.balance : 0n;
1727
+ const minBalance = minRecord.get(q.token);
1728
+ const min = minBalance && minBalance > 0n ? minBalance : 0n;
1730
1729
  return {
1731
1730
  target: creditFacade,
1732
1731
  callData: (0, import_viem.encodeFunctionData)({
@@ -244,6 +244,7 @@ class BaseContract extends import_Construct.Construct {
244
244
  const functionName = (0, import_utils.getFunctionSignature)(this.abi, calldata);
245
245
  return this.wrapParseCallV2(
246
246
  functionName,
247
+ calldata,
247
248
  this.parseFunctionParamsV2(decoded, strict)
248
249
  );
249
250
  } catch (e) {
@@ -257,7 +258,7 @@ class BaseContract extends import_Construct.Construct {
257
258
  this.logger?.warn(e);
258
259
  const selector = calldata.slice(0, 10);
259
260
  const data = `0x${calldata.slice(10)}`;
260
- return this.wrapParseCallV2(`unknown function ${selector}`, {
261
+ return this.wrapParseCallV2(`unknown function ${selector}`, calldata, {
261
262
  _data: data
262
263
  });
263
264
  }
@@ -270,7 +271,7 @@ class BaseContract extends import_Construct.Construct {
270
271
  parseFunctionParamsV2(params, _strict) {
271
272
  return (0, import_utils.functionArgsToRecord)(this.abi, params.functionName, params.args);
272
273
  }
273
- wrapParseCallV2(functionName, rawArgs) {
274
+ wrapParseCallV2(functionName, calldata, rawArgs) {
274
275
  return {
275
276
  chainId: this.chainId,
276
277
  target: this.address,
@@ -278,6 +279,7 @@ class BaseContract extends import_Construct.Construct {
278
279
  label: this.labelAddress(this.address, true),
279
280
  version: this.version,
280
281
  functionName,
282
+ calldata,
281
283
  rawArgs
282
284
  };
283
285
  }
@@ -184,6 +184,7 @@ class ChainContractsRegister {
184
184
  label: this.labelAddress(address, true),
185
185
  version: 0,
186
186
  functionName: `unknown function ${selector}`,
187
+ calldata,
187
188
  rawArgs: { _data: data }
188
189
  };
189
190
  }
@@ -41,15 +41,15 @@ class AbstractRouterContract extends import_base.BaseContract {
41
41
  options.debtOnly
42
42
  );
43
43
  const { leftoverBalances, expectedBalances, tokensToClaim } = b;
44
- const expected = new import_utils.AddressMap();
45
- const leftover = new import_utils.AddressMap();
44
+ const expected = new import_utils.AssetsMap();
45
+ const leftover = new import_utils.AssetsMap();
46
46
  for (const token of cm.collateralTokens) {
47
- const actual = expectedBalances.get(token)?.balance || 0n;
48
- expected.upsert(token, { token, balance: actual > 10n ? actual : 0n });
49
- leftover.upsert(token, {
47
+ const actual = expectedBalances.get(token) || 0n;
48
+ expected.upsert(token, actual > 10n ? actual : 0n);
49
+ leftover.upsert(
50
50
  token,
51
- balance: (0, import_helpers.limitLeftover)(leftoverBalances.get(token)?.balance || 1n, token) ?? 1n
52
- });
51
+ (0, import_helpers.limitLeftover)(leftoverBalances.get(token) || 1n, token) ?? 1n
52
+ );
53
53
  }
54
54
  return {
55
55
  expectedBalances: expected,
@@ -58,8 +58,8 @@ class AbstractRouterContract extends import_base.BaseContract {
58
58
  };
59
59
  }
60
60
  getDefaultExpectedAndLeftover(ca, keepAssets, debtOnly) {
61
- const expectedBalances = new import_utils.AddressMap();
62
- const leftoverBalances = new import_utils.AddressMap();
61
+ const expectedBalances = new import_utils.AssetsMap();
62
+ const leftoverBalances = new import_utils.AssetsMap();
63
63
  const keepAssetsSet = new import_utils.AddressSet(keepAssets);
64
64
  if (debtOnly) {
65
65
  const result = this.getLeftoversAfterBuyingDebt(ca, keepAssetsSet);
@@ -71,23 +71,23 @@ class AbstractRouterContract extends import_base.BaseContract {
71
71
  }
72
72
  for (const { token, balance, mask } of ca.tokens) {
73
73
  const isEnabled = (mask & ca.enabledTokensMask) !== 0n;
74
- expectedBalances.upsert(token, { token, balance });
74
+ expectedBalances.upsert(token, balance);
75
75
  if (keepAssetsSet.has(token) || !isEnabled || (0, import_utils.isDust)({
76
76
  sdk: this.sdk,
77
77
  token,
78
78
  balance,
79
79
  creditManager: ca.creditManager
80
80
  })) {
81
- leftoverBalances.upsert(token, {
81
+ leftoverBalances.upsert(
82
82
  token,
83
- balance: (0, import_helpers.limitLeftover)(balance, token) ?? balance
84
- });
83
+ (0, import_helpers.limitLeftover)(balance, token) ?? balance
84
+ );
85
85
  }
86
86
  }
87
87
  return {
88
88
  expectedBalances,
89
89
  leftoverBalances,
90
- tokensToClaim: new import_utils.AddressMap()
90
+ tokensToClaim: new import_utils.AssetsMap()
91
91
  };
92
92
  }
93
93
  /**
@@ -100,16 +100,13 @@ class AbstractRouterContract extends import_base.BaseContract {
100
100
  const { priceOracle } = this.sdk.marketRegister.findByCreditManager(
101
101
  ca.creditManager
102
102
  );
103
- const expectedBalances = new import_utils.AddressMap();
104
- const leftoverBalances = new import_utils.AddressMap();
103
+ const expectedBalances = new import_utils.AssetsMap();
104
+ const leftoverBalances = new import_utils.AssetsMap();
105
105
  const usdBalances = [];
106
106
  for (const { token, balance, mask } of ca.tokens) {
107
107
  const isEnabled = (mask & ca.enabledTokensMask) !== 0n;
108
- expectedBalances.upsert(token, { token, balance });
109
- leftoverBalances.upsert(token, {
110
- token,
111
- balance: (0, import_helpers.limitLeftover)(balance, token) ?? balance
112
- });
108
+ expectedBalances.upsert(token, balance);
109
+ leftoverBalances.upsert(token, (0, import_helpers.limitLeftover)(balance, token) ?? balance);
113
110
  if (isEnabled && !keepAssets.has(token)) {
114
111
  usdBalances.push({
115
112
  token,
@@ -139,15 +136,12 @@ class AbstractRouterContract extends import_base.BaseContract {
139
136
  if (tokenAmount === 0n) {
140
137
  return void 0;
141
138
  }
142
- let leftoverBalance = leftoverBalances.get(highestToken.token)?.balance ?? 0n;
139
+ let leftoverBalance = leftoverBalances.get(highestToken.token) ?? 0n;
143
140
  leftoverBalance -= tokenAmount;
144
141
  if (leftoverBalance < 0n) {
145
142
  return void 0;
146
143
  }
147
- leftoverBalances.upsert(highestToken.token, {
148
- token: highestToken.token,
149
- balance: leftoverBalance
150
- });
144
+ leftoverBalances.upsert(highestToken.token, leftoverBalance);
151
145
  const tokenAmountStr = this.sdk.tokensMeta.formatBN(
152
146
  highestToken.token,
153
147
  tokenAmount,
@@ -160,7 +154,7 @@ class AbstractRouterContract extends import_base.BaseContract {
160
154
  return {
161
155
  expectedBalances,
162
156
  leftoverBalances,
163
- tokensToClaim: new import_utils.AddressMap()
157
+ tokensToClaim: new import_utils.AssetsMap()
164
158
  };
165
159
  }
166
160
  safeConvertToUSD(priceOracle, token, balance) {
@@ -23,14 +23,13 @@ __export(RouterV310Contract_exports, {
23
23
  module.exports = __toCommonJS(RouterV310Contract_exports);
24
24
  var import_viem = require("viem");
25
25
  var import_gearboxRouter = require("../../abi/router/gearboxRouter.js");
26
- var import_AddressMap = require("../utils/AddressMap.js");
27
26
  var import_formatter = require("../utils/formatter.js");
28
27
  var import_utils = require("../utils/index.js");
29
28
  var import_AbstractRouterContract = require("./AbstractRouterContract.js");
30
29
  var import_helpers = require("./helpers.js");
31
30
  const abi = import_gearboxRouter.gearboxRouterAbi;
32
31
  class RouterV310Contract extends import_AbstractRouterContract.AbstractRouterContract {
33
- #numSplits = new import_AddressMap.AddressMap();
32
+ #numSplits = new import_utils.AddressMap();
34
33
  #defaultNumSplits = 4n;
35
34
  constructor(sdk, address, version) {
36
35
  super(sdk, {
@@ -94,8 +93,8 @@ class RouterV310Contract extends import_AbstractRouterContract.AbstractRouterCon
94
93
  slippage
95
94
  } = props;
96
95
  const [expectedMap, leftoverMap] = [
97
- (0, import_helpers.balancesMap)(expectedBalances),
98
- (0, import_helpers.balancesMap)(leftoverBalances)
96
+ new import_utils.AssetsMap(expectedBalances),
97
+ new import_utils.AssetsMap(leftoverBalances)
99
98
  ];
100
99
  const getNumSplits = this.#numSplitsGetter(cm, expectedBalances);
101
100
  const tData = cm.collateralTokens.map(
@@ -180,22 +179,22 @@ class RouterV310Contract extends import_AbstractRouterContract.AbstractRouterCon
180
179
  } = props;
181
180
  const { expectedBalances, leftoverBalances, tokensToClaim } = this.getExpectedAndLeftover(ca, cm, {
182
181
  balances: balances ? {
183
- expectedBalances: (0, import_helpers.assetsMap)(balances.expectedBalances),
184
- leftoverBalances: (0, import_helpers.assetsMap)(balances.leftoverBalances),
185
- tokensToClaim: (0, import_helpers.assetsMap)(balances.tokensToClaim || [])
182
+ expectedBalances: new import_utils.AssetsMap(balances.expectedBalances),
183
+ leftoverBalances: new import_utils.AssetsMap(balances.leftoverBalances),
184
+ tokensToClaim: new import_utils.AssetsMap(balances.tokensToClaim || [])
186
185
  } : void 0,
187
186
  keepAssets: balances ? void 0 : keepAssets,
188
187
  debtOnly
189
188
  });
190
- const getNumSplits = this.#numSplitsGetter(cm, expectedBalances.values());
189
+ const getNumSplits = this.#numSplitsGetter(cm, expectedBalances.toAssets());
191
190
  const tData = [];
192
191
  for (const token of cm.collateralTokens) {
193
192
  tData.push({
194
193
  token,
195
- balance: expectedBalances.get(token)?.balance || 0n,
196
- leftoverBalance: (0, import_helpers.limitLeftover)(leftoverBalances.get(token)?.balance, token) ?? 0n,
194
+ balance: expectedBalances.get(token) || 0n,
195
+ leftoverBalance: (0, import_helpers.limitLeftover)(leftoverBalances.get(token), token) ?? 0n,
197
196
  numSplits: getNumSplits(token),
198
- claimRewards: !!tokensToClaim.get(token)
197
+ claimRewards: tokensToClaim.has(token)
199
198
  });
200
199
  }
201
200
  this.logger?.debug(
@@ -278,7 +277,7 @@ class RouterV310Contract extends import_AbstractRouterContract.AbstractRouterCon
278
277
  })),
279
278
  "balances in usd"
280
279
  );
281
- const map = new import_AddressMap.AddressMap(
280
+ const map = new import_utils.AddressMap(
282
281
  inUSD.map(({ token }, i) => [
283
282
  token,
284
283
  i === 0 ? this.#defaultNumSplits : 1n
@@ -19,14 +19,10 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
19
19
  var helpers_exports = {};
20
20
  __export(helpers_exports, {
21
21
  assetsMap: () => assetsMap,
22
- balancesMap: () => balancesMap,
23
22
  limitLeftover: () => limitLeftover
24
23
  });
25
24
  module.exports = __toCommonJS(helpers_exports);
26
25
  var import_utils = require("../utils/index.js");
27
- function balancesMap(assets) {
28
- return new import_utils.AddressMap(assets.map(({ token, balance }) => [token, balance]));
29
- }
30
26
  function assetsMap(assets) {
31
27
  return new import_utils.AddressMap(assets.map((a) => [a.token, a]));
32
28
  }
@@ -42,6 +38,5 @@ function limitLeftover(balance, token) {
42
38
  // Annotate the CommonJS export names for ESM import in node:
43
39
  0 && (module.exports = {
44
40
  assetsMap,
45
- balancesMap,
46
41
  limitLeftover
47
42
  });
@@ -136,6 +136,12 @@ class AddressMap {
136
136
  keys() {
137
137
  return Array.from(this.#map.keys());
138
138
  }
139
+ /**
140
+ * Returns an unfrozen shallow copy of the map.
141
+ **/
142
+ clone() {
143
+ return new AddressMap(this.entries(), this.name);
144
+ }
139
145
  /**
140
146
  * Converts the map to a plain `Record<Address, T>` object.
141
147
  **/
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var AssetsMap_exports = {};
20
+ __export(AssetsMap_exports, {
21
+ AssetsMap: () => AssetsMap
22
+ });
23
+ module.exports = __toCommonJS(AssetsMap_exports);
24
+ var import_AddressMap = require("./AddressMap.js");
25
+ class AssetsMap extends import_AddressMap.AddressMap {
26
+ /**
27
+ * @param entries - Optional initial entries as `[address, balance]` tuples or {@link Asset} objects.
28
+ * @param name - Optional label used in error messages when a lookup fails.
29
+ */
30
+ constructor(entries, name) {
31
+ super(
32
+ entries?.map((e) => Array.isArray(e) ? e : [e.token, e.balance]),
33
+ name
34
+ );
35
+ }
36
+ /**
37
+ * Adds `amount` to the token balance, treating a missing key as `0n`.
38
+ */
39
+ inc(address, amount) {
40
+ this.upsert(address, (this.get(address) ?? 0n) + amount);
41
+ }
42
+ /**
43
+ * Subtracts `amount` from the token balance, treating a missing key as `0n`.
44
+ */
45
+ dec(address, amount) {
46
+ this.inc(address, -amount);
47
+ }
48
+ /**
49
+ * Converts the map to an array of {@link Asset} objects.
50
+ */
51
+ toAssets() {
52
+ return this.entries().map(([token, balance]) => ({ token, balance }));
53
+ }
54
+ clone() {
55
+ return new AssetsMap(this.entries(), this.name);
56
+ }
57
+ }
58
+ // Annotate the CommonJS export names for ESM import in node:
59
+ 0 && (module.exports = {
60
+ AssetsMap
61
+ });
@@ -17,6 +17,7 @@ var utils_exports = {};
17
17
  module.exports = __toCommonJS(utils_exports);
18
18
  __reExport(utils_exports, require("./AddressMap.js"), module.exports);
19
19
  __reExport(utils_exports, require("./AddressSet.js"), module.exports);
20
+ __reExport(utils_exports, require("./AssetsMap.js"), module.exports);
20
21
  __reExport(utils_exports, require("./abi-decode.js"), module.exports);
21
22
  __reExport(utils_exports, require("./bytes32ToString.js"), module.exports);
22
23
  __reExport(utils_exports, require("./childLogger.js"), module.exports);
@@ -36,6 +37,7 @@ __reExport(utils_exports, require("./zod.js"), module.exports);
36
37
  0 && (module.exports = {
37
38
  ...require("./AddressMap.js"),
38
39
  ...require("./AddressSet.js"),
40
+ ...require("./AssetsMap.js"),
39
41
  ...require("./abi-decode.js"),
40
42
  ...require("./bytes32ToString.js"),
41
43
  ...require("./childLogger.js"),
@@ -12,6 +12,7 @@ import {
12
12
  ADDRESS_0X0,
13
13
  AddressMap,
14
14
  AddressSet,
15
+ AssetsMap,
15
16
  childLogger,
16
17
  MAX_UINT256,
17
18
  PERCENTAGE_FACTOR,
@@ -373,7 +374,7 @@ class AccountOpener extends SDKConstruct {
373
374
  }
374
375
  async #depositIntoPools(targets) {
375
376
  this.#logger?.debug("checking and topping up pools if necessary");
376
- const minAvailableByPool = {};
377
+ const minAvailableByPool = new AssetsMap();
377
378
  for (let i = 0; i < targets.length; i++) {
378
379
  const t = targets[i];
379
380
  const leverage = this.#getLeverage(t);
@@ -381,14 +382,14 @@ class AccountOpener extends SDKConstruct {
381
382
  const minDebt = this.#minDebtMultiplier * cm.creditFacade.minDebt / PERCENTAGE_FACTOR;
382
383
  let amount = minDebt * (leverage - PERCENTAGE_FACTOR) / PERCENTAGE_FACTOR * this.#poolDepositMultiplier / PERCENTAGE_FACTOR;
383
384
  amount = amount > cm.creditFacade.maxDebt ? cm.creditFacade.maxDebt : amount;
384
- minAvailableByPool[cm.pool] = (minAvailableByPool[cm.pool] ?? 0n) + amount;
385
+ minAvailableByPool.inc(cm.pool, amount);
385
386
  this.#logger?.debug(
386
387
  `target #${i + 1} (${this.labelAddress(t.target)}) needs ${this.sdk.tokensMeta.formatBN(cm.underlying, amount, { symbol: true })} in pool (leverage: ${Number(leverage / PERCENTAGE_FACTOR)}%)`
387
388
  );
388
389
  }
389
390
  const deposits = [];
390
- const claims = new AddressMap();
391
- for (const [p, minAvailable] of Object.entries(minAvailableByPool)) {
391
+ const claims = new AssetsMap();
392
+ for (const [p, minAvailable] of minAvailableByPool.entries()) {
392
393
  const market = this.sdk.marketRegister.findByPool(p);
393
394
  const pool = market.pool.pool;
394
395
  let diff = minAvailable - pool.availableLiquidity;
@@ -405,9 +406,7 @@ class AccountOpener extends SDKConstruct {
405
406
  );
406
407
  if (diff > 0n) {
407
408
  deposits.push([pool, diff]);
408
- let claim = claims.get(pool.underlying) ?? 0n;
409
- claim += diff * PERCENTAGE_FACTOR / 8950n;
410
- claims.upsert(pool.underlying, claim);
409
+ claims.inc(pool.underlying, diff * PERCENTAGE_FACTOR / 8950n);
411
410
  }
412
411
  }
413
412
  const depositor = await this.#getDepositor();
@@ -564,18 +563,14 @@ class AccountOpener extends SDKConstruct {
564
563
  async #prepareBorrower(targets) {
565
564
  const borrower = await this.#getBorrower();
566
565
  const degenNFTS = {};
567
- const claims = new AddressMap();
566
+ const claims = new AssetsMap();
568
567
  for (const target of targets) {
569
568
  const cm = this.sdk.marketRegister.findCreditManager(
570
569
  target.creditManager
571
570
  );
572
- const market = this.sdk.marketRegister.findByCreditManager(
573
- target.creditManager
574
- );
575
571
  const { degenNFT } = cm.creditFacade;
576
572
  const minDebt = this.#minDebtMultiplier * cm.creditFacade.minDebt / PERCENTAGE_FACTOR;
577
- const claim = claims.get(cm.underlying) ?? 0n;
578
- claims.upsert(cm.underlying, claim + minDebt * 11n / 10n);
573
+ claims.inc(cm.underlying, minDebt * 11n / 10n);
579
574
  if (isAddress(degenNFT) && degenNFT !== ADDRESS_0X0) {
580
575
  degenNFTS[degenNFT] = (degenNFTS[degenNFT] ?? 0) + 1;
581
576
  }
@@ -45,6 +45,7 @@ function classifyMulticallOperations(input) {
45
45
  label: call.label,
46
46
  adapterFunctionName: call.functionName,
47
47
  adapterArgs: call.rawArgs,
48
+ calldata: call.calldata,
48
49
  protocol,
49
50
  transfers: transfers2,
50
51
  legacy
@@ -80,6 +81,7 @@ function classifyMulticallOperations(input) {
80
81
  label: call.label,
81
82
  adapterFunctionName: call.functionName,
82
83
  adapterArgs: call.rawArgs,
84
+ calldata: call.calldata,
83
85
  // Unknown adapter (non-strict): we have no ABI to decode the protocol
84
86
  // call, so `protocol` is left absent rather than filled with placeholders.
85
87
  protocol: void 0,
@@ -12,6 +12,13 @@ function mapInnerOperation(op, visitor, ctx) {
12
12
  return visitor.WithdrawCollateral(op, ctx);
13
13
  case "UpdateQuota":
14
14
  return visitor.UpdateQuota(op, ctx);
15
+ // The history classifier never emits other InnerOperation variants
16
+ // (e.g. StoreExpectedBalances/CompareBalances, which it drops), so this
17
+ // guards against silently returning undefined if that ever changes.
18
+ default:
19
+ throw new Error(
20
+ `unexpected inner operation: ${op.operation}`
21
+ );
15
22
  }
16
23
  }
17
24
  function mapOuterOperation(op, visitor) {