From 7f324dd75de39aaea8320cad3930e35849b0c3c4 Mon Sep 17 00:00:00 2001 From: "Savarn Dontamsetti (Sav)" Date: Thu, 17 Aug 2023 12:59:38 -0400 Subject: [PATCH] feat/Add Maverick V1 Support (#741) * Add Maverick V1 Support for Ethereum, BSC, and Base --- contracts/zero-ex/CHANGELOG.json | 8 +++ .../transformers/bridges/BSCBridgeAdapter.sol | 7 +++ .../bridges/BaseBridgeAdapter.sol | 7 +++ .../transformers/bridges/BridgeProtocols.sol | 1 + .../bridges/EthereumBridgeAdapter.sol | 7 +++ .../bridges/mixins/MixinMaverickV1.sol | 63 +++++++++++++++++++ packages/contract-addresses/CHANGELOG.json | 8 +++ packages/contract-addresses/addresses.json | 6 +- packages/protocol-utils/CHANGELOG.json | 8 +++ .../protocol-utils/src/transformer_utils.ts | 1 + 10 files changed, 113 insertions(+), 3 deletions(-) create mode 100644 contracts/zero-ex/contracts/src/transformers/bridges/mixins/MixinMaverickV1.sol diff --git a/contracts/zero-ex/CHANGELOG.json b/contracts/zero-ex/CHANGELOG.json index ec297f6a74..ee14271239 100644 --- a/contracts/zero-ex/CHANGELOG.json +++ b/contracts/zero-ex/CHANGELOG.json @@ -1,4 +1,12 @@ [ + { + "version": "0.47.0", + "changes": [ + { + "note": "Add MaverickV1 support on Ethereum, BSC, and Base" + } + ] + }, { "version": "0.46.0", "changes": [ diff --git a/contracts/zero-ex/contracts/src/transformers/bridges/BSCBridgeAdapter.sol b/contracts/zero-ex/contracts/src/transformers/bridges/BSCBridgeAdapter.sol index d98b16a946..f7575a61af 100644 --- a/contracts/zero-ex/contracts/src/transformers/bridges/BSCBridgeAdapter.sol +++ b/contracts/zero-ex/contracts/src/transformers/bridges/BSCBridgeAdapter.sol @@ -22,6 +22,7 @@ import "./mixins/MixinDodo.sol"; import "./mixins/MixinDodoV2.sol"; import "./mixins/MixinKyberDmm.sol"; import "./mixins/MixinKyberElastic.sol"; +import "./mixins/MixinMaverickV1.sol"; import "./mixins/MixinMooniswap.sol"; import "./mixins/MixinNerve.sol"; import "./mixins/MixinUniswapV2.sol"; @@ -36,6 +37,7 @@ contract BSCBridgeAdapter is MixinDodoV2, MixinKyberDmm, MixinKyberElastic, + MixinMaverickV1, MixinMooniswap, MixinNerve, MixinUniswapV2, @@ -103,6 +105,11 @@ contract BSCBridgeAdapter is return (0, true); } boughtAmount = _tradeWOOFi(sellToken, buyToken, sellAmount, order.bridgeData); + } else if (protocolId == BridgeProtocols.MAVERICK) { + if (dryRun) { + return (0, true); + } + boughtAmount = _tradeMaverickV1(sellToken, buyToken, sellAmount, order.bridgeData); } else if (protocolId == BridgeProtocols.UNKNOWN) { if (dryRun) { return (0, true); diff --git a/contracts/zero-ex/contracts/src/transformers/bridges/BaseBridgeAdapter.sol b/contracts/zero-ex/contracts/src/transformers/bridges/BaseBridgeAdapter.sol index 860e6d1593..df8fd454fa 100644 --- a/contracts/zero-ex/contracts/src/transformers/bridges/BaseBridgeAdapter.sol +++ b/contracts/zero-ex/contracts/src/transformers/bridges/BaseBridgeAdapter.sol @@ -22,6 +22,7 @@ import "./mixins/MixinUniswapV2.sol"; import "./mixins/MixinBalancerV2Batch.sol"; import "./mixins/MixinCurve.sol"; import "./mixins/MixinCurveV2.sol"; +import "./mixins/MixinMaverickV1.sol"; import "./mixins/MixinSolidly.sol"; contract BaseBridgeAdapter is @@ -31,6 +32,7 @@ contract BaseBridgeAdapter is MixinBalancerV2Batch, MixinCurve, MixinCurveV2, + MixinMaverickV1, MixinSolidly { constructor(IEtherToken weth) public MixinCurve(weth) {} @@ -73,6 +75,11 @@ contract BaseBridgeAdapter is return (0, true); } boughtAmount = _tradeBalancerV2Batch(sellAmount, order.bridgeData); + } else if (protocolId == BridgeProtocols.MAVERICK) { + if (dryRun) { + return (0, true); + } + boughtAmount = _tradeMaverickV1(sellToken, buyToken, sellAmount, order.bridgeData); } emit BridgeFill(order.source, sellToken, buyToken, sellAmount, boughtAmount); } diff --git a/contracts/zero-ex/contracts/src/transformers/bridges/BridgeProtocols.sol b/contracts/zero-ex/contracts/src/transformers/bridges/BridgeProtocols.sol index df9e69a9f9..371dd154e4 100644 --- a/contracts/zero-ex/contracts/src/transformers/bridges/BridgeProtocols.sol +++ b/contracts/zero-ex/contracts/src/transformers/bridges/BridgeProtocols.sol @@ -58,4 +58,5 @@ library BridgeProtocols { uint128 internal constant BARTER = 34; uint128 internal constant TRADERJOEV2 = 35; uint128 internal constant VELODROMEV2 = 36; + uint128 internal constant MAVERICK = 37; } diff --git a/contracts/zero-ex/contracts/src/transformers/bridges/EthereumBridgeAdapter.sol b/contracts/zero-ex/contracts/src/transformers/bridges/EthereumBridgeAdapter.sol index ea5be816b0..e1d3ee5bfe 100644 --- a/contracts/zero-ex/contracts/src/transformers/bridges/EthereumBridgeAdapter.sol +++ b/contracts/zero-ex/contracts/src/transformers/bridges/EthereumBridgeAdapter.sol @@ -32,6 +32,7 @@ import "./mixins/MixinKyberDmm.sol"; import "./mixins/MixinKyberElastic.sol"; import "./mixins/MixinLido.sol"; import "./mixins/MixinMakerPSM.sol"; +import "./mixins/MixinMaverickV1.sol"; import "./mixins/MixinNerve.sol"; import "./mixins/MixinSynthetix.sol"; import "./mixins/MixinUniswap.sol"; @@ -56,6 +57,7 @@ contract EthereumBridgeAdapter is MixinKyberElastic, MixinLido, MixinMakerPSM, + MixinMaverickV1, MixinNerve, MixinSynthetix, MixinUniswap, @@ -175,6 +177,11 @@ contract EthereumBridgeAdapter is return (0, true); } boughtAmount = _tradeBarter(sellToken, sellAmount, order.bridgeData); + } else if (protocolId == BridgeProtocols.MAVERICK) { + if (dryRun) { + return (0, true); + } + boughtAmount = _tradeMaverickV1(sellToken, buyToken, sellAmount, order.bridgeData); } else if (protocolId == BridgeProtocols.UNKNOWN) { if (dryRun) { return (0, true); diff --git a/contracts/zero-ex/contracts/src/transformers/bridges/mixins/MixinMaverickV1.sol b/contracts/zero-ex/contracts/src/transformers/bridges/mixins/MixinMaverickV1.sol new file mode 100644 index 0000000000..60a8ef5abf --- /dev/null +++ b/contracts/zero-ex/contracts/src/transformers/bridges/mixins/MixinMaverickV1.sol @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: Apache-2.0 +/* + Copyright 2023 ZeroEx Intl. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +pragma solidity ^0.6.5; +pragma experimental ABIEncoderV2; + +import "@0x/contracts-erc20/src/v06/LibERC20TokenV06.sol"; +import "@0x/contracts-erc20/src/IERC20Token.sol"; + +interface IMaverickV1Router { + struct ExactInputSingleParams { + address tokenIn; + address tokenOut; + address pool; + address recipient; + uint256 deadline; + uint256 amountIn; + uint256 amountOutMinimum; + uint256 sqrtPriceLimitD18; + } + + function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut); +} + +contract MixinMaverickV1 { + using LibERC20TokenV06 for IERC20Token; + + function _tradeMaverickV1( + IERC20Token sellToken, + IERC20Token buyToken, + uint256 sellAmount, + bytes memory bridgeData + ) internal returns (uint256 boughtAmount) { + (IMaverickV1Router router, address pool) = abi.decode(bridgeData, (IMaverickV1Router, address)); + + // Grant the MaverickV1 router an allowance to sell the sellToken + sellToken.approveIfBelow(address(router), sellAmount); + + boughtAmount = router.exactInputSingle( + IMaverickV1Router.ExactInputSingleParams({ + tokenIn: address(sellToken), + tokenOut: address(buyToken), + pool: pool, + recipient: address(this), + deadline: block.timestamp, + amountIn: sellAmount, + amountOutMinimum: 1, + sqrtPriceLimitD18: 0 + }) + ); + } +} diff --git a/packages/contract-addresses/CHANGELOG.json b/packages/contract-addresses/CHANGELOG.json index efbba79c57..a4894aa335 100644 --- a/packages/contract-addresses/CHANGELOG.json +++ b/packages/contract-addresses/CHANGELOG.json @@ -1,4 +1,12 @@ [ + { + "version": "8.11.0", + "changes": [ + { + "note": "Add MaverickV1 support on Ethereum, BSC, and Base" + } + ] + }, { "version": "8.10.0", "changes": [ diff --git a/packages/contract-addresses/addresses.json b/packages/contract-addresses/addresses.json index 8c22c0f1ea..3b639c0339 100644 --- a/packages/contract-addresses/addresses.json +++ b/packages/contract-addresses/addresses.json @@ -18,7 +18,7 @@ "wethTransformer": "0xb2bc06a4efb20fc6553a69dbfa49b7be938034a7", "payTakerTransformer": "0xea500d073652336a58846ada15c25f2c6d2d241f", "affiliateFeeTransformer": "0x8146cbbe327364b13d0699f2ced39c637f92501a", - "fillQuoteTransformer": "0x21c3bee93fad436dedd29f971dc4fdf82f3e3a3a", + "fillQuoteTransformer": "0x2fd08c1f9fc8406c1d7e3a799a13883a7e7949f0", "positiveSlippageFeeTransformer": "0x818a4a855bfeb16c305cb65e8d4fb239a308bc48" } }, @@ -64,7 +64,7 @@ "wethTransformer": "0xac3d95668c092e895cd83a9cbafe9c7d9906471f", "payTakerTransformer": "0x7e788f3a3e39cdd1944ba111fafc5fb7e59b5e90", "affiliateFeeTransformer": "0x043300d113de0c64684ab89c56a45cd94c7ef54c", - "fillQuoteTransformer": "0xa9c57c539690d4e1439411f648ead5b121b34a23", + "fillQuoteTransformer": "0x6073f12fc63bcc64bd4fed5d44aa1035e37d68ee", "positiveSlippageFeeTransformer": "0x6ff35e8cbaf56d8a8f6bf9963b902a4576243030" } }, @@ -271,7 +271,7 @@ "wethTransformer": "0x63186ea36e78ecbf0128e448362f1b81e9bf7412", "payTakerTransformer": "0x5cc22a0e06ea11097c612a962e63674b90e96099", "affiliateFeeTransformer": "0x9e52d8b32d835206d09810c310593bcc77264066", - "fillQuoteTransformer": "0x98b159db76c820dc877782f199e287a97420b1d2", + "fillQuoteTransformer": "0xab93d03a3e7e51ec5edaef75d27f20917da4c18e", "positiveSlippageFeeTransformer": "0xf98a130d3b4029c70e6d93098cb82a003421341e" } } diff --git a/packages/protocol-utils/CHANGELOG.json b/packages/protocol-utils/CHANGELOG.json index 7c35639d90..b2348b0dc2 100644 --- a/packages/protocol-utils/CHANGELOG.json +++ b/packages/protocol-utils/CHANGELOG.json @@ -1,4 +1,12 @@ [ + { + "version": "11.24.0", + "changes": [ + { + "note": "Add MaverickV1 support on Ethereum, BSC, and Base" + } + ] + }, { "version": "11.23.0", "changes": [ diff --git a/packages/protocol-utils/src/transformer_utils.ts b/packages/protocol-utils/src/transformer_utils.ts index c6f9e5fcb3..0fa0b2c9cc 100644 --- a/packages/protocol-utils/src/transformer_utils.ts +++ b/packages/protocol-utils/src/transformer_utils.ts @@ -167,6 +167,7 @@ export enum BridgeProtocol { Barter, TraderJoeV2, VelodromeV2, + MaverickV1, } /**