From 4bc5106075b7b601ce2a639b40cdf2a750865074 Mon Sep 17 00:00:00 2001 From: Michael Zhu Date: Wed, 26 Feb 2020 16:55:19 -0800 Subject: [PATCH] Get liquidity provider from registry in the sampler --- contracts/erc20-bridge-sampler/CHANGELOG.json | 4 ++ .../contracts/src/ERC20BridgeSampler.sol | 41 +++++++++++++++++-- .../src/ILiquidityProviderRegistry.sol | 36 ++++++++++++++++ contracts/erc20-bridge-sampler/package.json | 4 +- .../erc20-bridge-sampler/test/artifacts.ts | 2 + .../erc20-bridge-sampler/test/wrappers.ts | 1 + contracts/erc20-bridge-sampler/tsconfig.json | 1 + 7 files changed, 83 insertions(+), 6 deletions(-) create mode 100644 contracts/erc20-bridge-sampler/contracts/src/ILiquidityProviderRegistry.sol diff --git a/contracts/erc20-bridge-sampler/CHANGELOG.json b/contracts/erc20-bridge-sampler/CHANGELOG.json index dd976b0b37..cb716c3d75 100644 --- a/contracts/erc20-bridge-sampler/CHANGELOG.json +++ b/contracts/erc20-bridge-sampler/CHANGELOG.json @@ -5,6 +5,10 @@ { "note": "Add generic liquidity provider sampling", "pr": 2487 + }, + { + "note": "Use liquidity provider registry in sampler", + "pr": 2499 } ] }, diff --git a/contracts/erc20-bridge-sampler/contracts/src/ERC20BridgeSampler.sol b/contracts/erc20-bridge-sampler/contracts/src/ERC20BridgeSampler.sol index 559d3f3c63..fd3b23d781 100644 --- a/contracts/erc20-bridge-sampler/contracts/src/ERC20BridgeSampler.sol +++ b/contracts/erc20-bridge-sampler/contracts/src/ERC20BridgeSampler.sol @@ -31,6 +31,7 @@ import "./IKyberNetwork.sol"; import "./IUniswapExchangeQuotes.sol"; import "./ICurve.sol"; import "./ILiquidityProvider.sol"; +import "./ILiquidityProviderRegistry.sol"; contract ERC20BridgeSampler is @@ -435,14 +436,14 @@ contract ERC20BridgeSampler is } /// @dev Sample sell quotes from an arbitrary on-chain liquidity provider. - /// @param providerAddress Address of the liquidity provider contract. + /// @param registryAddress Address of the liquidity provider registry contract. /// @param takerToken Address of the taker token (what to sell). /// @param makerToken Address of the maker token (what to buy). /// @param takerTokenAmounts Taker token sell amount for each sample. /// @return makerTokenAmounts Maker amounts bought at each taker token /// amount. function sampleSellsFromLiquidityProvider( - address providerAddress, + address registryAddress, address takerToken, address makerToken, uint256[] memory takerTokenAmounts @@ -451,6 +452,12 @@ contract ERC20BridgeSampler is view returns (uint256[] memory makerTokenAmounts) { + address providerAddress = getLiquidityProviderFromRegistry( + registryAddress, + takerToken, + makerToken + ); + uint256 numSamples = takerTokenAmounts.length; makerTokenAmounts = new uint256[](numSamples); for (uint256 i = 0; i < numSamples; i++) { @@ -474,14 +481,14 @@ contract ERC20BridgeSampler is } /// @dev Sample buy quotes from an arbitrary on-chain liquidity provider. - /// @param providerAddress Address of the liquidity provider contract. + /// @param registryAddress Address of the liquidity provider registry contract. /// @param takerToken Address of the taker token (what to sell). /// @param makerToken Address of the maker token (what to buy). /// @param makerTokenAmounts Maker token buy amount for each sample. /// @return takerTokenAmounts Taker amounts sold at each maker token /// amount. function sampleBuysFromLiquidityProvider( - address providerAddress, + address registryAddress, address takerToken, address makerToken, uint256[] memory makerTokenAmounts @@ -490,6 +497,12 @@ contract ERC20BridgeSampler is view returns (uint256[] memory takerTokenAmounts) { + address providerAddress = getLiquidityProviderFromRegistry( + registryAddress, + takerToken, + makerToken + ); + uint256 numSamples = makerTokenAmounts.length; takerTokenAmounts = new uint256[](numSamples); for (uint256 i = 0; i < numSamples; i++) { @@ -512,6 +525,26 @@ contract ERC20BridgeSampler is } } + /// @dev Returns the address of a liquidity provider for the given market + /// (takerToken, makerToken), from a registry of liquidity providers. + /// @param takerToken Taker asset managed by liquidity provider. + /// @param makerToken Maker asset managed by liquidity provider. + /// @return Address of the liquidity provider. + function getLiquidityProviderFromRegistry( + address registryAddress, + address takerToken, + address makerToken + ) + public + view + returns (address) + { + return ILiquidityProviderRegistry(registryAddress).getLiquidityProviderForMarket( + takerToken, + makerToken + ); + } + /// @dev Overridable way to get token decimals. /// @param tokenAddress Address of the token. /// @return decimals The decimal places for the token. diff --git a/contracts/erc20-bridge-sampler/contracts/src/ILiquidityProviderRegistry.sol b/contracts/erc20-bridge-sampler/contracts/src/ILiquidityProviderRegistry.sol new file mode 100644 index 0000000000..22a39299b1 --- /dev/null +++ b/contracts/erc20-bridge-sampler/contracts/src/ILiquidityProviderRegistry.sol @@ -0,0 +1,36 @@ +/* + + Copyright 2019 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.5.9; + + +interface ILiquidityProviderRegistry { + + /// @dev Returns the address of a liquidity provider for the given market + /// (takerToken, makerToken), reverting if the pool does not exist. + /// @param takerToken Taker asset managed by liquidity provider. + /// @param makerToken Maker asset managed by liquidity provider. + /// @return Address of the liquidity provider. + function getLiquidityProviderForMarket( + address takerToken, + address makerToken + ) + external + view + returns (address providerAddress); +} diff --git a/contracts/erc20-bridge-sampler/package.json b/contracts/erc20-bridge-sampler/package.json index 46906d6519..1a348974ae 100644 --- a/contracts/erc20-bridge-sampler/package.json +++ b/contracts/erc20-bridge-sampler/package.json @@ -36,9 +36,9 @@ "compile:truffle": "truffle compile" }, "config": { - "publicInterfaceContracts": "ERC20BridgeSampler,IERC20BridgeSampler", + "publicInterfaceContracts": "ERC20BridgeSampler,IERC20BridgeSampler,ILiquidityProvider,ILiquidityProviderRegistry", "abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually.", - "abis": "./test/generated-artifacts/@(ERC20BridgeSampler|ICurve|IDevUtils|IERC20BridgeSampler|IEth2Dai|IKyberNetwork|ILiquidityProvider|IUniswapExchangeQuotes|TestERC20BridgeSampler).json" + "abis": "./test/generated-artifacts/@(ERC20BridgeSampler|ICurve|IDevUtils|IERC20BridgeSampler|IEth2Dai|IKyberNetwork|ILiquidityProvider|ILiquidityProviderRegistry|IUniswapExchangeQuotes|TestERC20BridgeSampler).json" }, "repository": { "type": "git", diff --git a/contracts/erc20-bridge-sampler/test/artifacts.ts b/contracts/erc20-bridge-sampler/test/artifacts.ts index 6e9a15445c..2ed14d12a6 100644 --- a/contracts/erc20-bridge-sampler/test/artifacts.ts +++ b/contracts/erc20-bridge-sampler/test/artifacts.ts @@ -12,6 +12,7 @@ import * as IERC20BridgeSampler from '../test/generated-artifacts/IERC20BridgeSa import * as IEth2Dai from '../test/generated-artifacts/IEth2Dai.json'; import * as IKyberNetwork from '../test/generated-artifacts/IKyberNetwork.json'; import * as ILiquidityProvider from '../test/generated-artifacts/ILiquidityProvider.json'; +import * as ILiquidityProviderRegistry from '../test/generated-artifacts/ILiquidityProviderRegistry.json'; import * as IUniswapExchangeQuotes from '../test/generated-artifacts/IUniswapExchangeQuotes.json'; import * as TestERC20BridgeSampler from '../test/generated-artifacts/TestERC20BridgeSampler.json'; export const artifacts = { @@ -22,6 +23,7 @@ export const artifacts = { IEth2Dai: IEth2Dai as ContractArtifact, IKyberNetwork: IKyberNetwork as ContractArtifact, ILiquidityProvider: ILiquidityProvider as ContractArtifact, + ILiquidityProviderRegistry: ILiquidityProviderRegistry as ContractArtifact, IUniswapExchangeQuotes: IUniswapExchangeQuotes as ContractArtifact, TestERC20BridgeSampler: TestERC20BridgeSampler as ContractArtifact, }; diff --git a/contracts/erc20-bridge-sampler/test/wrappers.ts b/contracts/erc20-bridge-sampler/test/wrappers.ts index 55db751e47..4465c09dfd 100644 --- a/contracts/erc20-bridge-sampler/test/wrappers.ts +++ b/contracts/erc20-bridge-sampler/test/wrappers.ts @@ -10,5 +10,6 @@ export * from '../test/generated-wrappers/i_erc20_bridge_sampler'; export * from '../test/generated-wrappers/i_eth2_dai'; export * from '../test/generated-wrappers/i_kyber_network'; export * from '../test/generated-wrappers/i_liquidity_provider'; +export * from '../test/generated-wrappers/i_liquidity_provider_registry'; export * from '../test/generated-wrappers/i_uniswap_exchange_quotes'; export * from '../test/generated-wrappers/test_erc20_bridge_sampler'; diff --git a/contracts/erc20-bridge-sampler/tsconfig.json b/contracts/erc20-bridge-sampler/tsconfig.json index a8cc5145ea..949000bd81 100644 --- a/contracts/erc20-bridge-sampler/tsconfig.json +++ b/contracts/erc20-bridge-sampler/tsconfig.json @@ -12,6 +12,7 @@ "test/generated-artifacts/IEth2Dai.json", "test/generated-artifacts/IKyberNetwork.json", "test/generated-artifacts/ILiquidityProvider.json", + "test/generated-artifacts/ILiquidityProviderRegistry.json", "test/generated-artifacts/IUniswapExchangeQuotes.json", "test/generated-artifacts/TestERC20BridgeSampler.json" ],