@gearbox-protocol/sdk 14.12.0-next.23 → 14.12.0-next.25

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 (100) hide show
  1. package/dist/cjs/dev/withdrawalUtils.js +35 -28
  2. package/dist/cjs/plugins/adapters/contracts/AbstractAdapter.js +31 -9
  3. package/dist/cjs/plugins/adapters/contracts/AbstractCurveAdapter.js +8 -5
  4. package/dist/cjs/plugins/adapters/contracts/BalancerV3RouterAdapterContract.js +6 -4
  5. package/dist/cjs/plugins/adapters/contracts/BalancerV3WrapperAdapterContract.js +6 -4
  6. package/dist/cjs/plugins/adapters/contracts/CamelotV3AdapterContract.js +6 -9
  7. package/dist/cjs/plugins/adapters/contracts/ConvexV1BaseRewardPoolAdapterContract.js +7 -5
  8. package/dist/cjs/plugins/adapters/contracts/ConvexV1BoosterAdapterContract.js +6 -4
  9. package/dist/cjs/plugins/adapters/contracts/DaiUsdsAdapterContract.js +6 -4
  10. package/dist/cjs/plugins/adapters/contracts/ERC4626AdapterContract.js +13 -4
  11. package/dist/cjs/plugins/adapters/contracts/ERC4626ReferralAdapterContract.js +6 -4
  12. package/dist/cjs/plugins/adapters/contracts/FluidDexAdapterContract.js +8 -8
  13. package/dist/cjs/plugins/adapters/contracts/InfinifiGatewayAdapterContract.js +8 -5
  14. package/dist/cjs/plugins/adapters/contracts/KelpLRTDepositPoolAdapterContract.js +4 -3
  15. package/dist/cjs/plugins/adapters/contracts/LidoV1AdapterContract.js +4 -3
  16. package/dist/cjs/plugins/adapters/contracts/MellowClaimerAdapterContract.js +29 -0
  17. package/dist/cjs/plugins/adapters/contracts/MellowDVVAdapterContract.js +6 -4
  18. package/dist/cjs/plugins/adapters/contracts/MellowERC4626VaultAdapterContract.js +11 -4
  19. package/dist/cjs/plugins/adapters/contracts/MellowWrapperAdapterContract.js +4 -3
  20. package/dist/cjs/plugins/adapters/contracts/MidasGatewayAdapterContract.js +31 -4
  21. package/dist/cjs/plugins/adapters/contracts/MidasIssuanceVaultAdapterContract.js +4 -3
  22. package/dist/cjs/plugins/adapters/contracts/MidasRedemptionVaultAdapterContract.js +4 -3
  23. package/dist/cjs/plugins/adapters/contracts/PendleRouterAdapterContract.js +14 -16
  24. package/dist/cjs/plugins/adapters/contracts/SecuritizeOnRampAdapterContract.js +4 -3
  25. package/dist/cjs/plugins/adapters/contracts/SecuritizeRedemptionGatewayAdapterContract.js +14 -13
  26. package/dist/cjs/plugins/adapters/contracts/StakingRewardsAdapterContract.js +7 -5
  27. package/dist/cjs/plugins/adapters/contracts/TraderJoeRouterAdapterContract.js +4 -3
  28. package/dist/cjs/plugins/adapters/contracts/UniswapV2AdapterContract.js +4 -3
  29. package/dist/cjs/plugins/adapters/contracts/UniswapV3AdapterContract.js +6 -9
  30. package/dist/cjs/plugins/adapters/contracts/UniswapV4AdapterContract.js +8 -8
  31. package/dist/cjs/plugins/adapters/contracts/UpshiftVaultAdapterContract.js +6 -4
  32. package/dist/cjs/plugins/adapters/contracts/VelodromeV2AdapterContract.js +4 -3
  33. package/dist/cjs/plugins/adapters/contracts/WstETHV1AdapterContract.js +6 -4
  34. package/dist/esm/dev/withdrawalUtils.js +35 -28
  35. package/dist/esm/plugins/adapters/contracts/AbstractAdapter.js +31 -9
  36. package/dist/esm/plugins/adapters/contracts/AbstractCurveAdapter.js +8 -5
  37. package/dist/esm/plugins/adapters/contracts/BalancerV3RouterAdapterContract.js +6 -4
  38. package/dist/esm/plugins/adapters/contracts/BalancerV3WrapperAdapterContract.js +6 -4
  39. package/dist/esm/plugins/adapters/contracts/CamelotV3AdapterContract.js +6 -9
  40. package/dist/esm/plugins/adapters/contracts/ConvexV1BaseRewardPoolAdapterContract.js +7 -5
  41. package/dist/esm/plugins/adapters/contracts/ConvexV1BoosterAdapterContract.js +6 -4
  42. package/dist/esm/plugins/adapters/contracts/DaiUsdsAdapterContract.js +6 -4
  43. package/dist/esm/plugins/adapters/contracts/ERC4626AdapterContract.js +13 -4
  44. package/dist/esm/plugins/adapters/contracts/ERC4626ReferralAdapterContract.js +6 -4
  45. package/dist/esm/plugins/adapters/contracts/FluidDexAdapterContract.js +8 -8
  46. package/dist/esm/plugins/adapters/contracts/InfinifiGatewayAdapterContract.js +8 -5
  47. package/dist/esm/plugins/adapters/contracts/KelpLRTDepositPoolAdapterContract.js +4 -3
  48. package/dist/esm/plugins/adapters/contracts/LidoV1AdapterContract.js +4 -3
  49. package/dist/esm/plugins/adapters/contracts/MellowClaimerAdapterContract.js +32 -1
  50. package/dist/esm/plugins/adapters/contracts/MellowDVVAdapterContract.js +6 -4
  51. package/dist/esm/plugins/adapters/contracts/MellowERC4626VaultAdapterContract.js +11 -4
  52. package/dist/esm/plugins/adapters/contracts/MellowWrapperAdapterContract.js +4 -3
  53. package/dist/esm/plugins/adapters/contracts/MidasGatewayAdapterContract.js +33 -5
  54. package/dist/esm/plugins/adapters/contracts/MidasIssuanceVaultAdapterContract.js +4 -3
  55. package/dist/esm/plugins/adapters/contracts/MidasRedemptionVaultAdapterContract.js +4 -3
  56. package/dist/esm/plugins/adapters/contracts/PendleRouterAdapterContract.js +14 -16
  57. package/dist/esm/plugins/adapters/contracts/SecuritizeOnRampAdapterContract.js +4 -3
  58. package/dist/esm/plugins/adapters/contracts/SecuritizeRedemptionGatewayAdapterContract.js +14 -13
  59. package/dist/esm/plugins/adapters/contracts/StakingRewardsAdapterContract.js +7 -5
  60. package/dist/esm/plugins/adapters/contracts/TraderJoeRouterAdapterContract.js +4 -3
  61. package/dist/esm/plugins/adapters/contracts/UniswapV2AdapterContract.js +4 -3
  62. package/dist/esm/plugins/adapters/contracts/UniswapV3AdapterContract.js +6 -9
  63. package/dist/esm/plugins/adapters/contracts/UniswapV4AdapterContract.js +8 -8
  64. package/dist/esm/plugins/adapters/contracts/UpshiftVaultAdapterContract.js +6 -4
  65. package/dist/esm/plugins/adapters/contracts/VelodromeV2AdapterContract.js +4 -3
  66. package/dist/esm/plugins/adapters/contracts/WstETHV1AdapterContract.js +6 -4
  67. package/dist/types/plugins/adapters/contracts/AbstractAdapter.d.ts +27 -7
  68. package/dist/types/plugins/adapters/contracts/AbstractCurveAdapter.d.ts +2 -3
  69. package/dist/types/plugins/adapters/contracts/BalancerV3RouterAdapterContract.d.ts +2 -3
  70. package/dist/types/plugins/adapters/contracts/BalancerV3WrapperAdapterContract.d.ts +2 -3
  71. package/dist/types/plugins/adapters/contracts/CamelotV3AdapterContract.d.ts +2 -3
  72. package/dist/types/plugins/adapters/contracts/ConvexV1BaseRewardPoolAdapterContract.d.ts +2 -3
  73. package/dist/types/plugins/adapters/contracts/ConvexV1BoosterAdapterContract.d.ts +2 -3
  74. package/dist/types/plugins/adapters/contracts/DaiUsdsAdapterContract.d.ts +2 -3
  75. package/dist/types/plugins/adapters/contracts/ERC4626AdapterContract.d.ts +2 -3
  76. package/dist/types/plugins/adapters/contracts/ERC4626ReferralAdapterContract.d.ts +2 -3
  77. package/dist/types/plugins/adapters/contracts/FluidDexAdapterContract.d.ts +2 -3
  78. package/dist/types/plugins/adapters/contracts/InfinifiGatewayAdapterContract.d.ts +2 -3
  79. package/dist/types/plugins/adapters/contracts/KelpLRTDepositPoolAdapterContract.d.ts +2 -3
  80. package/dist/types/plugins/adapters/contracts/LidoV1AdapterContract.d.ts +2 -3
  81. package/dist/types/plugins/adapters/contracts/MellowClaimerAdapterContract.d.ts +3 -2
  82. package/dist/types/plugins/adapters/contracts/MellowDVVAdapterContract.d.ts +2 -3
  83. package/dist/types/plugins/adapters/contracts/MellowERC4626VaultAdapterContract.d.ts +2 -3
  84. package/dist/types/plugins/adapters/contracts/MellowWrapperAdapterContract.d.ts +2 -3
  85. package/dist/types/plugins/adapters/contracts/MidasGatewayAdapterContract.d.ts +2 -3
  86. package/dist/types/plugins/adapters/contracts/MidasIssuanceVaultAdapterContract.d.ts +2 -3
  87. package/dist/types/plugins/adapters/contracts/MidasRedemptionVaultAdapterContract.d.ts +2 -3
  88. package/dist/types/plugins/adapters/contracts/PendleRouterAdapterContract.d.ts +2 -3
  89. package/dist/types/plugins/adapters/contracts/SecuritizeOnRampAdapterContract.d.ts +2 -3
  90. package/dist/types/plugins/adapters/contracts/SecuritizeRedemptionGatewayAdapterContract.d.ts +2 -3
  91. package/dist/types/plugins/adapters/contracts/StakingRewardsAdapterContract.d.ts +2 -3
  92. package/dist/types/plugins/adapters/contracts/TraderJoeRouterAdapterContract.d.ts +2 -3
  93. package/dist/types/plugins/adapters/contracts/UniswapV2AdapterContract.d.ts +2 -3
  94. package/dist/types/plugins/adapters/contracts/UniswapV3AdapterContract.d.ts +2 -3
  95. package/dist/types/plugins/adapters/contracts/UniswapV4AdapterContract.d.ts +2 -3
  96. package/dist/types/plugins/adapters/contracts/UpshiftVaultAdapterContract.d.ts +2 -3
  97. package/dist/types/plugins/adapters/contracts/VelodromeV2AdapterContract.d.ts +2 -3
  98. package/dist/types/plugins/adapters/contracts/WstETHV1AdapterContract.d.ts +2 -3
  99. package/dist/types/plugins/adapters/types.d.ts +0 -10
  100. package/package.json +1 -1
@@ -34,19 +34,21 @@ class BalancerV3WrapperAdapterContract extends AbstractAdapterContract {
34
34
  balancerPoolToken: this.#balancerPoolToken ? this.labelAddress(this.#balancerPoolToken) : void 0
35
35
  };
36
36
  }
37
- decodeDiffLeftovers(decoded, balances) {
37
+ applyBalanceChanges(balances, decoded) {
38
38
  switch (decoded.functionName) {
39
39
  // mint spends the pool token, burn spends the wrapper (target contract)
40
40
  case "mintDiff": {
41
41
  const [leftoverAmount] = decoded.args;
42
- return [{ tokenIn: this.balancerPoolToken, leftoverAmount }];
42
+ this.setLeftover(balances, this.balancerPoolToken, leftoverAmount);
43
+ break;
43
44
  }
44
45
  case "burnDiff": {
45
46
  const [leftoverAmount] = decoded.args;
46
- return [{ tokenIn: this.targetContract, leftoverAmount }];
47
+ this.setLeftover(balances, this.targetContract, leftoverAmount);
48
+ break;
47
49
  }
48
50
  default:
49
- return super.decodeDiffLeftovers(decoded, balances);
51
+ super.applyBalanceChanges(balances, decoded);
50
52
  }
51
53
  }
52
54
  }
@@ -47,24 +47,21 @@ class CamelotV3AdapterContract extends AbstractAdapterContract {
47
47
  }))
48
48
  };
49
49
  }
50
- decodeDiffLeftovers(decoded, balances) {
50
+ applyBalanceChanges(balances, decoded) {
51
51
  switch (decoded.functionName) {
52
52
  case "exactDiffInputSingle": {
53
53
  const [params] = decoded.args;
54
- return [
55
- {
56
- tokenIn: params.tokenIn,
57
- leftoverAmount: params.leftoverAmount
58
- }
59
- ];
54
+ this.setLeftover(balances, params.tokenIn, params.leftoverAmount);
55
+ break;
60
56
  }
61
57
  case "exactDiffInput": {
62
58
  const [params] = decoded.args;
63
59
  const tokenIn = `0x${params.path.replace("0x", "").slice(0, 40)}`;
64
- return [{ tokenIn, leftoverAmount: params.leftoverAmount }];
60
+ this.setLeftover(balances, tokenIn, params.leftoverAmount);
61
+ break;
65
62
  }
66
63
  default:
67
- return super.decodeDiffLeftovers(decoded, balances);
64
+ super.applyBalanceChanges(balances, decoded);
68
65
  }
69
66
  }
70
67
  }
@@ -116,22 +116,24 @@ class ConvexV1BaseRewardPoolAdapterContract extends AbstractAdapterContract {
116
116
  withdrawAmount: swap.toAmount
117
117
  };
118
118
  }
119
- decodeDiffLeftovers(decoded, balances) {
119
+ applyBalanceChanges(balances, decoded) {
120
120
  switch (decoded.functionName) {
121
121
  case "stakeDiff": {
122
122
  const [leftoverAmount] = decoded.args;
123
- return [{ tokenIn: this.stakingToken, leftoverAmount }];
123
+ this.setLeftover(balances, this.stakingToken, leftoverAmount);
124
+ break;
124
125
  }
125
126
  case "withdrawDiff":
126
127
  case "withdrawDiffAndUnwrap": {
127
128
  const [leftoverAmount] = decoded.args;
128
- return [{ tokenIn: this.stakedPhantomToken, leftoverAmount }];
129
+ this.setLeftover(balances, this.stakedPhantomToken, leftoverAmount);
130
+ break;
129
131
  }
130
132
  // no accrued rewards on a freshly opened account
131
133
  case "getReward":
132
- return [];
134
+ break;
133
135
  default:
134
- return super.decodeDiffLeftovers(decoded, balances);
136
+ super.applyBalanceChanges(balances, decoded);
135
137
  }
136
138
  }
137
139
  }
@@ -83,21 +83,23 @@ class ConvexV1BoosterAdapterContract extends AbstractAdapterContract {
83
83
  }
84
84
  return super.classifyLegacyOperation(parsed, transfers);
85
85
  }
86
- decodeDiffLeftovers(decoded, balances) {
86
+ applyBalanceChanges(balances, decoded) {
87
87
  switch (decoded.functionName) {
88
88
  // deposit spends the curve LP token, withdraw spends the convex token
89
89
  case "depositDiff": {
90
90
  const [pid, leftoverAmount] = decoded.args;
91
91
  const pool = this.#mustFindPool(Number(pid));
92
- return [{ tokenIn: pool.curveToken, leftoverAmount }];
92
+ this.setLeftover(balances, pool.curveToken, leftoverAmount);
93
+ break;
93
94
  }
94
95
  case "withdrawDiff": {
95
96
  const [pid, leftoverAmount] = decoded.args;
96
97
  const pool = this.#mustFindPool(Number(pid));
97
- return [{ tokenIn: pool.convexToken, leftoverAmount }];
98
+ this.setLeftover(balances, pool.convexToken, leftoverAmount);
99
+ break;
98
100
  }
99
101
  default:
100
- return super.decodeDiffLeftovers(decoded, balances);
102
+ super.applyBalanceChanges(balances, decoded);
101
103
  }
102
104
  }
103
105
  #mustFindPool(pid) {
@@ -55,18 +55,20 @@ class DaiUsdsAdapterContract extends AbstractAdapterContract {
55
55
  }
56
56
  return super.classifyLegacyOperation(parsed, transfers);
57
57
  }
58
- decodeDiffLeftovers(decoded, balances) {
58
+ applyBalanceChanges(balances, decoded) {
59
59
  switch (decoded.functionName) {
60
60
  case "daiToUsdsDiff": {
61
61
  const [leftoverAmount] = decoded.args;
62
- return [{ tokenIn: this.dai, leftoverAmount }];
62
+ this.setLeftover(balances, this.dai, leftoverAmount);
63
+ break;
63
64
  }
64
65
  case "usdsToDaiDiff": {
65
66
  const [leftoverAmount] = decoded.args;
66
- return [{ tokenIn: this.usds, leftoverAmount }];
67
+ this.setLeftover(balances, this.usds, leftoverAmount);
68
+ break;
67
69
  }
68
70
  default:
69
- return super.decodeDiffLeftovers(decoded, balances);
71
+ super.applyBalanceChanges(balances, decoded);
70
72
  }
71
73
  }
72
74
  }
@@ -81,18 +81,27 @@ class ERC4626AdapterContract extends AbstractAdapterContract {
81
81
  }
82
82
  return super.classifyLegacyOperation(parsed, transfers);
83
83
  }
84
- decodeDiffLeftovers(decoded, balances) {
84
+ applyBalanceChanges(balances, decoded) {
85
85
  switch (decoded.functionName) {
86
86
  case "depositDiff": {
87
87
  const [leftoverAmount] = decoded.args;
88
- return [{ tokenIn: this.asset, leftoverAmount }];
88
+ this.setLeftover(balances, this.asset, leftoverAmount);
89
+ break;
89
90
  }
90
91
  case "redeemDiff": {
91
92
  const [leftoverAmount] = decoded.args;
92
- return [{ tokenIn: this.share, leftoverAmount }];
93
+ this.setLeftover(balances, this.share, leftoverAmount);
94
+ break;
93
95
  }
96
+ case "redeem": {
97
+ const [shares] = decoded.args;
98
+ this.spendExact(balances, this.share, shares);
99
+ break;
100
+ }
101
+ // `withdraw`/`deposit`/`mint` stay unsupported: they are not emitted
102
+ // by the router (which uses diff variants) or the withdrawal compressor
94
103
  default:
95
- return super.decodeDiffLeftovers(decoded, balances);
104
+ super.applyBalanceChanges(balances, decoded);
96
105
  }
97
106
  }
98
107
  }
@@ -55,18 +55,20 @@ class ERC4626ReferralAdapterContract extends AbstractAdapterContract {
55
55
  }
56
56
  return super.classifyLegacyOperation(parsed, transfers);
57
57
  }
58
- decodeDiffLeftovers(decoded, balances) {
58
+ applyBalanceChanges(balances, decoded) {
59
59
  switch (decoded.functionName) {
60
60
  case "depositDiff": {
61
61
  const [leftoverAmount] = decoded.args;
62
- return [{ tokenIn: this.asset, leftoverAmount }];
62
+ this.setLeftover(balances, this.asset, leftoverAmount);
63
+ break;
63
64
  }
64
65
  case "redeemDiff": {
65
66
  const [leftoverAmount] = decoded.args;
66
- return [{ tokenIn: this.targetContract, leftoverAmount }];
67
+ this.setLeftover(balances, this.targetContract, leftoverAmount);
68
+ break;
67
69
  }
68
70
  default:
69
- return super.decodeDiffLeftovers(decoded, balances);
71
+ super.applyBalanceChanges(balances, decoded);
70
72
  }
71
73
  }
72
74
  }
@@ -43,19 +43,19 @@ class FluidDexAdapterContract extends AbstractAdapterContract {
43
43
  token1: this.#token1 ? this.labelAddress(this.#token1) : void 0
44
44
  };
45
45
  }
46
- decodeDiffLeftovers(decoded, balances) {
46
+ applyBalanceChanges(balances, decoded) {
47
47
  switch (decoded.functionName) {
48
48
  case "swapInDiff": {
49
49
  const [swap0to1, leftoverAmount] = decoded.args;
50
- return [
51
- {
52
- tokenIn: swap0to1 ? this.token0 : this.token1,
53
- leftoverAmount
54
- }
55
- ];
50
+ this.setLeftover(
51
+ balances,
52
+ swap0to1 ? this.token0 : this.token1,
53
+ leftoverAmount
54
+ );
55
+ break;
56
56
  }
57
57
  default:
58
- return super.decodeDiffLeftovers(decoded, balances);
58
+ super.applyBalanceChanges(balances, decoded);
59
59
  }
60
60
  }
61
61
  }
@@ -65,25 +65,28 @@ class InfinifiGatewayAdapterContract extends AbstractAdapterContract {
65
65
  )
66
66
  };
67
67
  }
68
- decodeDiffLeftovers(decoded, balances) {
68
+ applyBalanceChanges(balances, decoded) {
69
69
  switch (decoded.functionName) {
70
70
  case "mintDiff": {
71
71
  const [leftoverAmount] = decoded.args;
72
- return [{ tokenIn: this.usdc, leftoverAmount }];
72
+ this.setLeftover(balances, this.usdc, leftoverAmount);
73
+ break;
73
74
  }
74
75
  // redeem, stake and lock all spend iUSD
75
76
  case "redeemDiff":
76
77
  case "stakeDiff":
77
78
  case "createPositionDiff": {
78
79
  const [leftoverAmount] = decoded.args;
79
- return [{ tokenIn: this.iusd, leftoverAmount }];
80
+ this.setLeftover(balances, this.iusd, leftoverAmount);
81
+ break;
80
82
  }
81
83
  case "unstakeDiff": {
82
84
  const [leftoverAmount] = decoded.args;
83
- return [{ tokenIn: this.siusd, leftoverAmount }];
85
+ this.setLeftover(balances, this.siusd, leftoverAmount);
86
+ break;
84
87
  }
85
88
  default:
86
- return super.decodeDiffLeftovers(decoded, balances);
89
+ super.applyBalanceChanges(balances, decoded);
87
90
  }
88
91
  }
89
92
  }
@@ -38,14 +38,15 @@ class KelpLRTDepositPoolAdapterContract extends AbstractAdapterContract {
38
38
  allowedAssets: this.#allowedAssets?.map((a) => this.labelAddress(a))
39
39
  };
40
40
  }
41
- decodeDiffLeftovers(decoded, balances) {
41
+ applyBalanceChanges(balances, decoded) {
42
42
  switch (decoded.functionName) {
43
43
  case "depositAssetDiff": {
44
44
  const [tokenIn, leftoverAmount] = decoded.args;
45
- return [{ tokenIn, leftoverAmount }];
45
+ this.setLeftover(balances, tokenIn, leftoverAmount);
46
+ break;
46
47
  }
47
48
  default:
48
- return super.decodeDiffLeftovers(decoded, balances);
49
+ super.applyBalanceChanges(balances, decoded);
49
50
  }
50
51
  }
51
52
  }
@@ -56,15 +56,16 @@ class LidoV1AdapterContract extends AbstractAdapterContract {
56
56
  classifyLegacyOperation(_parsed, transfers) {
57
57
  return { operation: "LidoSubmit", ...swapFromTransfers(transfers) };
58
58
  }
59
- decodeDiffLeftovers(decoded, balances) {
59
+ applyBalanceChanges(balances, decoded) {
60
60
  switch (decoded.functionName) {
61
61
  // the adapter targets the WETH gateway, so WETH is spent
62
62
  case "submitDiff": {
63
63
  const [leftoverAmount] = decoded.args;
64
- return [{ tokenIn: this.weth, leftoverAmount }];
64
+ this.setLeftover(balances, this.weth, leftoverAmount);
65
+ break;
65
66
  }
66
67
  default:
67
- return super.decodeDiffLeftovers(decoded, balances);
68
+ super.applyBalanceChanges(balances, decoded);
68
69
  }
69
70
  }
70
71
  }
@@ -1,4 +1,6 @@
1
- import { decodeAbiParameters } from "viem";
1
+ import {
2
+ decodeAbiParameters
3
+ } from "viem";
2
4
  import {
3
5
  MissingSerializedParamsError
4
6
  } from "../../../sdk/index.js";
@@ -36,6 +38,35 @@ class MellowClaimerAdapterContract extends AbstractAdapterContract {
36
38
  )
37
39
  };
38
40
  }
41
+ applyBalanceChanges(balances, decoded) {
42
+ switch (decoded.functionName) {
43
+ // pure "accept" of transferred pending assets, coupled with a Mellow
44
+ // withdrawal request: it moves no ERC-20s, and the withdrawal phantom
45
+ // token effect is credited by the storeExpectedBalances bracket delta
46
+ // built from the compressor's outputs
47
+ case "multiAccept":
48
+ break;
49
+ case "withdrawPhantomToken": {
50
+ const [token, amount] = decoded.args;
51
+ this.spendExact(balances, token, amount);
52
+ break;
53
+ }
54
+ // TODO:
55
+ // `multiAcceptAndClaim` (the claim call emitted by the withdrawal
56
+ // compressor) cannot be previewed offline: the burn amount IS in
57
+ // calldata (`maxAssets` == the compressor's `withdrawalTokenSpent`),
58
+ // but the withdrawal phantom token to debit cannot be resolved from
59
+ // the `multiVault` argument. The on-chain adapter only serializes
60
+ // (creditManager, targetContract, allowedMultiVaults) and drops its
61
+ // `phantomTokenToMultiVault` mapping (unlike Midas/Kelp adapters,
62
+ // which serialize aligned token/phantom arrays). Resolving it would
63
+ // require DelayedWithdrawalPlugin state (WithdrawableAsset maps
64
+ // multiVault -> withdrawalPhantomToken) or a contract-side
65
+ // `serialize()` fix.
66
+ default:
67
+ super.applyBalanceChanges(balances, decoded);
68
+ }
69
+ }
39
70
  }
40
71
  export {
41
72
  MellowClaimerAdapterContract
@@ -54,19 +54,21 @@ class MellowDVVAdapterContract extends AbstractAdapterContract {
54
54
  }
55
55
  return super.classifyLegacyOperation(parsed, transfers);
56
56
  }
57
- decodeDiffLeftovers(decoded, balances) {
57
+ applyBalanceChanges(balances, decoded) {
58
58
  const share = this.#vault ?? this.targetContract;
59
59
  switch (decoded.functionName) {
60
60
  case "depositDiff": {
61
61
  const [leftoverAmount] = decoded.args;
62
- return [{ tokenIn: this.asset, leftoverAmount }];
62
+ this.setLeftover(balances, this.asset, leftoverAmount);
63
+ break;
63
64
  }
64
65
  case "redeemDiff": {
65
66
  const [leftoverAmount] = decoded.args;
66
- return [{ tokenIn: share, leftoverAmount }];
67
+ this.setLeftover(balances, share, leftoverAmount);
68
+ break;
67
69
  }
68
70
  default:
69
- return super.decodeDiffLeftovers(decoded, balances);
71
+ super.applyBalanceChanges(balances, decoded);
70
72
  }
71
73
  }
72
74
  }
@@ -89,19 +89,26 @@ class MellowERC4626VaultAdapterContract extends AbstractAdapterContract {
89
89
  }
90
90
  return super.classifyLegacyOperation(parsed, transfers);
91
91
  }
92
- decodeDiffLeftovers(decoded, balances) {
92
+ applyBalanceChanges(balances, decoded) {
93
93
  const share = this.#vault ?? this.targetContract;
94
94
  switch (decoded.functionName) {
95
95
  case "depositDiff": {
96
96
  const [leftoverAmount] = decoded.args;
97
- return [{ tokenIn: this.asset, leftoverAmount }];
97
+ this.setLeftover(balances, this.asset, leftoverAmount);
98
+ break;
98
99
  }
99
100
  case "redeemDiff": {
100
101
  const [leftoverAmount] = decoded.args;
101
- return [{ tokenIn: share, leftoverAmount }];
102
+ this.setLeftover(balances, share, leftoverAmount);
103
+ break;
104
+ }
105
+ case "redeem": {
106
+ const [shares] = decoded.args;
107
+ this.spendExact(balances, share, shares);
108
+ break;
102
109
  }
103
110
  default:
104
- return super.decodeDiffLeftovers(decoded, balances);
111
+ super.applyBalanceChanges(balances, decoded);
105
112
  }
106
113
  }
107
114
  }
@@ -36,15 +36,16 @@ class MellowWrapperAdapterContract extends AbstractAdapterContract {
36
36
  allowedVaults: this.#allowedVaults?.map((v) => this.labelAddress(v))
37
37
  };
38
38
  }
39
- decodeDiffLeftovers(decoded, balances) {
39
+ applyBalanceChanges(balances, decoded) {
40
40
  switch (decoded.functionName) {
41
41
  case "depositDiff": {
42
42
  const weth = this.tokensMeta.mustFindBySymbol("WETH").addr;
43
43
  const [leftoverAmount] = decoded.args;
44
- return [{ tokenIn: weth, leftoverAmount }];
44
+ this.setLeftover(balances, weth, leftoverAmount);
45
+ break;
45
46
  }
46
47
  default:
47
- return super.decodeDiffLeftovers(decoded, balances);
48
+ super.applyBalanceChanges(balances, decoded);
48
49
  }
49
50
  }
50
51
  }
@@ -1,5 +1,6 @@
1
1
  import {
2
- decodeAbiParameters
2
+ decodeAbiParameters,
3
+ isAddressEqual
3
4
  } from "viem";
4
5
  import {
5
6
  MissingSerializedParamsError
@@ -81,21 +82,48 @@ class MidasGatewayAdapterContract extends AbstractAdapterContract {
81
82
  }))
82
83
  };
83
84
  }
84
- decodeDiffLeftovers(decoded, balances) {
85
+ applyBalanceChanges(balances, decoded) {
85
86
  switch (decoded.functionName) {
86
87
  case "depositInstantDiff": {
87
88
  const [tokenIn, leftoverAmount] = decoded.args;
88
- return [{ tokenIn, leftoverAmount }];
89
+ this.setLeftover(balances, tokenIn, leftoverAmount);
90
+ break;
89
91
  }
90
92
  // redemptions spend the mToken down to the leftover, tokenOut arg is
91
93
  // the received token
92
94
  case "redeemInstantDiff":
93
95
  case "redeemRequestDiff": {
94
96
  const [, leftoverAmount] = decoded.args;
95
- return [{ tokenIn: this.mToken, leftoverAmount }];
97
+ this.setLeftover(balances, this.mToken, leftoverAmount);
98
+ break;
99
+ }
100
+ // exact-input redemption request emitted in-bracket by the withdrawal
101
+ // compressor
102
+ case "redeemRequest": {
103
+ const [, amountMTokenIn] = decoded.args;
104
+ this.spendExact(balances, this.mToken, amountMTokenIn);
105
+ break;
106
+ }
107
+ // claim call emitted by the withdrawal compressor
108
+ case "withdrawFromRedeemer": {
109
+ const [, tokenOut, amount] = decoded.args;
110
+ const phantomToken = this.allowedOutputTokens.find(
111
+ (t) => isAddressEqual(t.token, tokenOut)
112
+ )?.phantomToken;
113
+ if (!phantomToken) {
114
+ super.applyBalanceChanges(balances, decoded);
115
+ break;
116
+ }
117
+ this.spendExact(balances, phantomToken, amount);
118
+ break;
119
+ }
120
+ case "withdrawPhantomToken": {
121
+ const [token, amount] = decoded.args;
122
+ this.spendExact(balances, token, amount);
123
+ break;
96
124
  }
97
125
  default:
98
- return super.decodeDiffLeftovers(decoded, balances);
126
+ super.applyBalanceChanges(balances, decoded);
99
127
  }
100
128
  }
101
129
  }
@@ -53,14 +53,15 @@ class MidasIssuanceVaultAdapterContract extends AbstractAdapterContract {
53
53
  allowedTokens: this.#allowedTokens?.map((t) => this.labelAddress(t))
54
54
  };
55
55
  }
56
- decodeDiffLeftovers(decoded, balances) {
56
+ applyBalanceChanges(balances, decoded) {
57
57
  switch (decoded.functionName) {
58
58
  case "depositInstantDiff": {
59
59
  const [tokenIn, leftoverAmount] = decoded.args;
60
- return [{ tokenIn, leftoverAmount }];
60
+ this.setLeftover(balances, tokenIn, leftoverAmount);
61
+ break;
61
62
  }
62
63
  default:
63
- return super.decodeDiffLeftovers(decoded, balances);
64
+ super.applyBalanceChanges(balances, decoded);
64
65
  }
65
66
  }
66
67
  }
@@ -61,16 +61,17 @@ class MidasRedemptionVaultAdapterContract extends AbstractAdapterContract {
61
61
  }))
62
62
  };
63
63
  }
64
- decodeDiffLeftovers(decoded, balances) {
64
+ applyBalanceChanges(balances, decoded) {
65
65
  switch (decoded.functionName) {
66
66
  // redemption spends the mToken down to the leftover, tokenOut arg is
67
67
  // the received token
68
68
  case "redeemInstantDiff": {
69
69
  const [, leftoverAmount] = decoded.args;
70
- return [{ tokenIn: this.mToken, leftoverAmount }];
70
+ this.setLeftover(balances, this.mToken, leftoverAmount);
71
+ break;
71
72
  }
72
73
  default:
73
- return super.decodeDiffLeftovers(decoded, balances);
74
+ super.applyBalanceChanges(balances, decoded);
74
75
  }
75
76
  }
76
77
  }
@@ -96,27 +96,29 @@ class PendleRouterAdapterContract extends AbstractAdapterContract {
96
96
  }))
97
97
  };
98
98
  }
99
- decodeDiffLeftovers(decoded, balances) {
99
+ applyBalanceChanges(balances, decoded) {
100
100
  switch (decoded.functionName) {
101
101
  case "swapDiffTokenForPt":
102
102
  case "addLiquiditySingleTokenDiff": {
103
103
  const [, , , diffInput] = decoded.args;
104
- return [
105
- {
106
- tokenIn: diffInput.tokenIn,
107
- leftoverAmount: diffInput.leftoverTokenIn
108
- }
109
- ];
104
+ this.setLeftover(
105
+ balances,
106
+ diffInput.tokenIn,
107
+ diffInput.leftoverTokenIn
108
+ );
109
+ break;
110
110
  }
111
111
  case "swapDiffPtForToken": {
112
112
  const [market, leftoverPt] = decoded.args;
113
113
  const pt = this.#mustFindPendleToken(market, 0 /* PT */);
114
- return [{ tokenIn: pt, leftoverAmount: leftoverPt }];
114
+ this.setLeftover(balances, pt, leftoverPt);
115
+ break;
115
116
  }
116
117
  case "removeLiquiditySingleTokenDiff": {
117
118
  const [market, leftoverLp] = decoded.args;
118
119
  const lp = this.#mustFindPendleToken(market, 1 /* LP */);
119
- return [{ tokenIn: lp, leftoverAmount: leftoverLp }];
120
+ this.setLeftover(balances, lp, leftoverLp);
121
+ break;
120
122
  }
121
123
  case "redeemDiffPyToToken": {
122
124
  const candidates = this.allowedPairs.filter(
@@ -131,15 +133,11 @@ class PendleRouterAdapterContract extends AbstractAdapterContract {
131
133
  );
132
134
  }
133
135
  const [, leftoverPt] = decoded.args;
134
- return [
135
- {
136
- tokenIn: candidates[0].pendleToken,
137
- leftoverAmount: leftoverPt
138
- }
139
- ];
136
+ this.setLeftover(balances, candidates[0].pendleToken, leftoverPt);
137
+ break;
140
138
  }
141
139
  default:
142
- return super.decodeDiffLeftovers(decoded, balances);
140
+ super.applyBalanceChanges(balances, decoded);
143
141
  }
144
142
  }
145
143
  #mustFindPendleToken(market, type) {
@@ -45,15 +45,16 @@ class SecuritizeOnRampAdapterContract extends AbstractAdapterContract {
45
45
  liquidityToken: this.#liquidityToken ? this.labelAddress(this.#liquidityToken) : void 0
46
46
  };
47
47
  }
48
- decodeDiffLeftovers(decoded, balances) {
48
+ applyBalanceChanges(balances, decoded) {
49
49
  switch (decoded.functionName) {
50
50
  // swaps the liquidity token into dsToken
51
51
  case "swapDiff": {
52
52
  const [leftoverAmount] = decoded.args;
53
- return [{ tokenIn: this.liquidityToken, leftoverAmount }];
53
+ this.setLeftover(balances, this.liquidityToken, leftoverAmount);
54
+ break;
54
55
  }
55
56
  default:
56
- return super.decodeDiffLeftovers(decoded, balances);
57
+ super.applyBalanceChanges(balances, decoded);
57
58
  }
58
59
  }
59
60
  }