@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
@@ -1,3 +1,17 @@
1
+ class InvalidTransactionValueError extends Error {
2
+ /** Transaction `msg.value`. */
3
+ value;
4
+ /** Amount of wrapped native token added as collateral. */
5
+ wethCollateral;
6
+ constructor(value, wethCollateral) {
7
+ super(
8
+ `transaction value ${value} exceeds WETH collateral ${wethCollateral}`
9
+ );
10
+ this.name = "InvalidTransactionValueError";
11
+ this.value = value;
12
+ this.wethCollateral = wethCollateral;
13
+ }
14
+ }
1
15
  class UnsupportedOperationError extends Error {
2
16
  /** The parsed operation kind (the `operation` discriminant). */
3
17
  operation;
@@ -8,5 +22,6 @@ class UnsupportedOperationError extends Error {
8
22
  }
9
23
  }
10
24
  export {
25
+ InvalidTransactionValueError,
11
26
  UnsupportedOperationError
12
27
  };
@@ -1,60 +1,93 @@
1
+ import { AbstractAdapterContract } from "../../plugins/adapters/index.js";
1
2
  import {
2
- AddressMap
3
+ AP_WETH_TOKEN,
4
+ AssetsMap,
5
+ NO_VERSION
3
6
  } from "../../sdk/index.js";
4
- import { extractExpectedBalanceChanges } from "./extractExpectedBalanceChanges.js";
7
+ import { unwrapNativeCollateral } from "./unwrapNativeCollateral.js";
5
8
  function previewOpenCreditAccount(input, operation) {
6
- const { sdk, to, calldata } = input;
9
+ const { sdk, value = 0n } = input;
7
10
  const market = sdk.marketRegister.findByCreditManager(
8
11
  operation.creditManager
9
12
  );
10
- const collateralByToken = new AddressMap();
11
- const balances = new AddressMap();
12
- const addBalance = (token, amount) => {
13
- balances.upsert(token, (balances.get(token) ?? 0n) + amount);
14
- };
13
+ const collateralBalances = new AssetsMap();
14
+ const balances = new AssetsMap();
15
15
  let debt = 0n;
16
16
  const quotas = [];
17
+ let inBracket = false;
18
+ let storeSeen = false;
17
19
  for (const op of operation.multicall) {
18
20
  switch (op.operation) {
19
- case "AddCollateral": {
20
- const balance = collateralByToken.get(op.token)?.balance ?? 0n;
21
- collateralByToken.upsert(op.token, {
22
- token: op.token,
23
- balance: balance + op.amount
24
- });
25
- addBalance(op.token, op.amount);
21
+ case "AddCollateral":
22
+ collateralBalances.inc(op.token, op.amount);
23
+ balances.inc(op.token, op.amount);
26
24
  break;
27
- }
28
25
  case "WithdrawCollateral":
29
- addBalance(op.token, -op.amount);
26
+ balances.dec(op.token, op.amount);
30
27
  break;
31
28
  case "IncreaseBorrowedAmount":
32
29
  debt += op.amount;
33
- addBalance(op.token, op.amount);
30
+ balances.inc(op.token, op.amount);
34
31
  break;
35
32
  case "DecreaseBorrowedAmount":
36
33
  debt -= op.amount;
37
- addBalance(op.token, -op.amount);
34
+ balances.dec(op.token, op.amount);
38
35
  break;
39
36
  case "UpdateQuota":
40
37
  quotas.push({ token: op.token, balance: op.change });
41
38
  break;
39
+ case "StoreExpectedBalances":
40
+ if (storeSeen) {
41
+ throw new Error(
42
+ "malformed multicall: duplicate storeExpectedBalances call"
43
+ );
44
+ }
45
+ storeSeen = true;
46
+ inBracket = true;
47
+ for (const { token, balance } of op.deltas) {
48
+ balances.inc(token, balance);
49
+ }
50
+ break;
51
+ case "CompareBalances":
52
+ if (!inBracket) {
53
+ throw new Error(
54
+ "malformed multicall: compareBalances without a preceding storeExpectedBalances"
55
+ );
56
+ }
57
+ inBracket = false;
58
+ break;
59
+ case "Execute":
60
+ if (inBracket) {
61
+ const adapter = sdk.getContract(op.adapter);
62
+ if (!(adapter instanceof AbstractAdapterContract)) {
63
+ throw new Error(
64
+ `call to ${op.adapter} between storeExpectedBalances and compareBalances is not an adapter call`
65
+ );
66
+ }
67
+ adapter.previewBalanceChanges(balances, op.calldata);
68
+ }
69
+ break;
42
70
  }
43
71
  }
44
- const collateral = collateralByToken.values();
72
+ if (inBracket) {
73
+ throw new Error(
74
+ "malformed multicall: storeExpectedBalances without a matching compareBalances"
75
+ );
76
+ }
77
+ let collateral = collateralBalances.toAssets();
45
78
  const collateralValue = collateral.reduce(
46
79
  (acc, { token, balance }) => acc + market.priceOracle.convert(token, market.underlying, balance),
47
80
  0n
48
81
  );
49
- const parsed = sdk.parseFunctionDataV2(to, calldata);
50
- const innerCalls = parsed.rawArgs.calls ?? [];
51
- const deltas = extractExpectedBalanceChanges(innerCalls) ?? [];
52
- for (const { token, balance } of deltas) {
53
- addBalance(token, balance);
54
- }
82
+ collateral = unwrapNativeCollateral(
83
+ collateral,
84
+ value,
85
+ sdk.addressProvider.getAddress(AP_WETH_TOKEN, NO_VERSION)
86
+ );
55
87
  const assets = balances.entries().filter(([, balance]) => balance > 1n).map(([token, balance]) => ({ token, balance }));
56
88
  return {
57
89
  operation: operation.operation,
90
+ creditManager: operation.creditManager,
58
91
  target: inferTargetAsset(operation.multicall, balances),
59
92
  collateral,
60
93
  collateralValue,
@@ -0,0 +1,21 @@
1
+ import { AssetsMap, NATIVE_ADDRESS } from "../../sdk/index.js";
2
+ import { InvalidTransactionValueError } from "./errors.js";
3
+ function unwrapNativeCollateral(collateral, nativeAmount, wethToken) {
4
+ if (nativeAmount === 0n) {
5
+ return collateral;
6
+ }
7
+ const balances = new AssetsMap(collateral);
8
+ const wethBalance = balances.get(wethToken) ?? 0n;
9
+ if (wethBalance < nativeAmount) {
10
+ throw new InvalidTransactionValueError(nativeAmount, wethBalance);
11
+ }
12
+ balances.upsert(
13
+ wethToken,
14
+ wethBalance === nativeAmount ? void 0 : wethBalance - nativeAmount
15
+ );
16
+ balances.inc(NATIVE_ADDRESS, nativeAmount);
17
+ return balances.toAssets();
18
+ }
19
+ export {
20
+ unwrapNativeCollateral
21
+ };
@@ -27,8 +27,7 @@ import {
27
27
  import {
28
28
  getRawPriceUpdates
29
29
  } from "../market/index.js";
30
- import { assetsMap } from "../router/index.js";
31
- import { AddressMap, AddressSet, hexEq } from "../utils/index.js";
30
+ import { AddressMap, AddressSet, AssetsMap, hexEq } from "../utils/index.js";
32
31
  import { simulateWithPriceUpdates } from "../utils/viem/index.js";
33
32
  import {
34
33
  extractPriceUpdates,
@@ -1718,10 +1717,10 @@ class CreditAccountsServiceV310 extends SDKConstruct {
1718
1717
  return calls;
1719
1718
  }
1720
1719
  #prepareUpdateQuotas(creditFacade, { averageQuota, minQuota }) {
1721
- const minRecord = assetsMap(minQuota);
1720
+ const minRecord = new AssetsMap(minQuota);
1722
1721
  const calls = averageQuota.map((q) => {
1723
- const minAsset = minRecord.get(q.token);
1724
- const min = minAsset && minAsset?.balance > 0 ? minAsset.balance : 0n;
1722
+ const minBalance = minRecord.get(q.token);
1723
+ const min = minBalance && minBalance > 0n ? minBalance : 0n;
1725
1724
  return {
1726
1725
  target: creditFacade,
1727
1726
  callData: encodeFunctionData({
@@ -234,6 +234,7 @@ class BaseContract extends Construct {
234
234
  const functionName = getFunctionSignature(this.abi, calldata);
235
235
  return this.wrapParseCallV2(
236
236
  functionName,
237
+ calldata,
237
238
  this.parseFunctionParamsV2(decoded, strict)
238
239
  );
239
240
  } catch (e) {
@@ -247,7 +248,7 @@ class BaseContract extends Construct {
247
248
  this.logger?.warn(e);
248
249
  const selector = calldata.slice(0, 10);
249
250
  const data = `0x${calldata.slice(10)}`;
250
- return this.wrapParseCallV2(`unknown function ${selector}`, {
251
+ return this.wrapParseCallV2(`unknown function ${selector}`, calldata, {
251
252
  _data: data
252
253
  });
253
254
  }
@@ -260,7 +261,7 @@ class BaseContract extends Construct {
260
261
  parseFunctionParamsV2(params, _strict) {
261
262
  return functionArgsToRecord(this.abi, params.functionName, params.args);
262
263
  }
263
- wrapParseCallV2(functionName, rawArgs) {
264
+ wrapParseCallV2(functionName, calldata, rawArgs) {
264
265
  return {
265
266
  chainId: this.chainId,
266
267
  target: this.address,
@@ -268,6 +269,7 @@ class BaseContract extends Construct {
268
269
  label: this.labelAddress(this.address, true),
269
270
  version: this.version,
270
271
  functionName,
272
+ calldata,
271
273
  rawArgs
272
274
  };
273
275
  }
@@ -161,6 +161,7 @@ class ChainContractsRegister {
161
161
  label: this.labelAddress(address, true),
162
162
  version: 0,
163
163
  functionName: `unknown function ${selector}`,
164
+ calldata,
164
165
  rawArgs: { _data: data }
165
166
  };
166
167
  }
@@ -1,6 +1,8 @@
1
- import { BaseContract } from "../base/index.js";
1
+ import {
2
+ BaseContract
3
+ } from "../base/index.js";
2
4
  import { PERCENTAGE_FACTOR } from "../constants/math.js";
3
- import { AddressMap, AddressSet, formatBN, isDust } from "../utils/index.js";
5
+ import { AddressSet, AssetsMap, formatBN, isDust } from "../utils/index.js";
4
6
  import { limitLeftover } from "./helpers.js";
5
7
  class AbstractRouterContract extends BaseContract {
6
8
  /**
@@ -18,15 +20,15 @@ class AbstractRouterContract extends BaseContract {
18
20
  options.debtOnly
19
21
  );
20
22
  const { leftoverBalances, expectedBalances, tokensToClaim } = b;
21
- const expected = new AddressMap();
22
- const leftover = new AddressMap();
23
+ const expected = new AssetsMap();
24
+ const leftover = new AssetsMap();
23
25
  for (const token of cm.collateralTokens) {
24
- const actual = expectedBalances.get(token)?.balance || 0n;
25
- expected.upsert(token, { token, balance: actual > 10n ? actual : 0n });
26
- leftover.upsert(token, {
26
+ const actual = expectedBalances.get(token) || 0n;
27
+ expected.upsert(token, actual > 10n ? actual : 0n);
28
+ leftover.upsert(
27
29
  token,
28
- balance: limitLeftover(leftoverBalances.get(token)?.balance || 1n, token) ?? 1n
29
- });
30
+ limitLeftover(leftoverBalances.get(token) || 1n, token) ?? 1n
31
+ );
30
32
  }
31
33
  return {
32
34
  expectedBalances: expected,
@@ -35,8 +37,8 @@ class AbstractRouterContract extends BaseContract {
35
37
  };
36
38
  }
37
39
  getDefaultExpectedAndLeftover(ca, keepAssets, debtOnly) {
38
- const expectedBalances = new AddressMap();
39
- const leftoverBalances = new AddressMap();
40
+ const expectedBalances = new AssetsMap();
41
+ const leftoverBalances = new AssetsMap();
40
42
  const keepAssetsSet = new AddressSet(keepAssets);
41
43
  if (debtOnly) {
42
44
  const result = this.getLeftoversAfterBuyingDebt(ca, keepAssetsSet);
@@ -48,23 +50,23 @@ class AbstractRouterContract extends BaseContract {
48
50
  }
49
51
  for (const { token, balance, mask } of ca.tokens) {
50
52
  const isEnabled = (mask & ca.enabledTokensMask) !== 0n;
51
- expectedBalances.upsert(token, { token, balance });
53
+ expectedBalances.upsert(token, balance);
52
54
  if (keepAssetsSet.has(token) || !isEnabled || isDust({
53
55
  sdk: this.sdk,
54
56
  token,
55
57
  balance,
56
58
  creditManager: ca.creditManager
57
59
  })) {
58
- leftoverBalances.upsert(token, {
60
+ leftoverBalances.upsert(
59
61
  token,
60
- balance: limitLeftover(balance, token) ?? balance
61
- });
62
+ limitLeftover(balance, token) ?? balance
63
+ );
62
64
  }
63
65
  }
64
66
  return {
65
67
  expectedBalances,
66
68
  leftoverBalances,
67
- tokensToClaim: new AddressMap()
69
+ tokensToClaim: new AssetsMap()
68
70
  };
69
71
  }
70
72
  /**
@@ -77,16 +79,13 @@ class AbstractRouterContract extends BaseContract {
77
79
  const { priceOracle } = this.sdk.marketRegister.findByCreditManager(
78
80
  ca.creditManager
79
81
  );
80
- const expectedBalances = new AddressMap();
81
- const leftoverBalances = new AddressMap();
82
+ const expectedBalances = new AssetsMap();
83
+ const leftoverBalances = new AssetsMap();
82
84
  const usdBalances = [];
83
85
  for (const { token, balance, mask } of ca.tokens) {
84
86
  const isEnabled = (mask & ca.enabledTokensMask) !== 0n;
85
- expectedBalances.upsert(token, { token, balance });
86
- leftoverBalances.upsert(token, {
87
- token,
88
- balance: limitLeftover(balance, token) ?? balance
89
- });
87
+ expectedBalances.upsert(token, balance);
88
+ leftoverBalances.upsert(token, limitLeftover(balance, token) ?? balance);
90
89
  if (isEnabled && !keepAssets.has(token)) {
91
90
  usdBalances.push({
92
91
  token,
@@ -116,15 +115,12 @@ class AbstractRouterContract extends BaseContract {
116
115
  if (tokenAmount === 0n) {
117
116
  return void 0;
118
117
  }
119
- let leftoverBalance = leftoverBalances.get(highestToken.token)?.balance ?? 0n;
118
+ let leftoverBalance = leftoverBalances.get(highestToken.token) ?? 0n;
120
119
  leftoverBalance -= tokenAmount;
121
120
  if (leftoverBalance < 0n) {
122
121
  return void 0;
123
122
  }
124
- leftoverBalances.upsert(highestToken.token, {
125
- token: highestToken.token,
126
- balance: leftoverBalance
127
- });
123
+ leftoverBalances.upsert(highestToken.token, leftoverBalance);
128
124
  const tokenAmountStr = this.sdk.tokensMeta.formatBN(
129
125
  highestToken.token,
130
126
  tokenAmount,
@@ -137,7 +133,7 @@ class AbstractRouterContract extends BaseContract {
137
133
  return {
138
134
  expectedBalances,
139
135
  leftoverBalances,
140
- tokensToClaim: new AddressMap()
136
+ tokensToClaim: new AssetsMap()
141
137
  };
142
138
  }
143
139
  safeConvertToUSD(priceOracle, token, balance) {
@@ -1,10 +1,9 @@
1
1
  import { getAddress } from "viem";
2
2
  import { gearboxRouterAbi } from "../../abi/router/gearboxRouter.js";
3
- import { AddressMap } from "../utils/AddressMap.js";
4
3
  import { formatBN } from "../utils/formatter.js";
5
- import { isDust } from "../utils/index.js";
4
+ import { AddressMap, AssetsMap, isDust } from "../utils/index.js";
6
5
  import { AbstractRouterContract } from "./AbstractRouterContract.js";
7
- import { assetsMap, balancesMap, limitLeftover } from "./helpers.js";
6
+ import { limitLeftover } from "./helpers.js";
8
7
  const abi = gearboxRouterAbi;
9
8
  class RouterV310Contract extends AbstractRouterContract {
10
9
  #numSplits = new AddressMap();
@@ -71,8 +70,8 @@ class RouterV310Contract extends AbstractRouterContract {
71
70
  slippage
72
71
  } = props;
73
72
  const [expectedMap, leftoverMap] = [
74
- balancesMap(expectedBalances),
75
- balancesMap(leftoverBalances)
73
+ new AssetsMap(expectedBalances),
74
+ new AssetsMap(leftoverBalances)
76
75
  ];
77
76
  const getNumSplits = this.#numSplitsGetter(cm, expectedBalances);
78
77
  const tData = cm.collateralTokens.map(
@@ -157,22 +156,22 @@ class RouterV310Contract extends AbstractRouterContract {
157
156
  } = props;
158
157
  const { expectedBalances, leftoverBalances, tokensToClaim } = this.getExpectedAndLeftover(ca, cm, {
159
158
  balances: balances ? {
160
- expectedBalances: assetsMap(balances.expectedBalances),
161
- leftoverBalances: assetsMap(balances.leftoverBalances),
162
- tokensToClaim: assetsMap(balances.tokensToClaim || [])
159
+ expectedBalances: new AssetsMap(balances.expectedBalances),
160
+ leftoverBalances: new AssetsMap(balances.leftoverBalances),
161
+ tokensToClaim: new AssetsMap(balances.tokensToClaim || [])
163
162
  } : void 0,
164
163
  keepAssets: balances ? void 0 : keepAssets,
165
164
  debtOnly
166
165
  });
167
- const getNumSplits = this.#numSplitsGetter(cm, expectedBalances.values());
166
+ const getNumSplits = this.#numSplitsGetter(cm, expectedBalances.toAssets());
168
167
  const tData = [];
169
168
  for (const token of cm.collateralTokens) {
170
169
  tData.push({
171
170
  token,
172
- balance: expectedBalances.get(token)?.balance || 0n,
173
- leftoverBalance: limitLeftover(leftoverBalances.get(token)?.balance, token) ?? 0n,
171
+ balance: expectedBalances.get(token) || 0n,
172
+ leftoverBalance: limitLeftover(leftoverBalances.get(token), token) ?? 0n,
174
173
  numSplits: getNumSplits(token),
175
- claimRewards: !!tokensToClaim.get(token)
174
+ claimRewards: tokensToClaim.has(token)
176
175
  });
177
176
  }
178
177
  this.logger?.debug(
@@ -1,7 +1,4 @@
1
1
  import { AddressMap } from "../utils/index.js";
2
- function balancesMap(assets) {
3
- return new AddressMap(assets.map(({ token, balance }) => [token, balance]));
4
- }
5
2
  function assetsMap(assets) {
6
3
  return new AddressMap(assets.map((a) => [a.token, a]));
7
4
  }
@@ -16,6 +13,5 @@ function limitLeftover(balance, token) {
16
13
  }
17
14
  export {
18
15
  assetsMap,
19
- balancesMap,
20
16
  limitLeftover
21
17
  };
@@ -113,6 +113,12 @@ class AddressMap {
113
113
  keys() {
114
114
  return Array.from(this.#map.keys());
115
115
  }
116
+ /**
117
+ * Returns an unfrozen shallow copy of the map.
118
+ **/
119
+ clone() {
120
+ return new AddressMap(this.entries(), this.name);
121
+ }
116
122
  /**
117
123
  * Converts the map to a plain `Record<Address, T>` object.
118
124
  **/
@@ -0,0 +1,37 @@
1
+ import { AddressMap } from "./AddressMap.js";
2
+ class AssetsMap extends AddressMap {
3
+ /**
4
+ * @param entries - Optional initial entries as `[address, balance]` tuples or {@link Asset} objects.
5
+ * @param name - Optional label used in error messages when a lookup fails.
6
+ */
7
+ constructor(entries, name) {
8
+ super(
9
+ entries?.map((e) => Array.isArray(e) ? e : [e.token, e.balance]),
10
+ name
11
+ );
12
+ }
13
+ /**
14
+ * Adds `amount` to the token balance, treating a missing key as `0n`.
15
+ */
16
+ inc(address, amount) {
17
+ this.upsert(address, (this.get(address) ?? 0n) + amount);
18
+ }
19
+ /**
20
+ * Subtracts `amount` from the token balance, treating a missing key as `0n`.
21
+ */
22
+ dec(address, amount) {
23
+ this.inc(address, -amount);
24
+ }
25
+ /**
26
+ * Converts the map to an array of {@link Asset} objects.
27
+ */
28
+ toAssets() {
29
+ return this.entries().map(([token, balance]) => ({ token, balance }));
30
+ }
31
+ clone() {
32
+ return new AssetsMap(this.entries(), this.name);
33
+ }
34
+ }
35
+ export {
36
+ AssetsMap
37
+ };
@@ -1,5 +1,6 @@
1
1
  export * from "./AddressMap.js";
2
2
  export * from "./AddressSet.js";
3
+ export * from "./AssetsMap.js";
3
4
  export * from "./abi-decode.js";
4
5
  export * from "./bytes32ToString.js";
5
6
  export * from "./childLogger.js";
@@ -1,3 +1,3 @@
1
1
  import type { Address } from "viem";
2
- import type { Asset } from "../../../../sdk/router/types.js";
2
+ import type { Asset } from "../../../../sdk/index.js";
3
3
  export declare function getDefaultAsset(token: Address): Omit<Asset, "balance">;
@@ -1,5 +1,5 @@
1
1
  import type { Address } from "viem";
2
- import type { Asset } from "../../../../sdk/router/types.js";
2
+ import type { Asset } from "../../../../sdk/index.js";
3
3
  import type { TokenSlice } from "../strategy-info/types.js";
4
4
  export interface GetWalletBalancesAllowedOnCMProps {
5
5
  walletBalances: Record<Address, bigint> | undefined;
@@ -1,5 +1,5 @@
1
1
  import type { Address } from "viem";
2
- import type { Asset } from "../../../../sdk/router/types.js";
2
+ import type { Asset } from "../../../../sdk/index.js";
3
3
  import type { QuotaSlice, TokenSlice } from "./types.js";
4
4
  export interface TotalAPY {
5
5
  overallAPY: number | undefined | null;
@@ -1,5 +1,5 @@
1
1
  import type { Address } from "viem";
2
- import type { Asset } from "../../../../sdk/router/types.js";
2
+ import type { Asset } from "../../../../sdk/index.js";
3
3
  import type { LocalDebtReward, LocalPointsInfo, LocalPointsReward } from "../types/points-slices.js";
4
4
  import type { TokenSlice } from "./types.js";
5
5
  export interface PointsData {
@@ -1,5 +1,5 @@
1
1
  import type { Address } from "viem";
2
- import type { Asset } from "../../../../sdk/router/types.js";
2
+ import type { Asset } from "../../../../sdk/index.js";
3
3
  import type { TokenSlice } from "../strategy-info/types.js";
4
4
  export declare function addAmountInTarget<T extends Asset>(asset: T, tokensList: Record<Address, TokenSlice>, prices: Record<Address, bigint>, toPrice: bigint, toDecimals: number): T & {
5
5
  amountInTarget: bigint;
@@ -1,5 +1,5 @@
1
1
  import type { Address } from "viem";
2
- import type { Asset } from "../../../../sdk/router/types.js";
2
+ import type { Asset } from "../../../../sdk/index.js";
3
3
  import type { TokenSlice } from "../strategy-info/types.js";
4
4
  export interface AddAmountInTargetProps<T> {
5
5
  assets: Array<T>;
@@ -1,4 +1,4 @@
1
- import type { Asset } from "../../../../sdk/router/types.js";
1
+ import type { Asset } from "../../../../sdk/index.js";
2
2
  import type { calculateEarnings } from "../../apy/calculate-earnings.js";
3
3
  import type { Strategy } from "../../strategies/types/strategy.js";
4
4
  import type { calculateTotalAPY } from "../strategy-info/calculate-total-apy.js";
@@ -1,5 +1,5 @@
1
1
  import type { Address } from "viem";
2
- import type { Asset } from "../../../sdk/router/types.js";
2
+ import type { Asset } from "../../../sdk/index.js";
3
3
  import type { ValidateBalanceResult } from "./validate-balance.js";
4
4
  export interface ValidateBalancesProps {
5
5
  balances: Record<Address, bigint>;
@@ -1,5 +1,5 @@
1
1
  import type { Address } from "viem";
2
- import type { Asset } from "../../../sdk/router/types.js";
2
+ import type { Asset } from "../../../sdk/index.js";
3
3
  import type { CreditManagerSlice } from "../strategies/strategy-info/types.js";
4
4
  import type { ValidateQuotaResult } from "./validate-quota.js";
5
5
  export interface ValidateOpenAccountProps {
@@ -1,5 +1,5 @@
1
1
  import type { Address } from "viem";
2
- import type { Asset } from "../../../sdk/router/types.js";
2
+ import type { Asset } from "../../../sdk/index.js";
3
3
  import type { CreditManagerSlice } from "../strategies/strategy-info/types.js";
4
4
  export interface ValidateQuotaProps {
5
5
  desiredQuota: Record<Address, Asset>;
@@ -1,5 +1,5 @@
1
1
  import type { Address } from "viem";
2
- import type { Asset } from "../../../sdk/router/types.js";
2
+ import type { Asset } from "../../../sdk/index.js";
3
3
  export interface ValidateTokenToObtainProps {
4
4
  targetToken: Address | Array<Asset> | null;
5
5
  creditManager: {