Skip to content

Commit 4835a1b

Browse files
authored
Add UniswapV3 to Avalanche and BSC bridge adapters (#735)
* Add UniswapV3 to Avalanche and BSC * Support v2 router in MixinUniswapV3 * Update Avalanche and BSC FillQuoteTransformer addresses
1 parent 21c8477 commit 4835a1b

6 files changed

Lines changed: 57 additions & 14 deletions

File tree

contracts/zero-ex/CHANGELOG.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
},
1111
{
1212
"note": "Add Base Mainnet and Goerli BridgeAdapters"
13+
},
14+
{
15+
"note": "Add Uniswap V3 support on Avalanche and BSC"
1316
}
1417
]
1518
},

contracts/zero-ex/contracts/src/transformers/bridges/AvalancheBridgeAdapter.sol

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import "./mixins/MixinNerve.sol";
2828
import "./mixins/MixinPlatypus.sol";
2929
import "./mixins/MixinTraderJoeV2.sol";
3030
import "./mixins/MixinUniswapV2.sol";
31+
import "./mixins/MixinUniswapV3.sol";
3132
import "./mixins/MixinWOOFi.sol";
3233
import "./mixins/MixinZeroExBridge.sol";
3334

@@ -44,6 +45,7 @@ contract AvalancheBridgeAdapter is
4445
MixinPlatypus,
4546
MixinTraderJoeV2,
4647
MixinUniswapV2,
48+
MixinUniswapV3,
4749
MixinWOOFi,
4850
MixinZeroExBridge
4951
{
@@ -72,6 +74,11 @@ contract AvalancheBridgeAdapter is
7274
return (0, true);
7375
}
7476
boughtAmount = _tradeUniswapV2(buyToken, sellAmount, order.bridgeData);
77+
} else if (protocolId == BridgeProtocols.UNISWAPV3) {
78+
if (dryRun) {
79+
return (0, true);
80+
}
81+
boughtAmount = _tradeUniswapV3(sellToken, sellAmount, order.bridgeData);
7582
} else if (protocolId == BridgeProtocols.NERVE) {
7683
if (dryRun) {
7784
return (0, true);

contracts/zero-ex/contracts/src/transformers/bridges/BSCBridgeAdapter.sol

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import "./mixins/MixinKyberElastic.sol";
2525
import "./mixins/MixinMooniswap.sol";
2626
import "./mixins/MixinNerve.sol";
2727
import "./mixins/MixinUniswapV2.sol";
28+
import "./mixins/MixinUniswapV3.sol";
2829
import "./mixins/MixinWOOFi.sol";
2930
import "./mixins/MixinZeroExBridge.sol";
3031

@@ -38,6 +39,7 @@ contract BSCBridgeAdapter is
3839
MixinMooniswap,
3940
MixinNerve,
4041
MixinUniswapV2,
42+
MixinUniswapV3,
4143
MixinWOOFi,
4244
MixinZeroExBridge
4345
{
@@ -61,6 +63,11 @@ contract BSCBridgeAdapter is
6163
return (0, true);
6264
}
6365
boughtAmount = _tradeUniswapV2(buyToken, sellAmount, order.bridgeData);
66+
} else if (protocolId == BridgeProtocols.UNISWAPV3) {
67+
if (dryRun) {
68+
return (0, true);
69+
}
70+
boughtAmount = _tradeUniswapV3(sellToken, sellAmount, order.bridgeData);
6471
} else if (protocolId == BridgeProtocols.MOONISWAP) {
6572
if (dryRun) {
6673
return (0, true);

contracts/zero-ex/contracts/src/transformers/bridges/mixins/MixinUniswapV3.sol

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,18 @@ interface IUniswapV3Router {
3131
function exactInput(ExactInputParams memory params) external payable returns (uint256 amountOut);
3232
}
3333

34+
// https://github.com/Uniswap/swap-router-contracts/blob/main/contracts/interfaces/IV3SwapRouter.sol
35+
interface IUniswapV3Router2 {
36+
struct ExactInputParams {
37+
bytes path;
38+
address recipient;
39+
uint256 amountIn;
40+
uint256 amountOutMinimum;
41+
}
42+
43+
function exactInput(ExactInputParams memory params) external payable returns (uint256 amountOut);
44+
}
45+
3446
contract MixinUniswapV3 {
3547
using LibERC20TokenV06 for IERC20Token;
3648

@@ -39,19 +51,30 @@ contract MixinUniswapV3 {
3951
uint256 sellAmount,
4052
bytes memory bridgeData
4153
) internal returns (uint256 boughtAmount) {
42-
(IUniswapV3Router router, bytes memory path) = abi.decode(bridgeData, (IUniswapV3Router, bytes));
54+
(address router, bytes memory path, uint256 routerVersion) = abi.decode(bridgeData, (address, bytes, uint256));
4355

4456
// Grant the Uniswap router an allowance to sell the sell token.
45-
sellToken.approveIfBelow(address(router), sellAmount);
46-
47-
boughtAmount = router.exactInput(
48-
IUniswapV3Router.ExactInputParams({
49-
path: path,
50-
recipient: address(this),
51-
deadline: block.timestamp,
52-
amountIn: sellAmount,
53-
amountOutMinimum: 1
54-
})
55-
);
57+
sellToken.approveIfBelow(router, sellAmount);
58+
59+
if (routerVersion != 2) {
60+
boughtAmount = IUniswapV3Router(router).exactInput(
61+
IUniswapV3Router.ExactInputParams({
62+
path: path,
63+
recipient: address(this),
64+
deadline: block.timestamp,
65+
amountIn: sellAmount,
66+
amountOutMinimum: 1
67+
})
68+
);
69+
} else {
70+
boughtAmount = IUniswapV3Router2(router).exactInput(
71+
IUniswapV3Router2.ExactInputParams({
72+
path: path,
73+
recipient: address(this),
74+
amountIn: sellAmount,
75+
amountOutMinimum: 1
76+
})
77+
);
78+
}
5679
}
5780
}

packages/contract-addresses/CHANGELOG.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
"changes": [
55
{
66
"note": "Add Base mainnet addresses"
7+
},
8+
{
9+
"note": "Add UniswapV3 support in Avalanche and BSC FillQuoteTransformers"
710
}
811
]
912
},

packages/contract-addresses/addresses.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464
"wethTransformer": "0xac3d95668c092e895cd83a9cbafe9c7d9906471f",
6565
"payTakerTransformer": "0x7e788f3a3e39cdd1944ba111fafc5fb7e59b5e90",
6666
"affiliateFeeTransformer": "0x043300d113de0c64684ab89c56a45cd94c7ef54c",
67-
"fillQuoteTransformer": "0x43d10801db01c28093265ef9b77d532e553fa578",
67+
"fillQuoteTransformer": "0xa9c57c539690d4e1439411f648ead5b121b34a23",
6868
"positiveSlippageFeeTransformer": "0x6ff35e8cbaf56d8a8f6bf9963b902a4576243030"
6969
}
7070
},
@@ -156,7 +156,7 @@
156156
"wethTransformer": "0x9b8b52391071d71cd4ad1e61d7f273268fa34c6c",
157157
"payTakerTransformer": "0xb9a4c32547bc3cdc2ee2fb13cc1a0717dac9888f",
158158
"affiliateFeeTransformer": "0x105679f99d668001370b4621ad8648ac570c860f",
159-
"fillQuoteTransformer": "0x886e4f97d7e06ab66dba574a7a861046dcf7ae4f",
159+
"fillQuoteTransformer": "0x463fe1a80acb62ce1e4f0a4f7b83df674c2cce2c",
160160
"positiveSlippageFeeTransformer": "0xadbfdc58a24b6dbc16f21541800f43dd6e282250"
161161
}
162162
},

0 commit comments

Comments
 (0)