@@ -69,13 +69,14 @@ contract ArrakisUniswapV3AmmAdapter is IAmmAdapter {
69
69
*
70
70
* @param _setToken Address of the SetToken
71
71
* @param _pool Address of liquidity token
72
+ * @param _components Token address array required to remove liquidity
72
73
* @param _maxTokensIn AmountsIn desired to add liquidity
73
74
* @param _minLiquidity Min liquidity amount to add
74
75
*/
75
76
function getProvideLiquidityCalldata (
76
77
address _setToken ,
77
78
address _pool ,
78
- address [] calldata /* _components*/ ,
79
+ address [] calldata _components ,
79
80
uint256 [] calldata _maxTokensIn ,
80
81
uint256 _minLiquidity
81
82
)
@@ -85,14 +86,18 @@ contract ArrakisUniswapV3AmmAdapter is IAmmAdapter {
85
86
returns (address target , uint256 value , bytes memory data )
86
87
{
87
88
address setToken = _setToken;
89
+ address [] memory components = _components;
88
90
uint256 [] memory maxTokensIn = _maxTokensIn;
89
91
uint256 minLiquidity = _minLiquidity;
90
92
91
93
require (maxTokensIn[0 ] > 0 && maxTokensIn[1 ] > 0 , "Component quantity must be nonzero " );
92
94
93
95
IArrakisVaultV1 arrakisVaultPool = IArrakisVaultV1 (_pool);
94
96
95
- (uint256 amountAMin , uint256 amountBMin , uint256 liquidityExpectedFromSuppliedTokens ) = arrakisVaultPool.getMintAmounts (maxTokensIn[0 ], maxTokensIn[1 ]);
97
+ // Sort the amount in order of tokens stored in Arrakis Pool
98
+ (uint256 maxTokensInA , uint256 maxTokensInB ) = _getOrderedAmount (components[0 ], components[1 ], maxTokensIn[0 ], maxTokensIn[1 ]);
99
+
100
+ (uint256 amountAMin , uint256 amountBMin , uint256 liquidityExpectedFromSuppliedTokens ) = arrakisVaultPool.getMintAmounts (maxTokensInA, maxTokensInB);
96
101
97
102
require (
98
103
minLiquidity <= liquidityExpectedFromSuppliedTokens,
@@ -104,8 +109,8 @@ contract ArrakisUniswapV3AmmAdapter is IAmmAdapter {
104
109
data = abi.encodeWithSignature (
105
110
ADD_LIQUIDITY,
106
111
arrakisVaultPool,
107
- maxTokensIn[ 0 ] ,
108
- maxTokensIn[ 1 ] ,
112
+ maxTokensInA ,
113
+ maxTokensInB ,
109
114
amountAMin,
110
115
amountBMin,
111
116
setToken
@@ -135,13 +140,14 @@ contract ArrakisUniswapV3AmmAdapter is IAmmAdapter {
135
140
*
136
141
* @param _setToken Address of the SetToken
137
142
* @param _pool Address of liquidity token
143
+ * @param _components Token address array required to remove liquidity
138
144
* @param _minTokensOut AmountsOut minimum to remove liquidity
139
145
* @param _liquidity Liquidity amount to remove
140
146
*/
141
147
function getRemoveLiquidityCalldata (
142
148
address _setToken ,
143
149
address _pool ,
144
- address [] calldata /* _components*/ ,
150
+ address [] calldata _components ,
145
151
uint256 [] calldata _minTokensOut ,
146
152
uint256 _liquidity
147
153
)
@@ -151,6 +157,7 @@ contract ArrakisUniswapV3AmmAdapter is IAmmAdapter {
151
157
returns (address target , uint256 value , bytes memory data )
152
158
{
153
159
address setToken = _setToken;
160
+ address [] memory components = _components;
154
161
uint256 [] memory minTokensOut = _minTokensOut;
155
162
uint256 liquidity = _liquidity;
156
163
IArrakisVaultV1 arrakisVaultPool = IArrakisVaultV1 (_pool);
@@ -159,16 +166,20 @@ contract ArrakisUniswapV3AmmAdapter is IAmmAdapter {
159
166
uint256 setTokenLiquidityBalance = arrakisVaultPool.balanceOf (setToken);
160
167
require (liquidity <= setTokenLiquidityBalance, "_liquidity must be <= to current balance " );
161
168
162
- // Checks for minTokensOut required?
169
+ // Checks for minTokensOut
170
+ require (minTokensOut[0 ] > 0 && minTokensOut[1 ] > 0 , "Minimum quantity must be nonzero " );
171
+
172
+ // Sort the amount in order of tokens stored in Arrakis Pool
173
+ (uint256 minTokensOutA , uint256 minTokensOutB ) = _getOrderedAmount (components[0 ], components[1 ], minTokensOut[0 ], minTokensOut[1 ]);
163
174
164
175
target = router;
165
176
value = 0 ;
166
177
data = abi.encodeWithSignature (
167
178
REMOVE_LIQUIDITY,
168
179
arrakisVaultPool,
169
180
liquidity,
170
- minTokensOut[ 0 ] ,
171
- minTokensOut[ 1 ] ,
181
+ minTokensOutA ,
182
+ minTokensOutB ,
172
183
setToken
173
184
);
174
185
}
@@ -247,4 +258,16 @@ contract ArrakisUniswapV3AmmAdapter is IAmmAdapter {
247
258
248
259
return true ;
249
260
}
261
+
262
+ /**
263
+ * Sorts the amount in order of tokens stored in Arrakis/UniswapV3 Pool
264
+ *
265
+ * @param _token0 Address of token0
266
+ * @param _token0 Address of token1
267
+ * @param _amount0 Amount of token0
268
+ * @param _token1 Amount of token1
269
+ */
270
+ function _getOrderedAmount (address _token0 , address _token1 , uint256 _amount0 , uint256 _amount1 ) private pure returns (uint256 , uint256 ) {
271
+ return _token0 < _token1 ? (_amount0, _amount1) : (_amount1, _amount0);
272
+ }
250
273
}
0 commit comments