Skip to content

Commit 755137f

Browse files
committed
add integration tests
1 parent 44a940a commit 755137f

File tree

4 files changed

+576
-43
lines changed

4 files changed

+576
-43
lines changed

contracts/protocol/integration/amm/ArrakisUniswapV3AmmAdapter.sol

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -69,13 +69,14 @@ contract ArrakisUniswapV3AmmAdapter is IAmmAdapter {
6969
*
7070
* @param _setToken Address of the SetToken
7171
* @param _pool Address of liquidity token
72+
* @param _components Token address array required to remove liquidity
7273
* @param _maxTokensIn AmountsIn desired to add liquidity
7374
* @param _minLiquidity Min liquidity amount to add
7475
*/
7576
function getProvideLiquidityCalldata(
7677
address _setToken,
7778
address _pool,
78-
address[] calldata /*_components*/,
79+
address[] calldata _components,
7980
uint256[] calldata _maxTokensIn,
8081
uint256 _minLiquidity
8182
)
@@ -85,14 +86,18 @@ contract ArrakisUniswapV3AmmAdapter is IAmmAdapter {
8586
returns (address target, uint256 value, bytes memory data)
8687
{
8788
address setToken = _setToken;
89+
address[] memory components = _components;
8890
uint256[] memory maxTokensIn = _maxTokensIn;
8991
uint256 minLiquidity = _minLiquidity;
9092

9193
require(maxTokensIn[0] > 0 && maxTokensIn[1] > 0, "Component quantity must be nonzero");
9294

9395
IArrakisVaultV1 arrakisVaultPool = IArrakisVaultV1(_pool);
9496

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);
96101

97102
require(
98103
minLiquidity <= liquidityExpectedFromSuppliedTokens,
@@ -104,8 +109,8 @@ contract ArrakisUniswapV3AmmAdapter is IAmmAdapter {
104109
data = abi.encodeWithSignature(
105110
ADD_LIQUIDITY,
106111
arrakisVaultPool,
107-
maxTokensIn[0],
108-
maxTokensIn[1],
112+
maxTokensInA,
113+
maxTokensInB,
109114
amountAMin,
110115
amountBMin,
111116
setToken
@@ -135,13 +140,14 @@ contract ArrakisUniswapV3AmmAdapter is IAmmAdapter {
135140
*
136141
* @param _setToken Address of the SetToken
137142
* @param _pool Address of liquidity token
143+
* @param _components Token address array required to remove liquidity
138144
* @param _minTokensOut AmountsOut minimum to remove liquidity
139145
* @param _liquidity Liquidity amount to remove
140146
*/
141147
function getRemoveLiquidityCalldata(
142148
address _setToken,
143149
address _pool,
144-
address[] calldata /*_components*/,
150+
address[] calldata _components,
145151
uint256[] calldata _minTokensOut,
146152
uint256 _liquidity
147153
)
@@ -151,6 +157,7 @@ contract ArrakisUniswapV3AmmAdapter is IAmmAdapter {
151157
returns (address target, uint256 value, bytes memory data)
152158
{
153159
address setToken = _setToken;
160+
address[] memory components = _components;
154161
uint256[] memory minTokensOut = _minTokensOut;
155162
uint256 liquidity = _liquidity;
156163
IArrakisVaultV1 arrakisVaultPool = IArrakisVaultV1(_pool);
@@ -159,16 +166,20 @@ contract ArrakisUniswapV3AmmAdapter is IAmmAdapter {
159166
uint256 setTokenLiquidityBalance = arrakisVaultPool.balanceOf(setToken);
160167
require(liquidity <= setTokenLiquidityBalance, "_liquidity must be <= to current balance");
161168

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]);
163174

164175
target = router;
165176
value = 0;
166177
data = abi.encodeWithSignature(
167178
REMOVE_LIQUIDITY,
168179
arrakisVaultPool,
169180
liquidity,
170-
minTokensOut[0],
171-
minTokensOut[1],
181+
minTokensOutA,
182+
minTokensOutB,
172183
setToken
173184
);
174185
}
@@ -247,4 +258,16 @@ contract ArrakisUniswapV3AmmAdapter is IAmmAdapter {
247258

248259
return true;
249260
}
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+
}
250273
}

0 commit comments

Comments
 (0)