diff --git a/contracts/zero-ex/contracts/src/transformers/bridges/ArbitrumBridgeAdapter.sol b/contracts/zero-ex/contracts/src/transformers/bridges/ArbitrumBridgeAdapter.sol new file mode 100644 index 0000000000..eb5c304746 --- /dev/null +++ b/contracts/zero-ex/contracts/src/transformers/bridges/ArbitrumBridgeAdapter.sol @@ -0,0 +1,113 @@ +// SPDX-License-Identifier: Apache-2.0 +/* + + Copyright 2022 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 "./AbstractBridgeAdapter.sol"; +import "./BridgeProtocols.sol"; +import "./mixins/MixinBalancerV2.sol"; +import "./mixins/MixinCurve.sol"; +import "./mixins/MixinDodoV2.sol"; +import "./mixins/MixinGMX.sol"; +import "./mixins/MixinUniswapV3.sol"; +import "./mixins/MixinZeroExBridge.sol"; + +contract ArbitrumBridgeAdapter is + AbstractBridgeAdapter(42161, "Arbitrum"), + MixinBalancerV2, + MixinCurve, + MixinDodoV2, + MixinGMX, + MixinUniswapV3, + MixinZeroExBridge +{ + constructor(IEtherTokenV06 weth) + public + MixinCurve(weth) + {} + + function _trade( + BridgeOrder memory order, + IERC20TokenV06 sellToken, + IERC20TokenV06 buyToken, + uint256 sellAmount, + bool dryRun + ) + internal + override + returns (uint256 boughtAmount, bool supportedSource) + { + uint128 protocolId = uint128(uint256(order.source) >> 128); + if (protocolId == BridgeProtocols.BALANCERV2) { + if (dryRun) { return (0, true); } + boughtAmount = _tradeBalancerV2( + sellToken, + buyToken, + sellAmount, + order.bridgeData + ); + } else if (protocolId == BridgeProtocols.CURVE) { + if (dryRun) { return (0, true); } + boughtAmount = _tradeCurve( + sellToken, + buyToken, + sellAmount, + order.bridgeData + ); + } else if (protocolId == BridgeProtocols.DODOV2) { + if (dryRun) { return (0, true); } + boughtAmount = _tradeDodoV2( + sellToken, + sellAmount, + order.bridgeData + ); + } else if (protocolId == BridgeProtocols.UNISWAPV3) { + if (dryRun) { return (0, true); } + boughtAmount = _tradeUniswapV3( + sellToken, + sellAmount, + order.bridgeData + ); + } else if (protocolId == BridgeProtocols.GMX) { + if (dryRun) { return (0, true); } + boughtAmount = _tradeGMX( + sellToken, + sellAmount, + order.bridgeData + ); + } else if (protocolId == BridgeProtocols.UNKNOWN) { + if (dryRun) { return (0, true); } + boughtAmount = _tradeZeroExBridge( + sellToken, + buyToken, + sellAmount, + order.bridgeData + ); + } + + emit BridgeFill( + order.source, + sellToken, + buyToken, + sellAmount, + boughtAmount + ); + } +} diff --git a/packages/asset-swapper/src/utils/market_operation_utils/constants.ts b/packages/asset-swapper/src/utils/market_operation_utils/constants.ts index a44381e5df..22f09a55bd 100644 --- a/packages/asset-swapper/src/utils/market_operation_utils/constants.ts +++ b/packages/asset-swapper/src/utils/market_operation_utils/constants.ts @@ -71,6 +71,8 @@ function valueByChainId(rest: Partial<{ [key in ChainId]: T }>, defaultValue: [ChainId.Fantom]: defaultValue, [ChainId.Celo]: defaultValue, [ChainId.Optimism]: defaultValue, + [ChainId.Arbitrum]: defaultValue, + ...(rest || {}), }; } diff --git a/packages/contract-addresses/CHANGELOG.json b/packages/contract-addresses/CHANGELOG.json index 4a24a5a673..8dae992027 100644 --- a/packages/contract-addresses/CHANGELOG.json +++ b/packages/contract-addresses/CHANGELOG.json @@ -1,4 +1,12 @@ [ + { + "version": "6.21.0", + "changes": [ + { + "note": "Arbitrum addresses: need to be updated when deployed" + } + ] + }, { "version": "6.20.1", "changes": [ diff --git a/packages/contract-addresses/addresses.json b/packages/contract-addresses/addresses.json index f97e57fc39..be3a30e27c 100644 --- a/packages/contract-addresses/addresses.json +++ b/packages/contract-addresses/addresses.json @@ -544,5 +544,47 @@ "fillQuoteTransformer": "0x96499c097efc56ba5cf6b2a474392db17790ce96", "positiveSlippageFeeTransformer": "0xb11e14565dfbeb702dea9bc0cb47f1a8b32f4783" } + }, + "42161": { + "erc20Proxy": "0x0000000000000000000000000000000000000000", + "erc721Proxy": "0x0000000000000000000000000000000000000000", + "zrxToken": "0x0000000000000000000000000000000000000000", + "etherToken": "0x4200000000000000000000000000000000000006", + "exchangeV2": "0x0000000000000000000000000000000000000000", + "exchange": "0x0000000000000000000000000000000000000000", + "assetProxyOwner": "0x0000000000000000000000000000000000000000", + "zeroExGovernor": "0x0000000000000000000000000000000000000000", + "forwarder": "0x0000000000000000000000000000000000000000", + "coordinatorRegistry": "0x0000000000000000000000000000000000000000", + "coordinator": "0x0000000000000000000000000000000000000000", + "multiAssetProxy": "0x0000000000000000000000000000000000000000", + "staticCallProxy": "0x0000000000000000000000000000000000000000", + "erc1155Proxy": "0x0000000000000000000000000000000000000000", + "devUtils": "0x0000000000000000000000000000000000000000", + "zrxVault": "0x0000000000000000000000000000000000000000", + "staking": "0x0000000000000000000000000000000000000000", + "stakingProxy": "0x0000000000000000000000000000000000000000", + "erc20BridgeProxy": "0x0000000000000000000000000000000000000000", + "erc20BridgeSampler": "0x0000000000000000000000000000000000000000", + "chaiBridge": "0x0000000000000000000000000000000000000000", + "dydxBridge": "0x0000000000000000000000000000000000000000", + "godsUnchainedValidator": "0x0000000000000000000000000000000000000000", + "broker": "0x0000000000000000000000000000000000000000", + "chainlinkStopLimit": "0x0000000000000000000000000000000000000000", + "maximumGasPrice": "0x0000000000000000000000000000000000000000", + "dexForwarderBridge": "0x0000000000000000000000000000000000000000", + "exchangeProxyGovernor": "0x1fe80d5ad9464dba2d60b88e449305f184823f8a", + "exchangeProxy": "0xdef1c0ded9bec7f1a1670819833240f027b25eff", + "exchangeProxyTransformerDeployer": "0x29f80c1f685e19ae1807063eda432f431ac623d0", + "exchangeProxyFlashWallet": "0xdb6f1920a889355780af7570773609bd8cb1f498", + "exchangeProxyLiquidityProviderSandbox": "0x0000000000000000000000000000000000000000", + "zrxTreasury": "0x0000000000000000000000000000000000000000", + "transformers": { + "wethTransformer": "0x10e968968f49dd66a5efeebbb2edcb9c49c4fc49", + "payTakerTransformer": "0xae3e8cf7bf340d7084f312dfae2aa8b01c885b02", + "affiliateFeeTransformer": "0x05a24978471869327904ea13da3c4322128e2aaa", + "fillQuoteTransformer": "0x0000000000000000000000000000000000000000", + "positiveSlippageFeeTransformer": "0xd56b9c014b45ed95e2a048a0c28121db30265f13" + } } } diff --git a/packages/contract-addresses/src/index.ts b/packages/contract-addresses/src/index.ts index 9ddf09161d..6767d3b119 100644 --- a/packages/contract-addresses/src/index.ts +++ b/packages/contract-addresses/src/index.ts @@ -56,7 +56,7 @@ export enum ChainId { Avalanche = 43114, Fantom = 250, Celo = 42220, - // Arbitrum = 42161, + Arbitrum = 42161, Optimism = 10, }