From 4a2575136fcea3eb9e67829fe1d8cc2ac3b400e2 Mon Sep 17 00:00:00 2001 From: Jacob Evans Date: Mon, 6 Jan 2020 17:19:00 +1000 Subject: [PATCH] Allow for batching multiple buy/sell samples --- .../contracts/src/ERC20BridgeSampler.sol | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/contracts/erc20-bridge-sampler/contracts/src/ERC20BridgeSampler.sol b/contracts/erc20-bridge-sampler/contracts/src/ERC20BridgeSampler.sol index 4a420f9295..246da8cb8f 100644 --- a/contracts/erc20-bridge-sampler/contracts/src/ERC20BridgeSampler.sol +++ b/contracts/erc20-bridge-sampler/contracts/src/ERC20BridgeSampler.sol @@ -41,6 +41,61 @@ contract ERC20BridgeSampler is uint256 constant internal UNISWAP_SAMPLE_CALL_GAS = 150e3; uint256 constant internal ETH2DAI_SAMPLE_CALL_GAS = 250e3; + struct OrdersAndSample { + uint256[] orderFillableTakerAssetAmounts; + uint256[][] makerTokenAmountsBySource; + } + + function queryMultipleOrdersAndSampleBuys( + LibOrder.Order[][] memory orders, + bytes[][] memory orderSignatures, + address[] memory sources, + uint256[] memory makerTokenAmounts + ) + public + view + returns ( + OrdersAndSample[] memory ordersAndSamples + ) + { + ordersAndSamples = new OrdersAndSample[](orders.length); + uint256[] memory amounts = new uint256[](1); + for (uint256 i = 0; i != orders.length; i++) { + amounts[0] = makerTokenAmounts[i]; + ( + uint256[] memory orderFillableTakerAssetAmounts, + uint256[][] memory makerTokenAmountsBySource + ) = queryOrdersAndSampleBuys(orders[i], orderSignatures[i], sources, amounts); + ordersAndSamples[i].orderFillableTakerAssetAmounts = orderFillableTakerAssetAmounts; + ordersAndSamples[i].makerTokenAmountsBySource = makerTokenAmountsBySource; + } + } + + function queryMultipleOrdersAndSampleSells( + LibOrder.Order[][] memory orders, + bytes[][] memory orderSignatures, + address[] memory sources, + uint256[] memory makerTokenAmounts + ) + public + view + returns ( + OrdersAndSample[] memory ordersAndSamples + ) + { + ordersAndSamples = new OrdersAndSample[](orders.length); + uint256[] memory amounts = new uint256[](1); + for (uint256 i = 0; i != orders.length; i++) { + amounts[0] = makerTokenAmounts[i]; + ( + uint256[] memory orderFillableTakerAssetAmounts, + uint256[][] memory makerTokenAmountsBySource + ) = queryOrdersAndSampleSells(orders[i], orderSignatures[i], sources, amounts); + ordersAndSamples[i].orderFillableTakerAssetAmounts = orderFillableTakerAssetAmounts; + ordersAndSamples[i].makerTokenAmountsBySource = makerTokenAmountsBySource; + } + } + /// @dev Query native orders and sample sell quotes on multiple DEXes at once. /// @param orders Native orders to query. /// @param orderSignatures Signatures for each respective order in `orders`.