diff --git a/contracts/asset-proxy/package.json b/contracts/asset-proxy/package.json index 982199c4f6..7d62490892 100644 --- a/contracts/asset-proxy/package.json +++ b/contracts/asset-proxy/package.json @@ -84,7 +84,7 @@ "@0x/contracts-erc20": "^3.2.0", "@0x/contracts-erc721": "^3.1.6", "@0x/contracts-exchange-libs": "^4.3.6", - "@0x/order-utils": "^10.3.0", + "@0x/order-utils": "^10.2.5", "@0x/types": "^3.1.3", "@0x/typescript-typings": "^5.1.0", "@0x/utils": "^5.5.0", diff --git a/contracts/broker/package.json b/contracts/broker/package.json index ac9b5fba12..cbb43aede1 100644 --- a/contracts/broker/package.json +++ b/contracts/broker/package.json @@ -85,7 +85,7 @@ }, "dependencies": { "@0x/base-contract": "^6.2.2", - "@0x/order-utils": "^10.3.0", + "@0x/order-utils": "^10.2.5", "@0x/typescript-typings": "^5.1.0", "@0x/utils": "^5.5.0", "ethereum-types": "^3.1.1" diff --git a/contracts/coordinator/package.json b/contracts/coordinator/package.json index bbdb7aaa12..d9b107cf73 100644 --- a/contracts/coordinator/package.json +++ b/contracts/coordinator/package.json @@ -60,7 +60,7 @@ "@0x/contracts-gen": "^2.0.9", "@0x/contracts-test-utils": "^5.3.3", "@0x/dev-utils": "^3.2.2", - "@0x/order-utils": "^10.3.0", + "@0x/order-utils": "^10.2.5", "@0x/sol-compiler": "^4.1.0", "@0x/ts-doc-gen": "^0.0.22", "@0x/tslint-config": "^4.0.0", diff --git a/contracts/erc20-bridge-sampler/CHANGELOG.json b/contracts/erc20-bridge-sampler/CHANGELOG.json index 1da51ea4d3..99b716f5c7 100644 --- a/contracts/erc20-bridge-sampler/CHANGELOG.json +++ b/contracts/erc20-bridge-sampler/CHANGELOG.json @@ -1,4 +1,17 @@ [ + { + "version": "1.7.0", + "changes": [ + { + "note": "Pass in `DevUtils` address to required functions", + "pr": 2629 + }, + { + "note": "Use new Kyber Katalyst functions", + "pr": 2629 + } + ] + }, { "version": "1.6.0", "changes": [ diff --git a/contracts/erc20-bridge-sampler/contracts/src/ERC20BridgeSampler.sol b/contracts/erc20-bridge-sampler/contracts/src/ERC20BridgeSampler.sol index b384ad943f..5098c07a02 100644 --- a/contracts/erc20-bridge-sampler/contracts/src/ERC20BridgeSampler.sol +++ b/contracts/erc20-bridge-sampler/contracts/src/ERC20BridgeSampler.sol @@ -30,6 +30,8 @@ import "./IERC20BridgeSampler.sol"; import "./IEth2Dai.sol"; import "./IKyberNetwork.sol"; import "./IKyberNetworkProxy.sol"; +import "./IKyberStorage.sol"; +import "./IKyberHintHandler.sol"; import "./IUniswapExchangeQuotes.sol"; import "./ICurve.sol"; import "./ILiquidityProvider.sol"; @@ -58,16 +60,12 @@ contract ERC20BridgeSampler is /// @dev Default gas limit for liquidity provider calls. uint256 constant internal DEFAULT_CALL_GAS = 400e3; // 400k /// @dev The Kyber Uniswap Reserve address - address constant internal KYBER_UNIWAP_RESERVE = 0x31E085Afd48a1d6e51Cc193153d625e8f0514C7F; + address constant internal KYBER_UNISWAP_RESERVE = 0x31E085Afd48a1d6e51Cc193153d625e8f0514C7F; + /// @dev The Kyber Uniswap V2 Reserve address + address constant internal KYBER_UNISWAPV2_RESERVE = 0x10908C875D865C66f271F5d3949848971c9595C9; /// @dev The Kyber Eth2Dai Reserve address address constant internal KYBER_ETH2DAI_RESERVE = 0x1E158c0e93c30d24e918Ef83d1e0bE23595C3c0f; - address private _devUtilsAddress; - - constructor(address devUtilsAddress) public { - _devUtilsAddress = devUtilsAddress; - } - /// @dev Call multiple public functions on this contract in a single transaction. /// @param callDatas ABI-encoded call data for each function call. /// @return callResults ABI-encoded results data for each call. @@ -91,18 +89,19 @@ contract ERC20BridgeSampler is /// maker/taker asset amounts (returning 0). /// @param orders Native orders to query. /// @param orderSignatures Signatures for each respective order in `orders`. + /// @param devUtilsAddress Address to the DevUtils contract. /// @return orderFillableTakerAssetAmounts How much taker asset can be filled /// by each order in `orders`. function getOrderFillableTakerAssetAmounts( LibOrder.Order[] memory orders, - bytes[] memory orderSignatures + bytes[] memory orderSignatures, + address devUtilsAddress ) public view returns (uint256[] memory orderFillableTakerAssetAmounts) { orderFillableTakerAssetAmounts = new uint256[](orders.length); - address devUtilsAddress = _devUtilsAddress; for (uint256 i = 0; i != orders.length; i++) { // Ignore orders with no signature or empty maker/taker amounts. if (orderSignatures[i].length == 0 || @@ -149,11 +148,13 @@ contract ERC20BridgeSampler is /// Effectively ignores orders that have empty signatures or /// @param orders Native orders to query. /// @param orderSignatures Signatures for each respective order in `orders`. + /// @param devUtilsAddress Address to the DevUtils contract. /// @return orderFillableMakerAssetAmounts How much maker asset can be filled /// by each order in `orders`. function getOrderFillableMakerAssetAmounts( LibOrder.Order[] memory orders, - bytes[] memory orderSignatures + bytes[] memory orderSignatures, + address devUtilsAddress ) public view @@ -161,7 +162,8 @@ contract ERC20BridgeSampler is { orderFillableMakerAssetAmounts = getOrderFillableTakerAssetAmounts( orders, - orderSignatures + orderSignatures, + devUtilsAddress ); // `orderFillableMakerAssetAmounts` now holds taker asset amounts, so // convert them to maker asset amounts. @@ -196,26 +198,15 @@ contract ERC20BridgeSampler is makerTokenAmounts = new uint256[](numSamples); address wethAddress = _getWethAddress(); uint256 value; - address reserve; for (uint256 i = 0; i < numSamples; i++) { if (takerToken == wethAddress || makerToken == wethAddress) { // Direct ETH based trade - (value, reserve) = _sampleSellFromKyberNetwork(takerToken, makerToken, takerTokenAmounts[i]); - // If this fills on an on-chain reserve we remove it as that can introduce collisions - if (reserve == KYBER_UNIWAP_RESERVE || reserve == KYBER_ETH2DAI_RESERVE) { - value = 0; - } + value = _sampleSellFromKyberNetwork(takerToken, makerToken, takerTokenAmounts[i]); } else { // Hop to ETH - (value, reserve) = _sampleSellFromKyberNetwork(takerToken, wethAddress, takerTokenAmounts[i]); + value = _sampleSellFromKyberNetwork(takerToken, wethAddress, takerTokenAmounts[i]); if (value != 0) { - address otherReserve; - (value, otherReserve) = _sampleSellFromKyberNetwork(wethAddress, makerToken, value); - // If this fills on Eth2Dai it is ok as we queried a different market - // If this fills on Uniswap on both legs then this is a hard collision - if (reserve == KYBER_UNIWAP_RESERVE && reserve == otherReserve) { - value = 0; - } + value = _sampleSellFromKyberNetwork(wethAddress, makerToken, value); } } makerTokenAmounts[i] = value; @@ -960,6 +951,25 @@ contract ERC20BridgeSampler is } } + function _appendToList(bytes32[] memory list, bytes32 item) private view returns (bytes32[] memory appendedList) + { + appendedList = new bytes32[](list.length + 1); + for (uint256 i = 0; i < list.length; i++) { + appendedList[i] = list[i]; + } + appendedList[appendedList.length - 1] = item; + } + + function _getKyberAddresses() + private + view + returns (IKyberHintHandler kyberHint, IKyberStorage kyberStorage) + { + (, , kyberHint, kyberStorage, ,) = IKyberNetwork( + IKyberNetworkProxy(_getKyberNetworkProxyAddress()).kyberNetwork()).getContracts(); + return (IKyberHintHandler(kyberHint), IKyberStorage(kyberStorage)); + } + function _sampleSellFromKyberNetwork( address takerToken, address makerToken, @@ -967,43 +977,67 @@ contract ERC20BridgeSampler is ) private view - returns (uint256 makerTokenAmount, address reserve) + returns (uint256 makerTokenAmount) { - address _takerToken = takerToken == _getWethAddress() ? KYBER_ETH_ADDRESS : takerToken; - address _makerToken = makerToken == _getWethAddress() ? KYBER_ETH_ADDRESS : makerToken; - uint256 takerTokenDecimals = _getTokenDecimals(takerToken); - uint256 makerTokenDecimals = _getTokenDecimals(makerToken); - (bool didSucceed, bytes memory resultData) = _getKyberNetworkProxyAddress().staticcall.gas(DEFAULT_CALL_GAS)( - abi.encodeWithSelector( - IKyberNetworkProxy(0).kyberNetworkContract.selector - )); - if (!didSucceed) { - return (0, address(0)); + (IKyberHintHandler kyberHint, IKyberStorage kyberStorage) = _getKyberAddresses(); + // Ban reserves which can clash with our internal aggregation + bytes32[] memory reserveIds = kyberStorage.getReserveIdsPerTokenSrc( + takerToken == _getWethAddress() ? makerToken : takerToken + ); + bytes32[] memory bannedReserveIds = new bytes32[](0); + // Poor mans resize and append + for (uint256 i = 0; i < reserveIds.length; i++) { + if ( + reserveIds[i] == kyberStorage.getReserveId(KYBER_UNISWAP_RESERVE) || + reserveIds[i] == kyberStorage.getReserveId(KYBER_UNISWAPV2_RESERVE) || + reserveIds[i] == kyberStorage.getReserveId(KYBER_ETH2DAI_RESERVE) + ) { + bannedReserveIds = _appendToList(bannedReserveIds, reserveIds[i]); + } } - address kyberNetworkContract = abi.decode(resultData, (address)); - (didSucceed, resultData) = - kyberNetworkContract.staticcall.gas(KYBER_CALL_GAS)( + // Sampler either detects X->ETH/ETH->X + // or subsamples as X->ETH-Y. So token->token here is not possible + bytes memory hint; + if (takerToken == _getWethAddress()) { + // ETH -> X + hint = kyberHint.buildEthToTokenHint( + makerToken, + IKyberHintHandler.TradeType.MaskOut, + bannedReserveIds, + new uint256[](0)); + } else { + // X->ETH + hint = kyberHint.buildEthToTokenHint( + takerToken, + IKyberHintHandler.TradeType.MaskOut, + bannedReserveIds, + new uint256[](0)); + } + (bool didSucceed, bytes memory resultData) = + _getKyberNetworkProxyAddress().staticcall.gas(KYBER_CALL_GAS)( abi.encodeWithSelector( - IKyberNetwork(0).searchBestRate.selector, - _takerToken, - _makerToken, + IKyberNetworkProxy(0).getExpectedRateAfterFee.selector, + takerToken == _getWethAddress() ? KYBER_ETH_ADDRESS : takerToken, + makerToken == _getWethAddress() ? KYBER_ETH_ADDRESS : makerToken, takerTokenAmount, - false // usePermissionless + 0, // fee + hint )); uint256 rate = 0; - address reserve; if (didSucceed) { - (reserve, rate) = abi.decode(resultData, (address, uint256)); + (rate) = abi.decode(resultData, (uint256)); } else { - return (0, address(0)); + return 0; } + + uint256 makerTokenDecimals = _getTokenDecimals(makerToken); + uint256 takerTokenDecimals = _getTokenDecimals(takerToken); makerTokenAmount = rate * takerTokenAmount * 10 ** makerTokenDecimals / 10 ** takerTokenDecimals / 10 ** 18; - - return (makerTokenAmount, reserve); + return makerTokenAmount; } } diff --git a/contracts/erc20-bridge-sampler/contracts/src/IERC20BridgeSampler.sol b/contracts/erc20-bridge-sampler/contracts/src/IERC20BridgeSampler.sol index 546a5c2563..69a6895c76 100644 --- a/contracts/erc20-bridge-sampler/contracts/src/IERC20BridgeSampler.sol +++ b/contracts/erc20-bridge-sampler/contracts/src/IERC20BridgeSampler.sol @@ -40,11 +40,13 @@ interface IERC20BridgeSampler { /// @dev Queries the fillable taker asset amounts of native orders. /// @param orders Native orders to query. /// @param orderSignatures Signatures for each respective order in `orders`. + /// @param devUtilsAddress Address to the DevUtils contract. /// @return orderFillableTakerAssetAmounts How much taker asset can be filled /// by each order in `orders`. function getOrderFillableTakerAssetAmounts( LibOrder.Order[] calldata orders, - bytes[] calldata orderSignatures + bytes[] calldata orderSignatures, + address devUtilsAddress ) external view @@ -53,11 +55,13 @@ interface IERC20BridgeSampler { /// @dev Queries the fillable maker asset amounts of native orders. /// @param orders Native orders to query. /// @param orderSignatures Signatures for each respective order in `orders`. + /// @param devUtilsAddress Address to the DevUtils contract. /// @return orderFillableMakerAssetAmounts How much maker asset can be filled /// by each order in `orders`. function getOrderFillableMakerAssetAmounts( LibOrder.Order[] calldata orders, - bytes[] calldata orderSignatures + bytes[] calldata orderSignatures, + address devUtilsAddress ) external view diff --git a/contracts/erc20-bridge-sampler/contracts/src/IKyberHintHandler.sol b/contracts/erc20-bridge-sampler/contracts/src/IKyberHintHandler.sol new file mode 100644 index 0000000000..560c5c21c9 --- /dev/null +++ b/contracts/erc20-bridge-sampler/contracts/src/IKyberHintHandler.sol @@ -0,0 +1,52 @@ +/* + + Copyright 2020 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 IKyberHintHandler { + + function kyberStorage() external returns (address); + + enum TradeType {BestOfAll, MaskIn, MaskOut, Split} + + function buildTokenToEthHint( + address tokenSrc, + TradeType tokenToEthType, + bytes32[] calldata tokenToEthReserveIds, + uint256[] calldata tokenToEthSplits + ) external view returns (bytes memory hint); + + function buildEthToTokenHint( + address tokenDest, + TradeType ethToTokenType, + bytes32[] calldata ethToTokenReserveIds, + uint256[] calldata ethToTokenSplits + ) external view returns (bytes memory hint); + + function buildTokenToTokenHint( + address tokenSrc, + TradeType tokenToEthType, + bytes32[] calldata tokenToEthReserveIds, + uint256[] calldata tokenToEthSplits, + address tokenDest, + TradeType ethToTokenType, + bytes32[] calldata ethToTokenReserveIds, + uint256[] calldata ethToTokenSplits + ) external view returns (bytes memory hint); +} diff --git a/contracts/erc20-bridge-sampler/contracts/src/IKyberNetwork.sol b/contracts/erc20-bridge-sampler/contracts/src/IKyberNetwork.sol index fc47627904..f3aba1cce1 100644 --- a/contracts/erc20-bridge-sampler/contracts/src/IKyberNetwork.sol +++ b/contracts/erc20-bridge-sampler/contracts/src/IKyberNetwork.sol @@ -1,6 +1,6 @@ /* - Copyright 2019 ZeroEx Intl. + Copyright 2020 ZeroEx Intl. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -18,16 +18,20 @@ pragma solidity ^0.5.9; +import "./IKyberStorage.sol"; +import "./IKyberHintHandler.sol"; + interface IKyberNetwork { - function searchBestRate( - address fromToken, - address toToken, - uint256 fromAmount, - bool usePermissionless - ) + function getContracts() external view - returns (address reserve, uint256 expectedRate); + returns ( + address kyberFeeHandlerAddress, + address kyberDaoAddress, + IKyberHintHandler kyberMatchingEngineAddress, + IKyberStorage kyberStorageAddress, + address gasHelperAddress, + address[] memory kyberProxyAddresses); } diff --git a/contracts/erc20-bridge-sampler/contracts/src/IKyberNetworkProxy.sol b/contracts/erc20-bridge-sampler/contracts/src/IKyberNetworkProxy.sol index edd0f465d7..8c9c8b7e1a 100644 --- a/contracts/erc20-bridge-sampler/contracts/src/IKyberNetworkProxy.sol +++ b/contracts/erc20-bridge-sampler/contracts/src/IKyberNetworkProxy.sol @@ -1,6 +1,6 @@ /* - Copyright 2019 ZeroEx Intl. + Copyright 2020 ZeroEx Intl. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -21,14 +21,14 @@ pragma solidity ^0.5.9; interface IKyberNetworkProxy { - function kyberNetworkContract() external view returns (address); + function kyberNetwork() external view returns (address); + function kyberHintHandler() external view returns (address); - function getExpectedRate( - address fromToken, - address toToken, - uint256 fromAmount - ) - external - view - returns (uint256 expectedRate, uint256 slippageRate); + function getExpectedRateAfterFee( + address src, + address dest, + uint256 srcQty, + uint256 platformFeeBps, + bytes calldata hint + ) external view returns (uint256 expectedRate); } diff --git a/contracts/erc20-bridge-sampler/contracts/src/IKyberStorage.sol b/contracts/erc20-bridge-sampler/contracts/src/IKyberStorage.sol new file mode 100644 index 0000000000..1ba31f0c52 --- /dev/null +++ b/contracts/erc20-bridge-sampler/contracts/src/IKyberStorage.sol @@ -0,0 +1,37 @@ +/* + + Copyright 2020 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 IKyberStorage { + + function getReserveId( + address reserve + ) + external + view + returns (bytes32 reserveId); + + function getReserveIdsPerTokenSrc( + address token + ) + external + view + returns (bytes32[] memory reserveIds); +} diff --git a/contracts/erc20-bridge-sampler/contracts/test/TestERC20BridgeSampler.sol b/contracts/erc20-bridge-sampler/contracts/test/TestERC20BridgeSampler.sol index 338b4c848e..4ff95bf126 100644 --- a/contracts/erc20-bridge-sampler/contracts/test/TestERC20BridgeSampler.sol +++ b/contracts/erc20-bridge-sampler/contracts/test/TestERC20BridgeSampler.sol @@ -244,15 +244,17 @@ contract TestERC20BridgeSamplerUniswapV2Router01 is } +// solhint-disable space-after-comma contract TestERC20BridgeSamplerKyberNetwork is - IKyberNetwork, DeploymentConstants, FailTrigger { bytes32 constant private SALT = 0x0ff3ca9d46195c39f9a12afb74207b4970349fb3cfb1e459bbf170298d326bc7; address constant public ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; - function kyberNetworkContract() + enum TradeType {BestOfAll, MaskIn, MaskOut, Split} + + function kyberNetwork() external view returns (address) @@ -260,19 +262,91 @@ contract TestERC20BridgeSamplerKyberNetwork is return address(this); } - // IKyberNetwork not exposed via IKyberNetworkProxy - function searchBestRate( - address fromToken, - address toToken, - uint256 fromAmount, - bool // usePermissionless + // IKyberNetwork + function getContracts() + external + view + returns ( + address kyberFeeHandlerAddress, + address kyberDaoAddress, + address kyberMatchingEngineAddress, + address kyberStorageAddress, + address gasHelperAddress, + address[] memory kyberProxyAddresses + ) + { + return (kyberFeeHandlerAddress, + kyberDaoAddress, + address(this), + address(this), + gasHelperAddress, + kyberProxyAddresses + ); + } + + // IKyberStorage + function getReserveIdsPerTokenSrc( + address /* token */ ) external view - returns (address reserve, uint256 expectedRate) + returns (bytes32[] memory reserveIds) { - (expectedRate, ) = this.getExpectedRate(fromToken, toToken, fromAmount); - return (address(this), expectedRate); + return reserveIds; + } + + function getReserveId( + address /* reserve */ + ) + external + view + returns (bytes32 reserveId) + { + return reserveId; + } + + // IKyberHintHandler + function buildTokenToEthHint( + address /* tokenSrc */, + TradeType /* tokenToEthType */, + bytes32[] calldata /* tokenToEthReserveIds */, + uint256[] calldata /* tokenToEthSplits */ + ) external view returns (bytes memory hint) + { + return hint; + } + + function buildEthToTokenHint( + address /* tokenDest */, + TradeType /* ethToTokenType */, + bytes32[] calldata /* ethToTokenReserveIds */, + uint256[] calldata /* ethToTokenSplits */ + ) external view returns (bytes memory hint) + { + return hint; + } + + // Deterministic `IKyberNetworkProxy.getExpectedRateAfterFee()`. + function getExpectedRateAfterFee( + address fromToken, + address toToken, + uint256 /* srcQty */, + uint256 /* fee */, + bytes calldata /* hint */ + ) + external + view + returns + (uint256 expectedRate) + { + _revertIfShouldFail(); + fromToken = fromToken == ETH_ADDRESS ? _getWethAddress() : fromToken; + toToken = toToken == ETH_ADDRESS ? _getWethAddress() : toToken; + expectedRate = LibDeterministicQuotes.getDeterministicRate( + SALT, + fromToken, + toToken + ); } // Deterministic `IKyberNetworkProxy.getExpectedRate()`. @@ -294,6 +368,14 @@ contract TestERC20BridgeSamplerKyberNetwork is toToken ); } + + function _getKyberNetworkProxyAddress() + internal + view + returns (address) + { + return address(this); + } } @@ -381,7 +463,7 @@ contract TestERC20BridgeSampler is uint8 private constant MAX_ORDER_STATUS = uint8(LibOrder.OrderStatus.CANCELLED) + 1; - constructor() public ERC20BridgeSampler(address(this)) { + constructor() public ERC20BridgeSampler() { uniswap = new TestERC20BridgeSamplerUniswapExchangeFactory(); uniswapV2Router = new TestERC20BridgeSamplerUniswapV2Router01(); eth2Dai = new TestERC20BridgeSamplerEth2Dai(); diff --git a/contracts/erc20-bridge-sampler/package.json b/contracts/erc20-bridge-sampler/package.json index 5b65131f38..636c82deed 100644 --- a/contracts/erc20-bridge-sampler/package.json +++ b/contracts/erc20-bridge-sampler/package.json @@ -38,7 +38,7 @@ "config": { "publicInterfaceContracts": "ERC20BridgeSampler,IERC20BridgeSampler,ILiquidityProvider,ILiquidityProviderRegistry,DummyLiquidityProviderRegistry,DummyLiquidityProvider", "abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually.", - "abis": "./test/generated-artifacts/@(DummyLiquidityProvider|DummyLiquidityProviderRegistry|ERC20BridgeSampler|ICurve|IDevUtils|IERC20BridgeSampler|IEth2Dai|IKyberNetwork|IKyberNetworkProxy|ILiquidityProvider|ILiquidityProviderRegistry|IMultiBridge|IUniswapExchangeQuotes|IUniswapV2Router01|TestERC20BridgeSampler).json" + "abis": "./test/generated-artifacts/@(DummyLiquidityProvider|DummyLiquidityProviderRegistry|ERC20BridgeSampler|ICurve|IDevUtils|IERC20BridgeSampler|IEth2Dai|IKyberHintHandler|IKyberNetwork|IKyberNetworkProxy|IKyberStorage|ILiquidityProvider|ILiquidityProviderRegistry|IMultiBridge|IUniswapExchangeQuotes|IUniswapV2Router01|TestERC20BridgeSampler).json" }, "repository": { "type": "git", diff --git a/contracts/erc20-bridge-sampler/test/artifacts.ts b/contracts/erc20-bridge-sampler/test/artifacts.ts index d05f5c5651..729ec25186 100644 --- a/contracts/erc20-bridge-sampler/test/artifacts.ts +++ b/contracts/erc20-bridge-sampler/test/artifacts.ts @@ -12,8 +12,10 @@ import * as ICurve from '../test/generated-artifacts/ICurve.json'; import * as IDevUtils from '../test/generated-artifacts/IDevUtils.json'; import * as IERC20BridgeSampler from '../test/generated-artifacts/IERC20BridgeSampler.json'; import * as IEth2Dai from '../test/generated-artifacts/IEth2Dai.json'; +import * as IKyberHintHandler from '../test/generated-artifacts/IKyberHintHandler.json'; import * as IKyberNetwork from '../test/generated-artifacts/IKyberNetwork.json'; import * as IKyberNetworkProxy from '../test/generated-artifacts/IKyberNetworkProxy.json'; +import * as IKyberStorage from '../test/generated-artifacts/IKyberStorage.json'; import * as ILiquidityProvider from '../test/generated-artifacts/ILiquidityProvider.json'; import * as ILiquidityProviderRegistry from '../test/generated-artifacts/ILiquidityProviderRegistry.json'; import * as IMultiBridge from '../test/generated-artifacts/IMultiBridge.json'; @@ -28,8 +30,10 @@ export const artifacts = { IDevUtils: IDevUtils as ContractArtifact, IERC20BridgeSampler: IERC20BridgeSampler as ContractArtifact, IEth2Dai: IEth2Dai as ContractArtifact, + IKyberHintHandler: IKyberHintHandler as ContractArtifact, IKyberNetwork: IKyberNetwork as ContractArtifact, IKyberNetworkProxy: IKyberNetworkProxy as ContractArtifact, + IKyberStorage: IKyberStorage as ContractArtifact, ILiquidityProvider: ILiquidityProvider as ContractArtifact, ILiquidityProviderRegistry: ILiquidityProviderRegistry as ContractArtifact, IMultiBridge: IMultiBridge as ContractArtifact, diff --git a/contracts/erc20-bridge-sampler/test/erc20-bridge-sampler.ts b/contracts/erc20-bridge-sampler/test/erc20-bridge-sampler.ts index 8943149eca..a20b66cbd9 100644 --- a/contracts/erc20-bridge-sampler/test/erc20-bridge-sampler.ts +++ b/contracts/erc20-bridge-sampler/test/erc20-bridge-sampler.ts @@ -33,6 +33,7 @@ blockchainTests('erc20-bridge-sampler', env => { const INVALID_TOKEN_PAIR_ERROR = 'ERC20BridgeSampler/INVALID_TOKEN_PAIR'; const MAKER_TOKEN = randomAddress(); const TAKER_TOKEN = randomAddress(); + let devUtilsAddress: string; const FAKE_BUY_OPTS = { targetSlippageBps: new BigNumber(5), maxIterations: new BigNumber(5), @@ -45,6 +46,8 @@ blockchainTests('erc20-bridge-sampler', env => { env.txDefaults, {}, ); + // TestERC20BridgeSampler stubs DevUtils + devUtilsAddress = testContract.address; }); function getPackedHash(...args: string[]): string { @@ -272,12 +275,14 @@ blockchainTests('erc20-bridge-sampler', env => { const orders = createOrders(MAKER_TOKEN, TAKER_TOKEN); const signatures: string[] = _.times(orders.length, i => hexUtils.random()); const expected = orders.map(getDeterministicFillableTakerAssetAmount); - const actual = await testContract.getOrderFillableTakerAssetAmounts(orders, signatures).callAsync(); + const actual = await testContract + .getOrderFillableTakerAssetAmounts(orders, signatures, devUtilsAddress) + .callAsync(); expect(actual).to.deep.eq(expected); }); it('returns empty for no orders', async () => { - const actual = await testContract.getOrderFillableTakerAssetAmounts([], []).callAsync(); + const actual = await testContract.getOrderFillableTakerAssetAmounts([], [], devUtilsAddress).callAsync(); expect(actual).to.deep.eq([]); }); @@ -285,7 +290,9 @@ blockchainTests('erc20-bridge-sampler', env => { const orders = createOrders(MAKER_TOKEN, TAKER_TOKEN, 1); orders[0].makerAssetAmount = constants.ZERO_AMOUNT; const signatures: string[] = _.times(orders.length, i => hexUtils.random()); - const actual = await testContract.getOrderFillableTakerAssetAmounts(orders, signatures).callAsync(); + const actual = await testContract + .getOrderFillableTakerAssetAmounts(orders, signatures, devUtilsAddress) + .callAsync(); expect(actual).to.deep.eq([constants.ZERO_AMOUNT]); }); @@ -293,14 +300,18 @@ blockchainTests('erc20-bridge-sampler', env => { const orders = createOrders(MAKER_TOKEN, TAKER_TOKEN, 1); orders[0].takerAssetAmount = constants.ZERO_AMOUNT; const signatures: string[] = _.times(orders.length, i => hexUtils.random()); - const actual = await testContract.getOrderFillableTakerAssetAmounts(orders, signatures).callAsync(); + const actual = await testContract + .getOrderFillableTakerAssetAmounts(orders, signatures, devUtilsAddress) + .callAsync(); expect(actual).to.deep.eq([constants.ZERO_AMOUNT]); }); it('returns zero for an order with an empty signature', async () => { const orders = createOrders(MAKER_TOKEN, TAKER_TOKEN, 1); const signatures: string[] = _.times(orders.length, () => constants.NULL_BYTES); - const actual = await testContract.getOrderFillableTakerAssetAmounts(orders, signatures).callAsync(); + const actual = await testContract + .getOrderFillableTakerAssetAmounts(orders, signatures, devUtilsAddress) + .callAsync(); expect(actual).to.deep.eq([constants.ZERO_AMOUNT]); }); }); @@ -310,12 +321,14 @@ blockchainTests('erc20-bridge-sampler', env => { const orders = createOrders(MAKER_TOKEN, TAKER_TOKEN); const signatures: string[] = _.times(orders.length, i => hexUtils.random()); const expected = orders.map(getDeterministicFillableMakerAssetAmount); - const actual = await testContract.getOrderFillableMakerAssetAmounts(orders, signatures).callAsync(); + const actual = await testContract + .getOrderFillableMakerAssetAmounts(orders, signatures, devUtilsAddress) + .callAsync(); expect(actual).to.deep.eq(expected); }); it('returns empty for no orders', async () => { - const actual = await testContract.getOrderFillableMakerAssetAmounts([], []).callAsync(); + const actual = await testContract.getOrderFillableMakerAssetAmounts([], [], devUtilsAddress).callAsync(); expect(actual).to.deep.eq([]); }); @@ -323,7 +336,9 @@ blockchainTests('erc20-bridge-sampler', env => { const orders = createOrders(MAKER_TOKEN, TAKER_TOKEN, 1); orders[0].makerAssetAmount = constants.ZERO_AMOUNT; const signatures: string[] = _.times(orders.length, i => hexUtils.random()); - const actual = await testContract.getOrderFillableMakerAssetAmounts(orders, signatures).callAsync(); + const actual = await testContract + .getOrderFillableMakerAssetAmounts(orders, signatures, devUtilsAddress) + .callAsync(); expect(actual).to.deep.eq([constants.ZERO_AMOUNT]); }); @@ -331,14 +346,18 @@ blockchainTests('erc20-bridge-sampler', env => { const orders = createOrders(MAKER_TOKEN, TAKER_TOKEN, 1); orders[0].takerAssetAmount = constants.ZERO_AMOUNT; const signatures: string[] = _.times(orders.length, i => hexUtils.random()); - const actual = await testContract.getOrderFillableMakerAssetAmounts(orders, signatures).callAsync(); + const actual = await testContract + .getOrderFillableMakerAssetAmounts(orders, signatures, devUtilsAddress) + .callAsync(); expect(actual).to.deep.eq([constants.ZERO_AMOUNT]); }); it('returns zero for an order with an empty signature', async () => { const orders = createOrders(MAKER_TOKEN, TAKER_TOKEN, 1); const signatures: string[] = _.times(orders.length, () => constants.NULL_BYTES); - const actual = await testContract.getOrderFillableMakerAssetAmounts(orders, signatures).callAsync(); + const actual = await testContract + .getOrderFillableMakerAssetAmounts(orders, signatures, devUtilsAddress) + .callAsync(); expect(actual).to.deep.eq([constants.ZERO_AMOUNT]); }); }); @@ -1029,7 +1048,9 @@ blockchainTests('erc20-bridge-sampler', env => { const signatures: string[] = _.times(orders.length, i => hexUtils.random()); const expected = orders.map(getDeterministicFillableTakerAssetAmount); const calls = [ - testContract.getOrderFillableTakerAssetAmounts(orders, signatures).getABIEncodedTransactionData(), + testContract + .getOrderFillableTakerAssetAmounts(orders, signatures, devUtilsAddress) + .getABIEncodedTransactionData(), ]; const r = await testContract.batchCall(calls).callAsync(); expect(r).to.be.length(1); @@ -1046,8 +1067,12 @@ blockchainTests('erc20-bridge-sampler', env => { orders[1].map(getDeterministicFillableMakerAssetAmount), ]; const calls = [ - testContract.getOrderFillableTakerAssetAmounts(orders[0], signatures).getABIEncodedTransactionData(), - testContract.getOrderFillableMakerAssetAmounts(orders[1], signatures).getABIEncodedTransactionData(), + testContract + .getOrderFillableTakerAssetAmounts(orders[0], signatures, devUtilsAddress) + .getABIEncodedTransactionData(), + testContract + .getOrderFillableMakerAssetAmounts(orders[1], signatures, devUtilsAddress) + .getABIEncodedTransactionData(), ]; const r = await testContract.batchCall(calls).callAsync(); expect(r).to.be.length(2); @@ -1069,7 +1094,7 @@ blockchainTests('erc20-bridge-sampler', env => { testContract .batchCall([ testContract - .getOrderFillableTakerAssetAmounts(orders, signatures) + .getOrderFillableTakerAssetAmounts(orders, signatures, devUtilsAddress) .getABIEncodedTransactionData(), ]) .getABIEncodedTransactionData(), diff --git a/contracts/erc20-bridge-sampler/test/wrappers.ts b/contracts/erc20-bridge-sampler/test/wrappers.ts index aba6dd2e0d..ec7b3d1b5b 100644 --- a/contracts/erc20-bridge-sampler/test/wrappers.ts +++ b/contracts/erc20-bridge-sampler/test/wrappers.ts @@ -10,8 +10,10 @@ export * from '../test/generated-wrappers/i_curve'; export * from '../test/generated-wrappers/i_dev_utils'; export * from '../test/generated-wrappers/i_erc20_bridge_sampler'; export * from '../test/generated-wrappers/i_eth2_dai'; +export * from '../test/generated-wrappers/i_kyber_hint_handler'; export * from '../test/generated-wrappers/i_kyber_network'; export * from '../test/generated-wrappers/i_kyber_network_proxy'; +export * from '../test/generated-wrappers/i_kyber_storage'; export * from '../test/generated-wrappers/i_liquidity_provider'; export * from '../test/generated-wrappers/i_liquidity_provider_registry'; export * from '../test/generated-wrappers/i_multi_bridge'; diff --git a/contracts/erc20-bridge-sampler/tsconfig.json b/contracts/erc20-bridge-sampler/tsconfig.json index efb2203777..9aec3552fc 100644 --- a/contracts/erc20-bridge-sampler/tsconfig.json +++ b/contracts/erc20-bridge-sampler/tsconfig.json @@ -16,8 +16,10 @@ "test/generated-artifacts/IDevUtils.json", "test/generated-artifacts/IERC20BridgeSampler.json", "test/generated-artifacts/IEth2Dai.json", + "test/generated-artifacts/IKyberHintHandler.json", "test/generated-artifacts/IKyberNetwork.json", "test/generated-artifacts/IKyberNetworkProxy.json", + "test/generated-artifacts/IKyberStorage.json", "test/generated-artifacts/ILiquidityProvider.json", "test/generated-artifacts/ILiquidityProviderRegistry.json", "test/generated-artifacts/IMultiBridge.json", diff --git a/contracts/exchange-forwarder/package.json b/contracts/exchange-forwarder/package.json index 40253a3c85..a2abc38705 100644 --- a/contracts/exchange-forwarder/package.json +++ b/contracts/exchange-forwarder/package.json @@ -64,7 +64,7 @@ "@0x/contracts-test-utils": "^5.3.3", "@0x/contracts-utils": "^4.5.0", "@0x/dev-utils": "^3.2.2", - "@0x/order-utils": "^10.3.0", + "@0x/order-utils": "^10.2.5", "@0x/sol-compiler": "^4.1.0", "@0x/ts-doc-gen": "^0.0.22", "@0x/tslint-config": "^4.0.0", diff --git a/contracts/exchange-libs/package.json b/contracts/exchange-libs/package.json index 1ac22bfdbc..ba3a7d429d 100644 --- a/contracts/exchange-libs/package.json +++ b/contracts/exchange-libs/package.json @@ -83,7 +83,7 @@ "@0x/base-contract": "^6.2.2", "@0x/contracts-test-utils": "^5.3.3", "@0x/contracts-utils": "^4.5.0", - "@0x/order-utils": "^10.3.0", + "@0x/order-utils": "^10.2.5", "@0x/types": "^3.1.3", "@0x/typescript-typings": "^5.1.0", "@0x/utils": "^5.5.0", diff --git a/contracts/exchange/package.json b/contracts/exchange/package.json index 7a41c5a1d8..0acc8276b7 100644 --- a/contracts/exchange/package.json +++ b/contracts/exchange/package.json @@ -93,7 +93,7 @@ "@0x/contracts-erc1155": "^2.1.6", "@0x/contracts-erc20": "^3.2.0", "@0x/contracts-erc721": "^3.1.6", - "@0x/order-utils": "^10.3.0", + "@0x/order-utils": "^10.2.5", "@0x/utils": "^5.5.0", "lodash": "^4.17.11" }, diff --git a/contracts/extensions/package.json b/contracts/extensions/package.json index 47ea3de74c..685596d001 100644 --- a/contracts/extensions/package.json +++ b/contracts/extensions/package.json @@ -62,7 +62,7 @@ "@0x/contracts-test-utils": "^5.3.3", "@0x/contracts-utils": "^4.5.0", "@0x/dev-utils": "^3.2.2", - "@0x/order-utils": "^10.3.0", + "@0x/order-utils": "^10.2.5", "@0x/sol-compiler": "^4.1.0", "@0x/ts-doc-gen": "^0.0.22", "@0x/tslint-config": "^4.0.0", diff --git a/contracts/integrations/package.json b/contracts/integrations/package.json index 0dbf90d713..33dc8bec0d 100644 --- a/contracts/integrations/package.json +++ b/contracts/integrations/package.json @@ -66,7 +66,7 @@ "@0x/coordinator-server": "^1.0.5", "@0x/dev-utils": "^3.2.2", "@0x/migrations": "^6.3.0", - "@0x/order-utils": "^10.3.0", + "@0x/order-utils": "^10.2.5", "@0x/sol-compiler": "^4.1.0", "@0x/tslint-config": "^4.0.0", "@0x/web3-wrapper": "^7.1.0", diff --git a/contracts/integrations/test/bridge_sampler/bridge_sampler_mainnet_test.ts b/contracts/integrations/test/bridge_sampler/bridge_sampler_mainnet_test.ts index 78cdc8dac1..05ea74122a 100644 --- a/contracts/integrations/test/bridge_sampler/bridge_sampler_mainnet_test.ts +++ b/contracts/integrations/test/bridge_sampler/bridge_sampler_mainnet_test.ts @@ -1,6 +1,7 @@ import { artifacts, ERC20BridgeSamplerContract } from '@0x/contracts-erc20-bridge-sampler'; -import { blockchainTests, constants, describe, expect, toBaseUnitAmount } from '@0x/contracts-test-utils'; -import { BigNumber } from '@0x/utils'; +import { blockchainTests, describe, expect, toBaseUnitAmount, Web3ProviderEngine } from '@0x/contracts-test-utils'; +import { RPCSubprovider } from '@0x/dev-utils/node_modules/@0x/subproviders'; +import { BigNumber, providerUtils } from '@0x/utils'; export const VB = '0x6cc5f688a315f3dc28a7781717a9a798a59fda7b'; blockchainTests.configure({ @@ -11,14 +12,21 @@ blockchainTests.configure({ blockchainTests.fork.resets('Mainnet Sampler Tests', env => { let testContract: ERC20BridgeSamplerContract; + const fakeSamplerAddress = '0x1111111111111111111111111111111111111111'; + const overrides = { + [fakeSamplerAddress]: { + code: artifacts.ERC20BridgeSampler.compilerOutput.evm.deployedBytecode.object, + }, + }; before(async () => { - testContract = await ERC20BridgeSamplerContract.deployFrom0xArtifactAsync( - artifacts.ERC20BridgeSampler, - env.provider, - { ...env.txDefaults, from: VB }, - {}, - constants.NULL_ADDRESS, - ); + const provider = new Web3ProviderEngine(); + // tslint:disable-next-line:no-non-null-assertion + provider.addProvider(new RPCSubprovider(process.env.FORK_RPC_URL!)); + providerUtils.startProviderEngine(provider); + testContract = new ERC20BridgeSamplerContract(fakeSamplerAddress, provider, { + ...env.txDefaults, + from: VB, + }); }); describe('Curve', () => { const CURVE_ADDRESS = '0xa2b47e3d5c44877cca798226b7b8118f9bfb7a56'; @@ -29,7 +37,7 @@ blockchainTests.fork.resets('Mainnet Sampler Tests', env => { it('samples sells from Curve DAI->USDC', async () => { const samples = await testContract .sampleSellsFromCurve(CURVE_ADDRESS, DAI_TOKEN_INDEX, USDC_TOKEN_INDEX, [toBaseUnitAmount(1)]) - .callAsync(); + .callAsync({ overrides }); expect(samples.length).to.be.bignumber.greaterThan(0); expect(samples[0]).to.be.bignumber.greaterThan(0); }); @@ -37,7 +45,7 @@ blockchainTests.fork.resets('Mainnet Sampler Tests', env => { it('samples sells from Curve USDC->DAI', async () => { const samples = await testContract .sampleSellsFromCurve(CURVE_ADDRESS, USDC_TOKEN_INDEX, DAI_TOKEN_INDEX, [toBaseUnitAmount(1, 6)]) - .callAsync(); + .callAsync({ overrides }); expect(samples.length).to.be.bignumber.greaterThan(0); expect(samples[0]).to.be.bignumber.greaterThan(0); }); @@ -49,7 +57,7 @@ blockchainTests.fork.resets('Mainnet Sampler Tests', env => { // I want to buy 1 USDC const samples = await testContract .sampleBuysFromCurve(CURVE_ADDRESS, DAI_TOKEN_INDEX, USDC_TOKEN_INDEX, [toBaseUnitAmount(1, 6)]) - .callAsync(); + .callAsync({ overrides }); expect(samples.length).to.be.bignumber.greaterThan(0); expect(samples[0]).to.be.bignumber.greaterThan(0); }); @@ -59,7 +67,7 @@ blockchainTests.fork.resets('Mainnet Sampler Tests', env => { // I want to buy 1 DAI const samples = await testContract .sampleBuysFromCurve(CURVE_ADDRESS, USDC_TOKEN_INDEX, DAI_TOKEN_INDEX, [toBaseUnitAmount(1)]) - .callAsync(); + .callAsync({ overrides }); expect(samples.length).to.be.bignumber.greaterThan(0); expect(samples[0]).to.be.bignumber.greaterThan(0); }); @@ -70,16 +78,40 @@ blockchainTests.fork.resets('Mainnet Sampler Tests', env => { targetSlippageBps: new BigNumber(5), maxIterations: new BigNumber(5), }; - const DAI_ADDRESS = '0x6B175474E89094C44Da98b954EedeAC495271d0F'; - const WETH_ADDRESS = '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2'; + const WETH = '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2'; + const DAI = '0x6b175474e89094c44da98b954eedeac495271d0f'; + const USDC = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48'; + describe('sampleSellsFromKyberNetwork()', () => { + it('samples sells from Kyber DAI->WETH', async () => { + const samples = await testContract + .sampleSellsFromKyberNetwork(DAI, WETH, [toBaseUnitAmount(1)]) + .callAsync({ overrides }); + expect(samples.length).to.be.bignumber.greaterThan(0); + expect(samples[0]).to.be.bignumber.greaterThan(0); + }); + it('samples sells from Kyber WETH->DAI', async () => { + const samples = await testContract + .sampleSellsFromKyberNetwork(WETH, DAI, [toBaseUnitAmount(1)]) + .callAsync({ overrides }); + expect(samples.length).to.be.bignumber.greaterThan(0); + expect(samples[0]).to.be.bignumber.greaterThan(0); + }); + it('samples sells from Kyber DAI->USDC', async () => { + const samples = await testContract + .sampleSellsFromKyberNetwork(DAI, USDC, [toBaseUnitAmount(1)]) + .callAsync({ overrides }); + expect(samples.length).to.be.bignumber.greaterThan(0); + expect(samples[0]).to.be.bignumber.greaterThan(0); + }); + }); describe('sampleBuysFromKyber()', () => { it('samples buys from Kyber WETH->DAI', async () => { // From ETH to DAI // I want to buy 1 DAI const samples = await testContract - .sampleBuysFromKyberNetwork(WETH_ADDRESS, DAI_ADDRESS, [toBaseUnitAmount(1)], FAKE_BUY_OPTS) - .callAsync(); + .sampleBuysFromKyberNetwork(WETH, DAI, [toBaseUnitAmount(1)], FAKE_BUY_OPTS) + .callAsync({ overrides }); expect(samples.length).to.be.bignumber.greaterThan(0); expect(samples[0]).to.be.bignumber.greaterThan(0); }); @@ -88,8 +120,8 @@ blockchainTests.fork.resets('Mainnet Sampler Tests', env => { // From USDC to DAI // I want to buy 1 WETH const samples = await testContract - .sampleBuysFromKyberNetwork(DAI_ADDRESS, WETH_ADDRESS, [toBaseUnitAmount(1)], FAKE_BUY_OPTS) - .callAsync(); + .sampleBuysFromKyberNetwork(DAI, WETH, [toBaseUnitAmount(1)], FAKE_BUY_OPTS) + .callAsync({ overrides }); expect(samples.length).to.be.bignumber.greaterThan(0); expect(samples[0]).to.be.bignumber.greaterThan(0); }); diff --git a/contracts/staking/package.json b/contracts/staking/package.json index a96223d59f..e14a8170cb 100644 --- a/contracts/staking/package.json +++ b/contracts/staking/package.json @@ -61,7 +61,7 @@ "@0x/contracts-gen": "^2.0.9", "@0x/contracts-utils": "^4.5.0", "@0x/dev-utils": "^3.2.2", - "@0x/order-utils": "^10.3.0", + "@0x/order-utils": "^10.2.5", "@0x/sol-compiler": "^4.1.0", "@0x/ts-doc-gen": "^0.0.22", "@0x/tslint-config": "^4.0.0", diff --git a/contracts/test-utils/package.json b/contracts/test-utils/package.json index e31387251b..2a0a665c36 100644 --- a/contracts/test-utils/package.json +++ b/contracts/test-utils/package.json @@ -47,9 +47,9 @@ "@0x/contract-addresses": "^4.10.0", "@0x/dev-utils": "^3.2.2", "@0x/json-schemas": "^5.0.8", - "@0x/order-utils": "^10.3.0", + "@0x/order-utils": "^10.2.5", "@0x/sol-coverage": "^4.0.9", - "@0x/sol-profiler": "^4.1.0", + "@0x/sol-profiler": "^4.0.9", "@0x/sol-trace": "^3.0.9", "@0x/subproviders": "^6.1.0", "@0x/types": "^3.1.3", diff --git a/contracts/utils/contracts/src/DeploymentConstants.sol b/contracts/utils/contracts/src/DeploymentConstants.sol index fb4b59a1f9..7950ccc0e5 100644 --- a/contracts/utils/contracts/src/DeploymentConstants.sol +++ b/contracts/utils/contracts/src/DeploymentConstants.sol @@ -27,7 +27,7 @@ contract DeploymentConstants { /// @dev Mainnet address of the WETH contract. address constant private WETH_ADDRESS = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; /// @dev Mainnet address of the KyberNetworkProxy contract. - address constant private KYBER_NETWORK_PROXY_ADDRESS = 0x818E6FECD516Ecc3849DAf6845e3EC868087B755; + address constant private KYBER_NETWORK_PROXY_ADDRESS = 0x9AAb3f75489902f3a48495025729a0AF77d4b11e; /// @dev Mainnet address of the `UniswapExchangeFactory` contract. address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0xc0a47dFe034B400B47bDaD5FecDa2621de6c4d95; /// @dev Mainnet address of the `UniswapV2Router01` contract. diff --git a/contracts/utils/package.json b/contracts/utils/package.json index af535cebce..4677e5b648 100644 --- a/contracts/utils/package.json +++ b/contracts/utils/package.json @@ -54,7 +54,7 @@ "@0x/contracts-gen": "^2.0.9", "@0x/contracts-test-utils": "^5.3.3", "@0x/dev-utils": "^3.2.2", - "@0x/order-utils": "^10.3.0", + "@0x/order-utils": "^10.2.5", "@0x/sol-compiler": "^4.1.0", "@0x/tslint-config": "^4.0.0", "@0x/types": "^3.1.3", diff --git a/contracts/zero-ex/package.json b/contracts/zero-ex/package.json index 19a77e7620..63a82a064f 100644 --- a/contracts/zero-ex/package.json +++ b/contracts/zero-ex/package.json @@ -57,7 +57,7 @@ "@0x/contracts-gen": "^2.0.9", "@0x/contracts-test-utils": "^5.3.3", "@0x/dev-utils": "^3.2.2", - "@0x/order-utils": "^10.3.0", + "@0x/order-utils": "^10.2.5", "@0x/sol-compiler": "^4.1.0", "@0x/ts-doc-gen": "^0.0.22", "@0x/tslint-config": "^4.0.0", diff --git a/packages/asset-swapper/CHANGELOG.json b/packages/asset-swapper/CHANGELOG.json index 86b31d43b8..088a1a8d3f 100644 --- a/packages/asset-swapper/CHANGELOG.json +++ b/packages/asset-swapper/CHANGELOG.json @@ -37,6 +37,10 @@ { "note": "Change gas/fee schedule values from constants to functions returning numbers", "pr": 2613 + }, + { + "note": "Specify overrides to the ERC20Sampler contract, by default the latest bytecode is the override", + "pr": 2629 } ] }, diff --git a/packages/asset-swapper/package.json b/packages/asset-swapper/package.json index fa371d1892..e71201b21e 100644 --- a/packages/asset-swapper/package.json +++ b/packages/asset-swapper/package.json @@ -49,6 +49,7 @@ "@0x/assert": "^3.0.8", "@0x/contract-addresses": "^4.10.0", "@0x/contract-wrappers": "^13.7.0", + "@0x/contract-artifacts": "^3.7.0", "@0x/json-schemas": "^5.0.8", "@0x/order-utils": "^10.2.5", "@0x/orderbook": "^2.2.6", diff --git a/packages/asset-swapper/src/index.ts b/packages/asset-swapper/src/index.ts index 16e58a6d07..20df2ce2ec 100644 --- a/packages/asset-swapper/src/index.ts +++ b/packages/asset-swapper/src/index.ts @@ -12,15 +12,18 @@ export { SRAPollingOrderProviderOpts, SRAWebsocketOrderProviderOpts, } from '@0x/orderbook'; -export { RFQTIndicativeQuote, RFQTFirmQuote } from '@0x/quote-server'; +export { RFQTFirmQuote, RFQTIndicativeQuote } from '@0x/quote-server'; export { APIOrder, Asset, AssetPairsItem, SignedOrder } from '@0x/types'; export { BigNumber } from '@0x/utils'; export { + BlockParam, + BlockParamLiteral, DataItem, EIP1193Event, EIP1193Provider, EventParameter, GanacheProvider, + GethCallOverrides, JSONRPCErrorCallback, JSONRPCRequestPayload, JSONRPCResponseError, @@ -38,6 +41,7 @@ export { SwapQuoteConsumer } from './quote_consumers/swap_quote_consumer'; export { SwapQuoter } from './swap_quoter'; export { CalldataInfo, + ExchangeProxyContractOpts, ExtensionContractType, ForwarderExtensionContractOpts, GetExtensionContractTypeOpts, @@ -49,34 +53,34 @@ export { MockedRfqtFirmQuoteResponse, RfqtMakerAssetOfferings, RfqtRequestOpts, + SamplerOverrides, + SignedOrderWithFillableAmounts, SwapQuote, SwapQuoteConsumerBase, + SwapQuoteConsumerError, SwapQuoteConsumerOpts, SwapQuoteExecutionOpts, SwapQuoteGetOutputOpts, SwapQuoteInfo, + SwapQuoteOrdersBreakdown, SwapQuoteRequestOpts, SwapQuoterError, SwapQuoterOpts, - SwapQuoteConsumerError, - SignedOrderWithFillableAmounts, - SwapQuoteOrdersBreakdown, - ExchangeProxyContractOpts, } from './types'; +export { affiliateFeeUtils } from './utils/affiliate_fee_utils'; export { - ERC20BridgeSource, + BalancerFillData, CollapsedFill, - NativeCollapsedFill, - OptimizedMarketOrder, - GetMarketOrdersRfqtOpts, + CurveFillData, + ERC20BridgeSource, FeeSchedule, FillData, + GetMarketOrdersRfqtOpts, + NativeCollapsedFill, NativeFillData, - CurveFillData, - BalancerFillData, + OptimizedMarketOrder, UniswapV2FillData, } from './utils/market_operation_utils/types'; -export { affiliateFeeUtils } from './utils/affiliate_fee_utils'; export { ProtocolFeeUtils } from './utils/protocol_fee_utils'; export { QuoteRequestor } from './utils/quote_requestor'; export { rfqtMocker } from './utils/rfqt_mocker'; diff --git a/packages/asset-swapper/src/swap_quoter.ts b/packages/asset-swapper/src/swap_quoter.ts index 1d19f91736..f43e172cc5 100644 --- a/packages/asset-swapper/src/swap_quoter.ts +++ b/packages/asset-swapper/src/swap_quoter.ts @@ -1,10 +1,11 @@ import { ContractAddresses, getContractAddressesForChainOrThrow } from '@0x/contract-addresses'; -import { DevUtilsContract, IERC20BridgeSamplerContract } from '@0x/contract-wrappers'; +import { ERC20BridgeSampler } from '@0x/contract-artifacts'; +import { DevUtilsContract, ERC20BridgeSamplerContract } from '@0x/contract-wrappers'; import { schemas } from '@0x/json-schemas'; import { assetDataUtils, SignedOrder } from '@0x/order-utils'; import { MeshOrderProviderOpts, Orderbook, SRAPollingOrderProviderOpts } from '@0x/orderbook'; import { BigNumber, providerUtils } from '@0x/utils'; -import { SupportedProvider, ZeroExProvider } from 'ethereum-types'; +import { BlockParamLiteral, SupportedProvider, ZeroExProvider } from 'ethereum-types'; import * as _ from 'lodash'; import { constants } from './constants'; @@ -185,13 +186,27 @@ export class SwapQuoter { rfqt ? rfqt.infoLogger : undefined, expiryBufferMs, ); - const sampler = new DexOrderSampler( - new IERC20BridgeSamplerContract(this._contractAddresses.erc20BridgeSampler, this.provider, { + // Allow the sampler bytecode to be overwritten using geths override functionality + const samplerBytecode = _.get(ERC20BridgeSampler, 'compilerOutput.evm.deployedBytecode.object'); + const defaultCodeOverrides = samplerBytecode + ? { + [this._contractAddresses.erc20BridgeSampler]: { code: samplerBytecode }, + } + : {}; + const samplerOverrides = _.merge( + {}, + { block: BlockParamLiteral.Latest, overrides: defaultCodeOverrides }, + options.samplerOverrides, + ); + const samplerContract = new ERC20BridgeSamplerContract( + this._contractAddresses.erc20BridgeSampler, + this.provider, + { gas: samplerGasLimit, - }), + }, ); this._marketOperationUtils = new MarketOperationUtils( - sampler, + new DexOrderSampler(samplerContract, samplerOverrides), this._contractAddresses, { chainId, diff --git a/packages/asset-swapper/src/types.ts b/packages/asset-swapper/src/types.ts index df145e9b19..798e320f8c 100644 --- a/packages/asset-swapper/src/types.ts +++ b/packages/asset-swapper/src/types.ts @@ -1,4 +1,4 @@ -import { ContractAddresses } from '@0x/contract-wrappers'; +import { BlockParam, ContractAddresses, GethCallOverrides } from '@0x/contract-wrappers'; import { SignedOrder } from '@0x/types'; import { BigNumber } from '@0x/utils'; @@ -253,6 +253,7 @@ export interface SwapQuoterOpts extends OrderPrunerOpts { warningLogger?: LogFunction; infoLogger?: LogFunction; }; + samplerOverrides?: SamplerOverrides; } /** @@ -328,3 +329,8 @@ export interface MockedRfqtIndicativeQuoteResponse { responseData: any; responseCode: number; } + +export interface SamplerOverrides { + overrides: GethCallOverrides; + block: BlockParam; +} diff --git a/packages/asset-swapper/src/utils/market_operation_utils/index.ts b/packages/asset-swapper/src/utils/market_operation_utils/index.ts index 08b5af74c8..ad4f27c3c7 100644 --- a/packages/asset-swapper/src/utils/market_operation_utils/index.ts +++ b/packages/asset-swapper/src/utils/market_operation_utils/index.ts @@ -83,7 +83,7 @@ export class MarketOperationUtils { // Call the sampler contract. const samplerPromise = this._sampler.executeAsync( // Get native order fillable amounts. - DexOrderSampler.ops.getOrderFillableTakerAmounts(nativeOrders), + DexOrderSampler.ops.getOrderFillableTakerAmounts(nativeOrders, this.contractAddresses.devUtils), // Get the custom liquidity provider from registry. DexOrderSampler.ops.getLiquidityProviderFromRegistry( this._liquidityProviderRegistry, @@ -187,7 +187,7 @@ export class MarketOperationUtils { // Call the sampler contract. const samplerPromise = this._sampler.executeAsync( // Get native order fillable amounts. - DexOrderSampler.ops.getOrderFillableMakerAmounts(nativeOrders), + DexOrderSampler.ops.getOrderFillableMakerAmounts(nativeOrders, this.contractAddresses.devUtils), // Get the custom liquidity provider from registry. DexOrderSampler.ops.getLiquidityProviderFromRegistry( this._liquidityProviderRegistry, @@ -291,7 +291,9 @@ export class MarketOperationUtils { const sources = difference(BUY_SOURCES, _opts.excludedSources); const ops = [ - ...batchNativeOrders.map(orders => DexOrderSampler.ops.getOrderFillableMakerAmounts(orders)), + ...batchNativeOrders.map(orders => + DexOrderSampler.ops.getOrderFillableMakerAmounts(orders, this.contractAddresses.devUtils), + ), ...(await Promise.all( batchNativeOrders.map(async orders => DexOrderSampler.ops.getMedianSellRateAsync( diff --git a/packages/asset-swapper/src/utils/market_operation_utils/sampler.ts b/packages/asset-swapper/src/utils/market_operation_utils/sampler.ts index 30a79aff24..e1fa6d8fe7 100644 --- a/packages/asset-swapper/src/utils/market_operation_utils/sampler.ts +++ b/packages/asset-swapper/src/utils/market_operation_utils/sampler.ts @@ -1,6 +1,8 @@ -import { IERC20BridgeSamplerContract } from '@0x/contract-wrappers'; +import { ERC20BridgeSamplerContract } from '@0x/contract-wrappers'; import { BigNumber } from '@0x/utils'; +import { SamplerOverrides } from '../../types'; + import { BalancerPoolsCache } from './balancer_utils'; import { samplerOperations } from './sampler_operations'; import { BatchedOperation } from './types'; @@ -35,7 +37,8 @@ export class DexOrderSampler { public static ops = samplerOperations; constructor( - private readonly _samplerContract: IERC20BridgeSamplerContract, + private readonly _samplerContract: ERC20BridgeSamplerContract, + private readonly _samplerOverrides?: SamplerOverrides, public balancerPoolsCache: BalancerPoolsCache = new BalancerPoolsCache(), ) {} @@ -138,8 +141,13 @@ export class DexOrderSampler { */ public async executeBatchAsync>>(ops: T): Promise { const callDatas = ops.map(o => o.encodeCall(this._samplerContract)); + const { overrides, block } = this._samplerOverrides + ? this._samplerOverrides + : { overrides: undefined, block: undefined }; // Execute all non-empty calldatas. - const rawCallResults = await this._samplerContract.batchCall(callDatas.filter(cd => cd !== '0x')).callAsync(); + const rawCallResults = await this._samplerContract + .batchCall(callDatas.filter(cd => cd !== '0x')) + .callAsync({ overrides }, block); // Return the parsed results. let rawCallResultsIdx = 0; return Promise.all( diff --git a/packages/asset-swapper/src/utils/market_operation_utils/sampler_operations.ts b/packages/asset-swapper/src/utils/market_operation_utils/sampler_operations.ts index b1d9e47695..ec04b0c2d9 100644 --- a/packages/asset-swapper/src/utils/market_operation_utils/sampler_operations.ts +++ b/packages/asset-swapper/src/utils/market_operation_utils/sampler_operations.ts @@ -21,11 +21,11 @@ import { * for use with `DexOrderSampler.executeAsync()`. */ export const samplerOperations = { - getOrderFillableTakerAmounts(orders: SignedOrder[]): BatchedOperation { + getOrderFillableTakerAmounts(orders: SignedOrder[], devUtilsAddress: string): BatchedOperation { return { encodeCall: contract => { return contract - .getOrderFillableTakerAssetAmounts(orders, orders.map(o => o.signature)) + .getOrderFillableTakerAssetAmounts(orders, orders.map(o => o.signature), devUtilsAddress) .getABIEncodedTransactionData(); }, handleCallResultsAsync: async (contract, callResults) => { @@ -33,11 +33,11 @@ export const samplerOperations = { }, }; }, - getOrderFillableMakerAmounts(orders: SignedOrder[]): BatchedOperation { + getOrderFillableMakerAmounts(orders: SignedOrder[], devUtilsAddress: string): BatchedOperation { return { encodeCall: contract => { return contract - .getOrderFillableMakerAssetAmounts(orders, orders.map(o => o.signature)) + .getOrderFillableMakerAssetAmounts(orders, orders.map(o => o.signature), devUtilsAddress) .getABIEncodedTransactionData(); }, handleCallResultsAsync: async (contract, callResults) => { diff --git a/packages/asset-swapper/src/utils/market_operation_utils/types.ts b/packages/asset-swapper/src/utils/market_operation_utils/types.ts index 36a2b2f8c9..779e16947c 100644 --- a/packages/asset-swapper/src/utils/market_operation_utils/types.ts +++ b/packages/asset-swapper/src/utils/market_operation_utils/types.ts @@ -1,4 +1,4 @@ -import { IERC20BridgeSamplerContract } from '@0x/contract-wrappers'; +import { ERC20BridgeSamplerContract } from '@0x/contract-wrappers'; import { BigNumber } from '@0x/utils'; import { RfqtRequestOpts, SignedOrderWithFillableAmounts } from '../../types'; @@ -220,8 +220,8 @@ export interface GetMarketOrdersOpts { * A composable operation the be run in `DexOrderSampler.executeAsync()`. */ export interface BatchedOperation { - encodeCall(contract: IERC20BridgeSamplerContract): string; - handleCallResultsAsync(contract: IERC20BridgeSamplerContract, callResults: string): Promise; + encodeCall(contract: ERC20BridgeSamplerContract): string; + handleCallResultsAsync(contract: ERC20BridgeSamplerContract, callResults: string): Promise; } export interface SourceQuoteOperation extends BatchedOperation { diff --git a/packages/asset-swapper/test/dex_sampler_test.ts b/packages/asset-swapper/test/dex_sampler_test.ts index 310d2c1a46..a254678686 100644 --- a/packages/asset-swapper/test/dex_sampler_test.ts +++ b/packages/asset-swapper/test/dex_sampler_test.ts @@ -32,6 +32,7 @@ describe('DexSampler tests', () => { const TAKER_ASSET_DATA = assetDataUtils.encodeERC20AssetData(TAKER_TOKEN); const wethAddress = getContractAddressesForChainOrThrow(CHAIN_ID).etherToken; + const devUtilsAddress = getContractAddressesForChainOrThrow(CHAIN_ID).devUtils; describe('getSampleAmounts()', () => { const FILL_AMOUNT = getRandomInteger(1, 1e18); @@ -105,7 +106,7 @@ describe('DexSampler tests', () => { }); const dexOrderSampler = new DexOrderSampler(sampler); const [fillableAmounts] = await dexOrderSampler.executeAsync( - DexOrderSampler.ops.getOrderFillableMakerAmounts(ORDERS), + DexOrderSampler.ops.getOrderFillableMakerAmounts(ORDERS, devUtilsAddress), ); expect(fillableAmounts).to.deep.eq(expectedFillableAmounts); }); @@ -121,7 +122,7 @@ describe('DexSampler tests', () => { }); const dexOrderSampler = new DexOrderSampler(sampler); const [fillableAmounts] = await dexOrderSampler.executeAsync( - DexOrderSampler.ops.getOrderFillableTakerAmounts(ORDERS), + DexOrderSampler.ops.getOrderFillableTakerAmounts(ORDERS, devUtilsAddress), ); expect(fillableAmounts).to.deep.eq(expectedFillableAmounts); }); @@ -483,7 +484,7 @@ describe('DexSampler tests', () => { return Promise.resolve(pools); }, }); - const dexOrderSampler = new DexOrderSampler(new MockSamplerContract({}), balancerPoolsCache); + const dexOrderSampler = new DexOrderSampler(new MockSamplerContract({}), undefined, balancerPoolsCache); const [quotes] = await dexOrderSampler.executeAsync( await DexOrderSampler.ops.getSellQuotesAsync( [ERC20BridgeSource.Balancer], @@ -589,7 +590,7 @@ describe('DexSampler tests', () => { return Promise.resolve(pools); }, }); - const dexOrderSampler = new DexOrderSampler(new MockSamplerContract({}), balancerPoolsCache); + const dexOrderSampler = new DexOrderSampler(new MockSamplerContract({}), undefined, balancerPoolsCache); const [quotes] = await dexOrderSampler.executeAsync( await DexOrderSampler.ops.getBuyQuotesAsync( [ERC20BridgeSource.Balancer], @@ -631,8 +632,8 @@ describe('DexSampler tests', () => { }); const dexOrderSampler = new DexOrderSampler(sampler); const [fillableMakerAmounts, fillableTakerAmounts] = await dexOrderSampler.executeAsync( - DexOrderSampler.ops.getOrderFillableMakerAmounts(ORDERS), - DexOrderSampler.ops.getOrderFillableTakerAmounts(ORDERS), + DexOrderSampler.ops.getOrderFillableMakerAmounts(ORDERS, devUtilsAddress), + DexOrderSampler.ops.getOrderFillableTakerAmounts(ORDERS, devUtilsAddress), ); expect(fillableMakerAmounts).to.deep.eq(expectedFillableMakerAmounts); expect(fillableTakerAmounts).to.deep.eq(expectedFillableTakerAmounts); diff --git a/packages/asset-swapper/test/utils/mock_sampler_contract.ts b/packages/asset-swapper/test/utils/mock_sampler_contract.ts index cca7cc59b3..be9fd575a2 100644 --- a/packages/asset-swapper/test/utils/mock_sampler_contract.ts +++ b/packages/asset-swapper/test/utils/mock_sampler_contract.ts @@ -1,5 +1,5 @@ import { ContractFunctionObj } from '@0x/base-contract'; -import { IERC20BridgeSamplerContract } from '@0x/contract-wrappers'; +import { ERC20BridgeSamplerContract } from '@0x/contract-wrappers'; import { constants } from '@0x/contracts-test-utils'; import { Order } from '@0x/types'; import { BigNumber, hexUtils } from '@0x/utils'; @@ -8,6 +8,7 @@ export type GetOrderFillableAssetAmountResult = BigNumber[]; export type GetOrderFillableAssetAmountHandler = ( orders: Order[], signatures: string[], + devUtilsAddress: string, ) => GetOrderFillableAssetAmountResult; export type SampleResults = BigNumber[]; @@ -58,7 +59,7 @@ interface Handlers { sampleBuysFromLiquidityProviderRegistry: SampleSellsLPHandler; } -export class MockSamplerContract extends IERC20BridgeSamplerContract { +export class MockSamplerContract extends ERC20BridgeSamplerContract { private readonly _handlers: Partial = {}; public constructor(handlers: Partial = {}) { @@ -82,6 +83,7 @@ export class MockSamplerContract extends IERC20BridgeSamplerContract { this._handlers.getOrderFillableMakerAssetAmounts, orders, signatures, + constants.NULL_ADDRESS, ); } @@ -94,6 +96,7 @@ export class MockSamplerContract extends IERC20BridgeSamplerContract { this._handlers.getOrderFillableTakerAssetAmounts, orders, signatures, + constants.NULL_ADDRESS, ); } diff --git a/packages/contract-artifacts/CHANGELOG.json b/packages/contract-artifacts/CHANGELOG.json index c6fa2a8b89..71662283f1 100644 --- a/packages/contract-artifacts/CHANGELOG.json +++ b/packages/contract-artifacts/CHANGELOG.json @@ -1,4 +1,17 @@ [ + { + "version": "3.7.0", + "changes": [ + { + "note": "Provide devUtils address as a function parameter in ERC20BridgeSampler", + "pr": 2629 + }, + { + "note": "Remove devUtils address from ERC20BridgeSampler constructor", + "pr": 2629 + } + ] + }, { "version": "3.7.0", "changes": [ diff --git a/packages/contract-artifacts/artifacts/ERC20BridgeSampler.json b/packages/contract-artifacts/artifacts/ERC20BridgeSampler.json index 39f8d7381f..87d60e36db 100644 --- a/packages/contract-artifacts/artifacts/ERC20BridgeSampler.json +++ b/packages/contract-artifacts/artifacts/ERC20BridgeSampler.json @@ -3,12 +3,6 @@ "contractName": "ERC20BridgeSampler", "compilerOutput": { "abi": [ - { - "inputs": [{ "internalType": "address", "name": "devUtilsAddress", "type": "address" }], - "payable": false, - "stateMutability": "nonpayable", - "type": "constructor" - }, { "constant": true, "inputs": [{ "internalType": "bytes[]", "name": "callDatas", "type": "bytes[]" }], @@ -55,7 +49,8 @@ "name": "orders", "type": "tuple[]" }, - { "internalType": "bytes[]", "name": "orderSignatures", "type": "bytes[]" } + { "internalType": "bytes[]", "name": "orderSignatures", "type": "bytes[]" }, + { "internalType": "address", "name": "devUtilsAddress", "type": "address" } ], "name": "getOrderFillableMakerAssetAmounts", "outputs": [ @@ -89,7 +84,8 @@ "name": "orders", "type": "tuple[]" }, - { "internalType": "bytes[]", "name": "orderSignatures", "type": "bytes[]" } + { "internalType": "bytes[]", "name": "orderSignatures", "type": "bytes[]" }, + { "internalType": "address", "name": "devUtilsAddress", "type": "address" } ], "name": "getOrderFillableTakerAssetAmounts", "outputs": [ @@ -320,17 +316,19 @@ }, "return": "providerAddress Address of the liquidity provider." }, - "getOrderFillableMakerAssetAmounts((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[])": { + "getOrderFillableMakerAssetAmounts((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[],address)": { "details": "Queries the fillable taker asset amounts of native orders. Effectively ignores orders that have empty signatures or", "params": { + "devUtilsAddress": "Address to the DevUtils contract.", "orderSignatures": "Signatures for each respective order in `orders`.", "orders": "Native orders to query." }, "return": "orderFillableMakerAssetAmounts How much maker asset can be filled by each order in `orders`." }, - "getOrderFillableTakerAssetAmounts((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[])": { + "getOrderFillableTakerAssetAmounts((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[],address)": { "details": "Queries the fillable taker asset amounts of native orders. Effectively ignores orders that have empty signatures or maker/taker asset amounts (returning 0).", "params": { + "devUtilsAddress": "Address to the DevUtils contract.", "orderSignatures": "Signatures for each respective order in `orders`.", "orders": "Native orders to query." }, @@ -473,10 +471,10 @@ }, "evm": { "bytecode": { - "object": "0x60806040523480156200001157600080fd5b5060405162003d9738038062003d9783398101604081905262000034916200005a565b600080546001600160a01b0319166001600160a01b03929092169190911790556200008a565b6000602082840312156200006c578081fd5b81516001600160a01b038116811462000083578182fd5b9392505050565b613cfd806200009a6000396000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c806368be3cf2116100b25780639f76ad3511610081578063c7f7142e11610066578063c7f7142e1461027b578063d0eea06d1461029b578063e68248f7146102ae57610136565b80639f76ad3514610255578063abffc7611461026857610136565b806368be3cf2146101fc5780636dd6b78d1461021c5780638b123a021461022f57806398cdafba1461024257610136565b80634cb8e2531161010957806359f515d0116100ee57806359f515d0146101c357806360ee052a146101d657806364ee6ade146101e957610136565b80634cb8e2531461019d57806358306ba0146101b057610136565b80631796fb871461013b5780632d753aa414610164578063354152a3146101775780634703a7e61461018a575b600080fd5b61014e6101493660046133ca565b6102c1565b60405161015b919061399f565b60405180910390f35b61014e61017236600461317a565b610492565b61014e6101853660046133ca565b610688565b61014e6101983660046132f8565b610842565b61014e6101ab3660046132f8565b610a1e565b61014e6101be366004613200565b610c38565b61014e6101d1366004613537565b610ccf565b61014e6101e43660046132f8565b610d78565b61014e6101f73660046132f8565b611038565b61020f61020a3660046134cb565b6111fe565b60405161015b9190613921565b61014e61022a3660046132f8565b61133d565b61014e61023d366004613537565b6115e5565b61014e610250366004613273565b6118be565b61014e610263366004613200565b6118f8565b61014e610276366004613408565b611afc565b61028e610289366004613130565b611cdf565b60405161015b91906137c1565b61014e6102a9366004613358565b611e1a565b61014e6102bc366004613408565b611e4b565b6060600082519050806040519080825280602002602001820160405280156102f3578160200160208202803883390190505b50915060005b8181101561048857600060608873ffffffffffffffffffffffffffffffffffffffff16620927c0600073ffffffffffffffffffffffffffffffffffffffff16630e71d1b9905060e01b8a8a8a888151811061035057fe5b602002602001015160405160240161036a939291906139e2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516103f391906137a5565b6000604051808303818686fa925050503d806000811461042f576040519150601f19603f3d011682016040523d82523d6000602084013e610434565b606091505b5090925090506000821561045d578180602001905161045691908101906136de565b9050610465565b505050610488565b8086858151811061047257fe5b60209081029190910101525050506001016102f9565b5050949350505050565b6060600082519050806040519080825280602002602001820160405280156104c4578160200160208202803883390190505b50915073ffffffffffffffffffffffffffffffffffffffff87166104e8575061067f565b60005b8181101561067c57600060608973ffffffffffffffffffffffffffffffffffffffff1662061a80600073ffffffffffffffffffffffffffffffffffffffff16636e79e133905060e01b8b8b8b8b898151811061054357fe5b602002602001015160405160240161055e949392919061384a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516105e791906137a5565b6000604051808303818686fa925050503d8060008114610623576040519150601f19603f3d011682016040523d82523d6000602084013e610628565b606091505b50909250905060008215610651578180602001905161064a91908101906136de565b9050610659565b50505061067c565b8086858151811061066657fe5b60209081029190910101525050506001016104eb565b50505b95945050505050565b6060600082519050806040519080825280602002602001820160405280156106ba578160200160208202803883390190505b50915060005b8181101561048857600060608873ffffffffffffffffffffffffffffffffffffffff16620927c0600073ffffffffffffffffffffffffffffffffffffffff166307211ef7905060e01b8a8a8a888151811061071757fe5b6020026020010151604051602401610731939291906139e2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516107ba91906137a5565b6000604051808303818686fa925050503d80600081146107f6576040519150601f19603f3d011682016040523d82523d6000602084013e6107fb565b606091505b5090925090506000821561045d578180602001905161081d91908101906136de565b90508086858151811061082c57fe5b60209081029190910101525050506001016106c0565b606061084e838561201e565b8151604080518281526020808402820101909152818015610879578160200160208202803883390190505b50915060005b81811015610a155760006060610893612091565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663ff1fd974905060e01b8a8a8a88815181106108dd57fe5b60200260200101516040516024016108f7939291906138ba565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161098091906137a5565b6000604051808303818686fa925050503d80600081146109bc576040519150601f19603f3d011682016040523d82523d6000602084013e6109c1565b606091505b509092509050600082156109ea57818060200190516109e391908101906136de565b90506109f2565b505050610a15565b808685815181106109ff57fe5b602090810291909101015250505060010161087f565b50509392505050565b6060610a2a838561201e565b8151604080518281526020808402820101909152818015610a55578160200160208202803883390190505b5091506000610a626120a9565b9050600080805b84811015610c2c578373ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161480610ad657508373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b15610b6e57610af98989898481518110610aec57fe5b60200260200101516120c1565b909350915073ffffffffffffffffffffffffffffffffffffffff82167331e085afd48a1d6e51cc193153d625e8f0514c7f1480610b5f575073ffffffffffffffffffffffffffffffffffffffff8216731e158c0e93c30d24e918ef83d1e0be23595c3c0f145b15610b6957600092505b610c0c565b610b7f8985898481518110610aec57fe5b90935091508215610c0c576000610b97858a866120c1565b909450905073ffffffffffffffffffffffffffffffffffffffff83167331e085afd48a1d6e51cc193153d625e8f0514c7f148015610c0057508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15610c0a57600093505b505b82868281518110610c1957fe5b6020908102919091010152600101610a69565b50505050509392505050565b60608273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610c9f57508273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b15610ca957610cc7565b6060610cb6868585611038565b9050610cc3848683611038565b9150505b949350505050565b6060610cdb83836115e5565b905060005b8351811015610d7157818181518110610cf557fe5b6020026020010151600014610d6957610d50828281518110610d1357fe5b6020026020010151858381518110610d2757fe5b602002602001015160a00151868481518110610d3f57fe5b602002602001015160800151612435565b828281518110610d5c57fe5b6020026020010181815250505b600101610ce0565b5092915050565b6060610d84838561201e565b8151604080518281526020808402820101909152818015610daf578160200160208202803883390190505b5091506000610dbc6120a9565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610dfc57610df786612477565b610dff565b60005b90506000610e0b6120a9565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610e4b57610e4686612477565b610e4e565b60005b905060005b8381101561102d576001610e656120a9565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415610efc578651610edb9085907f2640f62c00000000000000000000000000000000000000000000000000000000908a9086908110610ece57fe5b602002602001015161250f565b878481518110610ee757fe5b60200260200101819350828152505050611019565b610f046120a9565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161415610f6d578651610edb9084907f59e9486200000000000000000000000000000000000000000000000000000000908a9086908110610ece57fe5b8651600090610fa69085907f59e9486200000000000000000000000000000000000000000000000000000000908b9087908110610ece57fe5b925090508015610ffc57610fdb857f2640f62c000000000000000000000000000000000000000000000000000000008361250f565b888581518110610fe757fe5b60200260200101819450828152505050611017565b600087848151811061100a57fe5b6020026020010181815250505b505b80611024575061102d565b50600101610e53565b505050509392505050565b6060611044838561201e565b815160408051828152602080840282010190915281801561106f578160200160208202803883390190505b50915060005b81811015610a155760006060611089612091565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663144a2752905060e01b898b8a88815181106110d357fe5b60200260200101516040516024016110ed939291906138ba565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161117691906137a5565b6000604051808303818686fa925050503d80600081146111b2576040519150601f19603f3d011682016040523d82523d6000602084013e6111b7565b606091505b509092509050600082156109ea57818060200190516111d991908101906136de565b9050808685815181106111e857fe5b6020908102919091010152505050600101611075565b60408051828152602080840282010190915260609082801561123457816020015b606081526020019060019003908161121f5790505b50905060005b808314610d7157600060603086868581811061125257fe5b6020028201905080357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe13684900301811261128c57600080fd5b9091016020810191503567ffffffffffffffff8111156112ab57600080fd5b368190038213156112bb57600080fd5b6040516112c9929190613795565b600060405180830381855afa9150503d8060008114611304576040519150601f19603f3d011682016040523d82523d6000602084013e611309565b606091505b50915091508161131b57805160208201fd5b8084848151811061132857fe5b6020908102919091010152505060010161123a565b6060611349838561201e565b8151604080518281526020808402820101909152818015611374578160200160208202803883390190505b50915060006113816120a9565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146113c1576113bc86612477565b6113c4565b60005b905060006113d06120a9565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146114105761140b86612477565b611413565b60005b905060005b8381101561102d57600161142a6120a9565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614156114b45786516114939085907f95b68fe700000000000000000000000000000000000000000000000000000000908a9086908110610ece57fe5b87848151811061149f57fe5b602002602001018193508281525050506115d1565b6114bc6120a9565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614156115255786516114939084907fcd7724c300000000000000000000000000000000000000000000000000000000908a9086908110610ece57fe5b865160009061155e9086907f95b68fe700000000000000000000000000000000000000000000000000000000908b9087908110610ece57fe5b9250905080156115b457611593847fcd7724c3000000000000000000000000000000000000000000000000000000008361250f565b88858151811061159f57fe5b602002602001018194508281525050506115cf565b60008784815181106115c257fe5b6020026020010181815250505b505b806115dc575061102d565b50600101611418565b60608251604051908082528060200260200182016040528015611612578160200160208202803883390190505b506000805491925073ffffffffffffffffffffffffffffffffffffffff909116905b845181146118b65783818151811061164857fe5b60200260200101515160001480611676575084818151811061166657fe5b6020026020010151608001516000145b80611698575084818151811061168857fe5b602002602001015160a001516000145b156116bc5760008382815181106116ab57fe5b6020026020010181815250506118ae565b600060608373ffffffffffffffffffffffffffffffffffffffff166207a1208573ffffffffffffffffffffffffffffffffffffffff1663e77286eb905060e01b89868151811061170857fe5b602002602001015189878151811061171c57fe5b6020026020010151604051602401611735929190613a5d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516117be91906137a5565b6000604051808303818686fa925050503d80600081146117fa576040519150601f19603f3d011682016040523d82523d6000602084013e6117ff565b606091505b50915091508161182a57600085848151811061181757fe5b60200260200101818152505050506118ae565b611832612dce565b600080838060200190516118499190810190613671565b9194509250905060038351600681111561185f57fe5b14158061186a575080155b1561188e57600088878151811061187d57fe5b6020026020010181815250506118a8565b8188878151811061189b57fe5b6020026020010181815250505b50505050505b600101611634565b505092915050565b60606118ee858585857f9f76ad35000000000000000000000000000000000000000000000000000000008b612657565b9695505050505050565b60606000825190508060405190808252806020026020018201604052801561192a578160200160208202803883390190505b509150600061193a878787611cdf565b905073ffffffffffffffffffffffffffffffffffffffff811661195f5750610cc79050565b60005b82811015611af157600060608373ffffffffffffffffffffffffffffffffffffffff1662061a80600073ffffffffffffffffffffffffffffffffffffffff1663343fbcdd905060e01b8b8b8b88815181106119b957fe5b60200260200101516040516024016119d3939291906138ba565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611a5c91906137a5565b6000604051808303818686fa925050503d8060008114611a98576040519150601f19603f3d011682016040523d82523d6000602084013e611a9d565b606091505b50909250905060008215611ac65781806020019051611abf91908101906136de565b9050611ace565b505050611af1565b80878581518110611adb57fe5b6020908102919091010152505050600101611962565b505050949350505050565b606060008251905080604051908082528060200260200182016040528015611b2e578160200160208202803883390190505b50915060005b818110156118b65760006060611b4861281d565b73ffffffffffffffffffffffffffffffffffffffff16620249f0600073ffffffffffffffffffffffffffffffffffffffff1663d06ca61f905060e01b888681518110611b9057fe5b60200260200101518a604051602401611baa929190613bba565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611c3391906137a5565b6000604051808303818686fa925050503d8060008114611c6f576040519150601f19603f3d011682016040523d82523d6000602084013e611c74565b606091505b50909250905060008215611cb45781806020019051611c9691908101906135de565b600189510381518110611ca557fe5b60200260200101519050611cbc565b5050506118b6565b80868581518110611cc957fe5b6020908102919091010152505050600101611b34565b6040516000906060907f153f59970000000000000000000000000000000000000000000000000000000090611d1a90869086906024016137e2565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608673ffffffffffffffffffffffffffffffffffffffff1683604051611da291906137a5565b600060405180830381855afa9150503d8060008114611ddd576040519150601f19603f3d011682016040523d82523d6000602084013e611de2565b606091505b5091509150818015611df5575080516020145b15611e0f57611e0581600c612835565b9350505050611e13565b5050505b9392505050565b606061067f858585857f4cb8e253000000000000000000000000000000000000000000000000000000006000612657565b606060008251905080604051908082528060200260200182016040528015611e7d578160200160208202803883390190505b50915060005b818110156118b65760006060611e9761281d565b73ffffffffffffffffffffffffffffffffffffffff16620249f0600073ffffffffffffffffffffffffffffffffffffffff16631f00ca74905060e01b888681518110611edf57fe5b60200260200101518a604051602401611ef9929190613bba565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611f8291906137a5565b6000604051808303818686fa925050503d8060008114611fbe576040519150601f19603f3d011682016040523d82523d6000602084013e611fc3565b606091505b50909250905060008215611cb45781806020019051611fe591908101906135de565b600081518110611ff157fe5b602002602001015190508086858151811061200857fe5b6020908102919091010152505050600101611e83565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561208d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208490613a00565b60405180910390fd5b5050565b73794e6e91555438afc3ccf1c5076a74f42133d08d90565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290565b60008060006120ce6120a9565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614612106578561211c565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b905060006121286120a9565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146121605785612176565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b905060006121838861287a565b60ff16905060006121938861287a565b60ff169050600060606121a4612885565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f4f61ff8b00000000000000000000000000000000000000000000000000000000179052905173ffffffffffffffffffffffffffffffffffffffff929092169162061a8091612224916137a5565b6000604051808303818686fa925050503d8060008114612260576040519150601f19603f3d011682016040523d82523d6000602084013e612265565b606091505b50915091508161228257506000965086955061242d945050505050565b60008180602001905161229891908101906130e7565b90508073ffffffffffffffffffffffffffffffffffffffff166216e360600073ffffffffffffffffffffffffffffffffffffffff16630c235d96905060e01b89898e60006040516024016122ef94939291906138eb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161237891906137a5565b6000604051808303818686fa925050503d80600081146123b4576040519150601f19603f3d011682016040523d82523d6000602084013e6123b9565b606091505b50909350915060008084156123e557838060200190516123dc9190810190613103565b925090506123fb565b506000995089985061242d975050505050505050565b670de0b6b3a764000087600a0a87600a0a8e8502028161241757fe5b048161241f57fe5b049a50985050505050505050505b935093915050565b6000610cc78361246b61244f82600163ffffffff61289d16565b61245f888763ffffffff6128bc16565b9063ffffffff6128ed16565b9063ffffffff61290916565b6000612481612933565b73ffffffffffffffffffffffffffffffffffffffff166306f2bf62836040518263ffffffff1660e01b81526004016124b991906137c1565b60206040518083038186803b1580156124d157600080fd5b505afa1580156124e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061250991908101906130e7565b92915050565b60008073ffffffffffffffffffffffffffffffffffffffff85166125325761242d565b60608573ffffffffffffffffffffffffffffffffffffffff16620249f086866040516024016125619190613bb1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516125ea91906137a5565b6000604051808303818686fa925050503d8060008114612626576040519150601f19603f3d011682016040523d82523d6000602084013e61262b565b606091505b509092509050811561264e578080602001905161264b91908101906136de565b92505b50935093915050565b6060612663868861201e565b845161266e576118ee565b6000806000875160405190808252806020026020018201604052801561269e578160200160208202803883390190505b5093506126c2898b8a6000815181106126b357fe5b6020026020010151898961294b565b9250826126d257506118ee915050565b6126df8a8a85898961294b565b9150816126ef57506118ee915050565b60005b885181101561280f5760005b88602001518110156127d1576127288a838151811061271957fe5b60200260200101518587612435565b945061273f89600001516127100161271087612435565b945060006127508d8d888c8c61294b565b90508061275d57506127d1565b8094508a838151811061276c57fe5b602002602001015185106127c85760008b848151811061278857fe5b60200260200101518c858151811061279c57fe5b6020026020010151870361271002816127b157fe5b0490508a6000015181116127c65750506127d1565b505b506001016126fe565b506127f08982815181106127e157fe5b60200260200101518486612435565b8582815181106127fc57fe5b60209081029190910101526001016126f2565b505050509695505050505050565b73f164fc0ec4e93095b804a4795bbe1e041497b92a90565b6000816014018351101561285b5761285b6128566004855185601401612c00565b612ca5565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b600061250982612cad565b73818e6fecd516ecc3849daf6845e3ec868087b75590565b6000828211156128b6576128b661285660028585612d7e565b50900390565b6000826128cb57506000612509565b828202828482816128d857fe5b0414611e1357611e1361285660018686612d7e565b600082820183811015611e1357611e1361285660008686612d7e565b60008161291f5761291f61285660038585612d7e565b600082848161292a57fe5b04949350505050565b73c0a47dfe034b400b47bdad5fecda2621de6c4d9590565b604080516001808252818301909252600091606091829160208083019080388339019050509050858160008151811061298057fe5b60209081029190910101527fffffffff0000000000000000000000000000000000000000000000000000000085167f4cb8e253000000000000000000000000000000000000000000000000000000001415612a90576040517f4cb8e2530000000000000000000000000000000000000000000000000000000090612a0c908a908a908590602401613881565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529150612b49565b6040517f9f76ad350000000000000000000000000000000000000000000000000000000090612ac99086908b908b908690602401613809565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915291505b600060603073ffffffffffffffffffffffffffffffffffffffff1684604051612b7291906137a5565b600060405180830381855afa9150503d8060008114612bad576040519150601f19603f3d011682016040523d82523d6000602084013e612bb2565b606091505b509150915081612bc957600094505050505061067f565b80806020019051612bdd91908101906135de565b600081518110612be957fe5b602002602001015194505050505095945050505050565b6060632800659560e01b848484604051602401612c1f939291906139d4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b600060129050600060608373ffffffffffffffffffffffffffffffffffffffff166040518060400160405280600481526020017f313ce56700000000000000000000000000000000000000000000000000000000815250604051612d1191906137a5565b600060405180830381855afa9150503d8060008114612d4c576040519150601f19603f3d011682016040523d82523d6000602084013e612d51565b606091505b5091509150818015612d64575080516020145b15612d7757612d74816000612d9d565b92505b5050919050565b606063e946c1bb60e01b848484604051602401612c1f939291906139b2565b6000611e13838360008160200183511015612dc557612dc56128566005855185602001612c00565b50016020015190565b6040805160608101909152806000815260006020820181905260409091015290565b803561250981613c95565b600082601f830112612e0b578081fd5b8135612e1e612e1982613c45565b613c1e565b8181529150602080830190840160005b83811015612e5b57612e468760208435890101612ece565b83526020928301929190910190600101612e2e565b5050505092915050565b600082601f830112612e75578081fd5b8135612e83612e1982613c45565b818152915060208083019084810181840286018201871015612ea457600080fd5b60005b84811015612ec357813584529282019290820190600101612ea7565b505050505092915050565b600082601f830112612ede578081fd5b813567ffffffffffffffff811115612ef4578182fd5b612f2560207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613c1e565b9150808252836020828501011115612f3c57600080fd5b8060208401602084013760009082016020015292915050565b8035600f81900b811461250957600080fd5b600060408284031215612f78578081fd5b612f826040613c1e565b9050813581526020820135602082015292915050565b60006101c0808385031215612fab578182fd5b612fb481613c1e565b915050612fc18383612df0565b8152612fd08360208401612df0565b6020820152612fe28360408401612df0565b6040820152612ff48360608401612df0565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff8082111561305657600080fd5b61306286838701612ece565b8385015261016092508285013591508082111561307e57600080fd5b61308a86838701612ece565b838501526101809250828501359150808211156130a657600080fd5b6130b286838701612ece565b838501526101a09250828501359150808211156130ce57600080fd5b506130db85828601612ece565b82840152505092915050565b6000602082840312156130f8578081fd5b8151611e1381613c95565b60008060408385031215613115578081fd5b825161312081613c95565b6020939093015192949293505050565b600080600060608486031215613144578081fd5b833561314f81613c95565b9250602084013561315f81613c95565b9150604084013561316f81613c95565b809150509250925092565b600080600080600060a08688031215613191578283fd5b853561319c81613c95565b945060208601356131ac81613c95565b935060408601356131bc81613c95565b925060608601356131cc81613c95565b9150608086013567ffffffffffffffff8111156131e7578182fd5b6131f388828901612e65565b9150509295509295909350565b60008060008060808587031215613215578182fd5b843561322081613c95565b9350602085013561323081613c95565b9250604085013561324081613c95565b9150606085013567ffffffffffffffff81111561325b578182fd5b61326787828801612e65565b91505092959194509250565b600080600080600060c0868803121561328a578283fd5b853561329581613c95565b945060208601356132a581613c95565b935060408601356132b581613c95565b9250606086013567ffffffffffffffff8111156132d0578182fd5b6132dc88828901612e65565b9250506132ec8760808801612f67565b90509295509295909350565b60008060006060848603121561330c578081fd5b833561331781613c95565b9250602084013561332781613c95565b9150604084013567ffffffffffffffff811115613342578182fd5b61334e86828701612e65565b9150509250925092565b60008060008060a0858703121561336d578182fd5b843561337881613c95565b9350602085013561338881613c95565b9250604085013567ffffffffffffffff8111156133a3578283fd5b6133af87828801612e65565b9250506133bf8660608701612f67565b905092959194509250565b600080600080608085870312156133df578182fd5b84356133ea81613c95565b93506133f98660208701612f55565b92506132408660408701612f55565b6000806040838503121561341a578182fd5b823567ffffffffffffffff80821115613431578384fd5b81850186601f820112613442578485fd5b80359250613452612e1984613c45565b80848252602080830192508084018a828389028701011115613472578889fd5b8894505b8685101561349d57803561348981613c95565b845260019490940193928101928101613476565b5090965087013593505050808211156134b4578283fd5b506134c185828601612e65565b9150509250929050565b600080602083850312156134dd578182fd5b823567ffffffffffffffff808211156134f4578384fd5b81850186601f820112613505578485fd5b8035925081831115613515578485fd5b8660208085028301011115613528578485fd5b60200196919550909350505050565b60008060408385031215613549578182fd5b823567ffffffffffffffff80821115613560578384fd5b81850186601f820112613571578485fd5b80359250613581612e1984613c45565b83815260208082019190838101885b878110156135b9576135a78c848435890101612f98565b85529382019390820190600101613590565b509197508801359450505050808211156135d1578283fd5b506134c185828601612dfb565b600060208083850312156135f0578182fd5b825167ffffffffffffffff811115613606578283fd5b80840185601f820112613617578384fd5b80519150613627612e1983613c45565b8281528381019082850185850284018601891015613643578687fd5b8693505b84841015613665578051835260019390930192918501918501613647565b50979650505050505050565b600080600083850360a0811215613686578182fd5b6060811215613693578182fd5b5061369e6060613c1e565b8451600781106136ac578283fd5b81526020858101519082015260408086015190820152606085015160808601519194509250801515811461316f578182fd5b6000602082840312156136ef578081fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208401935060208301825b82811015613741578151865260209586019590910190600101613723565b5093949350505050565b60008151808452613763816020860160208601613c65565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000828483379101908152919050565b600082516137b7818460208701613c65565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152808516604084015250608060608301526118ee6080830184613710565b73ffffffffffffffffffffffffffffffffffffffff9485168152928416602084015292166040820152606081019190915260800190565b600073ffffffffffffffffffffffffffffffffffffffff80861683528085166020840152506060604083015261067f6060830184613710565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff94851681529290931660208301526040820152901515606082015260800190565b6000602080830181845280855180835260408601915060408482028701019250838701855b82811015613992577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261398085835161374b565b94509285019290850190600101613946565b5092979650505050505050565b600060208252611e136020830184613710565b60608101600485106139c057fe5b938152602081019290925260409091015290565b60608101600885106139c057fe5b600f93840b81529190920b6020820152604081019190915260600190565b60208082526025908201527f455243323042726964676553616d706c65722f494e56414c49445f544f4b454e60408201527f5f50414952000000000000000000000000000000000000000000000000000000606082015260800190565b600060408252613a716040830185516136f6565b6020840151613a8360608401826136f6565b506040840151613a9660808401826136f6565b506060840151613aa960a08401826136f6565b50608084015160c083015260a084015160e083015260c0840151610100818185015260e086015191506101208281860152818701519250610140915082828601528087015192505061016082818601528187015192506101c091506101808281870152613b1a61020087018561374b565b8289015194507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc092506101a0838883030181890152613b59828761374b565b838b015196508489820301868a0152613b72818861374b565b955050808a0151955050505080858303016101e086015250613b94818361374b565b8481036020860152613ba6818761374b565b979650505050505050565b90815260200190565b60006040820184835260406020840152808451808352606085019150602086019250835b81811015613c1257835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101613bde565b50909695505050505050565b60405181810167ffffffffffffffff81118282101715613c3d57600080fd5b604052919050565b600067ffffffffffffffff821115613c5b578081fd5b5060209081020190565b60005b83811015613c80578181015183820152602001613c68565b83811115613c8f576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff81168114613cb757600080fd5b5056fea365627a7a723158204f89046f6ef91e066e56b4d991a1a9740ea0d2c2bfef6144bf56dbf1f65952d76c6578706572696d656e74616cf564736f6c63430005110040" + "object": "0x608060405234801561001057600080fd5b5061447d806100206000396000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c806368be3cf2116100b2578063abffc76111610081578063d0eea06d11610066578063d0eea06d14610288578063e68248f71461029b578063e9a8e442146102ae57610136565b8063abffc76114610255578063c7f7142e1461026857610136565b806368be3cf2146101fc5780636dd6b78d1461021c57806398cdafba1461022f5780639f76ad351461024257610136565b80634703a7e61161010957806358306ba0116100ee57806358306ba0146101c357806360ee052a146101d657806364ee6ade146101e957610136565b80634703a7e61461019d5780634cb8e253146101b057610136565b80631796fb871461013b5780632d753aa414610164578063354152a31461017757806339b085ad1461018a575b600080fd5b61014e6101493660046139e0565b6102c1565b60405161015b91906140df565b60405180910390f35b61014e610172366004613691565b610492565b61014e6101853660046139e0565b610688565b61014e610198366004613be0565b610842565b61014e6101ab36600461380f565b610aff565b61014e6101be36600461380f565b610cdb565b61014e6101d1366004613717565b610e0e565b61014e6101e436600461380f565b610ea5565b61014e6101f736600461380f565b61115a565b61020f61020a366004613b74565b611320565b60405161015b9190614061565b61014e61022a36600461380f565b611466565b61014e61023d36600461378a565b61170e565b61014e610250366004613717565b611748565b61014e610263366004613a1e565b61194c565b61027b610276366004613647565b611b37565b60405161015b9190613e5f565b61014e61029636600461386f565b611c72565b61014e6102a9366004613a1e565b611ca3565b61014e6102bc366004613be0565b611e76565b6060600082519050806040519080825280602002602001820160405280156102f3578160200160208202803883390190505b50915060005b8181101561048857600060608873ffffffffffffffffffffffffffffffffffffffff16620927c0600073ffffffffffffffffffffffffffffffffffffffff16630e71d1b9905060e01b8a8a8a888151811061035057fe5b602002602001015160405160240161036a93929190614121565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516103f39190613e43565b6000604051808303818686fa925050503d806000811461042f576040519150601f19603f3d011682016040523d82523d6000602084013e610434565b606091505b5090925090506000821561045d57818060200190516104569190810190613ca2565b9050610465565b505050610488565b8086858151811061047257fe5b60209081029190910101525050506001016102f9565b5050949350505050565b6060600082519050806040519080825280602002602001820160405280156104c4578160200160208202803883390190505b50915073ffffffffffffffffffffffffffffffffffffffff87166104e8575061067f565b60005b8181101561067c57600060608973ffffffffffffffffffffffffffffffffffffffff1662061a80600073ffffffffffffffffffffffffffffffffffffffff16636e79e133905060e01b8b8b8b8b898151811061054357fe5b602002602001015160405160240161055e9493929190613ee8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516105e79190613e43565b6000604051808303818686fa925050503d8060008114610623576040519150601f19603f3d011682016040523d82523d6000602084013e610628565b606091505b50909250905060008215610651578180602001905161064a9190810190613ca2565b9050610659565b50505061067c565b8086858151811061066657fe5b60209081029190910101525050506001016104eb565b50505b95945050505050565b6060600082519050806040519080825280602002602001820160405280156106ba578160200160208202803883390190505b50915060005b8181101561048857600060608873ffffffffffffffffffffffffffffffffffffffff16620927c0600073ffffffffffffffffffffffffffffffffffffffff166307211ef7905060e01b8a8a8a888151811061071757fe5b602002602001015160405160240161073193929190614121565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516107ba9190613e43565b6000604051808303818686fa925050503d80600081146107f6576040519150601f19603f3d011682016040523d82523d6000602084013e6107fb565b606091505b5090925090506000821561045d578180602001905161081d9190810190613ca2565b90508086858151811061082c57fe5b60209081029190910101525050506001016106c0565b6060835160405190808252806020026020018201604052801561086f578160200160208202803883390190505b50905060005b84518114610af75783818151811061088957fe5b602002602001015151600014806108b757508481815181106108a757fe5b6020026020010151608001516000145b806108d957508481815181106108c957fe5b602002602001015160a001516000145b156108fd5760008282815181106108ec57fe5b602002602001018181525050610aef565b600060608473ffffffffffffffffffffffffffffffffffffffff166207a1208673ffffffffffffffffffffffffffffffffffffffff1663e77286eb905060e01b89868151811061094957fe5b602002602001015189878151811061095d57fe5b602002602001015160405160240161097692919061419c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516109ff9190613e43565b6000604051808303818686fa925050503d8060008114610a3b576040519150601f19603f3d011682016040523d82523d6000602084013e610a40565b606091505b509150915081610a6b576000848481518110610a5857fe5b6020026020010181815250505050610aef565b610a73613340565b60008083806020019051610a8a9190810190613d27565b91945092509050600383516006811115610aa057fe5b141580610aab575080155b15610acf576000878781518110610abe57fe5b602002602001018181525050610ae9565b81878781518110610adc57fe5b6020026020010181815250505b50505050505b600101610875565b509392505050565b6060610b0b8385611f19565b8151604080518281526020808402820101909152818015610b36578160200160208202803883390190505b50915060005b81811015610cd25760006060610b50611f8c565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663ff1fd974905060e01b8a8a8a8881518110610b9a57fe5b6020026020010151604051602401610bb493929190613f58565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051610c3d9190613e43565b6000604051808303818686fa925050503d8060008114610c79576040519150601f19603f3d011682016040523d82523d6000602084013e610c7e565b606091505b50909250905060008215610ca75781806020019051610ca09190810190613ca2565b9050610caf565b505050610cd2565b80868581518110610cbc57fe5b6020908102919091010152505050600101610b3c565b50509392505050565b6060610ce78385611f19565b8151604080518281526020808402820101909152818015610d12578160200160208202803883390190505b5091506000610d1f611fa4565b90506000805b83811015610e03578273ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161480610d9257508273ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b15610dbc57610db58888888481518110610da857fe5b6020026020010151611fbc565b9150610de3565b610dcd8884888481518110610da857fe5b91508115610de357610de0838884611fbc565b91505b81858281518110610df057fe5b6020908102919091010152600101610d25565b505050509392505050565b60608273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610e7557508273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b15610e7f57610e9d565b6060610e8c86858561115a565b9050610e9984868361115a565b9150505b949350505050565b6060610eb18385611f19565b8151604080518281526020808402820101909152818015610edc578160200160208202803883390190505b5091506000610ee9611fa4565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610f2957610f24866127dc565b610f2c565b60005b90506000610f38611fa4565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610f7857610f73866127dc565b610f7b565b60005b905060005b83811015610e03576001610f92611fa4565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614156110295786516110089085907f2640f62c00000000000000000000000000000000000000000000000000000000908a9086908110610ffb57fe5b6020026020010151612874565b87848151811061101457fe5b60200260200101819350828152505050611146565b611031611fa4565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16141561109a5786516110089084907f59e9486200000000000000000000000000000000000000000000000000000000908a9086908110610ffb57fe5b86516000906110d39085907f59e9486200000000000000000000000000000000000000000000000000000000908b9087908110610ffb57fe5b92509050801561112957611108857f2640f62c0000000000000000000000000000000000000000000000000000000083612874565b88858151811061111457fe5b60200260200101819450828152505050611144565b600087848151811061113757fe5b6020026020010181815250505b505b806111515750610e03565b50600101610f80565b60606111668385611f19565b8151604080518281526020808402820101909152818015611191578160200160208202803883390190505b50915060005b81811015610cd257600060606111ab611f8c565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663144a2752905060e01b898b8a88815181106111f557fe5b602002602001015160405160240161120f93929190613f58565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516112989190613e43565b6000604051808303818686fa925050503d80600081146112d4576040519150601f19603f3d011682016040523d82523d6000602084013e6112d9565b606091505b50909250905060008215610ca757818060200190516112fb9190810190613ca2565b90508086858151811061130a57fe5b6020908102919091010152505050600101611197565b60408051828152602080840282010190915260609082801561135657816020015b60608152602001906001900390816113415790505b50905060005b80831461145f57600060603086868581811061137457fe5b6020028201905080357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1368490030181126113ae57600080fd5b9091016020810191503567ffffffffffffffff8111156113cd57600080fd5b368190038213156113dd57600080fd5b6040516113eb929190613e33565b600060405180830381855afa9150503d8060008114611426576040519150601f19603f3d011682016040523d82523d6000602084013e61142b565b606091505b50915091508161143d57805160208201fd5b8084848151811061144a57fe5b6020908102919091010152505060010161135c565b5092915050565b60606114728385611f19565b815160408051828152602080840282010190915281801561149d578160200160208202803883390190505b50915060006114aa611fa4565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146114ea576114e5866127dc565b6114ed565b60005b905060006114f9611fa4565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161461153957611534866127dc565b61153c565b60005b905060005b83811015610e03576001611553611fa4565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614156115dd5786516115bc9085907f95b68fe700000000000000000000000000000000000000000000000000000000908a9086908110610ffb57fe5b8784815181106115c857fe5b602002602001018193508281525050506116fa565b6115e5611fa4565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16141561164e5786516115bc9084907fcd7724c300000000000000000000000000000000000000000000000000000000908a9086908110610ffb57fe5b86516000906116879086907f95b68fe700000000000000000000000000000000000000000000000000000000908b9087908110610ffb57fe5b9250905080156116dd576116bc847fcd7724c30000000000000000000000000000000000000000000000000000000083612874565b8885815181106116c857fe5b602002602001018194508281525050506116f8565b60008784815181106116eb57fe5b6020026020010181815250505b505b806117055750610e03565b50600101611541565b606061173e858585857f9f76ad35000000000000000000000000000000000000000000000000000000008b6129bd565b9695505050505050565b60606000825190508060405190808252806020026020018201604052801561177a578160200160208202803883390190505b509150600061178a878787611b37565b905073ffffffffffffffffffffffffffffffffffffffff81166117af5750610e9d9050565b60005b8281101561194157600060608373ffffffffffffffffffffffffffffffffffffffff1662061a80600073ffffffffffffffffffffffffffffffffffffffff1663343fbcdd905060e01b8b8b8b888151811061180957fe5b602002602001015160405160240161182393929190613f58565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516118ac9190613e43565b6000604051808303818686fa925050503d80600081146118e8576040519150601f19603f3d011682016040523d82523d6000602084013e6118ed565b606091505b50909250905060008215611916578180602001905161190f9190810190613ca2565b905061191e565b505050611941565b8087858151811061192b57fe5b60209081029190910101525050506001016117b2565b505050949350505050565b60606000825190508060405190808252806020026020018201604052801561197e578160200160208202803883390190505b50915060005b81811015611b2f5760006060611998612b83565b73ffffffffffffffffffffffffffffffffffffffff16620249f0600073ffffffffffffffffffffffffffffffffffffffff1663d06ca61f905060e01b8886815181106119e057fe5b60200260200101518a6040516024016119fa9291906142ee565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611a839190613e43565b6000604051808303818686fa925050503d8060008114611abf576040519150601f19603f3d011682016040523d82523d6000602084013e611ac4565b606091505b50909250905060008215611b045781806020019051611ae69190810190613ae1565b600189510381518110611af557fe5b60200260200101519050611b0c565b505050611b2f565b80868581518110611b1957fe5b6020908102919091010152505050600101611984565b505092915050565b6040516000906060907f153f59970000000000000000000000000000000000000000000000000000000090611b729086908690602401613e80565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608673ffffffffffffffffffffffffffffffffffffffff1683604051611bfa9190613e43565b600060405180830381855afa9150503d8060008114611c35576040519150601f19603f3d011682016040523d82523d6000602084013e611c3a565b606091505b5091509150818015611c4d575080516020145b15611c6757611c5d81600c612b9b565b9350505050611c6b565b5050505b9392505050565b606061067f858585857f4cb8e2530000000000000000000000000000000000000000000000000000000060006129bd565b606060008251905080604051908082528060200260200182016040528015611cd5578160200160208202803883390190505b50915060005b81811015611b2f5760006060611cef612b83565b73ffffffffffffffffffffffffffffffffffffffff16620249f0600073ffffffffffffffffffffffffffffffffffffffff16631f00ca74905060e01b888681518110611d3757fe5b60200260200101518a604051602401611d519291906142ee565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611dda9190613e43565b6000604051808303818686fa925050503d8060008114611e16576040519150601f19603f3d011682016040523d82523d6000602084013e611e1b565b606091505b50909250905060008215611b045781806020019051611e3d9190810190613ae1565b600081518110611e4957fe5b6020026020010151905080868581518110611e6057fe5b6020908102919091010152505050600101611cdb565b6060611e83848484610842565b905060005b8451811015610af757818181518110611e9d57fe5b6020026020010151600014611f1157611ef8828281518110611ebb57fe5b6020026020010151868381518110611ecf57fe5b602002602001015160a00151878481518110611ee757fe5b602002602001015160800151612be0565b828281518110611f0457fe5b6020026020010181815250505b600101611e88565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7f9061413f565b60405180910390fd5b5050565b73794e6e91555438afc3ccf1c5076a74f42133d08d90565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290565b6000806000611fc9612c22565b9150915060608173ffffffffffffffffffffffffffffffffffffffff16633d3dc52c611ff3611fa4565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161461202b578861202d565b875b6040518263ffffffff1660e01b81526004016120499190613e5f565b60006040518083038186803b15801561206157600080fd5b505afa158015612075573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526120bb9190810190613ae1565b604080516000808252602082019092529192505b8251811015612374576040517f106e9a4b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063106e9a4b9061213e907331e085afd48a1d6e51cc193153d625e8f0514c7f90600401613e5f565b60206040518083038186803b15801561215657600080fd5b505afa15801561216a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061218e9190810190613ca2565b83828151811061219a57fe5b6020026020010151148061227557506040517f106e9a4b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063106e9a4b9061220f907310908c875d865c66f271f5d3949848971c9595c990600401613e5f565b60206040518083038186803b15801561222757600080fd5b505afa15801561223b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061225f9190810190613ca2565b83828151811061226b57fe5b6020026020010151145b8061234757506040517f106e9a4b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063106e9a4b906122e190731e158c0e93c30d24e918ef83d1e0be23595c3c0f90600401613e5f565b60206040518083038186803b1580156122f957600080fd5b505afa15801561230d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506123319190810190613ca2565b83828151811061233d57fe5b6020026020010151145b1561236c576123698284838151811061235c57fe5b6020026020010151612d56565b91505b6001016120cf565b50606061237f611fa4565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161415612496578473ffffffffffffffffffffffffffffffffffffffff166381efcbdd8960028560006040519080825280602002602001820160405280156123fd578160200160208202803883390190505b506040518563ffffffff1660e01b815260040161241d9493929190613fdc565b60006040518083038186803b15801561243557600080fd5b505afa158015612449573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261248f9190810190613cba565b9050612576565b8473ffffffffffffffffffffffffffffffffffffffff166381efcbdd8a60028560006040519080825280602002602001820160405280156124e1578160200160208202803883390190505b506040518563ffffffff1660e01b81526004016125019493929190613fdc565b60006040518083038186803b15801561251957600080fd5b505afa15801561252d573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526125739190810190613cba565b90505b60006060612582612dec565b73ffffffffffffffffffffffffffffffffffffffff166216e3607f418436bc000000000000000000000000000000000000000000000000000000006125c5611fa4565b73ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff16146125fd578d612613565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b61261b611fa4565b73ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff1614612653578d612669565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b8d600089604051602401612681959493929190613f89565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161270a9190613e43565b6000604051808303818686fa925050503d8060008114612746576040519150601f19603f3d011682016040523d82523d6000602084013e61274b565b606091505b50909250905060008215612774578180602001905161276d9190810190613ca2565b9050612785565b600098505050505050505050611c6b565b60006127908c612e04565b60ff16905060006127a08e612e04565b60ff169050670de0b6b3a764000081600a0a83600a0a8e860202816127c157fe5b04816127c957fe5b049e9d5050505050505050505050505050565b60006127e6612e0f565b73ffffffffffffffffffffffffffffffffffffffff166306f2bf62836040518263ffffffff1660e01b815260040161281e9190613e5f565b60206040518083038186803b15801561283657600080fd5b505afa15801561284a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061286e919081019061362b565b92915050565b60008073ffffffffffffffffffffffffffffffffffffffff8516612897576129b5565b60608573ffffffffffffffffffffffffffffffffffffffff16620249f086866040516024016128c691906142e5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161294f9190613e43565b6000604051808303818686fa925050503d806000811461298b576040519150601f19603f3d011682016040523d82523d6000602084013e612990565b606091505b50909250905081156129b357808060200190516129b09190810190613ca2565b92505b505b935093915050565b60606129c98688611f19565b84516129d45761173e565b60008060008751604051908082528060200260200182016040528015612a04578160200160208202803883390190505b509350612a28898b8a600081518110612a1957fe5b60200260200101518989612e27565b925082612a38575061173e915050565b612a458a8a858989612e27565b915081612a55575061173e915050565b60005b8851811015612b755760005b8860200151811015612b3757612a8e8a8381518110612a7f57fe5b60200260200101518587612be0565b9450612aa589600001516127100161271087612be0565b94506000612ab68d8d888c8c612e27565b905080612ac35750612b37565b8094508a8381518110612ad257fe5b60200260200101518510612b2e5760008b8481518110612aee57fe5b60200260200101518c8581518110612b0257fe5b602002602001015187036127100281612b1757fe5b0490508a600001518111612b2c575050612b37565b505b50600101612a64565b50612b56898281518110612b4757fe5b60200260200101518486612be0565b858281518110612b6257fe5b6020908102919091010152600101612a58565b505050509695505050505050565b73f164fc0ec4e93095b804a4795bbe1e041497b92a90565b60008160140183511015612bc157612bc1612bbc60048551856014016130dc565b613181565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b6000610e9d83612c16612bfa82600163ffffffff61318916565b612c0a888763ffffffff6131a816565b9063ffffffff6131d916565b9063ffffffff6131f516565b600080612c2d612dec565b73ffffffffffffffffffffffffffffffffffffffff1663b78b842d6040518163ffffffff1660e01b815260040160206040518083038186803b158015612c7257600080fd5b505afa158015612c86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612caa919081019061362b565b73ffffffffffffffffffffffffffffffffffffffff1663c3a2a93a6040518163ffffffff1660e01b815260040160006040518083038186803b158015612cef57600080fd5b505afa158015612d03573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612d4991908101906138e1565b5091955093505050509091565b60608251600101604051908082528060200260200182016040528015612d86578160200160208202803883390190505b50905060005b8351811015612dc857838181518110612da157fe5b6020026020010151828281518110612db557fe5b6020908102919091010152600101612d8c565b508181600183510381518110612dda57fe5b60200260200101818152505092915050565b739aab3f75489902f3a48495025729a0af77d4b11e90565b600061286e8261321f565b73c0a47dfe034b400b47bdad5fecda2621de6c4d9590565b6040805160018082528183019092526000916060918291602080830190803883390190505090508581600081518110612e5c57fe5b60209081029190910101527fffffffff0000000000000000000000000000000000000000000000000000000085167f4cb8e253000000000000000000000000000000000000000000000000000000001415612f6c576040517f4cb8e2530000000000000000000000000000000000000000000000000000000090612ee8908a908a908590602401613f1f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529150613025565b6040517f9f76ad350000000000000000000000000000000000000000000000000000000090612fa59086908b908b908690602401613ea7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915291505b600060603073ffffffffffffffffffffffffffffffffffffffff168460405161304e9190613e43565b600060405180830381855afa9150503d8060008114613089576040519150601f19603f3d011682016040523d82523d6000602084013e61308e565b606091505b5091509150816130a557600094505050505061067f565b808060200190516130b99190810190613ae1565b6000815181106130c557fe5b602002602001015194505050505095945050505050565b6060632800659560e01b8484846040516024016130fb93929190614113565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b6000828211156131a2576131a2612bbc600285856132f0565b50900390565b6000826131b75750600061286e565b828202828482816131c457fe5b0414611c6b57611c6b612bbc600186866132f0565b600082820183811015611c6b57611c6b612bbc600086866132f0565b60008161320b5761320b612bbc600385856132f0565b600082848161321657fe5b04949350505050565b600060129050600060608373ffffffffffffffffffffffffffffffffffffffff166040518060400160405280600481526020017f313ce567000000000000000000000000000000000000000000000000000000008152506040516132839190613e43565b600060405180830381855afa9150503d80600081146132be576040519150601f19603f3d011682016040523d82523d6000602084013e6132c3565b606091505b50915091508180156132d6575080516020145b156132e9576132e681600061330f565b92505b5050919050565b606063e946c1bb60e01b8484846040516024016130fb939291906140f2565b6000611c6b83836000816020018351101561333757613337612bbc60058551856020016130dc565b50016020015190565b6040805160608101909152806000815260006020820181905260409091015290565b803561286e81614418565b805161286e81614418565b600082601f830112613388578081fd5b813561339b61339682614379565b614352565b8181529150602080830190840160005b838110156133d8576133c3876020843589010161344b565b835260209283019291909101906001016133ab565b5050505092915050565b600082601f8301126133f2578081fd5b813561340061339682614379565b81815291506020808301908481018184028601820187101561342157600080fd5b60005b8481101561344057813584529282019290820190600101613424565b505050505092915050565b600082601f83011261345b578081fd5b813561346961339682614399565b915080825283602082850101111561348057600080fd5b8060208401602084013760009082016020015292915050565b8035600f81900b811461286e57600080fd5b6000604082840312156134bc578081fd5b6134c66040614352565b9050813581526020820135602082015292915050565b60006101c08083850312156134ef578182fd5b6134f881614352565b9150506135058383613362565b81526135148360208401613362565b60208201526135268360408401613362565b60408201526135388360608401613362565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff8082111561359a57600080fd5b6135a68683870161344b565b838501526101609250828501359150808211156135c257600080fd5b6135ce8683870161344b565b838501526101809250828501359150808211156135ea57600080fd5b6135f68683870161344b565b838501526101a092508285013591508082111561361257600080fd5b5061361f8582860161344b565b82840152505092915050565b60006020828403121561363c578081fd5b8151611c6b81614418565b60008060006060848603121561365b578182fd5b833561366681614418565b9250602084013561367681614418565b9150604084013561368681614418565b809150509250925092565b600080600080600060a086880312156136a8578283fd5b85356136b381614418565b945060208601356136c381614418565b935060408601356136d381614418565b925060608601356136e381614418565b9150608086013567ffffffffffffffff8111156136fe578182fd5b61370a888289016133e2565b9150509295509295909350565b6000806000806080858703121561372c578182fd5b843561373781614418565b9350602085013561374781614418565b9250604085013561375781614418565b9150606085013567ffffffffffffffff811115613772578182fd5b61377e878288016133e2565b91505092959194509250565b600080600080600060c086880312156137a1578283fd5b85356137ac81614418565b945060208601356137bc81614418565b935060408601356137cc81614418565b9250606086013567ffffffffffffffff8111156137e7578182fd5b6137f3888289016133e2565b92505061380387608088016134ab565b90509295509295909350565b600080600060608486031215613823578081fd5b833561382e81614418565b9250602084013561383e81614418565b9150604084013567ffffffffffffffff811115613859578182fd5b613865868287016133e2565b9150509250925092565b60008060008060a08587031215613884578182fd5b843561388f81614418565b9350602085013561389f81614418565b9250604085013567ffffffffffffffff8111156138ba578283fd5b6138c6878288016133e2565b9250506138d686606087016134ab565b905092959194509250565b60008060008060008060c087890312156138f9578384fd5b865161390481614418565b8096505060208088015161391781614418565b604089015190965061392881614418565b606089015190955061393981614418565b608089015190945061394a81614418565b60a089015190935067ffffffffffffffff811115613966578283fd5b8089018a601f820112613977578384fd5b8051915061398761339683614379565b82815283810190828501858502840186018e10156139a3578687fd5b8693505b848410156139cd576139b98e8261336d565b8352600193909301929185019185016139a7565b5080955050505050509295509295509295565b600080600080608085870312156139f5578182fd5b8435613a0081614418565b9350613a0f8660208701613499565b92506137578660408701613499565b60008060408385031215613a30578182fd5b823567ffffffffffffffff80821115613a47578384fd5b81850186601f820112613a58578485fd5b80359250613a6861339684614379565b80848252602080830192508084018a828389028701011115613a88578889fd5b8894505b86851015613ab3578035613a9f81614418565b845260019490940193928101928101613a8c565b509096508701359350505080821115613aca578283fd5b50613ad7858286016133e2565b9150509250929050565b60006020808385031215613af3578182fd5b825167ffffffffffffffff811115613b09578283fd5b80840185601f820112613b1a578384fd5b80519150613b2a61339683614379565b8281528381019082850185850284018601891015613b46578687fd5b8693505b84841015613b68578051835260019390930192918501918501613b4a565b50979650505050505050565b60008060208385031215613b86578182fd5b823567ffffffffffffffff80821115613b9d578384fd5b81850186601f820112613bae578485fd5b8035925081831115613bbe578485fd5b8660208085028301011115613bd1578485fd5b60200196919550909350505050565b600080600060608486031215613bf4578081fd5b833567ffffffffffffffff80821115613c0b578283fd5b81860187601f820112613c1c578384fd5b80359250613c2c61339684614379565b83815260208082019190838101875b87811015613c6457613c528d8484358901016134dc565b85529382019390820190600101613c3b565b50919850890135945050505080821115613c7c578283fd5b50613c8986828701613378565b925050613c998560408601613362565b90509250925092565b600060208284031215613cb3578081fd5b5051919050565b600060208284031215613ccb578081fd5b815167ffffffffffffffff811115613ce1578182fd5b80830184601f820112613cf2578283fd5b80519150613d0261339683614399565b828152856020848401011115613d16578384fd5b61067f8360208301602085016143db565b600080600083850360a0811215613d3c578182fd5b6060811215613d49578182fd5b50613d546060614352565b845160078110613d62578283fd5b815260208581015190820152604080860151908201526060850151608086015191945092508015158114613686578182fd5b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208401935060208301825b82811015613ddf578151865260209586019590910190600101613dc1565b5093949350505050565b60008151808452613e018160208601602086016143db565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000828483379101908152919050565b60008251613e558184602087016143db565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401528085166040840152506080606083015261173e6080830184613dae565b73ffffffffffffffffffffffffffffffffffffffff9485168152928416602084015292166040820152606081019190915260800190565b600073ffffffffffffffffffffffffffffffffffffffff80861683528085166020840152506060604083015261067f6060830184613dae565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015260ff8416606083015260a06080830152613fd160a0830184613de9565b979650505050505050565b60006080820173ffffffffffffffffffffffffffffffffffffffff871683526140048661440b565b60208381018790526080604085015285519182905285019060a0840190835b81811015614041578351835260209384019390920191600101614023565b505083810360608501526140558186613dae565b98975050505050505050565b6000602080830181845280855180835260408601915060408482028701019250838701855b828110156140d2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526140c0858351613de9565b94509285019290850190600101614086565b5092979650505050505050565b600060208252611c6b6020830184613dae565b606081016140ff8561440b565b938152602081019290925260409091015290565b60608101600885106140ff57fe5b600f93840b81529190920b6020820152604081019190915260600190565b60208082526025908201527f455243323042726964676553616d706c65722f494e56414c49445f544f4b454e60408201527f5f50414952000000000000000000000000000000000000000000000000000000606082015260800190565b6000604082526141b0604083018551613d94565b60208401516141c26060840182613d94565b5060408401516141d56080840182613d94565b5060608401516141e860a0840182613d94565b50608084015160c083015260a084015160e083015260c0840151610100818185015260e086015191506101208281860152818701519250610140915082828601528087015192505061016082818601528187015192506101c091506101808281870152614259610200870185613de9565b8289015194507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc092506101a08388830301818901526142988287613de9565b838b015196508489820301868a01526142b18188613de9565b955050808a0151955050505080858303016101e0860152506142d38183613de9565b8481036020860152613fd18187613de9565b90815260200190565b60006040820184835260406020840152808451808352606085019150602086019250835b8181101561434657835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101614312565b50909695505050505050565b60405181810167ffffffffffffffff8111828210171561437157600080fd5b604052919050565b600067ffffffffffffffff82111561438f578081fd5b5060209081020190565b600067ffffffffffffffff8211156143af578081fd5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b838110156143f65781810151838201526020016143de565b83811115614405576000848401525b50505050565b6004811061441557fe5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461441557600080fdfea365627a7a723158200ca872017075258b0971b4ddeb56cd71e136b20e6f3441f5aebf89a73cd1ca6a6c6578706572696d656e74616cf564736f6c63430005110040" }, "deployedBytecode": { - "object": "0x608060405234801561001057600080fd5b50600436106101365760003560e01c806368be3cf2116100b25780639f76ad3511610081578063c7f7142e11610066578063c7f7142e1461027b578063d0eea06d1461029b578063e68248f7146102ae57610136565b80639f76ad3514610255578063abffc7611461026857610136565b806368be3cf2146101fc5780636dd6b78d1461021c5780638b123a021461022f57806398cdafba1461024257610136565b80634cb8e2531161010957806359f515d0116100ee57806359f515d0146101c357806360ee052a146101d657806364ee6ade146101e957610136565b80634cb8e2531461019d57806358306ba0146101b057610136565b80631796fb871461013b5780632d753aa414610164578063354152a3146101775780634703a7e61461018a575b600080fd5b61014e6101493660046133ca565b6102c1565b60405161015b919061399f565b60405180910390f35b61014e61017236600461317a565b610492565b61014e6101853660046133ca565b610688565b61014e6101983660046132f8565b610842565b61014e6101ab3660046132f8565b610a1e565b61014e6101be366004613200565b610c38565b61014e6101d1366004613537565b610ccf565b61014e6101e43660046132f8565b610d78565b61014e6101f73660046132f8565b611038565b61020f61020a3660046134cb565b6111fe565b60405161015b9190613921565b61014e61022a3660046132f8565b61133d565b61014e61023d366004613537565b6115e5565b61014e610250366004613273565b6118be565b61014e610263366004613200565b6118f8565b61014e610276366004613408565b611afc565b61028e610289366004613130565b611cdf565b60405161015b91906137c1565b61014e6102a9366004613358565b611e1a565b61014e6102bc366004613408565b611e4b565b6060600082519050806040519080825280602002602001820160405280156102f3578160200160208202803883390190505b50915060005b8181101561048857600060608873ffffffffffffffffffffffffffffffffffffffff16620927c0600073ffffffffffffffffffffffffffffffffffffffff16630e71d1b9905060e01b8a8a8a888151811061035057fe5b602002602001015160405160240161036a939291906139e2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516103f391906137a5565b6000604051808303818686fa925050503d806000811461042f576040519150601f19603f3d011682016040523d82523d6000602084013e610434565b606091505b5090925090506000821561045d578180602001905161045691908101906136de565b9050610465565b505050610488565b8086858151811061047257fe5b60209081029190910101525050506001016102f9565b5050949350505050565b6060600082519050806040519080825280602002602001820160405280156104c4578160200160208202803883390190505b50915073ffffffffffffffffffffffffffffffffffffffff87166104e8575061067f565b60005b8181101561067c57600060608973ffffffffffffffffffffffffffffffffffffffff1662061a80600073ffffffffffffffffffffffffffffffffffffffff16636e79e133905060e01b8b8b8b8b898151811061054357fe5b602002602001015160405160240161055e949392919061384a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516105e791906137a5565b6000604051808303818686fa925050503d8060008114610623576040519150601f19603f3d011682016040523d82523d6000602084013e610628565b606091505b50909250905060008215610651578180602001905161064a91908101906136de565b9050610659565b50505061067c565b8086858151811061066657fe5b60209081029190910101525050506001016104eb565b50505b95945050505050565b6060600082519050806040519080825280602002602001820160405280156106ba578160200160208202803883390190505b50915060005b8181101561048857600060608873ffffffffffffffffffffffffffffffffffffffff16620927c0600073ffffffffffffffffffffffffffffffffffffffff166307211ef7905060e01b8a8a8a888151811061071757fe5b6020026020010151604051602401610731939291906139e2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516107ba91906137a5565b6000604051808303818686fa925050503d80600081146107f6576040519150601f19603f3d011682016040523d82523d6000602084013e6107fb565b606091505b5090925090506000821561045d578180602001905161081d91908101906136de565b90508086858151811061082c57fe5b60209081029190910101525050506001016106c0565b606061084e838561201e565b8151604080518281526020808402820101909152818015610879578160200160208202803883390190505b50915060005b81811015610a155760006060610893612091565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663ff1fd974905060e01b8a8a8a88815181106108dd57fe5b60200260200101516040516024016108f7939291906138ba565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161098091906137a5565b6000604051808303818686fa925050503d80600081146109bc576040519150601f19603f3d011682016040523d82523d6000602084013e6109c1565b606091505b509092509050600082156109ea57818060200190516109e391908101906136de565b90506109f2565b505050610a15565b808685815181106109ff57fe5b602090810291909101015250505060010161087f565b50509392505050565b6060610a2a838561201e565b8151604080518281526020808402820101909152818015610a55578160200160208202803883390190505b5091506000610a626120a9565b9050600080805b84811015610c2c578373ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161480610ad657508373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b15610b6e57610af98989898481518110610aec57fe5b60200260200101516120c1565b909350915073ffffffffffffffffffffffffffffffffffffffff82167331e085afd48a1d6e51cc193153d625e8f0514c7f1480610b5f575073ffffffffffffffffffffffffffffffffffffffff8216731e158c0e93c30d24e918ef83d1e0be23595c3c0f145b15610b6957600092505b610c0c565b610b7f8985898481518110610aec57fe5b90935091508215610c0c576000610b97858a866120c1565b909450905073ffffffffffffffffffffffffffffffffffffffff83167331e085afd48a1d6e51cc193153d625e8f0514c7f148015610c0057508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15610c0a57600093505b505b82868281518110610c1957fe5b6020908102919091010152600101610a69565b50505050509392505050565b60608273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610c9f57508273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b15610ca957610cc7565b6060610cb6868585611038565b9050610cc3848683611038565b9150505b949350505050565b6060610cdb83836115e5565b905060005b8351811015610d7157818181518110610cf557fe5b6020026020010151600014610d6957610d50828281518110610d1357fe5b6020026020010151858381518110610d2757fe5b602002602001015160a00151868481518110610d3f57fe5b602002602001015160800151612435565b828281518110610d5c57fe5b6020026020010181815250505b600101610ce0565b5092915050565b6060610d84838561201e565b8151604080518281526020808402820101909152818015610daf578160200160208202803883390190505b5091506000610dbc6120a9565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610dfc57610df786612477565b610dff565b60005b90506000610e0b6120a9565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610e4b57610e4686612477565b610e4e565b60005b905060005b8381101561102d576001610e656120a9565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415610efc578651610edb9085907f2640f62c00000000000000000000000000000000000000000000000000000000908a9086908110610ece57fe5b602002602001015161250f565b878481518110610ee757fe5b60200260200101819350828152505050611019565b610f046120a9565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161415610f6d578651610edb9084907f59e9486200000000000000000000000000000000000000000000000000000000908a9086908110610ece57fe5b8651600090610fa69085907f59e9486200000000000000000000000000000000000000000000000000000000908b9087908110610ece57fe5b925090508015610ffc57610fdb857f2640f62c000000000000000000000000000000000000000000000000000000008361250f565b888581518110610fe757fe5b60200260200101819450828152505050611017565b600087848151811061100a57fe5b6020026020010181815250505b505b80611024575061102d565b50600101610e53565b505050509392505050565b6060611044838561201e565b815160408051828152602080840282010190915281801561106f578160200160208202803883390190505b50915060005b81811015610a155760006060611089612091565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663144a2752905060e01b898b8a88815181106110d357fe5b60200260200101516040516024016110ed939291906138ba565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161117691906137a5565b6000604051808303818686fa925050503d80600081146111b2576040519150601f19603f3d011682016040523d82523d6000602084013e6111b7565b606091505b509092509050600082156109ea57818060200190516111d991908101906136de565b9050808685815181106111e857fe5b6020908102919091010152505050600101611075565b60408051828152602080840282010190915260609082801561123457816020015b606081526020019060019003908161121f5790505b50905060005b808314610d7157600060603086868581811061125257fe5b6020028201905080357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe13684900301811261128c57600080fd5b9091016020810191503567ffffffffffffffff8111156112ab57600080fd5b368190038213156112bb57600080fd5b6040516112c9929190613795565b600060405180830381855afa9150503d8060008114611304576040519150601f19603f3d011682016040523d82523d6000602084013e611309565b606091505b50915091508161131b57805160208201fd5b8084848151811061132857fe5b6020908102919091010152505060010161123a565b6060611349838561201e565b8151604080518281526020808402820101909152818015611374578160200160208202803883390190505b50915060006113816120a9565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146113c1576113bc86612477565b6113c4565b60005b905060006113d06120a9565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146114105761140b86612477565b611413565b60005b905060005b8381101561102d57600161142a6120a9565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614156114b45786516114939085907f95b68fe700000000000000000000000000000000000000000000000000000000908a9086908110610ece57fe5b87848151811061149f57fe5b602002602001018193508281525050506115d1565b6114bc6120a9565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614156115255786516114939084907fcd7724c300000000000000000000000000000000000000000000000000000000908a9086908110610ece57fe5b865160009061155e9086907f95b68fe700000000000000000000000000000000000000000000000000000000908b9087908110610ece57fe5b9250905080156115b457611593847fcd7724c3000000000000000000000000000000000000000000000000000000008361250f565b88858151811061159f57fe5b602002602001018194508281525050506115cf565b60008784815181106115c257fe5b6020026020010181815250505b505b806115dc575061102d565b50600101611418565b60608251604051908082528060200260200182016040528015611612578160200160208202803883390190505b506000805491925073ffffffffffffffffffffffffffffffffffffffff909116905b845181146118b65783818151811061164857fe5b60200260200101515160001480611676575084818151811061166657fe5b6020026020010151608001516000145b80611698575084818151811061168857fe5b602002602001015160a001516000145b156116bc5760008382815181106116ab57fe5b6020026020010181815250506118ae565b600060608373ffffffffffffffffffffffffffffffffffffffff166207a1208573ffffffffffffffffffffffffffffffffffffffff1663e77286eb905060e01b89868151811061170857fe5b602002602001015189878151811061171c57fe5b6020026020010151604051602401611735929190613a5d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516117be91906137a5565b6000604051808303818686fa925050503d80600081146117fa576040519150601f19603f3d011682016040523d82523d6000602084013e6117ff565b606091505b50915091508161182a57600085848151811061181757fe5b60200260200101818152505050506118ae565b611832612dce565b600080838060200190516118499190810190613671565b9194509250905060038351600681111561185f57fe5b14158061186a575080155b1561188e57600088878151811061187d57fe5b6020026020010181815250506118a8565b8188878151811061189b57fe5b6020026020010181815250505b50505050505b600101611634565b505092915050565b60606118ee858585857f9f76ad35000000000000000000000000000000000000000000000000000000008b612657565b9695505050505050565b60606000825190508060405190808252806020026020018201604052801561192a578160200160208202803883390190505b509150600061193a878787611cdf565b905073ffffffffffffffffffffffffffffffffffffffff811661195f5750610cc79050565b60005b82811015611af157600060608373ffffffffffffffffffffffffffffffffffffffff1662061a80600073ffffffffffffffffffffffffffffffffffffffff1663343fbcdd905060e01b8b8b8b88815181106119b957fe5b60200260200101516040516024016119d3939291906138ba565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611a5c91906137a5565b6000604051808303818686fa925050503d8060008114611a98576040519150601f19603f3d011682016040523d82523d6000602084013e611a9d565b606091505b50909250905060008215611ac65781806020019051611abf91908101906136de565b9050611ace565b505050611af1565b80878581518110611adb57fe5b6020908102919091010152505050600101611962565b505050949350505050565b606060008251905080604051908082528060200260200182016040528015611b2e578160200160208202803883390190505b50915060005b818110156118b65760006060611b4861281d565b73ffffffffffffffffffffffffffffffffffffffff16620249f0600073ffffffffffffffffffffffffffffffffffffffff1663d06ca61f905060e01b888681518110611b9057fe5b60200260200101518a604051602401611baa929190613bba565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611c3391906137a5565b6000604051808303818686fa925050503d8060008114611c6f576040519150601f19603f3d011682016040523d82523d6000602084013e611c74565b606091505b50909250905060008215611cb45781806020019051611c9691908101906135de565b600189510381518110611ca557fe5b60200260200101519050611cbc565b5050506118b6565b80868581518110611cc957fe5b6020908102919091010152505050600101611b34565b6040516000906060907f153f59970000000000000000000000000000000000000000000000000000000090611d1a90869086906024016137e2565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608673ffffffffffffffffffffffffffffffffffffffff1683604051611da291906137a5565b600060405180830381855afa9150503d8060008114611ddd576040519150601f19603f3d011682016040523d82523d6000602084013e611de2565b606091505b5091509150818015611df5575080516020145b15611e0f57611e0581600c612835565b9350505050611e13565b5050505b9392505050565b606061067f858585857f4cb8e253000000000000000000000000000000000000000000000000000000006000612657565b606060008251905080604051908082528060200260200182016040528015611e7d578160200160208202803883390190505b50915060005b818110156118b65760006060611e9761281d565b73ffffffffffffffffffffffffffffffffffffffff16620249f0600073ffffffffffffffffffffffffffffffffffffffff16631f00ca74905060e01b888681518110611edf57fe5b60200260200101518a604051602401611ef9929190613bba565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611f8291906137a5565b6000604051808303818686fa925050503d8060008114611fbe576040519150601f19603f3d011682016040523d82523d6000602084013e611fc3565b606091505b50909250905060008215611cb45781806020019051611fe591908101906135de565b600081518110611ff157fe5b602002602001015190508086858151811061200857fe5b6020908102919091010152505050600101611e83565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561208d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208490613a00565b60405180910390fd5b5050565b73794e6e91555438afc3ccf1c5076a74f42133d08d90565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290565b60008060006120ce6120a9565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614612106578561211c565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b905060006121286120a9565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146121605785612176565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b905060006121838861287a565b60ff16905060006121938861287a565b60ff169050600060606121a4612885565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f4f61ff8b00000000000000000000000000000000000000000000000000000000179052905173ffffffffffffffffffffffffffffffffffffffff929092169162061a8091612224916137a5565b6000604051808303818686fa925050503d8060008114612260576040519150601f19603f3d011682016040523d82523d6000602084013e612265565b606091505b50915091508161228257506000965086955061242d945050505050565b60008180602001905161229891908101906130e7565b90508073ffffffffffffffffffffffffffffffffffffffff166216e360600073ffffffffffffffffffffffffffffffffffffffff16630c235d96905060e01b89898e60006040516024016122ef94939291906138eb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161237891906137a5565b6000604051808303818686fa925050503d80600081146123b4576040519150601f19603f3d011682016040523d82523d6000602084013e6123b9565b606091505b50909350915060008084156123e557838060200190516123dc9190810190613103565b925090506123fb565b506000995089985061242d975050505050505050565b670de0b6b3a764000087600a0a87600a0a8e8502028161241757fe5b048161241f57fe5b049a50985050505050505050505b935093915050565b6000610cc78361246b61244f82600163ffffffff61289d16565b61245f888763ffffffff6128bc16565b9063ffffffff6128ed16565b9063ffffffff61290916565b6000612481612933565b73ffffffffffffffffffffffffffffffffffffffff166306f2bf62836040518263ffffffff1660e01b81526004016124b991906137c1565b60206040518083038186803b1580156124d157600080fd5b505afa1580156124e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061250991908101906130e7565b92915050565b60008073ffffffffffffffffffffffffffffffffffffffff85166125325761242d565b60608573ffffffffffffffffffffffffffffffffffffffff16620249f086866040516024016125619190613bb1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516125ea91906137a5565b6000604051808303818686fa925050503d8060008114612626576040519150601f19603f3d011682016040523d82523d6000602084013e61262b565b606091505b509092509050811561264e578080602001905161264b91908101906136de565b92505b50935093915050565b6060612663868861201e565b845161266e576118ee565b6000806000875160405190808252806020026020018201604052801561269e578160200160208202803883390190505b5093506126c2898b8a6000815181106126b357fe5b6020026020010151898961294b565b9250826126d257506118ee915050565b6126df8a8a85898961294b565b9150816126ef57506118ee915050565b60005b885181101561280f5760005b88602001518110156127d1576127288a838151811061271957fe5b60200260200101518587612435565b945061273f89600001516127100161271087612435565b945060006127508d8d888c8c61294b565b90508061275d57506127d1565b8094508a838151811061276c57fe5b602002602001015185106127c85760008b848151811061278857fe5b60200260200101518c858151811061279c57fe5b6020026020010151870361271002816127b157fe5b0490508a6000015181116127c65750506127d1565b505b506001016126fe565b506127f08982815181106127e157fe5b60200260200101518486612435565b8582815181106127fc57fe5b60209081029190910101526001016126f2565b505050509695505050505050565b73f164fc0ec4e93095b804a4795bbe1e041497b92a90565b6000816014018351101561285b5761285b6128566004855185601401612c00565b612ca5565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b600061250982612cad565b73818e6fecd516ecc3849daf6845e3ec868087b75590565b6000828211156128b6576128b661285660028585612d7e565b50900390565b6000826128cb57506000612509565b828202828482816128d857fe5b0414611e1357611e1361285660018686612d7e565b600082820183811015611e1357611e1361285660008686612d7e565b60008161291f5761291f61285660038585612d7e565b600082848161292a57fe5b04949350505050565b73c0a47dfe034b400b47bdad5fecda2621de6c4d9590565b604080516001808252818301909252600091606091829160208083019080388339019050509050858160008151811061298057fe5b60209081029190910101527fffffffff0000000000000000000000000000000000000000000000000000000085167f4cb8e253000000000000000000000000000000000000000000000000000000001415612a90576040517f4cb8e2530000000000000000000000000000000000000000000000000000000090612a0c908a908a908590602401613881565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529150612b49565b6040517f9f76ad350000000000000000000000000000000000000000000000000000000090612ac99086908b908b908690602401613809565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915291505b600060603073ffffffffffffffffffffffffffffffffffffffff1684604051612b7291906137a5565b600060405180830381855afa9150503d8060008114612bad576040519150601f19603f3d011682016040523d82523d6000602084013e612bb2565b606091505b509150915081612bc957600094505050505061067f565b80806020019051612bdd91908101906135de565b600081518110612be957fe5b602002602001015194505050505095945050505050565b6060632800659560e01b848484604051602401612c1f939291906139d4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b600060129050600060608373ffffffffffffffffffffffffffffffffffffffff166040518060400160405280600481526020017f313ce56700000000000000000000000000000000000000000000000000000000815250604051612d1191906137a5565b600060405180830381855afa9150503d8060008114612d4c576040519150601f19603f3d011682016040523d82523d6000602084013e612d51565b606091505b5091509150818015612d64575080516020145b15612d7757612d74816000612d9d565b92505b5050919050565b606063e946c1bb60e01b848484604051602401612c1f939291906139b2565b6000611e13838360008160200183511015612dc557612dc56128566005855185602001612c00565b50016020015190565b6040805160608101909152806000815260006020820181905260409091015290565b803561250981613c95565b600082601f830112612e0b578081fd5b8135612e1e612e1982613c45565b613c1e565b8181529150602080830190840160005b83811015612e5b57612e468760208435890101612ece565b83526020928301929190910190600101612e2e565b5050505092915050565b600082601f830112612e75578081fd5b8135612e83612e1982613c45565b818152915060208083019084810181840286018201871015612ea457600080fd5b60005b84811015612ec357813584529282019290820190600101612ea7565b505050505092915050565b600082601f830112612ede578081fd5b813567ffffffffffffffff811115612ef4578182fd5b612f2560207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613c1e565b9150808252836020828501011115612f3c57600080fd5b8060208401602084013760009082016020015292915050565b8035600f81900b811461250957600080fd5b600060408284031215612f78578081fd5b612f826040613c1e565b9050813581526020820135602082015292915050565b60006101c0808385031215612fab578182fd5b612fb481613c1e565b915050612fc18383612df0565b8152612fd08360208401612df0565b6020820152612fe28360408401612df0565b6040820152612ff48360608401612df0565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff8082111561305657600080fd5b61306286838701612ece565b8385015261016092508285013591508082111561307e57600080fd5b61308a86838701612ece565b838501526101809250828501359150808211156130a657600080fd5b6130b286838701612ece565b838501526101a09250828501359150808211156130ce57600080fd5b506130db85828601612ece565b82840152505092915050565b6000602082840312156130f8578081fd5b8151611e1381613c95565b60008060408385031215613115578081fd5b825161312081613c95565b6020939093015192949293505050565b600080600060608486031215613144578081fd5b833561314f81613c95565b9250602084013561315f81613c95565b9150604084013561316f81613c95565b809150509250925092565b600080600080600060a08688031215613191578283fd5b853561319c81613c95565b945060208601356131ac81613c95565b935060408601356131bc81613c95565b925060608601356131cc81613c95565b9150608086013567ffffffffffffffff8111156131e7578182fd5b6131f388828901612e65565b9150509295509295909350565b60008060008060808587031215613215578182fd5b843561322081613c95565b9350602085013561323081613c95565b9250604085013561324081613c95565b9150606085013567ffffffffffffffff81111561325b578182fd5b61326787828801612e65565b91505092959194509250565b600080600080600060c0868803121561328a578283fd5b853561329581613c95565b945060208601356132a581613c95565b935060408601356132b581613c95565b9250606086013567ffffffffffffffff8111156132d0578182fd5b6132dc88828901612e65565b9250506132ec8760808801612f67565b90509295509295909350565b60008060006060848603121561330c578081fd5b833561331781613c95565b9250602084013561332781613c95565b9150604084013567ffffffffffffffff811115613342578182fd5b61334e86828701612e65565b9150509250925092565b60008060008060a0858703121561336d578182fd5b843561337881613c95565b9350602085013561338881613c95565b9250604085013567ffffffffffffffff8111156133a3578283fd5b6133af87828801612e65565b9250506133bf8660608701612f67565b905092959194509250565b600080600080608085870312156133df578182fd5b84356133ea81613c95565b93506133f98660208701612f55565b92506132408660408701612f55565b6000806040838503121561341a578182fd5b823567ffffffffffffffff80821115613431578384fd5b81850186601f820112613442578485fd5b80359250613452612e1984613c45565b80848252602080830192508084018a828389028701011115613472578889fd5b8894505b8685101561349d57803561348981613c95565b845260019490940193928101928101613476565b5090965087013593505050808211156134b4578283fd5b506134c185828601612e65565b9150509250929050565b600080602083850312156134dd578182fd5b823567ffffffffffffffff808211156134f4578384fd5b81850186601f820112613505578485fd5b8035925081831115613515578485fd5b8660208085028301011115613528578485fd5b60200196919550909350505050565b60008060408385031215613549578182fd5b823567ffffffffffffffff80821115613560578384fd5b81850186601f820112613571578485fd5b80359250613581612e1984613c45565b83815260208082019190838101885b878110156135b9576135a78c848435890101612f98565b85529382019390820190600101613590565b509197508801359450505050808211156135d1578283fd5b506134c185828601612dfb565b600060208083850312156135f0578182fd5b825167ffffffffffffffff811115613606578283fd5b80840185601f820112613617578384fd5b80519150613627612e1983613c45565b8281528381019082850185850284018601891015613643578687fd5b8693505b84841015613665578051835260019390930192918501918501613647565b50979650505050505050565b600080600083850360a0811215613686578182fd5b6060811215613693578182fd5b5061369e6060613c1e565b8451600781106136ac578283fd5b81526020858101519082015260408086015190820152606085015160808601519194509250801515811461316f578182fd5b6000602082840312156136ef578081fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208401935060208301825b82811015613741578151865260209586019590910190600101613723565b5093949350505050565b60008151808452613763816020860160208601613c65565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000828483379101908152919050565b600082516137b7818460208701613c65565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152808516604084015250608060608301526118ee6080830184613710565b73ffffffffffffffffffffffffffffffffffffffff9485168152928416602084015292166040820152606081019190915260800190565b600073ffffffffffffffffffffffffffffffffffffffff80861683528085166020840152506060604083015261067f6060830184613710565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff94851681529290931660208301526040820152901515606082015260800190565b6000602080830181845280855180835260408601915060408482028701019250838701855b82811015613992577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261398085835161374b565b94509285019290850190600101613946565b5092979650505050505050565b600060208252611e136020830184613710565b60608101600485106139c057fe5b938152602081019290925260409091015290565b60608101600885106139c057fe5b600f93840b81529190920b6020820152604081019190915260600190565b60208082526025908201527f455243323042726964676553616d706c65722f494e56414c49445f544f4b454e60408201527f5f50414952000000000000000000000000000000000000000000000000000000606082015260800190565b600060408252613a716040830185516136f6565b6020840151613a8360608401826136f6565b506040840151613a9660808401826136f6565b506060840151613aa960a08401826136f6565b50608084015160c083015260a084015160e083015260c0840151610100818185015260e086015191506101208281860152818701519250610140915082828601528087015192505061016082818601528187015192506101c091506101808281870152613b1a61020087018561374b565b8289015194507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc092506101a0838883030181890152613b59828761374b565b838b015196508489820301868a0152613b72818861374b565b955050808a0151955050505080858303016101e086015250613b94818361374b565b8481036020860152613ba6818761374b565b979650505050505050565b90815260200190565b60006040820184835260406020840152808451808352606085019150602086019250835b81811015613c1257835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101613bde565b50909695505050505050565b60405181810167ffffffffffffffff81118282101715613c3d57600080fd5b604052919050565b600067ffffffffffffffff821115613c5b578081fd5b5060209081020190565b60005b83811015613c80578181015183820152602001613c68565b83811115613c8f576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff81168114613cb757600080fd5b5056fea365627a7a723158204f89046f6ef91e066e56b4d991a1a9740ea0d2c2bfef6144bf56dbf1f65952d76c6578706572696d656e74616cf564736f6c63430005110040" + "object": "0x608060405234801561001057600080fd5b50600436106101365760003560e01c806368be3cf2116100b2578063abffc76111610081578063d0eea06d11610066578063d0eea06d14610288578063e68248f71461029b578063e9a8e442146102ae57610136565b8063abffc76114610255578063c7f7142e1461026857610136565b806368be3cf2146101fc5780636dd6b78d1461021c57806398cdafba1461022f5780639f76ad351461024257610136565b80634703a7e61161010957806358306ba0116100ee57806358306ba0146101c357806360ee052a146101d657806364ee6ade146101e957610136565b80634703a7e61461019d5780634cb8e253146101b057610136565b80631796fb871461013b5780632d753aa414610164578063354152a31461017757806339b085ad1461018a575b600080fd5b61014e6101493660046139e0565b6102c1565b60405161015b91906140df565b60405180910390f35b61014e610172366004613691565b610492565b61014e6101853660046139e0565b610688565b61014e610198366004613be0565b610842565b61014e6101ab36600461380f565b610aff565b61014e6101be36600461380f565b610cdb565b61014e6101d1366004613717565b610e0e565b61014e6101e436600461380f565b610ea5565b61014e6101f736600461380f565b61115a565b61020f61020a366004613b74565b611320565b60405161015b9190614061565b61014e61022a36600461380f565b611466565b61014e61023d36600461378a565b61170e565b61014e610250366004613717565b611748565b61014e610263366004613a1e565b61194c565b61027b610276366004613647565b611b37565b60405161015b9190613e5f565b61014e61029636600461386f565b611c72565b61014e6102a9366004613a1e565b611ca3565b61014e6102bc366004613be0565b611e76565b6060600082519050806040519080825280602002602001820160405280156102f3578160200160208202803883390190505b50915060005b8181101561048857600060608873ffffffffffffffffffffffffffffffffffffffff16620927c0600073ffffffffffffffffffffffffffffffffffffffff16630e71d1b9905060e01b8a8a8a888151811061035057fe5b602002602001015160405160240161036a93929190614121565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516103f39190613e43565b6000604051808303818686fa925050503d806000811461042f576040519150601f19603f3d011682016040523d82523d6000602084013e610434565b606091505b5090925090506000821561045d57818060200190516104569190810190613ca2565b9050610465565b505050610488565b8086858151811061047257fe5b60209081029190910101525050506001016102f9565b5050949350505050565b6060600082519050806040519080825280602002602001820160405280156104c4578160200160208202803883390190505b50915073ffffffffffffffffffffffffffffffffffffffff87166104e8575061067f565b60005b8181101561067c57600060608973ffffffffffffffffffffffffffffffffffffffff1662061a80600073ffffffffffffffffffffffffffffffffffffffff16636e79e133905060e01b8b8b8b8b898151811061054357fe5b602002602001015160405160240161055e9493929190613ee8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516105e79190613e43565b6000604051808303818686fa925050503d8060008114610623576040519150601f19603f3d011682016040523d82523d6000602084013e610628565b606091505b50909250905060008215610651578180602001905161064a9190810190613ca2565b9050610659565b50505061067c565b8086858151811061066657fe5b60209081029190910101525050506001016104eb565b50505b95945050505050565b6060600082519050806040519080825280602002602001820160405280156106ba578160200160208202803883390190505b50915060005b8181101561048857600060608873ffffffffffffffffffffffffffffffffffffffff16620927c0600073ffffffffffffffffffffffffffffffffffffffff166307211ef7905060e01b8a8a8a888151811061071757fe5b602002602001015160405160240161073193929190614121565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516107ba9190613e43565b6000604051808303818686fa925050503d80600081146107f6576040519150601f19603f3d011682016040523d82523d6000602084013e6107fb565b606091505b5090925090506000821561045d578180602001905161081d9190810190613ca2565b90508086858151811061082c57fe5b60209081029190910101525050506001016106c0565b6060835160405190808252806020026020018201604052801561086f578160200160208202803883390190505b50905060005b84518114610af75783818151811061088957fe5b602002602001015151600014806108b757508481815181106108a757fe5b6020026020010151608001516000145b806108d957508481815181106108c957fe5b602002602001015160a001516000145b156108fd5760008282815181106108ec57fe5b602002602001018181525050610aef565b600060608473ffffffffffffffffffffffffffffffffffffffff166207a1208673ffffffffffffffffffffffffffffffffffffffff1663e77286eb905060e01b89868151811061094957fe5b602002602001015189878151811061095d57fe5b602002602001015160405160240161097692919061419c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516109ff9190613e43565b6000604051808303818686fa925050503d8060008114610a3b576040519150601f19603f3d011682016040523d82523d6000602084013e610a40565b606091505b509150915081610a6b576000848481518110610a5857fe5b6020026020010181815250505050610aef565b610a73613340565b60008083806020019051610a8a9190810190613d27565b91945092509050600383516006811115610aa057fe5b141580610aab575080155b15610acf576000878781518110610abe57fe5b602002602001018181525050610ae9565b81878781518110610adc57fe5b6020026020010181815250505b50505050505b600101610875565b509392505050565b6060610b0b8385611f19565b8151604080518281526020808402820101909152818015610b36578160200160208202803883390190505b50915060005b81811015610cd25760006060610b50611f8c565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663ff1fd974905060e01b8a8a8a8881518110610b9a57fe5b6020026020010151604051602401610bb493929190613f58565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051610c3d9190613e43565b6000604051808303818686fa925050503d8060008114610c79576040519150601f19603f3d011682016040523d82523d6000602084013e610c7e565b606091505b50909250905060008215610ca75781806020019051610ca09190810190613ca2565b9050610caf565b505050610cd2565b80868581518110610cbc57fe5b6020908102919091010152505050600101610b3c565b50509392505050565b6060610ce78385611f19565b8151604080518281526020808402820101909152818015610d12578160200160208202803883390190505b5091506000610d1f611fa4565b90506000805b83811015610e03578273ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161480610d9257508273ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b15610dbc57610db58888888481518110610da857fe5b6020026020010151611fbc565b9150610de3565b610dcd8884888481518110610da857fe5b91508115610de357610de0838884611fbc565b91505b81858281518110610df057fe5b6020908102919091010152600101610d25565b505050509392505050565b60608273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610e7557508273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b15610e7f57610e9d565b6060610e8c86858561115a565b9050610e9984868361115a565b9150505b949350505050565b6060610eb18385611f19565b8151604080518281526020808402820101909152818015610edc578160200160208202803883390190505b5091506000610ee9611fa4565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610f2957610f24866127dc565b610f2c565b60005b90506000610f38611fa4565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610f7857610f73866127dc565b610f7b565b60005b905060005b83811015610e03576001610f92611fa4565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614156110295786516110089085907f2640f62c00000000000000000000000000000000000000000000000000000000908a9086908110610ffb57fe5b6020026020010151612874565b87848151811061101457fe5b60200260200101819350828152505050611146565b611031611fa4565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16141561109a5786516110089084907f59e9486200000000000000000000000000000000000000000000000000000000908a9086908110610ffb57fe5b86516000906110d39085907f59e9486200000000000000000000000000000000000000000000000000000000908b9087908110610ffb57fe5b92509050801561112957611108857f2640f62c0000000000000000000000000000000000000000000000000000000083612874565b88858151811061111457fe5b60200260200101819450828152505050611144565b600087848151811061113757fe5b6020026020010181815250505b505b806111515750610e03565b50600101610f80565b60606111668385611f19565b8151604080518281526020808402820101909152818015611191578160200160208202803883390190505b50915060005b81811015610cd257600060606111ab611f8c565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663144a2752905060e01b898b8a88815181106111f557fe5b602002602001015160405160240161120f93929190613f58565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516112989190613e43565b6000604051808303818686fa925050503d80600081146112d4576040519150601f19603f3d011682016040523d82523d6000602084013e6112d9565b606091505b50909250905060008215610ca757818060200190516112fb9190810190613ca2565b90508086858151811061130a57fe5b6020908102919091010152505050600101611197565b60408051828152602080840282010190915260609082801561135657816020015b60608152602001906001900390816113415790505b50905060005b80831461145f57600060603086868581811061137457fe5b6020028201905080357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1368490030181126113ae57600080fd5b9091016020810191503567ffffffffffffffff8111156113cd57600080fd5b368190038213156113dd57600080fd5b6040516113eb929190613e33565b600060405180830381855afa9150503d8060008114611426576040519150601f19603f3d011682016040523d82523d6000602084013e61142b565b606091505b50915091508161143d57805160208201fd5b8084848151811061144a57fe5b6020908102919091010152505060010161135c565b5092915050565b60606114728385611f19565b815160408051828152602080840282010190915281801561149d578160200160208202803883390190505b50915060006114aa611fa4565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146114ea576114e5866127dc565b6114ed565b60005b905060006114f9611fa4565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161461153957611534866127dc565b61153c565b60005b905060005b83811015610e03576001611553611fa4565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614156115dd5786516115bc9085907f95b68fe700000000000000000000000000000000000000000000000000000000908a9086908110610ffb57fe5b8784815181106115c857fe5b602002602001018193508281525050506116fa565b6115e5611fa4565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16141561164e5786516115bc9084907fcd7724c300000000000000000000000000000000000000000000000000000000908a9086908110610ffb57fe5b86516000906116879086907f95b68fe700000000000000000000000000000000000000000000000000000000908b9087908110610ffb57fe5b9250905080156116dd576116bc847fcd7724c30000000000000000000000000000000000000000000000000000000083612874565b8885815181106116c857fe5b602002602001018194508281525050506116f8565b60008784815181106116eb57fe5b6020026020010181815250505b505b806117055750610e03565b50600101611541565b606061173e858585857f9f76ad35000000000000000000000000000000000000000000000000000000008b6129bd565b9695505050505050565b60606000825190508060405190808252806020026020018201604052801561177a578160200160208202803883390190505b509150600061178a878787611b37565b905073ffffffffffffffffffffffffffffffffffffffff81166117af5750610e9d9050565b60005b8281101561194157600060608373ffffffffffffffffffffffffffffffffffffffff1662061a80600073ffffffffffffffffffffffffffffffffffffffff1663343fbcdd905060e01b8b8b8b888151811061180957fe5b602002602001015160405160240161182393929190613f58565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516118ac9190613e43565b6000604051808303818686fa925050503d80600081146118e8576040519150601f19603f3d011682016040523d82523d6000602084013e6118ed565b606091505b50909250905060008215611916578180602001905161190f9190810190613ca2565b905061191e565b505050611941565b8087858151811061192b57fe5b60209081029190910101525050506001016117b2565b505050949350505050565b60606000825190508060405190808252806020026020018201604052801561197e578160200160208202803883390190505b50915060005b81811015611b2f5760006060611998612b83565b73ffffffffffffffffffffffffffffffffffffffff16620249f0600073ffffffffffffffffffffffffffffffffffffffff1663d06ca61f905060e01b8886815181106119e057fe5b60200260200101518a6040516024016119fa9291906142ee565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611a839190613e43565b6000604051808303818686fa925050503d8060008114611abf576040519150601f19603f3d011682016040523d82523d6000602084013e611ac4565b606091505b50909250905060008215611b045781806020019051611ae69190810190613ae1565b600189510381518110611af557fe5b60200260200101519050611b0c565b505050611b2f565b80868581518110611b1957fe5b6020908102919091010152505050600101611984565b505092915050565b6040516000906060907f153f59970000000000000000000000000000000000000000000000000000000090611b729086908690602401613e80565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608673ffffffffffffffffffffffffffffffffffffffff1683604051611bfa9190613e43565b600060405180830381855afa9150503d8060008114611c35576040519150601f19603f3d011682016040523d82523d6000602084013e611c3a565b606091505b5091509150818015611c4d575080516020145b15611c6757611c5d81600c612b9b565b9350505050611c6b565b5050505b9392505050565b606061067f858585857f4cb8e2530000000000000000000000000000000000000000000000000000000060006129bd565b606060008251905080604051908082528060200260200182016040528015611cd5578160200160208202803883390190505b50915060005b81811015611b2f5760006060611cef612b83565b73ffffffffffffffffffffffffffffffffffffffff16620249f0600073ffffffffffffffffffffffffffffffffffffffff16631f00ca74905060e01b888681518110611d3757fe5b60200260200101518a604051602401611d519291906142ee565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611dda9190613e43565b6000604051808303818686fa925050503d8060008114611e16576040519150601f19603f3d011682016040523d82523d6000602084013e611e1b565b606091505b50909250905060008215611b045781806020019051611e3d9190810190613ae1565b600081518110611e4957fe5b6020026020010151905080868581518110611e6057fe5b6020908102919091010152505050600101611cdb565b6060611e83848484610842565b905060005b8451811015610af757818181518110611e9d57fe5b6020026020010151600014611f1157611ef8828281518110611ebb57fe5b6020026020010151868381518110611ecf57fe5b602002602001015160a00151878481518110611ee757fe5b602002602001015160800151612be0565b828281518110611f0457fe5b6020026020010181815250505b600101611e88565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7f9061413f565b60405180910390fd5b5050565b73794e6e91555438afc3ccf1c5076a74f42133d08d90565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290565b6000806000611fc9612c22565b9150915060608173ffffffffffffffffffffffffffffffffffffffff16633d3dc52c611ff3611fa4565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161461202b578861202d565b875b6040518263ffffffff1660e01b81526004016120499190613e5f565b60006040518083038186803b15801561206157600080fd5b505afa158015612075573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526120bb9190810190613ae1565b604080516000808252602082019092529192505b8251811015612374576040517f106e9a4b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063106e9a4b9061213e907331e085afd48a1d6e51cc193153d625e8f0514c7f90600401613e5f565b60206040518083038186803b15801561215657600080fd5b505afa15801561216a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061218e9190810190613ca2565b83828151811061219a57fe5b6020026020010151148061227557506040517f106e9a4b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063106e9a4b9061220f907310908c875d865c66f271f5d3949848971c9595c990600401613e5f565b60206040518083038186803b15801561222757600080fd5b505afa15801561223b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061225f9190810190613ca2565b83828151811061226b57fe5b6020026020010151145b8061234757506040517f106e9a4b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063106e9a4b906122e190731e158c0e93c30d24e918ef83d1e0be23595c3c0f90600401613e5f565b60206040518083038186803b1580156122f957600080fd5b505afa15801561230d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506123319190810190613ca2565b83828151811061233d57fe5b6020026020010151145b1561236c576123698284838151811061235c57fe5b6020026020010151612d56565b91505b6001016120cf565b50606061237f611fa4565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161415612496578473ffffffffffffffffffffffffffffffffffffffff166381efcbdd8960028560006040519080825280602002602001820160405280156123fd578160200160208202803883390190505b506040518563ffffffff1660e01b815260040161241d9493929190613fdc565b60006040518083038186803b15801561243557600080fd5b505afa158015612449573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261248f9190810190613cba565b9050612576565b8473ffffffffffffffffffffffffffffffffffffffff166381efcbdd8a60028560006040519080825280602002602001820160405280156124e1578160200160208202803883390190505b506040518563ffffffff1660e01b81526004016125019493929190613fdc565b60006040518083038186803b15801561251957600080fd5b505afa15801561252d573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526125739190810190613cba565b90505b60006060612582612dec565b73ffffffffffffffffffffffffffffffffffffffff166216e3607f418436bc000000000000000000000000000000000000000000000000000000006125c5611fa4565b73ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff16146125fd578d612613565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b61261b611fa4565b73ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff1614612653578d612669565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b8d600089604051602401612681959493929190613f89565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161270a9190613e43565b6000604051808303818686fa925050503d8060008114612746576040519150601f19603f3d011682016040523d82523d6000602084013e61274b565b606091505b50909250905060008215612774578180602001905161276d9190810190613ca2565b9050612785565b600098505050505050505050611c6b565b60006127908c612e04565b60ff16905060006127a08e612e04565b60ff169050670de0b6b3a764000081600a0a83600a0a8e860202816127c157fe5b04816127c957fe5b049e9d5050505050505050505050505050565b60006127e6612e0f565b73ffffffffffffffffffffffffffffffffffffffff166306f2bf62836040518263ffffffff1660e01b815260040161281e9190613e5f565b60206040518083038186803b15801561283657600080fd5b505afa15801561284a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061286e919081019061362b565b92915050565b60008073ffffffffffffffffffffffffffffffffffffffff8516612897576129b5565b60608573ffffffffffffffffffffffffffffffffffffffff16620249f086866040516024016128c691906142e5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161294f9190613e43565b6000604051808303818686fa925050503d806000811461298b576040519150601f19603f3d011682016040523d82523d6000602084013e612990565b606091505b50909250905081156129b357808060200190516129b09190810190613ca2565b92505b505b935093915050565b60606129c98688611f19565b84516129d45761173e565b60008060008751604051908082528060200260200182016040528015612a04578160200160208202803883390190505b509350612a28898b8a600081518110612a1957fe5b60200260200101518989612e27565b925082612a38575061173e915050565b612a458a8a858989612e27565b915081612a55575061173e915050565b60005b8851811015612b755760005b8860200151811015612b3757612a8e8a8381518110612a7f57fe5b60200260200101518587612be0565b9450612aa589600001516127100161271087612be0565b94506000612ab68d8d888c8c612e27565b905080612ac35750612b37565b8094508a8381518110612ad257fe5b60200260200101518510612b2e5760008b8481518110612aee57fe5b60200260200101518c8581518110612b0257fe5b602002602001015187036127100281612b1757fe5b0490508a600001518111612b2c575050612b37565b505b50600101612a64565b50612b56898281518110612b4757fe5b60200260200101518486612be0565b858281518110612b6257fe5b6020908102919091010152600101612a58565b505050509695505050505050565b73f164fc0ec4e93095b804a4795bbe1e041497b92a90565b60008160140183511015612bc157612bc1612bbc60048551856014016130dc565b613181565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b6000610e9d83612c16612bfa82600163ffffffff61318916565b612c0a888763ffffffff6131a816565b9063ffffffff6131d916565b9063ffffffff6131f516565b600080612c2d612dec565b73ffffffffffffffffffffffffffffffffffffffff1663b78b842d6040518163ffffffff1660e01b815260040160206040518083038186803b158015612c7257600080fd5b505afa158015612c86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612caa919081019061362b565b73ffffffffffffffffffffffffffffffffffffffff1663c3a2a93a6040518163ffffffff1660e01b815260040160006040518083038186803b158015612cef57600080fd5b505afa158015612d03573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612d4991908101906138e1565b5091955093505050509091565b60608251600101604051908082528060200260200182016040528015612d86578160200160208202803883390190505b50905060005b8351811015612dc857838181518110612da157fe5b6020026020010151828281518110612db557fe5b6020908102919091010152600101612d8c565b508181600183510381518110612dda57fe5b60200260200101818152505092915050565b739aab3f75489902f3a48495025729a0af77d4b11e90565b600061286e8261321f565b73c0a47dfe034b400b47bdad5fecda2621de6c4d9590565b6040805160018082528183019092526000916060918291602080830190803883390190505090508581600081518110612e5c57fe5b60209081029190910101527fffffffff0000000000000000000000000000000000000000000000000000000085167f4cb8e253000000000000000000000000000000000000000000000000000000001415612f6c576040517f4cb8e2530000000000000000000000000000000000000000000000000000000090612ee8908a908a908590602401613f1f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529150613025565b6040517f9f76ad350000000000000000000000000000000000000000000000000000000090612fa59086908b908b908690602401613ea7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915291505b600060603073ffffffffffffffffffffffffffffffffffffffff168460405161304e9190613e43565b600060405180830381855afa9150503d8060008114613089576040519150601f19603f3d011682016040523d82523d6000602084013e61308e565b606091505b5091509150816130a557600094505050505061067f565b808060200190516130b99190810190613ae1565b6000815181106130c557fe5b602002602001015194505050505095945050505050565b6060632800659560e01b8484846040516024016130fb93929190614113565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b6000828211156131a2576131a2612bbc600285856132f0565b50900390565b6000826131b75750600061286e565b828202828482816131c457fe5b0414611c6b57611c6b612bbc600186866132f0565b600082820183811015611c6b57611c6b612bbc600086866132f0565b60008161320b5761320b612bbc600385856132f0565b600082848161321657fe5b04949350505050565b600060129050600060608373ffffffffffffffffffffffffffffffffffffffff166040518060400160405280600481526020017f313ce567000000000000000000000000000000000000000000000000000000008152506040516132839190613e43565b600060405180830381855afa9150503d80600081146132be576040519150601f19603f3d011682016040523d82523d6000602084013e6132c3565b606091505b50915091508180156132d6575080516020145b156132e9576132e681600061330f565b92505b5050919050565b606063e946c1bb60e01b8484846040516024016130fb939291906140f2565b6000611c6b83836000816020018351101561333757613337612bbc60058551856020016130dc565b50016020015190565b6040805160608101909152806000815260006020820181905260409091015290565b803561286e81614418565b805161286e81614418565b600082601f830112613388578081fd5b813561339b61339682614379565b614352565b8181529150602080830190840160005b838110156133d8576133c3876020843589010161344b565b835260209283019291909101906001016133ab565b5050505092915050565b600082601f8301126133f2578081fd5b813561340061339682614379565b81815291506020808301908481018184028601820187101561342157600080fd5b60005b8481101561344057813584529282019290820190600101613424565b505050505092915050565b600082601f83011261345b578081fd5b813561346961339682614399565b915080825283602082850101111561348057600080fd5b8060208401602084013760009082016020015292915050565b8035600f81900b811461286e57600080fd5b6000604082840312156134bc578081fd5b6134c66040614352565b9050813581526020820135602082015292915050565b60006101c08083850312156134ef578182fd5b6134f881614352565b9150506135058383613362565b81526135148360208401613362565b60208201526135268360408401613362565b60408201526135388360608401613362565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff8082111561359a57600080fd5b6135a68683870161344b565b838501526101609250828501359150808211156135c257600080fd5b6135ce8683870161344b565b838501526101809250828501359150808211156135ea57600080fd5b6135f68683870161344b565b838501526101a092508285013591508082111561361257600080fd5b5061361f8582860161344b565b82840152505092915050565b60006020828403121561363c578081fd5b8151611c6b81614418565b60008060006060848603121561365b578182fd5b833561366681614418565b9250602084013561367681614418565b9150604084013561368681614418565b809150509250925092565b600080600080600060a086880312156136a8578283fd5b85356136b381614418565b945060208601356136c381614418565b935060408601356136d381614418565b925060608601356136e381614418565b9150608086013567ffffffffffffffff8111156136fe578182fd5b61370a888289016133e2565b9150509295509295909350565b6000806000806080858703121561372c578182fd5b843561373781614418565b9350602085013561374781614418565b9250604085013561375781614418565b9150606085013567ffffffffffffffff811115613772578182fd5b61377e878288016133e2565b91505092959194509250565b600080600080600060c086880312156137a1578283fd5b85356137ac81614418565b945060208601356137bc81614418565b935060408601356137cc81614418565b9250606086013567ffffffffffffffff8111156137e7578182fd5b6137f3888289016133e2565b92505061380387608088016134ab565b90509295509295909350565b600080600060608486031215613823578081fd5b833561382e81614418565b9250602084013561383e81614418565b9150604084013567ffffffffffffffff811115613859578182fd5b613865868287016133e2565b9150509250925092565b60008060008060a08587031215613884578182fd5b843561388f81614418565b9350602085013561389f81614418565b9250604085013567ffffffffffffffff8111156138ba578283fd5b6138c6878288016133e2565b9250506138d686606087016134ab565b905092959194509250565b60008060008060008060c087890312156138f9578384fd5b865161390481614418565b8096505060208088015161391781614418565b604089015190965061392881614418565b606089015190955061393981614418565b608089015190945061394a81614418565b60a089015190935067ffffffffffffffff811115613966578283fd5b8089018a601f820112613977578384fd5b8051915061398761339683614379565b82815283810190828501858502840186018e10156139a3578687fd5b8693505b848410156139cd576139b98e8261336d565b8352600193909301929185019185016139a7565b5080955050505050509295509295509295565b600080600080608085870312156139f5578182fd5b8435613a0081614418565b9350613a0f8660208701613499565b92506137578660408701613499565b60008060408385031215613a30578182fd5b823567ffffffffffffffff80821115613a47578384fd5b81850186601f820112613a58578485fd5b80359250613a6861339684614379565b80848252602080830192508084018a828389028701011115613a88578889fd5b8894505b86851015613ab3578035613a9f81614418565b845260019490940193928101928101613a8c565b509096508701359350505080821115613aca578283fd5b50613ad7858286016133e2565b9150509250929050565b60006020808385031215613af3578182fd5b825167ffffffffffffffff811115613b09578283fd5b80840185601f820112613b1a578384fd5b80519150613b2a61339683614379565b8281528381019082850185850284018601891015613b46578687fd5b8693505b84841015613b68578051835260019390930192918501918501613b4a565b50979650505050505050565b60008060208385031215613b86578182fd5b823567ffffffffffffffff80821115613b9d578384fd5b81850186601f820112613bae578485fd5b8035925081831115613bbe578485fd5b8660208085028301011115613bd1578485fd5b60200196919550909350505050565b600080600060608486031215613bf4578081fd5b833567ffffffffffffffff80821115613c0b578283fd5b81860187601f820112613c1c578384fd5b80359250613c2c61339684614379565b83815260208082019190838101875b87811015613c6457613c528d8484358901016134dc565b85529382019390820190600101613c3b565b50919850890135945050505080821115613c7c578283fd5b50613c8986828701613378565b925050613c998560408601613362565b90509250925092565b600060208284031215613cb3578081fd5b5051919050565b600060208284031215613ccb578081fd5b815167ffffffffffffffff811115613ce1578182fd5b80830184601f820112613cf2578283fd5b80519150613d0261339683614399565b828152856020848401011115613d16578384fd5b61067f8360208301602085016143db565b600080600083850360a0811215613d3c578182fd5b6060811215613d49578182fd5b50613d546060614352565b845160078110613d62578283fd5b815260208581015190820152604080860151908201526060850151608086015191945092508015158114613686578182fd5b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208401935060208301825b82811015613ddf578151865260209586019590910190600101613dc1565b5093949350505050565b60008151808452613e018160208601602086016143db565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000828483379101908152919050565b60008251613e558184602087016143db565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401528085166040840152506080606083015261173e6080830184613dae565b73ffffffffffffffffffffffffffffffffffffffff9485168152928416602084015292166040820152606081019190915260800190565b600073ffffffffffffffffffffffffffffffffffffffff80861683528085166020840152506060604083015261067f6060830184613dae565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015260ff8416606083015260a06080830152613fd160a0830184613de9565b979650505050505050565b60006080820173ffffffffffffffffffffffffffffffffffffffff871683526140048661440b565b60208381018790526080604085015285519182905285019060a0840190835b81811015614041578351835260209384019390920191600101614023565b505083810360608501526140558186613dae565b98975050505050505050565b6000602080830181845280855180835260408601915060408482028701019250838701855b828110156140d2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526140c0858351613de9565b94509285019290850190600101614086565b5092979650505050505050565b600060208252611c6b6020830184613dae565b606081016140ff8561440b565b938152602081019290925260409091015290565b60608101600885106140ff57fe5b600f93840b81529190920b6020820152604081019190915260600190565b60208082526025908201527f455243323042726964676553616d706c65722f494e56414c49445f544f4b454e60408201527f5f50414952000000000000000000000000000000000000000000000000000000606082015260800190565b6000604082526141b0604083018551613d94565b60208401516141c26060840182613d94565b5060408401516141d56080840182613d94565b5060608401516141e860a0840182613d94565b50608084015160c083015260a084015160e083015260c0840151610100818185015260e086015191506101208281860152818701519250610140915082828601528087015192505061016082818601528187015192506101c091506101808281870152614259610200870185613de9565b8289015194507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc092506101a08388830301818901526142988287613de9565b838b015196508489820301868a01526142b18188613de9565b955050808a0151955050505080858303016101e0860152506142d38183613de9565b8481036020860152613fd18187613de9565b90815260200190565b60006040820184835260406020840152808451808352606085019150602086019250835b8181101561434657835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101614312565b50909695505050505050565b60405181810167ffffffffffffffff8111828210171561437157600080fd5b604052919050565b600067ffffffffffffffff82111561438f578081fd5b5060209081020190565b600067ffffffffffffffff8211156143af578081fd5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b838110156143f65781810151838201526020016143de565b83811115614405576000848401525b50505050565b6004811061441557fe5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461441557600080fdfea365627a7a723158200ca872017075258b0971b4ddeb56cd71e136b20e6f3441f5aebf89a73cd1ca6a6c6578706572696d656e74616cf564736f6c63430005110040" } } }, diff --git a/packages/contract-artifacts/artifacts/IERC20BridgeSampler.json b/packages/contract-artifacts/artifacts/IERC20BridgeSampler.json index 468754b795..f4a0445322 100644 --- a/packages/contract-artifacts/artifacts/IERC20BridgeSampler.json +++ b/packages/contract-artifacts/artifacts/IERC20BridgeSampler.json @@ -49,7 +49,8 @@ "name": "orders", "type": "tuple[]" }, - { "internalType": "bytes[]", "name": "orderSignatures", "type": "bytes[]" } + { "internalType": "bytes[]", "name": "orderSignatures", "type": "bytes[]" }, + { "internalType": "address", "name": "devUtilsAddress", "type": "address" } ], "name": "getOrderFillableMakerAssetAmounts", "outputs": [ @@ -83,7 +84,8 @@ "name": "orders", "type": "tuple[]" }, - { "internalType": "bytes[]", "name": "orderSignatures", "type": "bytes[]" } + { "internalType": "bytes[]", "name": "orderSignatures", "type": "bytes[]" }, + { "internalType": "address", "name": "devUtilsAddress", "type": "address" } ], "name": "getOrderFillableTakerAssetAmounts", "outputs": [ @@ -300,17 +302,19 @@ }, "return": "providerAddress Address of the liquidity provider." }, - "getOrderFillableMakerAssetAmounts((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[])": { + "getOrderFillableMakerAssetAmounts((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[],address)": { "details": "Queries the fillable maker asset amounts of native orders.", "params": { + "devUtilsAddress": "Address to the DevUtils contract.", "orderSignatures": "Signatures for each respective order in `orders`.", "orders": "Native orders to query." }, "return": "orderFillableMakerAssetAmounts How much maker asset can be filled by each order in `orders`." }, - "getOrderFillableTakerAssetAmounts((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[])": { + "getOrderFillableTakerAssetAmounts((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[],address)": { "details": "Queries the fillable taker asset amounts of native orders.", "params": { + "devUtilsAddress": "Address to the DevUtils contract.", "orderSignatures": "Signatures for each respective order in `orders`.", "orders": "Native orders to query." }, diff --git a/packages/contract-artifacts/src/index.ts b/packages/contract-artifacts/src/index.ts index e51c6ff302..b2f7f93d58 100644 --- a/packages/contract-artifacts/src/index.ts +++ b/packages/contract-artifacts/src/index.ts @@ -7,6 +7,8 @@ import * as DummyERC20Token from '../artifacts/DummyERC20Token.json'; import * as DummyERC721Token from '../artifacts/DummyERC721Token.json'; import * as ERC1155Mintable from '../artifacts/ERC1155Mintable.json'; import * as ERC1155Proxy from '../artifacts/ERC1155Proxy.json'; +import * as ERC20BridgeProxy from '../artifacts/ERC20BridgeProxy.json'; +import * as ERC20BridgeSampler from '../artifacts/ERC20BridgeSampler.json'; import * as ERC20Proxy from '../artifacts/ERC20Proxy.json'; import * as ERC20Token from '../artifacts/ERC20Token.json'; import * as ERC721Proxy from '../artifacts/ERC721Proxy.json'; @@ -15,6 +17,7 @@ import * as Exchange from '../artifacts/Exchange.json'; import * as Forwarder from '../artifacts/Forwarder.json'; import * as GodsUnchainedValidator from '../artifacts/GodsUnchainedValidator.json'; import * as IAssetProxy from '../artifacts/IAssetProxy.json'; +import * as ITransformERC20 from '../artifacts/ITransformERC20.json'; import * as IValidator from '../artifacts/IValidator.json'; import * as IWallet from '../artifacts/IWallet.json'; import * as MultiAssetProxy from '../artifacts/MultiAssetProxy.json'; @@ -23,10 +26,7 @@ import * as StakingProxy from '../artifacts/StakingProxy.json'; import * as StaticCallProxy from '../artifacts/StaticCallProxy.json'; import * as WETH9 from '../artifacts/WETH9.json'; import * as ZRXToken from '../artifacts/ZRXToken.json'; -import * as ERC20BridgeProxy from '../artifacts/ERC20BridgeProxy.json'; import * as ZrxVault from '../artifacts/ZrxVault.json'; -import * as IERC20BridgeSampler from '../artifacts/IERC20BridgeSampler.json'; -import * as ITransformERC20 from '../artifacts/ITransformERC20.json'; export { AssetProxyOwner, @@ -56,6 +56,6 @@ export { Staking, StakingProxy, ZrxVault, - IERC20BridgeSampler, + ERC20BridgeSampler, ITransformERC20, }; diff --git a/packages/contract-artifacts/tsconfig.json b/packages/contract-artifacts/tsconfig.json index 7f6106b0a3..944234cfd0 100644 --- a/packages/contract-artifacts/tsconfig.json +++ b/packages/contract-artifacts/tsconfig.json @@ -36,7 +36,7 @@ "./artifacts/StakingProxy.json", "./artifacts/ZrxVault.json", "./artifacts/ERC20BridgeProxy.json", - "./artifacts/IERC20BridgeSampler.json", + "./artifacts/ERC20BridgeSampler.json", "./artifacts/ITransformERC20.json" ] } diff --git a/packages/contract-wrappers/src/generated-wrappers/erc20_bridge_sampler.ts b/packages/contract-wrappers/src/generated-wrappers/erc20_bridge_sampler.ts index 2bb3f65184..f382931e80 100644 --- a/packages/contract-wrappers/src/generated-wrappers/erc20_bridge_sampler.ts +++ b/packages/contract-wrappers/src/generated-wrappers/erc20_bridge_sampler.ts @@ -49,7 +49,6 @@ export class ERC20BridgeSamplerContract extends BaseContract { supportedProvider: SupportedProvider, txDefaults: Partial, logDecodeDependencies: { [contractName: string]: ContractArtifact | SimpleContractArtifact }, - devUtilsAddress: string, ): Promise { assert.doesConformToSchema('txDefaults', txDefaults, schemas.txDataSchema, [ schemas.addressSchema, @@ -74,7 +73,6 @@ export class ERC20BridgeSamplerContract extends BaseContract { provider, txDefaults, logDecodeDependenciesAbiOnly, - devUtilsAddress, ); } @@ -84,7 +82,6 @@ export class ERC20BridgeSamplerContract extends BaseContract { supportedProvider: SupportedProvider, txDefaults: Partial, logDecodeDependencies: { [contractName: string]: ContractArtifact | SimpleContractArtifact }, - devUtilsAddress: string, ): Promise { assert.doesConformToSchema('txDefaults', txDefaults, schemas.txDataSchema, [ schemas.addressSchema, @@ -115,7 +112,6 @@ export class ERC20BridgeSamplerContract extends BaseContract { provider, txDefaults, logDecodeDependenciesAbiOnly, - devUtilsAddress, ); } @@ -125,7 +121,6 @@ export class ERC20BridgeSamplerContract extends BaseContract { supportedProvider: SupportedProvider, txDefaults: Partial, logDecodeDependencies: { [contractName: string]: ContractAbi }, - devUtilsAddress: string, ): Promise { assert.isHexString('bytecode', bytecode); assert.doesConformToSchema('txDefaults', txDefaults, schemas.txDataSchema, [ @@ -135,14 +130,10 @@ export class ERC20BridgeSamplerContract extends BaseContract { ]); const provider = providerUtils.standardizeOrThrow(supportedProvider); const constructorAbi = BaseContract._lookupConstructorAbi(abi); - [devUtilsAddress] = BaseContract._formatABIDataItemList( - constructorAbi.inputs, - [devUtilsAddress], - BaseContract._bigNumberToString, - ); + [] = BaseContract._formatABIDataItemList(constructorAbi.inputs, [], BaseContract._bigNumberToString); const iface = new ethers.utils.Interface(abi); const deployInfo = iface.deployFunction; - const txData = deployInfo.encode(bytecode, [devUtilsAddress]); + const txData = deployInfo.encode(bytecode, []); const web3Wrapper = new Web3Wrapper(provider); const txDataWithDefaults = await BaseContract._applyDefaultsToContractTxDataAsync( { @@ -161,7 +152,7 @@ export class ERC20BridgeSamplerContract extends BaseContract { txDefaults, logDecodeDependencies, ); - contractInstance.constructorArgs = [devUtilsAddress]; + contractInstance.constructorArgs = []; return contractInstance; } @@ -170,18 +161,6 @@ export class ERC20BridgeSamplerContract extends BaseContract { */ public static ABI(): ContractAbi { const abi = [ - { - inputs: [ - { - name: 'devUtilsAddress', - type: 'address', - }, - ], - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'constructor', - }, { constant: true, inputs: [ @@ -297,6 +276,10 @@ export class ERC20BridgeSamplerContract extends BaseContract { name: 'orderSignatures', type: 'bytes[]', }, + { + name: 'devUtilsAddress', + type: 'address', + }, ], name: 'getOrderFillableMakerAssetAmounts', outputs: [ @@ -378,6 +361,10 @@ export class ERC20BridgeSamplerContract extends BaseContract { name: 'orderSignatures', type: 'bytes[]', }, + { + name: 'devUtilsAddress', + type: 'address', + }, ], name: 'getOrderFillableTakerAssetAmounts', outputs: [ @@ -965,6 +952,7 @@ export class ERC20BridgeSamplerContract extends BaseContract { * Effectively ignores orders that have empty signatures or * @param orders Native orders to query. * @param orderSignatures Signatures for each respective order in `orders`. + * @param devUtilsAddress Address to the DevUtils contract. * @returns orderFillableMakerAssetAmounts How much maker asset can be filled by each order in `orders`. */ public getOrderFillableMakerAssetAmounts( @@ -985,12 +973,14 @@ export class ERC20BridgeSamplerContract extends BaseContract { takerFeeAssetData: string; }>, orderSignatures: string[], + devUtilsAddress: string, ): ContractFunctionObj { const self = (this as any) as ERC20BridgeSamplerContract; assert.isArray('orders', orders); assert.isArray('orderSignatures', orderSignatures); + assert.isString('devUtilsAddress', devUtilsAddress); const functionSignature = - 'getOrderFillableMakerAssetAmounts((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[])'; + 'getOrderFillableMakerAssetAmounts((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[],address)'; return { async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { @@ -1004,7 +994,11 @@ export class ERC20BridgeSamplerContract extends BaseContract { return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { - return self._strictEncodeArguments(functionSignature, [orders, orderSignatures]); + return self._strictEncodeArguments(functionSignature, [ + orders, + orderSignatures, + devUtilsAddress.toLowerCase(), + ]); }, }; } @@ -1014,6 +1008,7 @@ export class ERC20BridgeSamplerContract extends BaseContract { * maker/taker asset amounts (returning 0). * @param orders Native orders to query. * @param orderSignatures Signatures for each respective order in `orders`. + * @param devUtilsAddress Address to the DevUtils contract. * @returns orderFillableTakerAssetAmounts How much taker asset can be filled by each order in `orders`. */ public getOrderFillableTakerAssetAmounts( @@ -1034,12 +1029,14 @@ export class ERC20BridgeSamplerContract extends BaseContract { takerFeeAssetData: string; }>, orderSignatures: string[], + devUtilsAddress: string, ): ContractFunctionObj { const self = (this as any) as ERC20BridgeSamplerContract; assert.isArray('orders', orders); assert.isArray('orderSignatures', orderSignatures); + assert.isString('devUtilsAddress', devUtilsAddress); const functionSignature = - 'getOrderFillableTakerAssetAmounts((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[])'; + 'getOrderFillableTakerAssetAmounts((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[],address)'; return { async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { @@ -1053,7 +1050,11 @@ export class ERC20BridgeSamplerContract extends BaseContract { return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { - return self._strictEncodeArguments(functionSignature, [orders, orderSignatures]); + return self._strictEncodeArguments(functionSignature, [ + orders, + orderSignatures, + devUtilsAddress.toLowerCase(), + ]); }, }; } diff --git a/packages/contract-wrappers/src/generated-wrappers/i_erc20_bridge_sampler.ts b/packages/contract-wrappers/src/generated-wrappers/i_erc20_bridge_sampler.ts index b696c1381f..ebb3db4029 100644 --- a/packages/contract-wrappers/src/generated-wrappers/i_erc20_bridge_sampler.ts +++ b/packages/contract-wrappers/src/generated-wrappers/i_erc20_bridge_sampler.ts @@ -276,6 +276,10 @@ export class IERC20BridgeSamplerContract extends BaseContract { name: 'orderSignatures', type: 'bytes[]', }, + { + name: 'devUtilsAddress', + type: 'address', + }, ], name: 'getOrderFillableMakerAssetAmounts', outputs: [ @@ -357,6 +361,10 @@ export class IERC20BridgeSamplerContract extends BaseContract { name: 'orderSignatures', type: 'bytes[]', }, + { + name: 'devUtilsAddress', + type: 'address', + }, ], name: 'getOrderFillableTakerAssetAmounts', outputs: [ @@ -912,6 +920,7 @@ export class IERC20BridgeSamplerContract extends BaseContract { * Queries the fillable maker asset amounts of native orders. * @param orders Native orders to query. * @param orderSignatures Signatures for each respective order in `orders`. + * @param devUtilsAddress Address to the DevUtils contract. * @returns orderFillableMakerAssetAmounts How much maker asset can be filled by each order in `orders`. */ public getOrderFillableMakerAssetAmounts( @@ -932,12 +941,14 @@ export class IERC20BridgeSamplerContract extends BaseContract { takerFeeAssetData: string; }>, orderSignatures: string[], + devUtilsAddress: string, ): ContractFunctionObj { const self = (this as any) as IERC20BridgeSamplerContract; assert.isArray('orders', orders); assert.isArray('orderSignatures', orderSignatures); + assert.isString('devUtilsAddress', devUtilsAddress); const functionSignature = - 'getOrderFillableMakerAssetAmounts((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[])'; + 'getOrderFillableMakerAssetAmounts((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[],address)'; return { async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { @@ -951,7 +962,11 @@ export class IERC20BridgeSamplerContract extends BaseContract { return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { - return self._strictEncodeArguments(functionSignature, [orders, orderSignatures]); + return self._strictEncodeArguments(functionSignature, [ + orders, + orderSignatures, + devUtilsAddress.toLowerCase(), + ]); }, }; } @@ -959,6 +974,7 @@ export class IERC20BridgeSamplerContract extends BaseContract { * Queries the fillable taker asset amounts of native orders. * @param orders Native orders to query. * @param orderSignatures Signatures for each respective order in `orders`. + * @param devUtilsAddress Address to the DevUtils contract. * @returns orderFillableTakerAssetAmounts How much taker asset can be filled by each order in `orders`. */ public getOrderFillableTakerAssetAmounts( @@ -979,12 +995,14 @@ export class IERC20BridgeSamplerContract extends BaseContract { takerFeeAssetData: string; }>, orderSignatures: string[], + devUtilsAddress: string, ): ContractFunctionObj { const self = (this as any) as IERC20BridgeSamplerContract; assert.isArray('orders', orders); assert.isArray('orderSignatures', orderSignatures); + assert.isString('devUtilsAddress', devUtilsAddress); const functionSignature = - 'getOrderFillableTakerAssetAmounts((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[])'; + 'getOrderFillableTakerAssetAmounts((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[],address)'; return { async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { @@ -998,7 +1016,11 @@ export class IERC20BridgeSamplerContract extends BaseContract { return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { - return self._strictEncodeArguments(functionSignature, [orders, orderSignatures]); + return self._strictEncodeArguments(functionSignature, [ + orders, + orderSignatures, + devUtilsAddress.toLowerCase(), + ]); }, }; } diff --git a/packages/contracts-gen/package.json b/packages/contracts-gen/package.json index ec64089c92..2dc3ee97ab 100644 --- a/packages/contracts-gen/package.json +++ b/packages/contracts-gen/package.json @@ -28,7 +28,7 @@ "homepage": "https://github.com/0xProject/0x-monorepo/packages/contracts-gen/README.md", "dependencies": { "@0x/sol-compiler": "^4.1.0", - "@0x/sol-resolver": "^3.1.0", + "@0x/sol-resolver": "^3.0.4", "@0x/types": "^3.1.3", "@0x/typescript-typings": "^5.1.0", "@0x/utils": "^5.5.0", diff --git a/packages/migrations/src/migration.ts b/packages/migrations/src/migration.ts index 8c8cc26e2c..51eb641be0 100644 --- a/packages/migrations/src/migration.ts +++ b/packages/migrations/src/migration.ts @@ -300,7 +300,6 @@ export async function runMigrationsAsync( provider, txDefaults, allArtifacts, - devUtils.address, ); // Exchange Proxy ////////////////////////////////////////////////////////// diff --git a/packages/order-utils/package.json b/packages/order-utils/package.json index fe4784ed27..e15cc8a820 100644 --- a/packages/order-utils/package.json +++ b/packages/order-utils/package.json @@ -1,6 +1,6 @@ { "name": "@0x/order-utils", - "version": "10.3.0", + "version": "10.2.5", "engines": { "node": ">=6.12" }, diff --git a/packages/sol-compiler/package.json b/packages/sol-compiler/package.json index 53866e9dd7..2a5233a199 100644 --- a/packages/sol-compiler/package.json +++ b/packages/sol-compiler/package.json @@ -76,7 +76,7 @@ "dependencies": { "@0x/assert": "^3.0.8", "@0x/json-schemas": "^5.0.8", - "@0x/sol-resolver": "^3.1.0", + "@0x/sol-resolver": "^3.0.4", "@0x/types": "^3.1.3", "@0x/typescript-typings": "^5.1.0", "@0x/utils": "^5.5.0", diff --git a/packages/sol-coverage/package.json b/packages/sol-coverage/package.json index 7107e98211..3f9dfb4844 100644 --- a/packages/sol-coverage/package.json +++ b/packages/sol-coverage/package.json @@ -33,7 +33,7 @@ }, "homepage": "https://github.com/0xProject/0x-monorepo/packages/sol-coverage/README.md", "dependencies": { - "@0x/sol-tracing-utils": "^7.1.0", + "@0x/sol-tracing-utils": "^7.0.9", "@0x/subproviders": "^6.1.0", "@0x/typescript-typings": "^5.1.0", "@types/minimatch": "^3.0.3", diff --git a/packages/sol-profiler/package.json b/packages/sol-profiler/package.json index fc60ab1b91..d35ed2a8cb 100644 --- a/packages/sol-profiler/package.json +++ b/packages/sol-profiler/package.json @@ -1,6 +1,6 @@ { "name": "@0x/sol-profiler", - "version": "4.1.0", + "version": "4.0.9", "engines": { "node": ">=6.12" }, @@ -33,7 +33,7 @@ }, "homepage": "https://github.com/0xProject/0x-monorepo/packages/sol-profiler/README.md", "dependencies": { - "@0x/sol-tracing-utils": "^7.1.0", + "@0x/sol-tracing-utils": "^7.0.9", "@0x/subproviders": "^6.1.0", "@0x/typescript-typings": "^5.1.0", "@0x/utils": "^5.5.0", diff --git a/packages/sol-resolver/package.json b/packages/sol-resolver/package.json index 624cfc9fff..0877dc5ad6 100644 --- a/packages/sol-resolver/package.json +++ b/packages/sol-resolver/package.json @@ -1,6 +1,6 @@ { "name": "@0x/sol-resolver", - "version": "3.1.0", + "version": "3.0.4", "engines": { "node": ">=6.12" }, diff --git a/packages/sol-trace/package.json b/packages/sol-trace/package.json index 759a4ab18f..63060f09e2 100644 --- a/packages/sol-trace/package.json +++ b/packages/sol-trace/package.json @@ -33,7 +33,7 @@ }, "homepage": "https://github.com/0xProject/0x-monorepo/packages/sol-trace/README.md", "dependencies": { - "@0x/sol-tracing-utils": "^7.1.0", + "@0x/sol-tracing-utils": "^7.0.9", "@0x/subproviders": "^6.1.0", "@0x/typescript-typings": "^5.1.0", "chalk": "^2.3.0", diff --git a/packages/sol-tracing-utils/package.json b/packages/sol-tracing-utils/package.json index ff52c6c169..f52b7046a0 100644 --- a/packages/sol-tracing-utils/package.json +++ b/packages/sol-tracing-utils/package.json @@ -1,6 +1,6 @@ { "name": "@0x/sol-tracing-utils", - "version": "7.1.0", + "version": "7.0.9", "engines": { "node": ">=6.12" }, @@ -40,7 +40,7 @@ "dependencies": { "@0x/dev-utils": "^3.2.2", "@0x/sol-compiler": "^4.1.0", - "@0x/sol-resolver": "^3.1.0", + "@0x/sol-resolver": "^3.0.4", "@0x/subproviders": "^6.1.0", "@0x/typescript-typings": "^5.1.0", "@0x/utils": "^5.5.0", diff --git a/packages/web3-wrapper/CHANGELOG.json b/packages/web3-wrapper/CHANGELOG.json index a7690922df..5a8da2e7c9 100644 --- a/packages/web3-wrapper/CHANGELOG.json +++ b/packages/web3-wrapper/CHANGELOG.json @@ -5,6 +5,10 @@ { "note": "Add geth eth_call support", "pr": 2620 + }, + { + "note": "Remove duplicate overrides data from the eth_call rpc call", + "pr": 2629 } ] }, diff --git a/packages/web3-wrapper/src/marshaller.ts b/packages/web3-wrapper/src/marshaller.ts index cc00b853d6..8e6db237a6 100644 --- a/packages/web3-wrapper/src/marshaller.ts +++ b/packages/web3-wrapper/src/marshaller.ts @@ -16,8 +16,6 @@ import { import ethUtil = require('ethereumjs-util'); import * as _ from 'lodash'; -import { utils } from './utils'; - import { BlockWithoutTransactionDataRPC, BlockWithTransactionDataRPC, @@ -28,6 +26,7 @@ import { TransactionRPC, TxDataRPC, } from './types'; +import { utils } from './utils'; /** * Utils to convert ethereum structures from user-space format to RPC format. (marshall/unmarshall) @@ -163,6 +162,7 @@ export const marshaller = { ...callData, }; delete callTxDataBase.from; + delete callTxDataBase.overrides; const callTxDataBaseRPC = marshaller._marshalCallTxDataBase(callTxDataBase); const callDataRPC = { ...callTxDataBaseRPC,