From 82b0f8525886d80688647282d5c84c1afab85963 Mon Sep 17 00:00:00 2001 From: Daniel Pyrathon Date: Mon, 2 Mar 2020 10:01:06 -0800 Subject: [PATCH] transformed the new artifacts --- .../artifacts/DummyLiquidityProvider.json | 246 ++-- .../DummyLiquidityProviderRegistry.json | 230 ++-- .../artifacts/ERC20BridgeSampler.json | 1121 +++++------------ .../artifacts/IERC20BridgeSampler.json | 1034 +++++---------- .../artifacts/ILiquidityProvider.json | 310 ++--- .../artifacts/ILiquidityProviderRegistry.json | 162 +-- 6 files changed, 1022 insertions(+), 2081 deletions(-) diff --git a/packages/contract-artifacts/artifacts/DummyLiquidityProvider.json b/packages/contract-artifacts/artifacts/DummyLiquidityProvider.json index e1ce68e1e9..78b682110d 100644 --- a/packages/contract-artifacts/artifacts/DummyLiquidityProvider.json +++ b/packages/contract-artifacts/artifacts/DummyLiquidityProvider.json @@ -1,158 +1,90 @@ { - "schemaVersion": "2.0.0", - "contractName": "DummyLiquidityProvider", - "compilerOutput": { - "abi": [ - { - "inputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "takerToken", - "type": "address" - }, - { - "internalType": "address", - "name": "makerToken", - "type": "address" - }, - { - "internalType": "uint256", - "name": "buyAmount", - "type": "uint256" - } - ], - "name": "getBuyQuote", - "outputs": [ - { - "internalType": "uint256", - "name": "takerTokenAmount", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "takerToken", - "type": "address" - }, - { - "internalType": "address", - "name": "makerToken", - "type": "address" - }, - { - "internalType": "uint256", - "name": "sellAmount", - "type": "uint256" - } - ], - "name": "getSellQuote", - "outputs": [ - { - "internalType": "uint256", - "name": "makerTokenAmount", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - } - ], - "devdoc": { - "methods": { - "getBuyQuote(address,address,uint256)": { - "details": "Quotes the amount of `takerToken` that would need to be sold in order to obtain `buyAmount` of `makerToken`.", - "params": { - "buyAmount": "Amount of `makerToken` to buy.", - "makerToken": "Address of the maker token (what to buy).", - "takerToken": "Address of the taker token (what to sell)." - }, - "return": "takerTokenAmount Amount of `takerToken` that would need to be sold." - }, - "getSellQuote(address,address,uint256)": { - "details": "Quotes the amount of `makerToken` that would be obtained by selling `sellAmount` of `takerToken`.", - "params": { - "makerToken": "Address of the maker token (what to buy).", - "sellAmount": "Amount of `takerToken` to sell.", - "takerToken": "Address of the taker token (what to sell)." - }, - "return": "makerTokenAmount Amount of `makerToken` that would be obtained." - } - } - }, - "evm": { - "bytecode": { - "linkReferences": {}, - "object": "0x608060405234801561001057600080fd5b50610159806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063343fbcdd1461003b57806345060eb014610064575b600080fd5b61004e6100493660046100a8565b610077565b60405161005b91906100e8565b60405180910390f35b61004e6100723660046100a8565b61009f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b60010192915050565b6000806000606084860312156100bc578283fd5b83356100c7816100f1565b925060208401356100d7816100f1565b929592945050506040919091013590565b90815260200190565b73ffffffffffffffffffffffffffffffffffffffff8116811461011357600080fd5b5056fea365627a7a723158202381fcfabad426957f70167a455c05b45e1a6babf4a85fb8887359d558fd68e46c6578706572696d656e74616cf564736f6c63430005100040", - "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x159 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x36 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x343FBCDD EQ PUSH2 0x3B JUMPI DUP1 PUSH4 0x45060EB0 EQ PUSH2 0x64 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x49 CALLDATASIZE PUSH1 0x4 PUSH2 0xA8 JUMP JUMPDEST PUSH2 0x77 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x5B SWAP2 SWAP1 PUSH2 0xE8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x4E PUSH2 0x72 CALLDATASIZE PUSH1 0x4 PUSH2 0xA8 JUMP JUMPDEST PUSH2 0x9F JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0xBC JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0xC7 DUP2 PUSH2 0xF1 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0xD7 DUP2 PUSH2 0xF1 JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x113 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG3 PUSH6 0x627A7A723158 KECCAK256 0x23 DUP2 0xFC STATICCALL 0xBA 0xD4 0x26 SWAP6 PUSH32 0x70167A455C05B45E1A6BABF4A85FB8887359D558FD68E46C6578706572696D65 PUSH15 0x74616CF564736F6C63430005100040 ", - "sourceMap": "61:1381:0:-;;;99:35;8:9:-1;5:2;;;30:1;27;20:12;5:2;99:35:0;61:1381;;;;;;" - }, - "deployedBytecode": { - "linkReferences": {}, - "object": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c8063343fbcdd1461003b57806345060eb014610064575b600080fd5b61004e6100493660046100a8565b610077565b60405161005b91906100e8565b60405180910390f35b61004e6100723660046100a8565b61009f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b60010192915050565b6000806000606084860312156100bc578283fd5b83356100c7816100f1565b925060208401356100d7816100f1565b929592945050506040919091013590565b90815260200190565b73ffffffffffffffffffffffffffffffffffffffff8116811461011357600080fd5b5056fea365627a7a723158202381fcfabad426957f70167a455c05b45e1a6babf4a85fb8887359d558fd68e46c6578706572696d656e74616cf564736f6c63430005100040", - "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x36 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x343FBCDD EQ PUSH2 0x3B JUMPI DUP1 PUSH4 0x45060EB0 EQ PUSH2 0x64 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x49 CALLDATASIZE PUSH1 0x4 PUSH2 0xA8 JUMP JUMPDEST PUSH2 0x77 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x5B SWAP2 SWAP1 PUSH2 0xE8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x4E PUSH2 0x72 CALLDATASIZE PUSH1 0x4 PUSH2 0xA8 JUMP JUMPDEST PUSH2 0x9F JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0xBC JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0xC7 DUP2 PUSH2 0xF1 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0xD7 DUP2 PUSH2 0xF1 JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x113 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG3 PUSH6 0x627A7A723158 KECCAK256 0x23 DUP2 0xFC STATICCALL 0xBA 0xD4 0x26 SWAP6 PUSH32 0x70167A455C05B45E1A6BABF4A85FB8887359D558FD68E46C6578706572696D65 PUSH15 0x74616CF564736F6C63430005100040 ", - "sourceMap": "61:1381:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61:1381:0;;;;;;;;;;;;;;;;;;;;;;;;539:243;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;1200:240;;;;;;;;;:::i;539:243::-;757:14;;;539:243;-1:-1:-1;;539:243:0:o;1200:240::-;1428:1;1416:13;;1200:240;-1:-1:-1;;1200:240:0:o;279:491:-1:-;;;;417:2;405:9;396:7;392:23;388:32;385:2;;;-1:-1;;423:12;385:2;85:6;72:20;97:33;124:5;97:33;;;475:63;-1:-1;575:2;614:22;;72:20;97:33;72:20;97:33;;;379:391;;583:63;;-1:-1;;;683:2;722:22;;;;209:20;;379:391;897:213;848:37;;;1015:2;1000:18;;986:124;1422:117;1288:42;1509:5;1277:54;1484:5;1481:35;1471:2;;1530:1;;1520:12;1471:2;1465:74;" - } - } - }, - "sources": { - "src/DummyLiquidityProvider.sol": { - "id": 0 - } - }, - "sourceCodes": { - "src/DummyLiquidityProvider.sol": "pragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\n\n\ncontract DummyLiquidityProvider\n{\n constructor()\n public\n {}\n\n /// @dev Quotes the amount of `makerToken` that would be obtained by\n /// selling `sellAmount` of `takerToken`.\n /// @param takerToken Address of the taker token (what to sell).\n /// @param makerToken Address of the maker token (what to buy).\n /// @param sellAmount Amount of `takerToken` to sell.\n /// @return makerTokenAmount Amount of `makerToken` that would be obtained.\n function getSellQuote(\n address takerToken,\n address makerToken,\n uint256 sellAmount\n )\n external\n view\n returns (uint256 makerTokenAmount) {\n makerTokenAmount = sellAmount - 1;\n }\n\n /// @dev Quotes the amount of `takerToken` that would need to be sold in\n /// order to obtain `buyAmount` of `makerToken`.\n /// @param takerToken Address of the taker token (what to sell).\n /// @param makerToken Address of the maker token (what to buy).\n /// @param buyAmount Amount of `makerToken` to buy.\n /// @return takerTokenAmount Amount of `takerToken` that would need to be sold.\n function getBuyQuote(\n address takerToken,\n address makerToken,\n uint256 buyAmount\n )\n external\n view\n returns (uint256 takerTokenAmount) {\n takerTokenAmount = buyAmount + 1;\n }\n}" - }, - "sourceTreeHashHex": "0x5962f24dc9460337e176690d71cba0289aec29cd924cdc5eedd32a32147ae773", - "compiler": { - "name": "solc", - "version": "soljson-v0.5.16+commit.9c3226ce.js", - "settings": { - "optimizer": { - "enabled": true, - "runs": 1000000, - "details": { - "yul": true, - "deduplicate": true, - "cse": true, - "constantOptimizer": true - } - }, - "outputSelection": { - "*": { - "*": [ - "abi", - "devdoc", - "evm.bytecode.object", - "evm.bytecode.sourceMap", - "evm.deployedBytecode.object", - "evm.deployedBytecode.sourceMap" - ] - } - }, - "evmVersion": "istanbul", - "remappings": [ - "@0x/contracts-asset-proxy=/Users/danielpyrathon/Desktop/Projects/0x-monorepo/contracts/erc20-bridge-sampler/node_modules/@0x/contracts-asset-proxy", - "@0x/contracts-erc20=/Users/danielpyrathon/Desktop/Projects/0x-monorepo/contracts/erc20-bridge-sampler/node_modules/@0x/contracts-erc20", - "@0x/contracts-utils=/Users/danielpyrathon/Desktop/Projects/0x-monorepo/contracts/erc20-bridge-sampler/node_modules/@0x/contracts-utils", - "@0x/contracts-exchange-libs=/Users/danielpyrathon/Desktop/Projects/0x-monorepo/contracts/erc20-bridge-sampler/node_modules/@0x/contracts-exchange-libs", - "@0x/contracts-exchange=/Users/danielpyrathon/Desktop/Projects/0x-monorepo/contracts/erc20-bridge-sampler/node_modules/@0x/contracts-exchange" - ] - } - }, - "chains": {} -} \ No newline at end of file + "schemaVersion": "2.0.0", + "contractName": "DummyLiquidityProvider", + "compilerOutput": { + "abi": [ + { "inputs": [], "payable": false, "stateMutability": "nonpayable", "type": "constructor" }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "takerToken", "type": "address" }, + { "internalType": "address", "name": "makerToken", "type": "address" }, + { "internalType": "uint256", "name": "buyAmount", "type": "uint256" } + ], + "name": "getBuyQuote", + "outputs": [{ "internalType": "uint256", "name": "takerTokenAmount", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "takerToken", "type": "address" }, + { "internalType": "address", "name": "makerToken", "type": "address" }, + { "internalType": "uint256", "name": "sellAmount", "type": "uint256" } + ], + "name": "getSellQuote", + "outputs": [{ "internalType": "uint256", "name": "makerTokenAmount", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "methods": { + "getBuyQuote(address,address,uint256)": { + "details": "Quotes the amount of `takerToken` that would need to be sold in order to obtain `buyAmount` of `makerToken`.", + "params": { + "buyAmount": "Amount of `makerToken` to buy.", + "makerToken": "Address of the maker token (what to buy).", + "takerToken": "Address of the taker token (what to sell)." + }, + "return": "takerTokenAmount Amount of `takerToken` that would need to be sold." + }, + "getSellQuote(address,address,uint256)": { + "details": "Quotes the amount of `makerToken` that would be obtained by selling `sellAmount` of `takerToken`.", + "params": { + "makerToken": "Address of the maker token (what to buy).", + "sellAmount": "Amount of `takerToken` to sell.", + "takerToken": "Address of the taker token (what to sell)." + }, + "return": "makerTokenAmount Amount of `makerToken` that would be obtained." + } + } + }, + "evm": { + "bytecode": { + "object": "0x608060405234801561001057600080fd5b50610159806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063343fbcdd1461003b57806345060eb014610064575b600080fd5b61004e6100493660046100a8565b610077565b60405161005b91906100e8565b60405180910390f35b61004e6100723660046100a8565b61009f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b60010192915050565b6000806000606084860312156100bc578283fd5b83356100c7816100f1565b925060208401356100d7816100f1565b929592945050506040919091013590565b90815260200190565b73ffffffffffffffffffffffffffffffffffffffff8116811461011357600080fd5b5056fea365627a7a723158202381fcfabad426957f70167a455c05b45e1a6babf4a85fb8887359d558fd68e46c6578706572696d656e74616cf564736f6c63430005100040" + }, + "deployedBytecode": { + "object": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c8063343fbcdd1461003b57806345060eb014610064575b600080fd5b61004e6100493660046100a8565b610077565b60405161005b91906100e8565b60405180910390f35b61004e6100723660046100a8565b61009f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b60010192915050565b6000806000606084860312156100bc578283fd5b83356100c7816100f1565b925060208401356100d7816100f1565b929592945050506040919091013590565b90815260200190565b73ffffffffffffffffffffffffffffffffffffffff8116811461011357600080fd5b5056fea365627a7a723158202381fcfabad426957f70167a455c05b45e1a6babf4a85fb8887359d558fd68e46c6578706572696d656e74616cf564736f6c63430005100040" + } + } + }, + "compiler": { + "name": "solc", + "version": "soljson-v0.5.16+commit.9c3226ce.js", + "settings": { + "optimizer": { + "enabled": true, + "runs": 1000000, + "details": { "yul": true, "deduplicate": true, "cse": true, "constantOptimizer": true } + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "devdoc", + "evm.bytecode.object", + "evm.bytecode.sourceMap", + "evm.deployedBytecode.object", + "evm.deployedBytecode.sourceMap" + ] + } + }, + "evmVersion": "istanbul" + } + }, + "chains": {} +} diff --git a/packages/contract-artifacts/artifacts/DummyLiquidityProviderRegistry.json b/packages/contract-artifacts/artifacts/DummyLiquidityProviderRegistry.json index 0e003dce7b..916da2472a 100644 --- a/packages/contract-artifacts/artifacts/DummyLiquidityProviderRegistry.json +++ b/packages/contract-artifacts/artifacts/DummyLiquidityProviderRegistry.json @@ -1,145 +1,87 @@ { - "schemaVersion": "2.0.0", - "contractName": "DummyLiquidityProviderRegistry", - "compilerOutput": { - "abi": [ - { - "inputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "takerToken", - "type": "address" - }, - { - "internalType": "address", - "name": "makerToken", - "type": "address" - } - ], - "name": "getLiquidityProviderForMarket", - "outputs": [ - { - "internalType": "address", - "name": "poolAddress", - "type": "address" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "takerToken", - "type": "address" - }, - { - "internalType": "address", - "name": "makerToken", - "type": "address" - }, - { - "internalType": "address", - "name": "poolAddress", - "type": "address" - } - ], - "name": "setLiquidityProviderForMarket", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - } - ], - "devdoc": { - "methods": { - "getLiquidityProviderForMarket(address,address)": { - "details": "Returns the address of pool for a market given market (xAsset, yAsset), or reverts if pool does not exist.", - "params": { - "makerToken": "Second asset managed by pool.", - "takerToken": "First asset managed by pool." - }, - "return": "Address of pool." - }, - "setLiquidityProviderForMarket(address,address,address)": { - "details": "Sets address of pool for a market given market (xAsset, yAsset).", - "params": { - "makerToken": "Second asset managed by pool.", - "poolAddress": "Address of pool.", - "takerToken": "First asset managed by pool." - } - } - } - }, - "evm": { - "bytecode": { - "linkReferences": {}, - "object": "0x608060405234801561001057600080fd5b506102a6806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063153f59971461003b57806384da8d1e14610064575b600080fd5b61004e610049366004610192565b610079565b60405161005b919061020b565b60405180910390f35b6100776100723660046101c6565b6100f2565b005b73ffffffffffffffffffffffffffffffffffffffff808316600090815260208181526040808320858516845290915290205416806100ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100e39061022c565b60405180910390fd5b92915050565b73ffffffffffffffffffffffffffffffffffffffff92831660008181526020818152604080832095871683529481528482208054969094167fffffffffffffffffffffffff0000000000000000000000000000000000000000968716811790945581815284822092825291909152919091208054909216179055565b803573ffffffffffffffffffffffffffffffffffffffff811681146100ec57600080fd5b600080604083850312156101a4578182fd5b6101ae848461016e565b91506101bd846020850161016e565b90509250929050565b6000806000606084860312156101da578081fd5b6101e4858561016e565b92506101f3856020860161016e565b9150610202856040860161016e565b90509250925092565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6020808252601c908201527f52656769737472792f4d41524b45545f504149525f4e4f545f5345540000000060408201526060019056fea365627a7a72315820e9d014b71aff38d71d3d9efe78edb01a2b319d7bd2dddac70764cfb4924be0136c6578706572696d656e74616cf564736f6c63430005100040", - "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2A6 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x36 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x153F5997 EQ PUSH2 0x3B JUMPI DUP1 PUSH4 0x84DA8D1E EQ PUSH2 0x64 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x49 CALLDATASIZE PUSH1 0x4 PUSH2 0x192 JUMP JUMPDEST PUSH2 0x79 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x5B SWAP2 SWAP1 PUSH2 0x20B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x77 PUSH2 0x72 CALLDATASIZE PUSH1 0x4 PUSH2 0x1C6 JUMP JUMPDEST PUSH2 0xF2 JUMP JUMPDEST STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP6 DUP6 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD AND DUP1 PUSH2 0xEC JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xE3 SWAP1 PUSH2 0x22C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP6 DUP8 AND DUP4 MSTORE SWAP5 DUP2 MSTORE DUP5 DUP3 KECCAK256 DUP1 SLOAD SWAP7 SWAP1 SWAP5 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP7 DUP8 AND DUP2 OR SWAP1 SWAP5 SSTORE DUP2 DUP2 MSTORE DUP5 DUP3 KECCAK256 SWAP3 DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE SWAP2 SWAP1 SWAP2 KECCAK256 DUP1 SLOAD SWAP1 SWAP3 AND OR SWAP1 SSTORE JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xEC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1A4 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x1AE DUP5 DUP5 PUSH2 0x16E JUMP JUMPDEST SWAP2 POP PUSH2 0x1BD DUP5 PUSH1 0x20 DUP6 ADD PUSH2 0x16E JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1DA JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x1E4 DUP6 DUP6 PUSH2 0x16E JUMP JUMPDEST SWAP3 POP PUSH2 0x1F3 DUP6 PUSH1 0x20 DUP7 ADD PUSH2 0x16E JUMP JUMPDEST SWAP2 POP PUSH2 0x202 DUP6 PUSH1 0x40 DUP7 ADD PUSH2 0x16E JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x52656769737472792F4D41524B45545F504149525F4E4F545F53455400000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP INVALID LOG3 PUSH6 0x627A7A723158 KECCAK256 0xE9 0xD0 EQ 0xB7 BYTE SELFDESTRUCT CODESIZE 0xD7 SAR RETURNDATASIZE SWAP15 INVALID PUSH25 0xEDB01A2B319D7BD2DDDAC70764CFB4924BE0136C6578706572 PUSH10 0x6D656E74616CF564736F PUSH13 0x63430005100040000000000000 ", - "sourceMap": "60:1355:1:-;;;165:35;8:9:-1;5:2;;;30:1;27;20:12;5:2;165:35:1;60:1355;;;;;;" - }, - "deployedBytecode": { - "linkReferences": {}, - "object": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c8063153f59971461003b57806384da8d1e14610064575b600080fd5b61004e610049366004610192565b610079565b60405161005b919061020b565b60405180910390f35b6100776100723660046101c6565b6100f2565b005b73ffffffffffffffffffffffffffffffffffffffff808316600090815260208181526040808320858516845290915290205416806100ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100e39061022c565b60405180910390fd5b92915050565b73ffffffffffffffffffffffffffffffffffffffff92831660008181526020818152604080832095871683529481528482208054969094167fffffffffffffffffffffffff0000000000000000000000000000000000000000968716811790945581815284822092825291909152919091208054909216179055565b803573ffffffffffffffffffffffffffffffffffffffff811681146100ec57600080fd5b600080604083850312156101a4578182fd5b6101ae848461016e565b91506101bd846020850161016e565b90509250929050565b6000806000606084860312156101da578081fd5b6101e4858561016e565b92506101f3856020860161016e565b9150610202856040860161016e565b90509250925092565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6020808252601c908201527f52656769737472792f4d41524b45545f504149525f4e4f545f5345540000000060408201526060019056fea365627a7a72315820e9d014b71aff38d71d3d9efe78edb01a2b319d7bd2dddac70764cfb4924be0136c6578706572696d656e74616cf564736f6c63430005100040", - "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x36 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x153F5997 EQ PUSH2 0x3B JUMPI DUP1 PUSH4 0x84DA8D1E EQ PUSH2 0x64 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x49 CALLDATASIZE PUSH1 0x4 PUSH2 0x192 JUMP JUMPDEST PUSH2 0x79 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x5B SWAP2 SWAP1 PUSH2 0x20B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x77 PUSH2 0x72 CALLDATASIZE PUSH1 0x4 PUSH2 0x1C6 JUMP JUMPDEST PUSH2 0xF2 JUMP JUMPDEST STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP6 DUP6 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD AND DUP1 PUSH2 0xEC JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xE3 SWAP1 PUSH2 0x22C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP6 DUP8 AND DUP4 MSTORE SWAP5 DUP2 MSTORE DUP5 DUP3 KECCAK256 DUP1 SLOAD SWAP7 SWAP1 SWAP5 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP7 DUP8 AND DUP2 OR SWAP1 SWAP5 SSTORE DUP2 DUP2 MSTORE DUP5 DUP3 KECCAK256 SWAP3 DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE SWAP2 SWAP1 SWAP2 KECCAK256 DUP1 SLOAD SWAP1 SWAP3 AND OR SWAP1 SSTORE JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xEC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1A4 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x1AE DUP5 DUP5 PUSH2 0x16E JUMP JUMPDEST SWAP2 POP PUSH2 0x1BD DUP5 PUSH1 0x20 DUP6 ADD PUSH2 0x16E JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1DA JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x1E4 DUP6 DUP6 PUSH2 0x16E JUMP JUMPDEST SWAP3 POP PUSH2 0x1F3 DUP6 PUSH1 0x20 DUP7 ADD PUSH2 0x16E JUMP JUMPDEST SWAP2 POP PUSH2 0x202 DUP6 PUSH1 0x40 DUP7 ADD PUSH2 0x16E JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x52656769737472792F4D41524B45545F504149525F4E4F545F53455400000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP INVALID LOG3 PUSH6 0x627A7A723158 KECCAK256 0xE9 0xD0 EQ 0xB7 BYTE SELFDESTRUCT CODESIZE 0xD7 SAR RETURNDATASIZE SWAP15 INVALID PUSH25 0xEDB01A2B319D7BD2DDDAC70764CFB4924BE0136C6578706572 PUSH10 0x6D656E74616CF564736F PUSH13 0x63430005100040000000000000 ", - "sourceMap": "60:1355:1:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60:1355:1;;;;;;;;;;;;;;;;;;;;;;;;1060:353;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;518:272;;;;;;;;;:::i;:::-;;1060:353;1257:25;;;;1208:19;1257:25;;;;;;;;;;;:37;;;;;;;;;;;;1325:27;1304:102;;;;;;;;;;;;;;;;;;;;;;1060:353;;;;:::o;518:272::-;671:25;;;;:13;:25;;;;;;;;;;;:37;;;;;;;;;;;:51;;;;;;;;;;;;;;;732:25;;;;;;:37;;;;;;;;;;;:51;;;;;;;;518:272::o;5:130:-1:-;72:20;;2447:42;2436:54;;2561:35;;2551:2;;2610:1;;2600:12;142:366;;;263:2;251:9;242:7;238:23;234:32;231:2;;;-1:-1;;269:12;231:2;331:53;376:7;352:22;331:53;;;321:63;;439:53;484:7;421:2;464:9;460:22;439:53;;;429:63;;225:283;;;;;;515:491;;;;653:2;641:9;632:7;628:23;624:32;621:2;;;-1:-1;;659:12;621:2;721:53;766:7;742:22;721:53;;;711:63;;829:53;874:7;811:2;854:9;850:22;829:53;;;819:63;;937:53;982:7;919:2;962:9;958:22;937:53;;;927:63;;615:391;;;;;;1470:213;2447:42;2436:54;;;;1084:37;;1588:2;1573:18;;1559:124;1690:407;1881:2;1895:47;;;1358:2;1866:18;;;2208:19;1394:30;2248:14;;;1374:51;1444:12;;;1852:245" - } - } - }, - "sources": { - "src/DummyLiquidityProviderRegistry.sol": { - "id": 1 - } - }, - "sourceCodes": { - "src/DummyLiquidityProviderRegistry.sol": "pragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\n\ncontract DummyLiquidityProviderRegistry\n{\n address private constant NULL_ADDRESS = address(0x0);\n\n constructor()\n public\n {}\n\n mapping (address => mapping (address => address)) internal _gAddressBook;\n\n /// @dev Sets address of pool for a market given market (xAsset, yAsset).\n /// @param takerToken First asset managed by pool.\n /// @param makerToken Second asset managed by pool.\n /// @param poolAddress Address of pool.\n function setLiquidityProviderForMarket(\n address takerToken,\n address makerToken,\n address poolAddress\n ) external\n {\n _gAddressBook[takerToken][makerToken] = poolAddress;\n _gAddressBook[makerToken][takerToken] = poolAddress;\n }\n\n /// @dev Returns the address of pool for a market given market (xAsset, yAsset), or reverts if pool does not exist.\n /// @param takerToken First asset managed by pool.\n /// @param makerToken Second asset managed by pool.\n /// @return Address of pool.\n function getLiquidityProviderForMarket(\n address takerToken,\n address makerToken\n )\n external\n view\n returns (address poolAddress)\n {\n poolAddress = _gAddressBook[takerToken][makerToken];\n require(\n poolAddress != NULL_ADDRESS,\n \"Registry/MARKET_PAIR_NOT_SET\"\n );\n }\n}" - }, - "sourceTreeHashHex": "0xd7384821c9485d12dcbfe63802f637b5d32687aaf1245c2f2385558583a79d72", - "compiler": { - "name": "solc", - "version": "soljson-v0.5.16+commit.9c3226ce.js", - "settings": { - "optimizer": { - "enabled": true, - "runs": 1000000, - "details": { - "yul": true, - "deduplicate": true, - "cse": true, - "constantOptimizer": true - } - }, - "outputSelection": { - "*": { - "*": [ - "abi", - "devdoc", - "evm.bytecode.object", - "evm.bytecode.sourceMap", - "evm.deployedBytecode.object", - "evm.deployedBytecode.sourceMap" - ] - } - }, - "evmVersion": "istanbul", - "remappings": [ - "@0x/contracts-asset-proxy=/Users/danielpyrathon/Desktop/Projects/0x-monorepo/contracts/erc20-bridge-sampler/node_modules/@0x/contracts-asset-proxy", - "@0x/contracts-erc20=/Users/danielpyrathon/Desktop/Projects/0x-monorepo/contracts/erc20-bridge-sampler/node_modules/@0x/contracts-erc20", - "@0x/contracts-utils=/Users/danielpyrathon/Desktop/Projects/0x-monorepo/contracts/erc20-bridge-sampler/node_modules/@0x/contracts-utils", - "@0x/contracts-exchange-libs=/Users/danielpyrathon/Desktop/Projects/0x-monorepo/contracts/erc20-bridge-sampler/node_modules/@0x/contracts-exchange-libs", - "@0x/contracts-exchange=/Users/danielpyrathon/Desktop/Projects/0x-monorepo/contracts/erc20-bridge-sampler/node_modules/@0x/contracts-exchange" - ] - } - }, - "chains": {} -} \ No newline at end of file + "schemaVersion": "2.0.0", + "contractName": "DummyLiquidityProviderRegistry", + "compilerOutput": { + "abi": [ + { "inputs": [], "payable": false, "stateMutability": "nonpayable", "type": "constructor" }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "takerToken", "type": "address" }, + { "internalType": "address", "name": "makerToken", "type": "address" } + ], + "name": "getLiquidityProviderForMarket", + "outputs": [{ "internalType": "address", "name": "poolAddress", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "takerToken", "type": "address" }, + { "internalType": "address", "name": "makerToken", "type": "address" }, + { "internalType": "address", "name": "poolAddress", "type": "address" } + ], + "name": "setLiquidityProviderForMarket", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } + ], + "devdoc": { + "methods": { + "getLiquidityProviderForMarket(address,address)": { + "details": "Returns the address of pool for a market given market (xAsset, yAsset), or reverts if pool does not exist.", + "params": { + "makerToken": "Second asset managed by pool.", + "takerToken": "First asset managed by pool." + }, + "return": "Address of pool." + }, + "setLiquidityProviderForMarket(address,address,address)": { + "details": "Sets address of pool for a market given market (xAsset, yAsset).", + "params": { + "makerToken": "Second asset managed by pool.", + "poolAddress": "Address of pool.", + "takerToken": "First asset managed by pool." + } + } + } + }, + "evm": { + "bytecode": { + "object": "0x608060405234801561001057600080fd5b506102a6806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063153f59971461003b57806384da8d1e14610064575b600080fd5b61004e610049366004610192565b610079565b60405161005b919061020b565b60405180910390f35b6100776100723660046101c6565b6100f2565b005b73ffffffffffffffffffffffffffffffffffffffff808316600090815260208181526040808320858516845290915290205416806100ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100e39061022c565b60405180910390fd5b92915050565b73ffffffffffffffffffffffffffffffffffffffff92831660008181526020818152604080832095871683529481528482208054969094167fffffffffffffffffffffffff0000000000000000000000000000000000000000968716811790945581815284822092825291909152919091208054909216179055565b803573ffffffffffffffffffffffffffffffffffffffff811681146100ec57600080fd5b600080604083850312156101a4578182fd5b6101ae848461016e565b91506101bd846020850161016e565b90509250929050565b6000806000606084860312156101da578081fd5b6101e4858561016e565b92506101f3856020860161016e565b9150610202856040860161016e565b90509250925092565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6020808252601c908201527f52656769737472792f4d41524b45545f504149525f4e4f545f5345540000000060408201526060019056fea365627a7a72315820e9d014b71aff38d71d3d9efe78edb01a2b319d7bd2dddac70764cfb4924be0136c6578706572696d656e74616cf564736f6c63430005100040" + }, + "deployedBytecode": { + "object": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c8063153f59971461003b57806384da8d1e14610064575b600080fd5b61004e610049366004610192565b610079565b60405161005b919061020b565b60405180910390f35b6100776100723660046101c6565b6100f2565b005b73ffffffffffffffffffffffffffffffffffffffff808316600090815260208181526040808320858516845290915290205416806100ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100e39061022c565b60405180910390fd5b92915050565b73ffffffffffffffffffffffffffffffffffffffff92831660008181526020818152604080832095871683529481528482208054969094167fffffffffffffffffffffffff0000000000000000000000000000000000000000968716811790945581815284822092825291909152919091208054909216179055565b803573ffffffffffffffffffffffffffffffffffffffff811681146100ec57600080fd5b600080604083850312156101a4578182fd5b6101ae848461016e565b91506101bd846020850161016e565b90509250929050565b6000806000606084860312156101da578081fd5b6101e4858561016e565b92506101f3856020860161016e565b9150610202856040860161016e565b90509250925092565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6020808252601c908201527f52656769737472792f4d41524b45545f504149525f4e4f545f5345540000000060408201526060019056fea365627a7a72315820e9d014b71aff38d71d3d9efe78edb01a2b319d7bd2dddac70764cfb4924be0136c6578706572696d656e74616cf564736f6c63430005100040" + } + } + }, + "compiler": { + "name": "solc", + "version": "soljson-v0.5.16+commit.9c3226ce.js", + "settings": { + "optimizer": { + "enabled": true, + "runs": 1000000, + "details": { "yul": true, "deduplicate": true, "cse": true, "constantOptimizer": true } + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "devdoc", + "evm.bytecode.object", + "evm.bytecode.sourceMap", + "evm.deployedBytecode.object", + "evm.deployedBytecode.sourceMap" + ] + } + }, + "evmVersion": "istanbul" + } + }, + "chains": {} +} diff --git a/packages/contract-artifacts/artifacts/ERC20BridgeSampler.json b/packages/contract-artifacts/artifacts/ERC20BridgeSampler.json index 8fe9b53267..f4f7a148e0 100644 --- a/packages/contract-artifacts/artifacts/ERC20BridgeSampler.json +++ b/packages/contract-artifacts/artifacts/ERC20BridgeSampler.json @@ -1,777 +1,346 @@ { - "schemaVersion": "2.0.0", - "contractName": "ERC20BridgeSampler", - "compilerOutput": { - "abi": [ - { - "constant": true, - "inputs": [ - { - "internalType": "bytes[]", - "name": "callDatas", - "type": "bytes[]" - } - ], - "name": "batchCall", - "outputs": [ - { - "internalType": "bytes[]", - "name": "callResults", - "type": "bytes[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "registryAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "takerToken", - "type": "address" - }, - { - "internalType": "address", - "name": "makerToken", - "type": "address" - } - ], - "name": "getLiquidityProviderFromRegistry", - "outputs": [ - { - "internalType": "address", - "name": "providerAddress", - "type": "address" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "components": [ - { - "internalType": "address", - "name": "makerAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "takerAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "feeRecipientAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "senderAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "makerAssetAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "takerAssetAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "makerFee", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "takerFee", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "expirationTimeSeconds", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "salt", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "makerAssetData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "takerAssetData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "makerFeeAssetData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "takerFeeAssetData", - "type": "bytes" - } - ], - "internalType": "struct LibOrder.Order[]", - "name": "orders", - "type": "tuple[]" - }, - { - "internalType": "bytes[]", - "name": "orderSignatures", - "type": "bytes[]" - } - ], - "name": "getOrderFillableMakerAssetAmounts", - "outputs": [ - { - "internalType": "uint256[]", - "name": "orderFillableMakerAssetAmounts", - "type": "uint256[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "components": [ - { - "internalType": "address", - "name": "makerAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "takerAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "feeRecipientAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "senderAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "makerAssetAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "takerAssetAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "makerFee", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "takerFee", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "expirationTimeSeconds", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "salt", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "makerAssetData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "takerAssetData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "makerFeeAssetData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "takerFeeAssetData", - "type": "bytes" - } - ], - "internalType": "struct LibOrder.Order[]", - "name": "orders", - "type": "tuple[]" - }, - { - "internalType": "bytes[]", - "name": "orderSignatures", - "type": "bytes[]" - } - ], - "name": "getOrderFillableTakerAssetAmounts", - "outputs": [ - { - "internalType": "uint256[]", - "name": "orderFillableTakerAssetAmounts", - "type": "uint256[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "takerToken", - "type": "address" - }, - { - "internalType": "address", - "name": "makerToken", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "makerTokenAmounts", - "type": "uint256[]" - } - ], - "name": "sampleBuysFromEth2Dai", - "outputs": [ - { - "internalType": "uint256[]", - "name": "takerTokenAmounts", - "type": "uint256[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "registryAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "takerToken", - "type": "address" - }, - { - "internalType": "address", - "name": "makerToken", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "makerTokenAmounts", - "type": "uint256[]" - } - ], - "name": "sampleBuysFromLiquidityProviderRegistry", - "outputs": [ - { - "internalType": "uint256[]", - "name": "takerTokenAmounts", - "type": "uint256[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "takerToken", - "type": "address" - }, - { - "internalType": "address", - "name": "makerToken", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "makerTokenAmounts", - "type": "uint256[]" - } - ], - "name": "sampleBuysFromUniswap", - "outputs": [ - { - "internalType": "uint256[]", - "name": "takerTokenAmounts", - "type": "uint256[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "curveAddress", - "type": "address" - }, - { - "internalType": "int128", - "name": "fromTokenIdx", - "type": "int128" - }, - { - "internalType": "int128", - "name": "toTokenIdx", - "type": "int128" - }, - { - "internalType": "uint256[]", - "name": "takerTokenAmounts", - "type": "uint256[]" - } - ], - "name": "sampleSellsFromCurve", - "outputs": [ - { - "internalType": "uint256[]", - "name": "makerTokenAmounts", - "type": "uint256[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "takerToken", - "type": "address" - }, - { - "internalType": "address", - "name": "makerToken", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "takerTokenAmounts", - "type": "uint256[]" - } - ], - "name": "sampleSellsFromEth2Dai", - "outputs": [ - { - "internalType": "uint256[]", - "name": "makerTokenAmounts", - "type": "uint256[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "takerToken", - "type": "address" - }, - { - "internalType": "address", - "name": "makerToken", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "takerTokenAmounts", - "type": "uint256[]" - } - ], - "name": "sampleSellsFromKyberNetwork", - "outputs": [ - { - "internalType": "uint256[]", - "name": "makerTokenAmounts", - "type": "uint256[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "registryAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "takerToken", - "type": "address" - }, - { - "internalType": "address", - "name": "makerToken", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "takerTokenAmounts", - "type": "uint256[]" - } - ], - "name": "sampleSellsFromLiquidityProviderRegistry", - "outputs": [ - { - "internalType": "uint256[]", - "name": "makerTokenAmounts", - "type": "uint256[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "takerToken", - "type": "address" - }, - { - "internalType": "address", - "name": "makerToken", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "takerTokenAmounts", - "type": "uint256[]" - } - ], - "name": "sampleSellsFromUniswap", - "outputs": [ - { - "internalType": "uint256[]", - "name": "makerTokenAmounts", - "type": "uint256[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - } - ], - "devdoc": { - "methods": { - "batchCall(bytes[])": { - "details": "Call multiple public functions on this contract in a single transaction.", - "params": { - "callDatas": "ABI-encoded call data for each function call." - }, - "return": "callResults ABI-encoded results data for each call." - }, - "getLiquidityProviderFromRegistry(address,address,address)": { - "details": "Returns the address of a liquidity provider for the given market (takerToken, makerToken), from a registry of liquidity providers. Returns address(0) if no such provider exists in the registry.", - "params": { - "makerToken": "Maker asset managed by liquidity provider.", - "takerToken": "Taker asset managed by liquidity provider." - }, - "return": "providerAddress Address of the liquidity provider." - }, - "getOrderFillableMakerAssetAmounts((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[])": { - "details": "Queries the fillable taker asset amounts of native orders. Effectively ignores orders that have empty signatures or", - "params": { - "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[])": { - "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": { - "orderSignatures": "Signatures for each respective order in `orders`.", - "orders": "Native orders to query." - }, - "return": "orderFillableTakerAssetAmounts How much taker asset can be filled by each order in `orders`." - }, - "sampleBuysFromEth2Dai(address,address,uint256[])": { - "details": "Sample buy quotes from Eth2Dai/Oasis.", - "params": { - "makerToken": "Address of the maker token (what to buy).", - "takerToken": "Address of the taker token (what to sell).", - "takerTokenAmounts": "Maker token sell amount for each sample." - }, - "return": "takerTokenAmounts Taker amounts sold at each maker token amount." - }, - "sampleBuysFromLiquidityProviderRegistry(address,address,address,uint256[])": { - "details": "Sample buy quotes from an arbitrary on-chain liquidity provider.", - "params": { - "makerToken": "Address of the maker token (what to buy).", - "makerTokenAmounts": "Maker token buy amount for each sample.", - "registryAddress": "Address of the liquidity provider registry contract.", - "takerToken": "Address of the taker token (what to sell)." - }, - "return": "takerTokenAmounts Taker amounts sold at each maker token amount." - }, - "sampleBuysFromUniswap(address,address,uint256[])": { - "details": "Sample buy quotes from Uniswap.", - "params": { - "makerToken": "Address of the maker token (what to buy).", - "makerTokenAmounts": "Maker token sell amount for each sample.", - "takerToken": "Address of the taker token (what to sell)." - }, - "return": "takerTokenAmounts Taker amounts sold at each maker token amount." - }, - "sampleSellsFromCurve(address,int128,int128,uint256[])": { - "details": "Sample sell quotes from Curve.", - "params": { - "curveAddress": "Address of the Curve contract.", - "fromTokenIdx": "Index of the taker token (what to sell).", - "takerTokenAmounts": "Taker token sell amount for each sample.", - "toTokenIdx": "Index of the maker token (what to buy)." - }, - "return": "makerTokenAmounts Maker amounts bought at each taker token amount." - }, - "sampleSellsFromEth2Dai(address,address,uint256[])": { - "details": "Sample sell quotes from Eth2Dai/Oasis.", - "params": { - "makerToken": "Address of the maker token (what to buy).", - "takerToken": "Address of the taker token (what to sell).", - "takerTokenAmounts": "Taker token sell amount for each sample." - }, - "return": "makerTokenAmounts Maker amounts bought at each taker token amount." - }, - "sampleSellsFromKyberNetwork(address,address,uint256[])": { - "details": "Sample sell quotes from Kyber.", - "params": { - "makerToken": "Address of the maker token (what to buy).", - "takerToken": "Address of the taker token (what to sell).", - "takerTokenAmounts": "Taker token sell amount for each sample." - }, - "return": "makerTokenAmounts Maker amounts bought at each taker token amount." - }, - "sampleSellsFromLiquidityProviderRegistry(address,address,address,uint256[])": { - "details": "Sample sell quotes from an arbitrary on-chain liquidity provider.", - "params": { - "makerToken": "Address of the maker token (what to buy).", - "registryAddress": "Address of the liquidity provider registry contract.", - "takerToken": "Address of the taker token (what to sell).", - "takerTokenAmounts": "Taker token sell amount for each sample." - }, - "return": "makerTokenAmounts Maker amounts bought at each taker token amount." - }, - "sampleSellsFromUniswap(address,address,uint256[])": { - "details": "Sample sell quotes from Uniswap.", - "params": { - "makerToken": "Address of the maker token (what to buy).", - "takerToken": "Address of the taker token (what to sell).", - "takerTokenAmounts": "Taker token sell amount for each sample." - }, - "return": "makerTokenAmounts Maker amounts bought at each taker token amount." - } - } - }, - "evm": { - "bytecode": { - "linkReferences": {}, - "object": "0x608060405234801561001057600080fd5b50612a0d806100206000396000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c806368be3cf2116100815780639f76ad351161005b5780639f76ad35146101a7578063a2c28d4b146101ba578063c7f7142e146101cd576100d4565b806368be3cf2146101615780636dd6b78d146101815780638b123a0214610194576100d4565b806359f515d0116100b257806359f515d01461012857806360ee052a1461013b57806364ee6ade1461014e576100d4565b8063354152a3146100d95780634703a7e6146101025780634cb8e25314610115575b600080fd5b6100ec6100e736600461237c565b6101ed565b6040516100f991906126e3565b60405180910390f35b6100ec61011036600461231c565b6103be565b6100ec61012336600461231c565b61059a565b6100ec610136366004612426565b61088a565b6100ec61014936600461231c565b610933565b6100ec61015c36600461231c565b610bf3565b61017461016f3660046123ba565b610db9565b6040516100f99190612665565b6100ec61018f36600461231c565b610ef8565b6100ec6101a2366004612426565b6111a0565b6100ec6101b53660046122a9565b611468565b6100ec6101c83660046122a9565b61166d565b6101e06101db36600461225f565b611859565b6040516100f991906125ec565b60606000825190508060405190808252806020026020018201604052801561021f578160200160208202803883390190505b50915060005b818110156103b457600060608873ffffffffffffffffffffffffffffffffffffffff16620927c0600073ffffffffffffffffffffffffffffffffffffffff166307211ef7905060e01b8a8a8a888151811061027c57fe5b602002602001015160405160240161029693929190612756565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161031f91906125d0565b6000604051808303818686fa925050503d806000811461035b576040519150601f19603f3d011682016040523d82523d6000602084013e610360565b606091505b5090925090506000821561038957818060200190516103829190810190612544565b9050610391565b5050506103b4565b8086858151811061039e57fe5b6020908102919091010152505050600101610225565b5050949350505050565b60606103ca8385611994565b81516040805182815260208084028201019091528180156103f5578160200160208202803883390190505b50915060005b81811015610591576000606061040f611a07565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663ff1fd974905060e01b8a8a8a888151811061045957fe5b602002602001015160405160240161047393929190612634565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516104fc91906125d0565b6000604051808303818686fa925050503d8060008114610538576040519150601f19603f3d011682016040523d82523d6000602084013e61053d565b606091505b50909250905060008215610566578180602001905161055f9190810190612544565b905061056e565b505050610591565b8086858151811061057b57fe5b60209081029190910101525050506001016103fb565b50509392505050565b60606105a68385611994565b60006105b0611a1f565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146105e857846105fe565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b9050600061060a611a1f565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146106425784610658565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b9050600061066587611a37565b60ff169050600061067587611a37565b60ff169050600086519050806040519080825280602002602001820160405280156106aa578160200160208202803883390190505b50955060005b8181101561087d57600060606106c4611a48565b73ffffffffffffffffffffffffffffffffffffffff166216e360600073ffffffffffffffffffffffffffffffffffffffff1663809a9e55905060e01b8a8a8e888151811061070e57fe5b602002602001015160405160240161072893929190612634565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516107b191906125d0565b6000604051808303818686fa925050503d80600081146107ed576040519150601f19603f3d011682016040523d82523d6000602084013e6107f2565b606091505b5090925090506000821561081b57818060200190516108149190810190612544565b9050610823565b50505061087d565b670de0b6b3a764000087600a0a87600a0a8d878151811061084057fe5b60200260200101518402028161085257fe5b048161085a57fe5b048a858151811061086757fe5b60209081029190910101525050506001016106b0565b5050505050509392505050565b606061089683836111a0565b905060005b835181101561092c578181815181106108b057fe5b60200260200101516000146109245761090b8282815181106108ce57fe5b60200260200101518583815181106108e257fe5b602002602001015160a001518684815181106108fa57fe5b602002602001015160800151611a60565b82828151811061091757fe5b6020026020010181815250505b60010161089b565b5092915050565b606061093f8385611994565b815160408051828152602080840282010190915281801561096a578160200160208202803883390190505b5091506000610977611a1f565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146109b7576109b286611aa2565b6109ba565b60005b905060006109c6611a1f565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610a0657610a0186611aa2565b610a09565b60005b905060005b83811015610be8576001610a20611a1f565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415610ab7578651610a969085907f2640f62c00000000000000000000000000000000000000000000000000000000908a9086908110610a8957fe5b6020026020010151611b34565b878481518110610aa257fe5b60200260200101819350828152505050610bd4565b610abf611a1f565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161415610b28578651610a969084907f59e9486200000000000000000000000000000000000000000000000000000000908a9086908110610a8957fe5b8651600090610b619085907f59e9486200000000000000000000000000000000000000000000000000000000908b9087908110610a8957fe5b925090508015610bb757610b96857f2640f62c0000000000000000000000000000000000000000000000000000000083611b34565b888581518110610ba257fe5b60200260200101819450828152505050610bd2565b6000878481518110610bc557fe5b6020026020010181815250505b505b80610bdf5750610be8565b50600101610a0e565b505050509392505050565b6060610bff8385611994565b8151604080518281526020808402820101909152818015610c2a578160200160208202803883390190505b50915060005b818110156105915760006060610c44611a07565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663144a2752905060e01b898b8a8881518110610c8e57fe5b6020026020010151604051602401610ca893929190612634565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051610d3191906125d0565b6000604051808303818686fa925050503d8060008114610d6d576040519150601f19603f3d011682016040523d82523d6000602084013e610d72565b606091505b509092509050600082156105665781806020019051610d949190810190612544565b905080868581518110610da357fe5b6020908102919091010152505050600101610c30565b604080518281526020808402820101909152606090828015610def57816020015b6060815260200190600190039081610dda5790505b50905060005b80831461092c576000606030868685818110610e0d57fe5b6020028201905080357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe136849003018112610e4757600080fd5b9091016020810191503567ffffffffffffffff811115610e6657600080fd5b36819003821315610e7657600080fd5b604051610e849291906125c0565b600060405180830381855afa9150503d8060008114610ebf576040519150601f19603f3d011682016040523d82523d6000602084013e610ec4565b606091505b509150915081610ed657805160208201fd5b80848481518110610ee357fe5b60209081029190910101525050600101610df5565b6060610f048385611994565b8151604080518281526020808402820101909152818015610f2f578160200160208202803883390190505b5091506000610f3c611a1f565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610f7c57610f7786611aa2565b610f7f565b60005b90506000610f8b611a1f565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610fcb57610fc686611aa2565b610fce565b60005b905060005b83811015610be8576001610fe5611a1f565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16141561106f57865161104e9085907f95b68fe700000000000000000000000000000000000000000000000000000000908a9086908110610a8957fe5b87848151811061105a57fe5b6020026020010181935082815250505061118c565b611077611a1f565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614156110e057865161104e9084907fcd7724c300000000000000000000000000000000000000000000000000000000908a9086908110610a8957fe5b86516000906111199086907f95b68fe700000000000000000000000000000000000000000000000000000000908b9087908110610a8957fe5b92509050801561116f5761114e847fcd7724c30000000000000000000000000000000000000000000000000000000083611b34565b88858151811061115a57fe5b6020026020010181945082815250505061118a565b600087848151811061117d57fe5b6020026020010181815250505b505b806111975750610be8565b50600101610fd3565b606082516040519080825280602002602001820160405280156111cd578160200160208202803883390190505b50905060005b8351811461092c578281815181106111e757fe5b60200260200101515160001480611215575083818151811061120557fe5b6020026020010151608001516000145b80611237575083818151811061122757fe5b602002602001015160a001516000145b1561125b57600082828151811061124a57fe5b602002602001018181525050611460565b60006060611267611c7d565b73ffffffffffffffffffffffffffffffffffffffff166207a120611289611c7d565b5087517fe77286eb00000000000000000000000000000000000000000000000000000000908990879081106112ba57fe5b60200260200101518887815181106112ce57fe5b60200260200101516040516024016112e79291906127d1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161137091906125d0565b6000604051808303818686fa925050503d80600081146113ac576040519150601f19603f3d011682016040523d82523d6000602084013e6113b1565b606091505b5091509150816113dc5760008484815181106113c957fe5b6020026020010181815250505050611460565b6113e4611f5b565b600080838060200190516113fb91908101906124d7565b9194509250905060038351600681111561141157fe5b14158061141c575080155b1561144057600087878151811061142f57fe5b60200260200101818152505061145a565b8187878151811061144d57fe5b6020026020010181815250505b50505050505b6001016111d3565b60606000825190508060405190808252806020026020018201604052801561149a578160200160208202803883390190505b50915060006114aa878787611859565b905073ffffffffffffffffffffffffffffffffffffffff81166114cf57506116659050565b60005b8281101561166157600060608373ffffffffffffffffffffffffffffffffffffffff1662030d40600073ffffffffffffffffffffffffffffffffffffffff1663343fbcdd905060e01b8b8b8b888151811061152957fe5b602002602001015160405160240161154393929190612634565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516115cc91906125d0565b6000604051808303818686fa925050503d8060008114611608576040519150601f19603f3d011682016040523d82523d6000602084013e61160d565b606091505b50909250905060008215611636578180602001905161162f9190810190612544565b905061163e565b505050611661565b8087858151811061164b57fe5b60209081029190910101525050506001016114d2565b5050505b949350505050565b60606000825190508060405190808252806020026020018201604052801561169f578160200160208202803883390190505b50915060006116af878787611859565b905073ffffffffffffffffffffffffffffffffffffffff81166116d457506116659050565b60005b8281101561166157600060608373ffffffffffffffffffffffffffffffffffffffff1662030d40600073ffffffffffffffffffffffffffffffffffffffff166345060eb0905060e01b8b8b8b888151811061172e57fe5b602002602001015160405160240161174893929190612634565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516117d191906125d0565b6000604051808303818686fa925050503d806000811461180d576040519150601f19603f3d011682016040523d82523d6000602084013e611812565b606091505b5090925090506000821561163657818060200190516118349190810190612544565b90508087858151811061184357fe5b60209081029190910101525050506001016116d7565b6040516000906060907f153f59970000000000000000000000000000000000000000000000000000000090611894908690869060240161260d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608673ffffffffffffffffffffffffffffffffffffffff168360405161191c91906125d0565b600060405180830381855afa9150503d8060008114611957576040519150601f19603f3d011682016040523d82523d6000602084013e61195c565b606091505b509150915081801561196f575080516020145b156119895761197f81600c611c95565b935050505061198d565b5050505b9392505050565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fa90612774565b60405180910390fd5b5050565b73794e6e91555438afc3ccf1c5076a74f42133d08d90565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290565b6000611a4282611cda565b92915050565b73818e6fecd516ecc3849daf6845e3ec868087b75590565b600061166583611a96611a7a82600163ffffffff611dab16565b611a8a888763ffffffff611dca16565b9063ffffffff611dfb16565b9063ffffffff611e1716565b6000611aac611e41565b73ffffffffffffffffffffffffffffffffffffffff166306f2bf62836040518263ffffffff1660e01b8152600401611ae491906125ec565b60206040518083038186803b158015611afc57600080fd5b505afa158015611b10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611a429190810190612243565b60008073ffffffffffffffffffffffffffffffffffffffff8516611b5757611c75565b60608573ffffffffffffffffffffffffffffffffffffffff16620249f08686604051602401611b869190612925565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611c0f91906125d0565b6000604051808303818686fa925050503d8060008114611c4b576040519150601f19603f3d011682016040523d82523d6000602084013e611c50565b606091505b5090925090508115611c735780806020019051611c709190810190612544565b92505b505b935093915050565b7374134cf88b21383713e096a5ecf59e297dc7f54790565b60008160140183511015611cbb57611cbb611cb66004855185601401611e59565b611efe565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b600060129050600060608373ffffffffffffffffffffffffffffffffffffffff166040518060400160405280600481526020017f313ce56700000000000000000000000000000000000000000000000000000000815250604051611d3e91906125d0565b600060405180830381855afa9150503d8060008114611d79576040519150601f19603f3d011682016040523d82523d6000602084013e611d7e565b606091505b5091509150818015611d91575080516020145b15611da457611da1816000611f06565b92505b5050919050565b600082821115611dc457611dc4611cb660028585611f12565b50900390565b600082611dd957506000611a42565b82820282848281611de657fe5b041461198d5761198d611cb660018686611f12565b60008282018381101561198d5761198d611cb660008686611f12565b600081611e2d57611e2d611cb660038585611f12565b6000828481611e3857fe5b04949350505050565b73c0a47dfe034b400b47bdad5fecda2621de6c4d9590565b6060632800659560e01b848484604051602401611e7893929190612748565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b600061198d8383611f31565b606063e946c1bb60e01b848484604051602401611e7893929190612726565b60008160200183511015611f5257611f52611cb66005855185602001611e59565b50016020015190565b6040805160608101909152806000815260006020820181905260409091015290565b8035611a42816129a5565b600082601f830112611f98578081fd5b8135611fab611fa682612955565b61292e565b8181529150602080830190840160005b83811015611fe857611fd3876020843589010161205b565b83526020928301929190910190600101611fbb565b5050505092915050565b600082601f830112612002578081fd5b8135612010611fa682612955565b81815291506020808301908481018184028601820187101561203157600080fd5b60005b8481101561205057813584529282019290820190600101612034565b505050505092915050565b600082601f83011261206b578081fd5b813567ffffffffffffffff811115612081578182fd5b6120b260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161292e565b91508082528360208285010111156120c957600080fd5b8060208401602084013760009082016020015292915050565b8035600f81900b8114611a4257600080fd5b60006101c0808385031215612107578182fd5b6121108161292e565b91505061211d8383611f7d565b815261212c8360208401611f7d565b602082015261213e8360408401611f7d565b60408201526121508360608401611f7d565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff808211156121b257600080fd5b6121be8683870161205b565b838501526101609250828501359150808211156121da57600080fd5b6121e68683870161205b565b8385015261018092508285013591508082111561220257600080fd5b61220e8683870161205b565b838501526101a092508285013591508082111561222a57600080fd5b506122378582860161205b565b82840152505092915050565b600060208284031215612254578081fd5b815161198d816129a5565b600080600060608486031215612273578182fd5b833561227e816129a5565b9250602084013561228e816129a5565b9150604084013561229e816129a5565b809150509250925092565b600080600080608085870312156122be578081fd5b84356122c9816129a5565b935060208501356122d9816129a5565b925060408501356122e9816129a5565b9150606085013567ffffffffffffffff811115612304578182fd5b61231087828801611ff2565b91505092959194509250565b600080600060608486031215612330578283fd5b833561233b816129a5565b9250602084013561234b816129a5565b9150604084013567ffffffffffffffff811115612366578182fd5b61237286828701611ff2565b9150509250925092565b60008060008060808587031215612391578182fd5b843561239c816129a5565b93506123ab86602087016120e2565b92506122e986604087016120e2565b600080602083850312156123cc578182fd5b823567ffffffffffffffff808211156123e3578384fd5b81850186601f8201126123f4578485fd5b8035925081831115612404578485fd5b8660208085028301011115612417578485fd5b60200196919550909350505050565b60008060408385031215612438578182fd5b823567ffffffffffffffff8082111561244f578384fd5b81850186601f820112612460578485fd5b80359250612470611fa684612955565b83815260208082019190838101885b878110156124a8576124968c8484358901016120f4565b8552938201939082019060010161247f565b509197508801359450505050808211156124c0578283fd5b506124cd85828601611f88565b9150509250929050565b600080600083850360a08112156124ec578182fd5b60608112156124f9578182fd5b50612504606061292e565b845160078110612512578283fd5b81526020858101519082015260408086015190820152606085015160808601519194509250801515811461229e578182fd5b600060208284031215612555578081fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845261258e816020860160208601612975565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000828483379101908152919050565b600082516125e2818460208701612975565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b6000602080830181845280855180835260408601915060408482028701019250838701855b828110156126d6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526126c4858351612576565b9450928501929085019060010161268a565b5092979650505050505050565b602080825282518282018190526000918401906040840190835b8181101561271b5783518352602093840193909201916001016126fd565b509095945050505050565b606081016004851061273457fe5b938152602081019290925260409091015290565b606081016008851061273457fe5b600f93840b81529190920b6020820152604081019190915260600190565b60208082526025908201527f455243323042726964676553616d706c65722f494e56414c49445f544f4b454e60408201527f5f50414952000000000000000000000000000000000000000000000000000000606082015260800190565b6000604082526127e560408301855161255c565b60208401516127f7606084018261255c565b50604084015161280a608084018261255c565b50606084015161281d60a084018261255c565b50608084015160c083015260a084015160e083015260c0840151610100818185015260e086015191506101208281860152818701519250610140915082828601528087015192505061016082818601528187015192506101c09150610180828187015261288e610200870185612576565b8289015194507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc092506101a08388830301818901526128cd8287612576565b838b015196508489820301868a01526128e68188612576565b955050808a0151955050505080858303016101e0860152506129088183612576565b848103602086015261291a8187612576565b979650505050505050565b90815260200190565b60405181810167ffffffffffffffff8111828210171561294d57600080fd5b604052919050565b600067ffffffffffffffff82111561296b578081fd5b5060209081020190565b60005b83811015612990578181015183820152602001612978565b8381111561299f576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff811681146129c757600080fd5b5056fea365627a7a7231582034e7eab64809a5ab7420c524f487ac0ca03a80f2b355b2d12a392dde2df0522e6c6578706572696d656e74616cf564736f6c63430005100040", - "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2A0D DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0xD4 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x68BE3CF2 GT PUSH2 0x81 JUMPI DUP1 PUSH4 0x9F76AD35 GT PUSH2 0x5B JUMPI DUP1 PUSH4 0x9F76AD35 EQ PUSH2 0x1A7 JUMPI DUP1 PUSH4 0xA2C28D4B EQ PUSH2 0x1BA JUMPI DUP1 PUSH4 0xC7F7142E EQ PUSH2 0x1CD JUMPI PUSH2 0xD4 JUMP JUMPDEST DUP1 PUSH4 0x68BE3CF2 EQ PUSH2 0x161 JUMPI DUP1 PUSH4 0x6DD6B78D EQ PUSH2 0x181 JUMPI DUP1 PUSH4 0x8B123A02 EQ PUSH2 0x194 JUMPI PUSH2 0xD4 JUMP JUMPDEST DUP1 PUSH4 0x59F515D0 GT PUSH2 0xB2 JUMPI DUP1 PUSH4 0x59F515D0 EQ PUSH2 0x128 JUMPI DUP1 PUSH4 0x60EE052A EQ PUSH2 0x13B JUMPI DUP1 PUSH4 0x64EE6ADE EQ PUSH2 0x14E JUMPI PUSH2 0xD4 JUMP JUMPDEST DUP1 PUSH4 0x354152A3 EQ PUSH2 0xD9 JUMPI DUP1 PUSH4 0x4703A7E6 EQ PUSH2 0x102 JUMPI DUP1 PUSH4 0x4CB8E253 EQ PUSH2 0x115 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xEC PUSH2 0xE7 CALLDATASIZE PUSH1 0x4 PUSH2 0x237C JUMP JUMPDEST PUSH2 0x1ED JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xF9 SWAP2 SWAP1 PUSH2 0x26E3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xEC PUSH2 0x110 CALLDATASIZE PUSH1 0x4 PUSH2 0x231C JUMP JUMPDEST PUSH2 0x3BE JUMP JUMPDEST PUSH2 0xEC PUSH2 0x123 CALLDATASIZE PUSH1 0x4 PUSH2 0x231C JUMP JUMPDEST PUSH2 0x59A JUMP JUMPDEST PUSH2 0xEC PUSH2 0x136 CALLDATASIZE PUSH1 0x4 PUSH2 0x2426 JUMP JUMPDEST PUSH2 0x88A JUMP JUMPDEST PUSH2 0xEC PUSH2 0x149 CALLDATASIZE PUSH1 0x4 PUSH2 0x231C JUMP JUMPDEST PUSH2 0x933 JUMP JUMPDEST PUSH2 0xEC PUSH2 0x15C CALLDATASIZE PUSH1 0x4 PUSH2 0x231C JUMP JUMPDEST PUSH2 0xBF3 JUMP JUMPDEST PUSH2 0x174 PUSH2 0x16F CALLDATASIZE PUSH1 0x4 PUSH2 0x23BA JUMP JUMPDEST PUSH2 0xDB9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xF9 SWAP2 SWAP1 PUSH2 0x2665 JUMP JUMPDEST PUSH2 0xEC PUSH2 0x18F CALLDATASIZE PUSH1 0x4 PUSH2 0x231C JUMP JUMPDEST PUSH2 0xEF8 JUMP JUMPDEST PUSH2 0xEC PUSH2 0x1A2 CALLDATASIZE PUSH1 0x4 PUSH2 0x2426 JUMP JUMPDEST PUSH2 0x11A0 JUMP JUMPDEST PUSH2 0xEC PUSH2 0x1B5 CALLDATASIZE PUSH1 0x4 PUSH2 0x22A9 JUMP JUMPDEST PUSH2 0x1468 JUMP JUMPDEST PUSH2 0xEC PUSH2 0x1C8 CALLDATASIZE PUSH1 0x4 PUSH2 0x22A9 JUMP JUMPDEST PUSH2 0x166D JUMP JUMPDEST PUSH2 0x1E0 PUSH2 0x1DB CALLDATASIZE PUSH1 0x4 PUSH2 0x225F JUMP JUMPDEST PUSH2 0x1859 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xF9 SWAP2 SWAP1 PUSH2 0x25EC JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP3 MLOAD SWAP1 POP DUP1 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x21F JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x3B4 JUMPI PUSH1 0x0 PUSH1 0x60 DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH3 0x927C0 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x7211EF7 SWAP1 POP PUSH1 0xE0 SHL DUP11 DUP11 DUP11 DUP9 DUP2 MLOAD DUP2 LT PUSH2 0x27C JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x296 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2756 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE SWAP1 MLOAD PUSH2 0x31F SWAP2 SWAP1 PUSH2 0x25D0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x35B JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x360 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x0 DUP3 ISZERO PUSH2 0x389 JUMPI DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x382 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2544 JUMP JUMPDEST SWAP1 POP PUSH2 0x391 JUMP JUMPDEST POP POP POP PUSH2 0x3B4 JUMP JUMPDEST DUP1 DUP7 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0x39E JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE POP POP POP PUSH1 0x1 ADD PUSH2 0x225 JUMP JUMPDEST POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x3CA DUP4 DUP6 PUSH2 0x1994 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE PUSH1 0x20 DUP1 DUP5 MUL DUP3 ADD ADD SWAP1 SWAP2 MSTORE DUP2 DUP1 ISZERO PUSH2 0x3F5 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x591 JUMPI PUSH1 0x0 PUSH1 0x60 PUSH2 0x40F PUSH2 0x1A07 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH3 0xF4240 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xFF1FD974 SWAP1 POP PUSH1 0xE0 SHL DUP11 DUP11 DUP11 DUP9 DUP2 MLOAD DUP2 LT PUSH2 0x459 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x473 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2634 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE SWAP1 MLOAD PUSH2 0x4FC SWAP2 SWAP1 PUSH2 0x25D0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x538 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x53D JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x0 DUP3 ISZERO PUSH2 0x566 JUMPI DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x55F SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2544 JUMP JUMPDEST SWAP1 POP PUSH2 0x56E JUMP JUMPDEST POP POP POP PUSH2 0x591 JUMP JUMPDEST DUP1 DUP7 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0x57B JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE POP POP POP PUSH1 0x1 ADD PUSH2 0x3FB JUMP JUMPDEST POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x5A6 DUP4 DUP6 PUSH2 0x1994 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5B0 PUSH2 0x1A1F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x5E8 JUMPI DUP5 PUSH2 0x5FE JUMP JUMPDEST PUSH20 0xEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x60A PUSH2 0x1A1F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x642 JUMPI DUP5 PUSH2 0x658 JUMP JUMPDEST PUSH20 0xEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x665 DUP8 PUSH2 0x1A37 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 POP PUSH1 0x0 PUSH2 0x675 DUP8 PUSH2 0x1A37 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 POP PUSH1 0x0 DUP7 MLOAD SWAP1 POP DUP1 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x6AA JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP6 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x87D JUMPI PUSH1 0x0 PUSH1 0x60 PUSH2 0x6C4 PUSH2 0x1A48 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH3 0x16E360 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x809A9E55 SWAP1 POP PUSH1 0xE0 SHL DUP11 DUP11 DUP15 DUP9 DUP2 MLOAD DUP2 LT PUSH2 0x70E JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x728 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2634 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE SWAP1 MLOAD PUSH2 0x7B1 SWAP2 SWAP1 PUSH2 0x25D0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x7ED JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x7F2 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x0 DUP3 ISZERO PUSH2 0x81B JUMPI DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x814 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2544 JUMP JUMPDEST SWAP1 POP PUSH2 0x823 JUMP JUMPDEST POP POP POP PUSH2 0x87D JUMP JUMPDEST PUSH8 0xDE0B6B3A7640000 DUP8 PUSH1 0xA EXP DUP8 PUSH1 0xA EXP DUP14 DUP8 DUP2 MLOAD DUP2 LT PUSH2 0x840 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP5 MUL MUL DUP2 PUSH2 0x852 JUMPI INVALID JUMPDEST DIV DUP2 PUSH2 0x85A JUMPI INVALID JUMPDEST DIV DUP11 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0x867 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE POP POP POP PUSH1 0x1 ADD PUSH2 0x6B0 JUMP JUMPDEST POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x896 DUP4 DUP4 PUSH2 0x11A0 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 JUMPDEST DUP4 MLOAD DUP2 LT ISZERO PUSH2 0x92C JUMPI DUP2 DUP2 DUP2 MLOAD DUP2 LT PUSH2 0x8B0 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x0 EQ PUSH2 0x924 JUMPI PUSH2 0x90B DUP3 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x8CE JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP6 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x8E2 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP7 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x8FA JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x80 ADD MLOAD PUSH2 0x1A60 JUMP JUMPDEST DUP3 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x917 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP JUMPDEST PUSH1 0x1 ADD PUSH2 0x89B JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x93F DUP4 DUP6 PUSH2 0x1994 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE PUSH1 0x20 DUP1 DUP5 MUL DUP3 ADD ADD SWAP1 SWAP2 MSTORE DUP2 DUP1 ISZERO PUSH2 0x96A JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 PUSH2 0x977 PUSH2 0x1A1F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x9B7 JUMPI PUSH2 0x9B2 DUP7 PUSH2 0x1AA2 JUMP JUMPDEST PUSH2 0x9BA JUMP JUMPDEST PUSH1 0x0 JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x9C6 PUSH2 0x1A1F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xA06 JUMPI PUSH2 0xA01 DUP7 PUSH2 0x1AA2 JUMP JUMPDEST PUSH2 0xA09 JUMP JUMPDEST PUSH1 0x0 JUMPDEST SWAP1 POP PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xBE8 JUMPI PUSH1 0x1 PUSH2 0xA20 PUSH2 0x1A1F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xAB7 JUMPI DUP7 MLOAD PUSH2 0xA96 SWAP1 DUP6 SWAP1 PUSH32 0x2640F62C00000000000000000000000000000000000000000000000000000000 SWAP1 DUP11 SWAP1 DUP7 SWAP1 DUP2 LT PUSH2 0xA89 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x1B34 JUMP JUMPDEST DUP8 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0xAA2 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP4 POP DUP3 DUP2 MSTORE POP POP POP PUSH2 0xBD4 JUMP JUMPDEST PUSH2 0xABF PUSH2 0x1A1F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xB28 JUMPI DUP7 MLOAD PUSH2 0xA96 SWAP1 DUP5 SWAP1 PUSH32 0x59E9486200000000000000000000000000000000000000000000000000000000 SWAP1 DUP11 SWAP1 DUP7 SWAP1 DUP2 LT PUSH2 0xA89 JUMPI INVALID JUMPDEST DUP7 MLOAD PUSH1 0x0 SWAP1 PUSH2 0xB61 SWAP1 DUP6 SWAP1 PUSH32 0x59E9486200000000000000000000000000000000000000000000000000000000 SWAP1 DUP12 SWAP1 DUP8 SWAP1 DUP2 LT PUSH2 0xA89 JUMPI INVALID JUMPDEST SWAP3 POP SWAP1 POP DUP1 ISZERO PUSH2 0xBB7 JUMPI PUSH2 0xB96 DUP6 PUSH32 0x2640F62C00000000000000000000000000000000000000000000000000000000 DUP4 PUSH2 0x1B34 JUMP JUMPDEST DUP9 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0xBA2 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP5 POP DUP3 DUP2 MSTORE POP POP POP PUSH2 0xBD2 JUMP JUMPDEST PUSH1 0x0 DUP8 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0xBC5 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP JUMPDEST POP JUMPDEST DUP1 PUSH2 0xBDF JUMPI POP PUSH2 0xBE8 JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0xA0E JUMP JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0xBFF DUP4 DUP6 PUSH2 0x1994 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE PUSH1 0x20 DUP1 DUP5 MUL DUP3 ADD ADD SWAP1 SWAP2 MSTORE DUP2 DUP1 ISZERO PUSH2 0xC2A JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x591 JUMPI PUSH1 0x0 PUSH1 0x60 PUSH2 0xC44 PUSH2 0x1A07 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH3 0xF4240 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x144A2752 SWAP1 POP PUSH1 0xE0 SHL DUP10 DUP12 DUP11 DUP9 DUP2 MLOAD DUP2 LT PUSH2 0xC8E JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0xCA8 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2634 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE SWAP1 MLOAD PUSH2 0xD31 SWAP2 SWAP1 PUSH2 0x25D0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0xD6D JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xD72 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x0 DUP3 ISZERO PUSH2 0x566 JUMPI DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0xD94 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2544 JUMP JUMPDEST SWAP1 POP DUP1 DUP7 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0xDA3 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE POP POP POP PUSH1 0x1 ADD PUSH2 0xC30 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE PUSH1 0x20 DUP1 DUP5 MUL DUP3 ADD ADD SWAP1 SWAP2 MSTORE PUSH1 0x60 SWAP1 DUP3 DUP1 ISZERO PUSH2 0xDEF JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0xDDA JUMPI SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP1 DUP4 EQ PUSH2 0x92C JUMPI PUSH1 0x0 PUSH1 0x60 ADDRESS DUP7 DUP7 DUP6 DUP2 DUP2 LT PUSH2 0xE0D JUMPI INVALID JUMPDEST PUSH1 0x20 MUL DUP3 ADD SWAP1 POP DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0xE47 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP2 ADD PUSH1 0x20 DUP2 ADD SWAP2 POP CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xE66 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0xE76 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xE84 SWAP3 SWAP2 SWAP1 PUSH2 0x25C0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0xEBF JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xEC4 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0xED6 JUMPI DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST DUP1 DUP5 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0xEE3 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE POP POP PUSH1 0x1 ADD PUSH2 0xDF5 JUMP JUMPDEST PUSH1 0x60 PUSH2 0xF04 DUP4 DUP6 PUSH2 0x1994 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE PUSH1 0x20 DUP1 DUP5 MUL DUP3 ADD ADD SWAP1 SWAP2 MSTORE DUP2 DUP1 ISZERO PUSH2 0xF2F JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 PUSH2 0xF3C PUSH2 0x1A1F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xF7C JUMPI PUSH2 0xF77 DUP7 PUSH2 0x1AA2 JUMP JUMPDEST PUSH2 0xF7F JUMP JUMPDEST PUSH1 0x0 JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xF8B PUSH2 0x1A1F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xFCB JUMPI PUSH2 0xFC6 DUP7 PUSH2 0x1AA2 JUMP JUMPDEST PUSH2 0xFCE JUMP JUMPDEST PUSH1 0x0 JUMPDEST SWAP1 POP PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xBE8 JUMPI PUSH1 0x1 PUSH2 0xFE5 PUSH2 0x1A1F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x106F JUMPI DUP7 MLOAD PUSH2 0x104E SWAP1 DUP6 SWAP1 PUSH32 0x95B68FE700000000000000000000000000000000000000000000000000000000 SWAP1 DUP11 SWAP1 DUP7 SWAP1 DUP2 LT PUSH2 0xA89 JUMPI INVALID JUMPDEST DUP8 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x105A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP4 POP DUP3 DUP2 MSTORE POP POP POP PUSH2 0x118C JUMP JUMPDEST PUSH2 0x1077 PUSH2 0x1A1F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x10E0 JUMPI DUP7 MLOAD PUSH2 0x104E SWAP1 DUP5 SWAP1 PUSH32 0xCD7724C300000000000000000000000000000000000000000000000000000000 SWAP1 DUP11 SWAP1 DUP7 SWAP1 DUP2 LT PUSH2 0xA89 JUMPI INVALID JUMPDEST DUP7 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x1119 SWAP1 DUP7 SWAP1 PUSH32 0x95B68FE700000000000000000000000000000000000000000000000000000000 SWAP1 DUP12 SWAP1 DUP8 SWAP1 DUP2 LT PUSH2 0xA89 JUMPI INVALID JUMPDEST SWAP3 POP SWAP1 POP DUP1 ISZERO PUSH2 0x116F JUMPI PUSH2 0x114E DUP5 PUSH32 0xCD7724C300000000000000000000000000000000000000000000000000000000 DUP4 PUSH2 0x1B34 JUMP JUMPDEST DUP9 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0x115A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP5 POP DUP3 DUP2 MSTORE POP POP POP PUSH2 0x118A JUMP JUMPDEST PUSH1 0x0 DUP8 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x117D JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP JUMPDEST POP JUMPDEST DUP1 PUSH2 0x1197 JUMPI POP PUSH2 0xBE8 JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0xFD3 JUMP JUMPDEST PUSH1 0x60 DUP3 MLOAD PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x11CD JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP4 MLOAD DUP2 EQ PUSH2 0x92C JUMPI DUP3 DUP2 DUP2 MLOAD DUP2 LT PUSH2 0x11E7 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD MLOAD PUSH1 0x0 EQ DUP1 PUSH2 0x1215 JUMPI POP DUP4 DUP2 DUP2 MLOAD DUP2 LT PUSH2 0x1205 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x80 ADD MLOAD PUSH1 0x0 EQ JUMPDEST DUP1 PUSH2 0x1237 JUMPI POP DUP4 DUP2 DUP2 MLOAD DUP2 LT PUSH2 0x1227 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0xA0 ADD MLOAD PUSH1 0x0 EQ JUMPDEST ISZERO PUSH2 0x125B JUMPI PUSH1 0x0 DUP3 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x124A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP PUSH2 0x1460 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH2 0x1267 PUSH2 0x1C7D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH3 0x7A120 PUSH2 0x1289 PUSH2 0x1C7D JUMP JUMPDEST POP DUP8 MLOAD PUSH32 0xE77286EB00000000000000000000000000000000000000000000000000000000 SWAP1 DUP10 SWAP1 DUP8 SWAP1 DUP2 LT PUSH2 0x12BA JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP9 DUP8 DUP2 MLOAD DUP2 LT PUSH2 0x12CE JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x12E7 SWAP3 SWAP2 SWAP1 PUSH2 0x27D1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE SWAP1 MLOAD PUSH2 0x1370 SWAP2 SWAP1 PUSH2 0x25D0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x13AC JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x13B1 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x13DC JUMPI PUSH1 0x0 DUP5 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x13C9 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP POP POP PUSH2 0x1460 JUMP JUMPDEST PUSH2 0x13E4 PUSH2 0x1F5B JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x13FB SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x24D7 JUMP JUMPDEST SWAP2 SWAP5 POP SWAP3 POP SWAP1 POP PUSH1 0x3 DUP4 MLOAD PUSH1 0x6 DUP2 GT ISZERO PUSH2 0x1411 JUMPI INVALID JUMPDEST EQ ISZERO DUP1 PUSH2 0x141C JUMPI POP DUP1 ISZERO JUMPDEST ISZERO PUSH2 0x1440 JUMPI PUSH1 0x0 DUP8 DUP8 DUP2 MLOAD DUP2 LT PUSH2 0x142F JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP PUSH2 0x145A JUMP JUMPDEST DUP2 DUP8 DUP8 DUP2 MLOAD DUP2 LT PUSH2 0x144D JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP JUMPDEST POP POP POP POP POP JUMPDEST PUSH1 0x1 ADD PUSH2 0x11D3 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP3 MLOAD SWAP1 POP DUP1 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x149A JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 PUSH2 0x14AA DUP8 DUP8 DUP8 PUSH2 0x1859 JUMP JUMPDEST SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x14CF JUMPI POP PUSH2 0x1665 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x1661 JUMPI PUSH1 0x0 PUSH1 0x60 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH3 0x30D40 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x343FBCDD SWAP1 POP PUSH1 0xE0 SHL DUP12 DUP12 DUP12 DUP9 DUP2 MLOAD DUP2 LT PUSH2 0x1529 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1543 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2634 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE SWAP1 MLOAD PUSH2 0x15CC SWAP2 SWAP1 PUSH2 0x25D0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1608 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x160D JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x0 DUP3 ISZERO PUSH2 0x1636 JUMPI DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x162F SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2544 JUMP JUMPDEST SWAP1 POP PUSH2 0x163E JUMP JUMPDEST POP POP POP PUSH2 0x1661 JUMP JUMPDEST DUP1 DUP8 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0x164B JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE POP POP POP PUSH1 0x1 ADD PUSH2 0x14D2 JUMP JUMPDEST POP POP POP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP3 MLOAD SWAP1 POP DUP1 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x169F JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 PUSH2 0x16AF DUP8 DUP8 DUP8 PUSH2 0x1859 JUMP JUMPDEST SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x16D4 JUMPI POP PUSH2 0x1665 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x1661 JUMPI PUSH1 0x0 PUSH1 0x60 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH3 0x30D40 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x45060EB0 SWAP1 POP PUSH1 0xE0 SHL DUP12 DUP12 DUP12 DUP9 DUP2 MLOAD DUP2 LT PUSH2 0x172E JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1748 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2634 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE SWAP1 MLOAD PUSH2 0x17D1 SWAP2 SWAP1 PUSH2 0x25D0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x180D JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1812 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x0 DUP3 ISZERO PUSH2 0x1636 JUMPI DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x1834 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2544 JUMP JUMPDEST SWAP1 POP DUP1 DUP8 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0x1843 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE POP POP POP PUSH1 0x1 ADD PUSH2 0x16D7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 PUSH1 0x60 SWAP1 PUSH32 0x153F599700000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0x1894 SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x24 ADD PUSH2 0x260D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP SWAP1 POP PUSH1 0x0 PUSH1 0x60 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x40 MLOAD PUSH2 0x191C SWAP2 SWAP1 PUSH2 0x25D0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1957 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x195C JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x196F JUMPI POP DUP1 MLOAD PUSH1 0x20 EQ JUMPDEST ISZERO PUSH2 0x1989 JUMPI PUSH2 0x197F DUP2 PUSH1 0xC PUSH2 0x1C95 JUMP JUMPDEST SWAP4 POP POP POP POP PUSH2 0x198D JUMP JUMPDEST POP POP POP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x1A03 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x19FA SWAP1 PUSH2 0x2774 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP JUMP JUMPDEST PUSH20 0x794E6E91555438AFC3CCF1C5076A74F42133D08D SWAP1 JUMP JUMPDEST PUSH20 0xC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2 SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1A42 DUP3 PUSH2 0x1CDA JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0x818E6FECD516ECC3849DAF6845E3EC868087B755 SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1665 DUP4 PUSH2 0x1A96 PUSH2 0x1A7A DUP3 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x1DAB AND JUMP JUMPDEST PUSH2 0x1A8A DUP9 DUP8 PUSH4 0xFFFFFFFF PUSH2 0x1DCA AND JUMP JUMPDEST SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1DFB AND JUMP JUMPDEST SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1E17 AND JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1AAC PUSH2 0x1E41 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x6F2BF62 DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1AE4 SWAP2 SWAP1 PUSH2 0x25EC JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1AFC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1B10 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x1A42 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2243 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH2 0x1B57 JUMPI PUSH2 0x1C75 JUMP JUMPDEST PUSH1 0x60 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH3 0x249F0 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1B86 SWAP2 SWAP1 PUSH2 0x2925 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE SWAP1 MLOAD PUSH2 0x1C0F SWAP2 SWAP1 PUSH2 0x25D0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1C4B JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1C50 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP DUP2 ISZERO PUSH2 0x1C73 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x1C70 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2544 JUMP JUMPDEST SWAP3 POP JUMPDEST POP JUMPDEST SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH20 0x74134CF88B21383713E096A5ECF59E297DC7F547 SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO PUSH2 0x1CBB JUMPI PUSH2 0x1CBB PUSH2 0x1CB6 PUSH1 0x4 DUP6 MLOAD DUP6 PUSH1 0x14 ADD PUSH2 0x1E59 JUMP JUMPDEST PUSH2 0x1EFE JUMP JUMPDEST POP ADD PUSH1 0x14 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x12 SWAP1 POP PUSH1 0x0 PUSH1 0x60 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x4 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x313CE56700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x40 MLOAD PUSH2 0x1D3E SWAP2 SWAP1 PUSH2 0x25D0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1D79 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1D7E JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x1D91 JUMPI POP DUP1 MLOAD PUSH1 0x20 EQ JUMPDEST ISZERO PUSH2 0x1DA4 JUMPI PUSH2 0x1DA1 DUP2 PUSH1 0x0 PUSH2 0x1F06 JUMP JUMPDEST SWAP3 POP JUMPDEST POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x1DC4 JUMPI PUSH2 0x1DC4 PUSH2 0x1CB6 PUSH1 0x2 DUP6 DUP6 PUSH2 0x1F12 JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1DD9 JUMPI POP PUSH1 0x0 PUSH2 0x1A42 JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x1DE6 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x198D JUMPI PUSH2 0x198D PUSH2 0x1CB6 PUSH1 0x1 DUP7 DUP7 PUSH2 0x1F12 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x198D JUMPI PUSH2 0x198D PUSH2 0x1CB6 PUSH1 0x0 DUP7 DUP7 PUSH2 0x1F12 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x1E2D JUMPI PUSH2 0x1E2D PUSH2 0x1CB6 PUSH1 0x3 DUP6 DUP6 PUSH2 0x1F12 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP2 PUSH2 0x1E38 JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH20 0xC0A47DFE034B400B47BDAD5FECDA2621DE6C4D95 SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x28006595 PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1E78 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2748 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH1 0x0 PUSH2 0x198D DUP4 DUP4 PUSH2 0x1F31 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xE946C1BB PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1E78 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2726 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH2 0x1F52 JUMPI PUSH2 0x1F52 PUSH2 0x1CB6 PUSH1 0x5 DUP6 MLOAD DUP6 PUSH1 0x20 ADD PUSH2 0x1E59 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD SWAP1 SWAP2 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH2 0x1A42 DUP2 PUSH2 0x29A5 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1F98 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1FAB PUSH2 0x1FA6 DUP3 PUSH2 0x2955 JUMP JUMPDEST PUSH2 0x292E JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 ADD PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1FE8 JUMPI PUSH2 0x1FD3 DUP8 PUSH1 0x20 DUP5 CALLDATALOAD DUP10 ADD ADD PUSH2 0x205B JUMP JUMPDEST DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1FBB JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x2002 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x2010 PUSH2 0x1FA6 DUP3 PUSH2 0x2955 JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 DUP2 ADD DUP2 DUP5 MUL DUP7 ADD DUP3 ADD DUP8 LT ISZERO PUSH2 0x2031 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x2050 JUMPI DUP2 CALLDATALOAD DUP5 MSTORE SWAP3 DUP3 ADD SWAP3 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x2034 JUMP JUMPDEST POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x206B JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2081 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x20B2 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD PUSH2 0x292E JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x20C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP5 ADD CALLDATACOPY PUSH1 0x0 SWAP1 DUP3 ADD PUSH1 0x20 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH1 0xF DUP2 SWAP1 SIGNEXTEND DUP2 EQ PUSH2 0x1A42 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1C0 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x2107 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x2110 DUP2 PUSH2 0x292E JUMP JUMPDEST SWAP2 POP POP PUSH2 0x211D DUP4 DUP4 PUSH2 0x1F7D JUMP JUMPDEST DUP2 MSTORE PUSH2 0x212C DUP4 PUSH1 0x20 DUP5 ADD PUSH2 0x1F7D JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x213E DUP4 PUSH1 0x40 DUP5 ADD PUSH2 0x1F7D JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x2150 DUP4 PUSH1 0x60 DUP5 ADD PUSH2 0x1F7D JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 DUP3 ADD CALLDATALOAD PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 DUP3 ADD CALLDATALOAD PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 DUP3 ADD CALLDATALOAD PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xE0 DUP3 ADD CALLDATALOAD PUSH1 0xE0 DUP3 ADD MSTORE PUSH2 0x100 DUP1 DUP4 ADD CALLDATALOAD DUP2 DUP4 ADD MSTORE POP PUSH2 0x120 DUP1 DUP4 ADD CALLDATALOAD DUP2 DUP4 ADD MSTORE POP PUSH2 0x140 DUP1 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x21B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x21BE DUP7 DUP4 DUP8 ADD PUSH2 0x205B JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x160 SWAP3 POP DUP3 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x21DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x21E6 DUP7 DUP4 DUP8 ADD PUSH2 0x205B JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x180 SWAP3 POP DUP3 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x2202 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x220E DUP7 DUP4 DUP8 ADD PUSH2 0x205B JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x1A0 SWAP3 POP DUP3 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x222A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2237 DUP6 DUP3 DUP7 ADD PUSH2 0x205B JUMP JUMPDEST DUP3 DUP5 ADD MSTORE POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2254 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x198D DUP2 PUSH2 0x29A5 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x2273 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x227E DUP2 PUSH2 0x29A5 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x228E DUP2 PUSH2 0x29A5 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x229E DUP2 PUSH2 0x29A5 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x22BE JUMPI DUP1 DUP2 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x22C9 DUP2 PUSH2 0x29A5 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH2 0x22D9 DUP2 PUSH2 0x29A5 JUMP JUMPDEST SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0x22E9 DUP2 PUSH2 0x29A5 JUMP JUMPDEST SWAP2 POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2304 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x2310 DUP8 DUP3 DUP9 ADD PUSH2 0x1FF2 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x2330 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x233B DUP2 PUSH2 0x29A5 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x234B DUP2 PUSH2 0x29A5 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2366 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x2372 DUP7 DUP3 DUP8 ADD PUSH2 0x1FF2 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x2391 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x239C DUP2 PUSH2 0x29A5 JUMP JUMPDEST SWAP4 POP PUSH2 0x23AB DUP7 PUSH1 0x20 DUP8 ADD PUSH2 0x20E2 JUMP JUMPDEST SWAP3 POP PUSH2 0x22E9 DUP7 PUSH1 0x40 DUP8 ADD PUSH2 0x20E2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x23CC JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x23E3 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP6 ADD DUP7 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x23F4 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP3 POP DUP2 DUP4 GT ISZERO PUSH2 0x2404 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP7 PUSH1 0x20 DUP1 DUP6 MUL DUP4 ADD ADD GT ISZERO PUSH2 0x2417 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH1 0x20 ADD SWAP7 SWAP2 SWAP6 POP SWAP1 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x2438 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x244F JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP6 ADD DUP7 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x2460 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP3 POP PUSH2 0x2470 PUSH2 0x1FA6 DUP5 PUSH2 0x2955 JUMP JUMPDEST DUP4 DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD SWAP2 SWAP1 DUP4 DUP2 ADD DUP9 JUMPDEST DUP8 DUP2 LT ISZERO PUSH2 0x24A8 JUMPI PUSH2 0x2496 DUP13 DUP5 DUP5 CALLDATALOAD DUP10 ADD ADD PUSH2 0x20F4 JUMP JUMPDEST DUP6 MSTORE SWAP4 DUP3 ADD SWAP4 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x247F JUMP JUMPDEST POP SWAP2 SWAP8 POP DUP9 ADD CALLDATALOAD SWAP5 POP POP POP POP DUP1 DUP3 GT ISZERO PUSH2 0x24C0 JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x24CD DUP6 DUP3 DUP7 ADD PUSH2 0x1F88 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 DUP6 SUB PUSH1 0xA0 DUP2 SLT ISZERO PUSH2 0x24EC JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x60 DUP2 SLT ISZERO PUSH2 0x24F9 JUMPI DUP2 DUP3 REVERT JUMPDEST POP PUSH2 0x2504 PUSH1 0x60 PUSH2 0x292E JUMP JUMPDEST DUP5 MLOAD PUSH1 0x7 DUP2 LT PUSH2 0x2512 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP6 DUP2 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x40 DUP1 DUP7 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x60 DUP6 ADD MLOAD PUSH1 0x80 DUP7 ADD MLOAD SWAP2 SWAP5 POP SWAP3 POP DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x229E JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2555 JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x258E DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x2975 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP4 CALLDATACOPY SWAP2 ADD SWAP1 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x25E2 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x2975 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 ADD DUP2 DUP5 MSTORE DUP1 DUP6 MLOAD DUP1 DUP4 MSTORE PUSH1 0x40 DUP7 ADD SWAP2 POP PUSH1 0x40 DUP5 DUP3 MUL DUP8 ADD ADD SWAP3 POP DUP4 DUP8 ADD DUP6 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x26D6 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 DUP9 DUP7 SUB ADD DUP5 MSTORE PUSH2 0x26C4 DUP6 DUP4 MLOAD PUSH2 0x2576 JUMP JUMPDEST SWAP5 POP SWAP3 DUP6 ADD SWAP3 SWAP1 DUP6 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x268A JUMP JUMPDEST POP SWAP3 SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 DUP5 ADD SWAP1 PUSH1 0x40 DUP5 ADD SWAP1 DUP4 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x271B JUMPI DUP4 MLOAD DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x26FD JUMP JUMPDEST POP SWAP1 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH1 0x4 DUP6 LT PUSH2 0x2734 JUMPI INVALID JUMPDEST SWAP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH1 0x8 DUP6 LT PUSH2 0x2734 JUMPI INVALID JUMPDEST PUSH1 0xF SWAP4 DUP5 SIGNEXTEND DUP2 MSTORE SWAP2 SWAP1 SWAP3 SIGNEXTEND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x25 SWAP1 DUP3 ADD MSTORE PUSH32 0x455243323042726964676553616D706C65722F494E56414C49445F544F4B454E PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x5F50414952000000000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 MSTORE PUSH2 0x27E5 PUSH1 0x40 DUP4 ADD DUP6 MLOAD PUSH2 0x255C JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD PUSH2 0x27F7 PUSH1 0x60 DUP5 ADD DUP3 PUSH2 0x255C JUMP JUMPDEST POP PUSH1 0x40 DUP5 ADD MLOAD PUSH2 0x280A PUSH1 0x80 DUP5 ADD DUP3 PUSH2 0x255C JUMP JUMPDEST POP PUSH1 0x60 DUP5 ADD MLOAD PUSH2 0x281D PUSH1 0xA0 DUP5 ADD DUP3 PUSH2 0x255C JUMP JUMPDEST POP PUSH1 0x80 DUP5 ADD MLOAD PUSH1 0xC0 DUP4 ADD MSTORE PUSH1 0xA0 DUP5 ADD MLOAD PUSH1 0xE0 DUP4 ADD MSTORE PUSH1 0xC0 DUP5 ADD MLOAD PUSH2 0x100 DUP2 DUP2 DUP6 ADD MSTORE PUSH1 0xE0 DUP7 ADD MLOAD SWAP2 POP PUSH2 0x120 DUP3 DUP2 DUP7 ADD MSTORE DUP2 DUP8 ADD MLOAD SWAP3 POP PUSH2 0x140 SWAP2 POP DUP3 DUP3 DUP7 ADD MSTORE DUP1 DUP8 ADD MLOAD SWAP3 POP POP PUSH2 0x160 DUP3 DUP2 DUP7 ADD MSTORE DUP2 DUP8 ADD MLOAD SWAP3 POP PUSH2 0x1C0 SWAP2 POP PUSH2 0x180 DUP3 DUP2 DUP8 ADD MSTORE PUSH2 0x288E PUSH2 0x200 DUP8 ADD DUP6 PUSH2 0x2576 JUMP JUMPDEST DUP3 DUP10 ADD MLOAD SWAP5 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 SWAP3 POP PUSH2 0x1A0 DUP4 DUP9 DUP4 SUB ADD DUP2 DUP10 ADD MSTORE PUSH2 0x28CD DUP3 DUP8 PUSH2 0x2576 JUMP JUMPDEST DUP4 DUP12 ADD MLOAD SWAP7 POP DUP5 DUP10 DUP3 SUB ADD DUP7 DUP11 ADD MSTORE PUSH2 0x28E6 DUP2 DUP9 PUSH2 0x2576 JUMP JUMPDEST SWAP6 POP POP DUP1 DUP11 ADD MLOAD SWAP6 POP POP POP POP DUP1 DUP6 DUP4 SUB ADD PUSH2 0x1E0 DUP7 ADD MSTORE POP PUSH2 0x2908 DUP2 DUP4 PUSH2 0x2576 JUMP JUMPDEST DUP5 DUP2 SUB PUSH1 0x20 DUP7 ADD MSTORE PUSH2 0x291A DUP2 DUP8 PUSH2 0x2576 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x294D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x296B JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x2990 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2978 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x299F JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x29C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG3 PUSH6 0x627A7A723158 KECCAK256 CALLVALUE 0xE7 0xEA 0xB6 0x48 MULMOD 0xA5 0xAB PUSH21 0x20C524F487AC0CA03A80F2B355B2D12A392DDE2DF0 MSTORE 0x2E PUSH13 0x6578706572696D656E74616CF5 PUSH5 0x736F6C6343 STOP SDIV LT STOP BLOCKHASH ", - "sourceMap": "1303:24401:2:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1303:24401:2;;;;;;;" - }, - "deployedBytecode": { - "linkReferences": {}, - "object": "0x608060405234801561001057600080fd5b50600436106100d45760003560e01c806368be3cf2116100815780639f76ad351161005b5780639f76ad35146101a7578063a2c28d4b146101ba578063c7f7142e146101cd576100d4565b806368be3cf2146101615780636dd6b78d146101815780638b123a0214610194576100d4565b806359f515d0116100b257806359f515d01461012857806360ee052a1461013b57806364ee6ade1461014e576100d4565b8063354152a3146100d95780634703a7e6146101025780634cb8e25314610115575b600080fd5b6100ec6100e736600461237c565b6101ed565b6040516100f991906126e3565b60405180910390f35b6100ec61011036600461231c565b6103be565b6100ec61012336600461231c565b61059a565b6100ec610136366004612426565b61088a565b6100ec61014936600461231c565b610933565b6100ec61015c36600461231c565b610bf3565b61017461016f3660046123ba565b610db9565b6040516100f99190612665565b6100ec61018f36600461231c565b610ef8565b6100ec6101a2366004612426565b6111a0565b6100ec6101b53660046122a9565b611468565b6100ec6101c83660046122a9565b61166d565b6101e06101db36600461225f565b611859565b6040516100f991906125ec565b60606000825190508060405190808252806020026020018201604052801561021f578160200160208202803883390190505b50915060005b818110156103b457600060608873ffffffffffffffffffffffffffffffffffffffff16620927c0600073ffffffffffffffffffffffffffffffffffffffff166307211ef7905060e01b8a8a8a888151811061027c57fe5b602002602001015160405160240161029693929190612756565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161031f91906125d0565b6000604051808303818686fa925050503d806000811461035b576040519150601f19603f3d011682016040523d82523d6000602084013e610360565b606091505b5090925090506000821561038957818060200190516103829190810190612544565b9050610391565b5050506103b4565b8086858151811061039e57fe5b6020908102919091010152505050600101610225565b5050949350505050565b60606103ca8385611994565b81516040805182815260208084028201019091528180156103f5578160200160208202803883390190505b50915060005b81811015610591576000606061040f611a07565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663ff1fd974905060e01b8a8a8a888151811061045957fe5b602002602001015160405160240161047393929190612634565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516104fc91906125d0565b6000604051808303818686fa925050503d8060008114610538576040519150601f19603f3d011682016040523d82523d6000602084013e61053d565b606091505b50909250905060008215610566578180602001905161055f9190810190612544565b905061056e565b505050610591565b8086858151811061057b57fe5b60209081029190910101525050506001016103fb565b50509392505050565b60606105a68385611994565b60006105b0611a1f565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146105e857846105fe565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b9050600061060a611a1f565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146106425784610658565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b9050600061066587611a37565b60ff169050600061067587611a37565b60ff169050600086519050806040519080825280602002602001820160405280156106aa578160200160208202803883390190505b50955060005b8181101561087d57600060606106c4611a48565b73ffffffffffffffffffffffffffffffffffffffff166216e360600073ffffffffffffffffffffffffffffffffffffffff1663809a9e55905060e01b8a8a8e888151811061070e57fe5b602002602001015160405160240161072893929190612634565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516107b191906125d0565b6000604051808303818686fa925050503d80600081146107ed576040519150601f19603f3d011682016040523d82523d6000602084013e6107f2565b606091505b5090925090506000821561081b57818060200190516108149190810190612544565b9050610823565b50505061087d565b670de0b6b3a764000087600a0a87600a0a8d878151811061084057fe5b60200260200101518402028161085257fe5b048161085a57fe5b048a858151811061086757fe5b60209081029190910101525050506001016106b0565b5050505050509392505050565b606061089683836111a0565b905060005b835181101561092c578181815181106108b057fe5b60200260200101516000146109245761090b8282815181106108ce57fe5b60200260200101518583815181106108e257fe5b602002602001015160a001518684815181106108fa57fe5b602002602001015160800151611a60565b82828151811061091757fe5b6020026020010181815250505b60010161089b565b5092915050565b606061093f8385611994565b815160408051828152602080840282010190915281801561096a578160200160208202803883390190505b5091506000610977611a1f565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146109b7576109b286611aa2565b6109ba565b60005b905060006109c6611a1f565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610a0657610a0186611aa2565b610a09565b60005b905060005b83811015610be8576001610a20611a1f565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415610ab7578651610a969085907f2640f62c00000000000000000000000000000000000000000000000000000000908a9086908110610a8957fe5b6020026020010151611b34565b878481518110610aa257fe5b60200260200101819350828152505050610bd4565b610abf611a1f565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161415610b28578651610a969084907f59e9486200000000000000000000000000000000000000000000000000000000908a9086908110610a8957fe5b8651600090610b619085907f59e9486200000000000000000000000000000000000000000000000000000000908b9087908110610a8957fe5b925090508015610bb757610b96857f2640f62c0000000000000000000000000000000000000000000000000000000083611b34565b888581518110610ba257fe5b60200260200101819450828152505050610bd2565b6000878481518110610bc557fe5b6020026020010181815250505b505b80610bdf5750610be8565b50600101610a0e565b505050509392505050565b6060610bff8385611994565b8151604080518281526020808402820101909152818015610c2a578160200160208202803883390190505b50915060005b818110156105915760006060610c44611a07565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663144a2752905060e01b898b8a8881518110610c8e57fe5b6020026020010151604051602401610ca893929190612634565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051610d3191906125d0565b6000604051808303818686fa925050503d8060008114610d6d576040519150601f19603f3d011682016040523d82523d6000602084013e610d72565b606091505b509092509050600082156105665781806020019051610d949190810190612544565b905080868581518110610da357fe5b6020908102919091010152505050600101610c30565b604080518281526020808402820101909152606090828015610def57816020015b6060815260200190600190039081610dda5790505b50905060005b80831461092c576000606030868685818110610e0d57fe5b6020028201905080357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe136849003018112610e4757600080fd5b9091016020810191503567ffffffffffffffff811115610e6657600080fd5b36819003821315610e7657600080fd5b604051610e849291906125c0565b600060405180830381855afa9150503d8060008114610ebf576040519150601f19603f3d011682016040523d82523d6000602084013e610ec4565b606091505b509150915081610ed657805160208201fd5b80848481518110610ee357fe5b60209081029190910101525050600101610df5565b6060610f048385611994565b8151604080518281526020808402820101909152818015610f2f578160200160208202803883390190505b5091506000610f3c611a1f565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610f7c57610f7786611aa2565b610f7f565b60005b90506000610f8b611a1f565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610fcb57610fc686611aa2565b610fce565b60005b905060005b83811015610be8576001610fe5611a1f565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16141561106f57865161104e9085907f95b68fe700000000000000000000000000000000000000000000000000000000908a9086908110610a8957fe5b87848151811061105a57fe5b6020026020010181935082815250505061118c565b611077611a1f565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614156110e057865161104e9084907fcd7724c300000000000000000000000000000000000000000000000000000000908a9086908110610a8957fe5b86516000906111199086907f95b68fe700000000000000000000000000000000000000000000000000000000908b9087908110610a8957fe5b92509050801561116f5761114e847fcd7724c30000000000000000000000000000000000000000000000000000000083611b34565b88858151811061115a57fe5b6020026020010181945082815250505061118a565b600087848151811061117d57fe5b6020026020010181815250505b505b806111975750610be8565b50600101610fd3565b606082516040519080825280602002602001820160405280156111cd578160200160208202803883390190505b50905060005b8351811461092c578281815181106111e757fe5b60200260200101515160001480611215575083818151811061120557fe5b6020026020010151608001516000145b80611237575083818151811061122757fe5b602002602001015160a001516000145b1561125b57600082828151811061124a57fe5b602002602001018181525050611460565b60006060611267611c7d565b73ffffffffffffffffffffffffffffffffffffffff166207a120611289611c7d565b5087517fe77286eb00000000000000000000000000000000000000000000000000000000908990879081106112ba57fe5b60200260200101518887815181106112ce57fe5b60200260200101516040516024016112e79291906127d1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161137091906125d0565b6000604051808303818686fa925050503d80600081146113ac576040519150601f19603f3d011682016040523d82523d6000602084013e6113b1565b606091505b5091509150816113dc5760008484815181106113c957fe5b6020026020010181815250505050611460565b6113e4611f5b565b600080838060200190516113fb91908101906124d7565b9194509250905060038351600681111561141157fe5b14158061141c575080155b1561144057600087878151811061142f57fe5b60200260200101818152505061145a565b8187878151811061144d57fe5b6020026020010181815250505b50505050505b6001016111d3565b60606000825190508060405190808252806020026020018201604052801561149a578160200160208202803883390190505b50915060006114aa878787611859565b905073ffffffffffffffffffffffffffffffffffffffff81166114cf57506116659050565b60005b8281101561166157600060608373ffffffffffffffffffffffffffffffffffffffff1662030d40600073ffffffffffffffffffffffffffffffffffffffff1663343fbcdd905060e01b8b8b8b888151811061152957fe5b602002602001015160405160240161154393929190612634565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516115cc91906125d0565b6000604051808303818686fa925050503d8060008114611608576040519150601f19603f3d011682016040523d82523d6000602084013e61160d565b606091505b50909250905060008215611636578180602001905161162f9190810190612544565b905061163e565b505050611661565b8087858151811061164b57fe5b60209081029190910101525050506001016114d2565b5050505b949350505050565b60606000825190508060405190808252806020026020018201604052801561169f578160200160208202803883390190505b50915060006116af878787611859565b905073ffffffffffffffffffffffffffffffffffffffff81166116d457506116659050565b60005b8281101561166157600060608373ffffffffffffffffffffffffffffffffffffffff1662030d40600073ffffffffffffffffffffffffffffffffffffffff166345060eb0905060e01b8b8b8b888151811061172e57fe5b602002602001015160405160240161174893929190612634565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516117d191906125d0565b6000604051808303818686fa925050503d806000811461180d576040519150601f19603f3d011682016040523d82523d6000602084013e611812565b606091505b5090925090506000821561163657818060200190516118349190810190612544565b90508087858151811061184357fe5b60209081029190910101525050506001016116d7565b6040516000906060907f153f59970000000000000000000000000000000000000000000000000000000090611894908690869060240161260d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608673ffffffffffffffffffffffffffffffffffffffff168360405161191c91906125d0565b600060405180830381855afa9150503d8060008114611957576040519150601f19603f3d011682016040523d82523d6000602084013e61195c565b606091505b509150915081801561196f575080516020145b156119895761197f81600c611c95565b935050505061198d565b5050505b9392505050565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fa90612774565b60405180910390fd5b5050565b73794e6e91555438afc3ccf1c5076a74f42133d08d90565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290565b6000611a4282611cda565b92915050565b73818e6fecd516ecc3849daf6845e3ec868087b75590565b600061166583611a96611a7a82600163ffffffff611dab16565b611a8a888763ffffffff611dca16565b9063ffffffff611dfb16565b9063ffffffff611e1716565b6000611aac611e41565b73ffffffffffffffffffffffffffffffffffffffff166306f2bf62836040518263ffffffff1660e01b8152600401611ae491906125ec565b60206040518083038186803b158015611afc57600080fd5b505afa158015611b10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611a429190810190612243565b60008073ffffffffffffffffffffffffffffffffffffffff8516611b5757611c75565b60608573ffffffffffffffffffffffffffffffffffffffff16620249f08686604051602401611b869190612925565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611c0f91906125d0565b6000604051808303818686fa925050503d8060008114611c4b576040519150601f19603f3d011682016040523d82523d6000602084013e611c50565b606091505b5090925090508115611c735780806020019051611c709190810190612544565b92505b505b935093915050565b7374134cf88b21383713e096a5ecf59e297dc7f54790565b60008160140183511015611cbb57611cbb611cb66004855185601401611e59565b611efe565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b600060129050600060608373ffffffffffffffffffffffffffffffffffffffff166040518060400160405280600481526020017f313ce56700000000000000000000000000000000000000000000000000000000815250604051611d3e91906125d0565b600060405180830381855afa9150503d8060008114611d79576040519150601f19603f3d011682016040523d82523d6000602084013e611d7e565b606091505b5091509150818015611d91575080516020145b15611da457611da1816000611f06565b92505b5050919050565b600082821115611dc457611dc4611cb660028585611f12565b50900390565b600082611dd957506000611a42565b82820282848281611de657fe5b041461198d5761198d611cb660018686611f12565b60008282018381101561198d5761198d611cb660008686611f12565b600081611e2d57611e2d611cb660038585611f12565b6000828481611e3857fe5b04949350505050565b73c0a47dfe034b400b47bdad5fecda2621de6c4d9590565b6060632800659560e01b848484604051602401611e7893929190612748565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b600061198d8383611f31565b606063e946c1bb60e01b848484604051602401611e7893929190612726565b60008160200183511015611f5257611f52611cb66005855185602001611e59565b50016020015190565b6040805160608101909152806000815260006020820181905260409091015290565b8035611a42816129a5565b600082601f830112611f98578081fd5b8135611fab611fa682612955565b61292e565b8181529150602080830190840160005b83811015611fe857611fd3876020843589010161205b565b83526020928301929190910190600101611fbb565b5050505092915050565b600082601f830112612002578081fd5b8135612010611fa682612955565b81815291506020808301908481018184028601820187101561203157600080fd5b60005b8481101561205057813584529282019290820190600101612034565b505050505092915050565b600082601f83011261206b578081fd5b813567ffffffffffffffff811115612081578182fd5b6120b260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161292e565b91508082528360208285010111156120c957600080fd5b8060208401602084013760009082016020015292915050565b8035600f81900b8114611a4257600080fd5b60006101c0808385031215612107578182fd5b6121108161292e565b91505061211d8383611f7d565b815261212c8360208401611f7d565b602082015261213e8360408401611f7d565b60408201526121508360608401611f7d565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff808211156121b257600080fd5b6121be8683870161205b565b838501526101609250828501359150808211156121da57600080fd5b6121e68683870161205b565b8385015261018092508285013591508082111561220257600080fd5b61220e8683870161205b565b838501526101a092508285013591508082111561222a57600080fd5b506122378582860161205b565b82840152505092915050565b600060208284031215612254578081fd5b815161198d816129a5565b600080600060608486031215612273578182fd5b833561227e816129a5565b9250602084013561228e816129a5565b9150604084013561229e816129a5565b809150509250925092565b600080600080608085870312156122be578081fd5b84356122c9816129a5565b935060208501356122d9816129a5565b925060408501356122e9816129a5565b9150606085013567ffffffffffffffff811115612304578182fd5b61231087828801611ff2565b91505092959194509250565b600080600060608486031215612330578283fd5b833561233b816129a5565b9250602084013561234b816129a5565b9150604084013567ffffffffffffffff811115612366578182fd5b61237286828701611ff2565b9150509250925092565b60008060008060808587031215612391578182fd5b843561239c816129a5565b93506123ab86602087016120e2565b92506122e986604087016120e2565b600080602083850312156123cc578182fd5b823567ffffffffffffffff808211156123e3578384fd5b81850186601f8201126123f4578485fd5b8035925081831115612404578485fd5b8660208085028301011115612417578485fd5b60200196919550909350505050565b60008060408385031215612438578182fd5b823567ffffffffffffffff8082111561244f578384fd5b81850186601f820112612460578485fd5b80359250612470611fa684612955565b83815260208082019190838101885b878110156124a8576124968c8484358901016120f4565b8552938201939082019060010161247f565b509197508801359450505050808211156124c0578283fd5b506124cd85828601611f88565b9150509250929050565b600080600083850360a08112156124ec578182fd5b60608112156124f9578182fd5b50612504606061292e565b845160078110612512578283fd5b81526020858101519082015260408086015190820152606085015160808601519194509250801515811461229e578182fd5b600060208284031215612555578081fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845261258e816020860160208601612975565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000828483379101908152919050565b600082516125e2818460208701612975565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b6000602080830181845280855180835260408601915060408482028701019250838701855b828110156126d6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526126c4858351612576565b9450928501929085019060010161268a565b5092979650505050505050565b602080825282518282018190526000918401906040840190835b8181101561271b5783518352602093840193909201916001016126fd565b509095945050505050565b606081016004851061273457fe5b938152602081019290925260409091015290565b606081016008851061273457fe5b600f93840b81529190920b6020820152604081019190915260600190565b60208082526025908201527f455243323042726964676553616d706c65722f494e56414c49445f544f4b454e60408201527f5f50414952000000000000000000000000000000000000000000000000000000606082015260800190565b6000604082526127e560408301855161255c565b60208401516127f7606084018261255c565b50604084015161280a608084018261255c565b50606084015161281d60a084018261255c565b50608084015160c083015260a084015160e083015260c0840151610100818185015260e086015191506101208281860152818701519250610140915082828601528087015192505061016082818601528187015192506101c09150610180828187015261288e610200870185612576565b8289015194507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc092506101a08388830301818901526128cd8287612576565b838b015196508489820301868a01526128e68188612576565b955050808a0151955050505080858303016101e0860152506129088183612576565b848103602086015261291a8187612576565b979650505050505050565b90815260200190565b60405181810167ffffffffffffffff8111828210171561294d57600080fd5b604052919050565b600067ffffffffffffffff82111561296b578081fd5b5060209081020190565b60005b83811015612990578181015183820152602001612978565b8381111561299f576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff811681146129c757600080fd5b5056fea365627a7a7231582034e7eab64809a5ab7420c524f487ac0ca03a80f2b355b2d12a392dde2df0522e6c6578706572696d656e74616cf564736f6c63430005100040", - "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0xD4 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x68BE3CF2 GT PUSH2 0x81 JUMPI DUP1 PUSH4 0x9F76AD35 GT PUSH2 0x5B JUMPI DUP1 PUSH4 0x9F76AD35 EQ PUSH2 0x1A7 JUMPI DUP1 PUSH4 0xA2C28D4B EQ PUSH2 0x1BA JUMPI DUP1 PUSH4 0xC7F7142E EQ PUSH2 0x1CD JUMPI PUSH2 0xD4 JUMP JUMPDEST DUP1 PUSH4 0x68BE3CF2 EQ PUSH2 0x161 JUMPI DUP1 PUSH4 0x6DD6B78D EQ PUSH2 0x181 JUMPI DUP1 PUSH4 0x8B123A02 EQ PUSH2 0x194 JUMPI PUSH2 0xD4 JUMP JUMPDEST DUP1 PUSH4 0x59F515D0 GT PUSH2 0xB2 JUMPI DUP1 PUSH4 0x59F515D0 EQ PUSH2 0x128 JUMPI DUP1 PUSH4 0x60EE052A EQ PUSH2 0x13B JUMPI DUP1 PUSH4 0x64EE6ADE EQ PUSH2 0x14E JUMPI PUSH2 0xD4 JUMP JUMPDEST DUP1 PUSH4 0x354152A3 EQ PUSH2 0xD9 JUMPI DUP1 PUSH4 0x4703A7E6 EQ PUSH2 0x102 JUMPI DUP1 PUSH4 0x4CB8E253 EQ PUSH2 0x115 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xEC PUSH2 0xE7 CALLDATASIZE PUSH1 0x4 PUSH2 0x237C JUMP JUMPDEST PUSH2 0x1ED JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xF9 SWAP2 SWAP1 PUSH2 0x26E3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xEC PUSH2 0x110 CALLDATASIZE PUSH1 0x4 PUSH2 0x231C JUMP JUMPDEST PUSH2 0x3BE JUMP JUMPDEST PUSH2 0xEC PUSH2 0x123 CALLDATASIZE PUSH1 0x4 PUSH2 0x231C JUMP JUMPDEST PUSH2 0x59A JUMP JUMPDEST PUSH2 0xEC PUSH2 0x136 CALLDATASIZE PUSH1 0x4 PUSH2 0x2426 JUMP JUMPDEST PUSH2 0x88A JUMP JUMPDEST PUSH2 0xEC PUSH2 0x149 CALLDATASIZE PUSH1 0x4 PUSH2 0x231C JUMP JUMPDEST PUSH2 0x933 JUMP JUMPDEST PUSH2 0xEC PUSH2 0x15C CALLDATASIZE PUSH1 0x4 PUSH2 0x231C JUMP JUMPDEST PUSH2 0xBF3 JUMP JUMPDEST PUSH2 0x174 PUSH2 0x16F CALLDATASIZE PUSH1 0x4 PUSH2 0x23BA JUMP JUMPDEST PUSH2 0xDB9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xF9 SWAP2 SWAP1 PUSH2 0x2665 JUMP JUMPDEST PUSH2 0xEC PUSH2 0x18F CALLDATASIZE PUSH1 0x4 PUSH2 0x231C JUMP JUMPDEST PUSH2 0xEF8 JUMP JUMPDEST PUSH2 0xEC PUSH2 0x1A2 CALLDATASIZE PUSH1 0x4 PUSH2 0x2426 JUMP JUMPDEST PUSH2 0x11A0 JUMP JUMPDEST PUSH2 0xEC PUSH2 0x1B5 CALLDATASIZE PUSH1 0x4 PUSH2 0x22A9 JUMP JUMPDEST PUSH2 0x1468 JUMP JUMPDEST PUSH2 0xEC PUSH2 0x1C8 CALLDATASIZE PUSH1 0x4 PUSH2 0x22A9 JUMP JUMPDEST PUSH2 0x166D JUMP JUMPDEST PUSH2 0x1E0 PUSH2 0x1DB CALLDATASIZE PUSH1 0x4 PUSH2 0x225F JUMP JUMPDEST PUSH2 0x1859 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xF9 SWAP2 SWAP1 PUSH2 0x25EC JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP3 MLOAD SWAP1 POP DUP1 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x21F JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x3B4 JUMPI PUSH1 0x0 PUSH1 0x60 DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH3 0x927C0 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x7211EF7 SWAP1 POP PUSH1 0xE0 SHL DUP11 DUP11 DUP11 DUP9 DUP2 MLOAD DUP2 LT PUSH2 0x27C JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x296 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2756 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE SWAP1 MLOAD PUSH2 0x31F SWAP2 SWAP1 PUSH2 0x25D0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x35B JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x360 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x0 DUP3 ISZERO PUSH2 0x389 JUMPI DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x382 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2544 JUMP JUMPDEST SWAP1 POP PUSH2 0x391 JUMP JUMPDEST POP POP POP PUSH2 0x3B4 JUMP JUMPDEST DUP1 DUP7 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0x39E JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE POP POP POP PUSH1 0x1 ADD PUSH2 0x225 JUMP JUMPDEST POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x3CA DUP4 DUP6 PUSH2 0x1994 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE PUSH1 0x20 DUP1 DUP5 MUL DUP3 ADD ADD SWAP1 SWAP2 MSTORE DUP2 DUP1 ISZERO PUSH2 0x3F5 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x591 JUMPI PUSH1 0x0 PUSH1 0x60 PUSH2 0x40F PUSH2 0x1A07 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH3 0xF4240 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xFF1FD974 SWAP1 POP PUSH1 0xE0 SHL DUP11 DUP11 DUP11 DUP9 DUP2 MLOAD DUP2 LT PUSH2 0x459 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x473 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2634 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE SWAP1 MLOAD PUSH2 0x4FC SWAP2 SWAP1 PUSH2 0x25D0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x538 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x53D JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x0 DUP3 ISZERO PUSH2 0x566 JUMPI DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x55F SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2544 JUMP JUMPDEST SWAP1 POP PUSH2 0x56E JUMP JUMPDEST POP POP POP PUSH2 0x591 JUMP JUMPDEST DUP1 DUP7 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0x57B JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE POP POP POP PUSH1 0x1 ADD PUSH2 0x3FB JUMP JUMPDEST POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x5A6 DUP4 DUP6 PUSH2 0x1994 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5B0 PUSH2 0x1A1F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x5E8 JUMPI DUP5 PUSH2 0x5FE JUMP JUMPDEST PUSH20 0xEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x60A PUSH2 0x1A1F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x642 JUMPI DUP5 PUSH2 0x658 JUMP JUMPDEST PUSH20 0xEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x665 DUP8 PUSH2 0x1A37 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 POP PUSH1 0x0 PUSH2 0x675 DUP8 PUSH2 0x1A37 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 POP PUSH1 0x0 DUP7 MLOAD SWAP1 POP DUP1 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x6AA JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP6 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x87D JUMPI PUSH1 0x0 PUSH1 0x60 PUSH2 0x6C4 PUSH2 0x1A48 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH3 0x16E360 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x809A9E55 SWAP1 POP PUSH1 0xE0 SHL DUP11 DUP11 DUP15 DUP9 DUP2 MLOAD DUP2 LT PUSH2 0x70E JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x728 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2634 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE SWAP1 MLOAD PUSH2 0x7B1 SWAP2 SWAP1 PUSH2 0x25D0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x7ED JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x7F2 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x0 DUP3 ISZERO PUSH2 0x81B JUMPI DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x814 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2544 JUMP JUMPDEST SWAP1 POP PUSH2 0x823 JUMP JUMPDEST POP POP POP PUSH2 0x87D JUMP JUMPDEST PUSH8 0xDE0B6B3A7640000 DUP8 PUSH1 0xA EXP DUP8 PUSH1 0xA EXP DUP14 DUP8 DUP2 MLOAD DUP2 LT PUSH2 0x840 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP5 MUL MUL DUP2 PUSH2 0x852 JUMPI INVALID JUMPDEST DIV DUP2 PUSH2 0x85A JUMPI INVALID JUMPDEST DIV DUP11 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0x867 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE POP POP POP PUSH1 0x1 ADD PUSH2 0x6B0 JUMP JUMPDEST POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x896 DUP4 DUP4 PUSH2 0x11A0 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 JUMPDEST DUP4 MLOAD DUP2 LT ISZERO PUSH2 0x92C JUMPI DUP2 DUP2 DUP2 MLOAD DUP2 LT PUSH2 0x8B0 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x0 EQ PUSH2 0x924 JUMPI PUSH2 0x90B DUP3 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x8CE JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP6 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x8E2 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP7 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x8FA JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x80 ADD MLOAD PUSH2 0x1A60 JUMP JUMPDEST DUP3 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x917 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP JUMPDEST PUSH1 0x1 ADD PUSH2 0x89B JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x93F DUP4 DUP6 PUSH2 0x1994 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE PUSH1 0x20 DUP1 DUP5 MUL DUP3 ADD ADD SWAP1 SWAP2 MSTORE DUP2 DUP1 ISZERO PUSH2 0x96A JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 PUSH2 0x977 PUSH2 0x1A1F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x9B7 JUMPI PUSH2 0x9B2 DUP7 PUSH2 0x1AA2 JUMP JUMPDEST PUSH2 0x9BA JUMP JUMPDEST PUSH1 0x0 JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x9C6 PUSH2 0x1A1F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xA06 JUMPI PUSH2 0xA01 DUP7 PUSH2 0x1AA2 JUMP JUMPDEST PUSH2 0xA09 JUMP JUMPDEST PUSH1 0x0 JUMPDEST SWAP1 POP PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xBE8 JUMPI PUSH1 0x1 PUSH2 0xA20 PUSH2 0x1A1F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xAB7 JUMPI DUP7 MLOAD PUSH2 0xA96 SWAP1 DUP6 SWAP1 PUSH32 0x2640F62C00000000000000000000000000000000000000000000000000000000 SWAP1 DUP11 SWAP1 DUP7 SWAP1 DUP2 LT PUSH2 0xA89 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x1B34 JUMP JUMPDEST DUP8 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0xAA2 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP4 POP DUP3 DUP2 MSTORE POP POP POP PUSH2 0xBD4 JUMP JUMPDEST PUSH2 0xABF PUSH2 0x1A1F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xB28 JUMPI DUP7 MLOAD PUSH2 0xA96 SWAP1 DUP5 SWAP1 PUSH32 0x59E9486200000000000000000000000000000000000000000000000000000000 SWAP1 DUP11 SWAP1 DUP7 SWAP1 DUP2 LT PUSH2 0xA89 JUMPI INVALID JUMPDEST DUP7 MLOAD PUSH1 0x0 SWAP1 PUSH2 0xB61 SWAP1 DUP6 SWAP1 PUSH32 0x59E9486200000000000000000000000000000000000000000000000000000000 SWAP1 DUP12 SWAP1 DUP8 SWAP1 DUP2 LT PUSH2 0xA89 JUMPI INVALID JUMPDEST SWAP3 POP SWAP1 POP DUP1 ISZERO PUSH2 0xBB7 JUMPI PUSH2 0xB96 DUP6 PUSH32 0x2640F62C00000000000000000000000000000000000000000000000000000000 DUP4 PUSH2 0x1B34 JUMP JUMPDEST DUP9 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0xBA2 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP5 POP DUP3 DUP2 MSTORE POP POP POP PUSH2 0xBD2 JUMP JUMPDEST PUSH1 0x0 DUP8 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0xBC5 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP JUMPDEST POP JUMPDEST DUP1 PUSH2 0xBDF JUMPI POP PUSH2 0xBE8 JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0xA0E JUMP JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0xBFF DUP4 DUP6 PUSH2 0x1994 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE PUSH1 0x20 DUP1 DUP5 MUL DUP3 ADD ADD SWAP1 SWAP2 MSTORE DUP2 DUP1 ISZERO PUSH2 0xC2A JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x591 JUMPI PUSH1 0x0 PUSH1 0x60 PUSH2 0xC44 PUSH2 0x1A07 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH3 0xF4240 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x144A2752 SWAP1 POP PUSH1 0xE0 SHL DUP10 DUP12 DUP11 DUP9 DUP2 MLOAD DUP2 LT PUSH2 0xC8E JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0xCA8 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2634 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE SWAP1 MLOAD PUSH2 0xD31 SWAP2 SWAP1 PUSH2 0x25D0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0xD6D JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xD72 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x0 DUP3 ISZERO PUSH2 0x566 JUMPI DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0xD94 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2544 JUMP JUMPDEST SWAP1 POP DUP1 DUP7 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0xDA3 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE POP POP POP PUSH1 0x1 ADD PUSH2 0xC30 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE PUSH1 0x20 DUP1 DUP5 MUL DUP3 ADD ADD SWAP1 SWAP2 MSTORE PUSH1 0x60 SWAP1 DUP3 DUP1 ISZERO PUSH2 0xDEF JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0xDDA JUMPI SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP1 DUP4 EQ PUSH2 0x92C JUMPI PUSH1 0x0 PUSH1 0x60 ADDRESS DUP7 DUP7 DUP6 DUP2 DUP2 LT PUSH2 0xE0D JUMPI INVALID JUMPDEST PUSH1 0x20 MUL DUP3 ADD SWAP1 POP DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0xE47 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP2 ADD PUSH1 0x20 DUP2 ADD SWAP2 POP CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xE66 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0xE76 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xE84 SWAP3 SWAP2 SWAP1 PUSH2 0x25C0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0xEBF JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xEC4 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0xED6 JUMPI DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST DUP1 DUP5 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0xEE3 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE POP POP PUSH1 0x1 ADD PUSH2 0xDF5 JUMP JUMPDEST PUSH1 0x60 PUSH2 0xF04 DUP4 DUP6 PUSH2 0x1994 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE PUSH1 0x20 DUP1 DUP5 MUL DUP3 ADD ADD SWAP1 SWAP2 MSTORE DUP2 DUP1 ISZERO PUSH2 0xF2F JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 PUSH2 0xF3C PUSH2 0x1A1F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xF7C JUMPI PUSH2 0xF77 DUP7 PUSH2 0x1AA2 JUMP JUMPDEST PUSH2 0xF7F JUMP JUMPDEST PUSH1 0x0 JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xF8B PUSH2 0x1A1F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xFCB JUMPI PUSH2 0xFC6 DUP7 PUSH2 0x1AA2 JUMP JUMPDEST PUSH2 0xFCE JUMP JUMPDEST PUSH1 0x0 JUMPDEST SWAP1 POP PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xBE8 JUMPI PUSH1 0x1 PUSH2 0xFE5 PUSH2 0x1A1F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x106F JUMPI DUP7 MLOAD PUSH2 0x104E SWAP1 DUP6 SWAP1 PUSH32 0x95B68FE700000000000000000000000000000000000000000000000000000000 SWAP1 DUP11 SWAP1 DUP7 SWAP1 DUP2 LT PUSH2 0xA89 JUMPI INVALID JUMPDEST DUP8 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x105A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP4 POP DUP3 DUP2 MSTORE POP POP POP PUSH2 0x118C JUMP JUMPDEST PUSH2 0x1077 PUSH2 0x1A1F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x10E0 JUMPI DUP7 MLOAD PUSH2 0x104E SWAP1 DUP5 SWAP1 PUSH32 0xCD7724C300000000000000000000000000000000000000000000000000000000 SWAP1 DUP11 SWAP1 DUP7 SWAP1 DUP2 LT PUSH2 0xA89 JUMPI INVALID JUMPDEST DUP7 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x1119 SWAP1 DUP7 SWAP1 PUSH32 0x95B68FE700000000000000000000000000000000000000000000000000000000 SWAP1 DUP12 SWAP1 DUP8 SWAP1 DUP2 LT PUSH2 0xA89 JUMPI INVALID JUMPDEST SWAP3 POP SWAP1 POP DUP1 ISZERO PUSH2 0x116F JUMPI PUSH2 0x114E DUP5 PUSH32 0xCD7724C300000000000000000000000000000000000000000000000000000000 DUP4 PUSH2 0x1B34 JUMP JUMPDEST DUP9 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0x115A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP5 POP DUP3 DUP2 MSTORE POP POP POP PUSH2 0x118A JUMP JUMPDEST PUSH1 0x0 DUP8 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x117D JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP JUMPDEST POP JUMPDEST DUP1 PUSH2 0x1197 JUMPI POP PUSH2 0xBE8 JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0xFD3 JUMP JUMPDEST PUSH1 0x60 DUP3 MLOAD PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x11CD JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP4 MLOAD DUP2 EQ PUSH2 0x92C JUMPI DUP3 DUP2 DUP2 MLOAD DUP2 LT PUSH2 0x11E7 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD MLOAD PUSH1 0x0 EQ DUP1 PUSH2 0x1215 JUMPI POP DUP4 DUP2 DUP2 MLOAD DUP2 LT PUSH2 0x1205 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x80 ADD MLOAD PUSH1 0x0 EQ JUMPDEST DUP1 PUSH2 0x1237 JUMPI POP DUP4 DUP2 DUP2 MLOAD DUP2 LT PUSH2 0x1227 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0xA0 ADD MLOAD PUSH1 0x0 EQ JUMPDEST ISZERO PUSH2 0x125B JUMPI PUSH1 0x0 DUP3 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x124A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP PUSH2 0x1460 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH2 0x1267 PUSH2 0x1C7D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH3 0x7A120 PUSH2 0x1289 PUSH2 0x1C7D JUMP JUMPDEST POP DUP8 MLOAD PUSH32 0xE77286EB00000000000000000000000000000000000000000000000000000000 SWAP1 DUP10 SWAP1 DUP8 SWAP1 DUP2 LT PUSH2 0x12BA JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP9 DUP8 DUP2 MLOAD DUP2 LT PUSH2 0x12CE JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x12E7 SWAP3 SWAP2 SWAP1 PUSH2 0x27D1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE SWAP1 MLOAD PUSH2 0x1370 SWAP2 SWAP1 PUSH2 0x25D0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x13AC JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x13B1 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x13DC JUMPI PUSH1 0x0 DUP5 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x13C9 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP POP POP PUSH2 0x1460 JUMP JUMPDEST PUSH2 0x13E4 PUSH2 0x1F5B JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x13FB SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x24D7 JUMP JUMPDEST SWAP2 SWAP5 POP SWAP3 POP SWAP1 POP PUSH1 0x3 DUP4 MLOAD PUSH1 0x6 DUP2 GT ISZERO PUSH2 0x1411 JUMPI INVALID JUMPDEST EQ ISZERO DUP1 PUSH2 0x141C JUMPI POP DUP1 ISZERO JUMPDEST ISZERO PUSH2 0x1440 JUMPI PUSH1 0x0 DUP8 DUP8 DUP2 MLOAD DUP2 LT PUSH2 0x142F JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP PUSH2 0x145A JUMP JUMPDEST DUP2 DUP8 DUP8 DUP2 MLOAD DUP2 LT PUSH2 0x144D JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP JUMPDEST POP POP POP POP POP JUMPDEST PUSH1 0x1 ADD PUSH2 0x11D3 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP3 MLOAD SWAP1 POP DUP1 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x149A JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 PUSH2 0x14AA DUP8 DUP8 DUP8 PUSH2 0x1859 JUMP JUMPDEST SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x14CF JUMPI POP PUSH2 0x1665 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x1661 JUMPI PUSH1 0x0 PUSH1 0x60 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH3 0x30D40 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x343FBCDD SWAP1 POP PUSH1 0xE0 SHL DUP12 DUP12 DUP12 DUP9 DUP2 MLOAD DUP2 LT PUSH2 0x1529 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1543 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2634 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE SWAP1 MLOAD PUSH2 0x15CC SWAP2 SWAP1 PUSH2 0x25D0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1608 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x160D JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x0 DUP3 ISZERO PUSH2 0x1636 JUMPI DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x162F SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2544 JUMP JUMPDEST SWAP1 POP PUSH2 0x163E JUMP JUMPDEST POP POP POP PUSH2 0x1661 JUMP JUMPDEST DUP1 DUP8 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0x164B JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE POP POP POP PUSH1 0x1 ADD PUSH2 0x14D2 JUMP JUMPDEST POP POP POP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP3 MLOAD SWAP1 POP DUP1 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x169F JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 PUSH2 0x16AF DUP8 DUP8 DUP8 PUSH2 0x1859 JUMP JUMPDEST SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x16D4 JUMPI POP PUSH2 0x1665 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x1661 JUMPI PUSH1 0x0 PUSH1 0x60 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH3 0x30D40 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x45060EB0 SWAP1 POP PUSH1 0xE0 SHL DUP12 DUP12 DUP12 DUP9 DUP2 MLOAD DUP2 LT PUSH2 0x172E JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1748 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2634 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE SWAP1 MLOAD PUSH2 0x17D1 SWAP2 SWAP1 PUSH2 0x25D0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x180D JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1812 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x0 DUP3 ISZERO PUSH2 0x1636 JUMPI DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x1834 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2544 JUMP JUMPDEST SWAP1 POP DUP1 DUP8 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0x1843 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE POP POP POP PUSH1 0x1 ADD PUSH2 0x16D7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 PUSH1 0x60 SWAP1 PUSH32 0x153F599700000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0x1894 SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x24 ADD PUSH2 0x260D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP SWAP1 POP PUSH1 0x0 PUSH1 0x60 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x40 MLOAD PUSH2 0x191C SWAP2 SWAP1 PUSH2 0x25D0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1957 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x195C JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x196F JUMPI POP DUP1 MLOAD PUSH1 0x20 EQ JUMPDEST ISZERO PUSH2 0x1989 JUMPI PUSH2 0x197F DUP2 PUSH1 0xC PUSH2 0x1C95 JUMP JUMPDEST SWAP4 POP POP POP POP PUSH2 0x198D JUMP JUMPDEST POP POP POP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x1A03 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x19FA SWAP1 PUSH2 0x2774 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP JUMP JUMPDEST PUSH20 0x794E6E91555438AFC3CCF1C5076A74F42133D08D SWAP1 JUMP JUMPDEST PUSH20 0xC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2 SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1A42 DUP3 PUSH2 0x1CDA JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0x818E6FECD516ECC3849DAF6845E3EC868087B755 SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1665 DUP4 PUSH2 0x1A96 PUSH2 0x1A7A DUP3 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x1DAB AND JUMP JUMPDEST PUSH2 0x1A8A DUP9 DUP8 PUSH4 0xFFFFFFFF PUSH2 0x1DCA AND JUMP JUMPDEST SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1DFB AND JUMP JUMPDEST SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1E17 AND JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1AAC PUSH2 0x1E41 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x6F2BF62 DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1AE4 SWAP2 SWAP1 PUSH2 0x25EC JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1AFC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1B10 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x1A42 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2243 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH2 0x1B57 JUMPI PUSH2 0x1C75 JUMP JUMPDEST PUSH1 0x60 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH3 0x249F0 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1B86 SWAP2 SWAP1 PUSH2 0x2925 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE SWAP1 MLOAD PUSH2 0x1C0F SWAP2 SWAP1 PUSH2 0x25D0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1C4B JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1C50 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP DUP2 ISZERO PUSH2 0x1C73 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x1C70 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2544 JUMP JUMPDEST SWAP3 POP JUMPDEST POP JUMPDEST SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH20 0x74134CF88B21383713E096A5ECF59E297DC7F547 SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO PUSH2 0x1CBB JUMPI PUSH2 0x1CBB PUSH2 0x1CB6 PUSH1 0x4 DUP6 MLOAD DUP6 PUSH1 0x14 ADD PUSH2 0x1E59 JUMP JUMPDEST PUSH2 0x1EFE JUMP JUMPDEST POP ADD PUSH1 0x14 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x12 SWAP1 POP PUSH1 0x0 PUSH1 0x60 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x4 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x313CE56700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x40 MLOAD PUSH2 0x1D3E SWAP2 SWAP1 PUSH2 0x25D0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1D79 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1D7E JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x1D91 JUMPI POP DUP1 MLOAD PUSH1 0x20 EQ JUMPDEST ISZERO PUSH2 0x1DA4 JUMPI PUSH2 0x1DA1 DUP2 PUSH1 0x0 PUSH2 0x1F06 JUMP JUMPDEST SWAP3 POP JUMPDEST POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x1DC4 JUMPI PUSH2 0x1DC4 PUSH2 0x1CB6 PUSH1 0x2 DUP6 DUP6 PUSH2 0x1F12 JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1DD9 JUMPI POP PUSH1 0x0 PUSH2 0x1A42 JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x1DE6 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x198D JUMPI PUSH2 0x198D PUSH2 0x1CB6 PUSH1 0x1 DUP7 DUP7 PUSH2 0x1F12 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x198D JUMPI PUSH2 0x198D PUSH2 0x1CB6 PUSH1 0x0 DUP7 DUP7 PUSH2 0x1F12 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x1E2D JUMPI PUSH2 0x1E2D PUSH2 0x1CB6 PUSH1 0x3 DUP6 DUP6 PUSH2 0x1F12 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP2 PUSH2 0x1E38 JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH20 0xC0A47DFE034B400B47BDAD5FECDA2621DE6C4D95 SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x28006595 PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1E78 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2748 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH1 0x0 PUSH2 0x198D DUP4 DUP4 PUSH2 0x1F31 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xE946C1BB PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1E78 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2726 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH2 0x1F52 JUMPI PUSH2 0x1F52 PUSH2 0x1CB6 PUSH1 0x5 DUP6 MLOAD DUP6 PUSH1 0x20 ADD PUSH2 0x1E59 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD SWAP1 SWAP2 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH2 0x1A42 DUP2 PUSH2 0x29A5 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1F98 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1FAB PUSH2 0x1FA6 DUP3 PUSH2 0x2955 JUMP JUMPDEST PUSH2 0x292E JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 ADD PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1FE8 JUMPI PUSH2 0x1FD3 DUP8 PUSH1 0x20 DUP5 CALLDATALOAD DUP10 ADD ADD PUSH2 0x205B JUMP JUMPDEST DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1FBB JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x2002 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x2010 PUSH2 0x1FA6 DUP3 PUSH2 0x2955 JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 DUP2 ADD DUP2 DUP5 MUL DUP7 ADD DUP3 ADD DUP8 LT ISZERO PUSH2 0x2031 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x2050 JUMPI DUP2 CALLDATALOAD DUP5 MSTORE SWAP3 DUP3 ADD SWAP3 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x2034 JUMP JUMPDEST POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x206B JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2081 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x20B2 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD PUSH2 0x292E JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x20C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP5 ADD CALLDATACOPY PUSH1 0x0 SWAP1 DUP3 ADD PUSH1 0x20 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH1 0xF DUP2 SWAP1 SIGNEXTEND DUP2 EQ PUSH2 0x1A42 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1C0 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x2107 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x2110 DUP2 PUSH2 0x292E JUMP JUMPDEST SWAP2 POP POP PUSH2 0x211D DUP4 DUP4 PUSH2 0x1F7D JUMP JUMPDEST DUP2 MSTORE PUSH2 0x212C DUP4 PUSH1 0x20 DUP5 ADD PUSH2 0x1F7D JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x213E DUP4 PUSH1 0x40 DUP5 ADD PUSH2 0x1F7D JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x2150 DUP4 PUSH1 0x60 DUP5 ADD PUSH2 0x1F7D JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 DUP3 ADD CALLDATALOAD PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 DUP3 ADD CALLDATALOAD PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 DUP3 ADD CALLDATALOAD PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xE0 DUP3 ADD CALLDATALOAD PUSH1 0xE0 DUP3 ADD MSTORE PUSH2 0x100 DUP1 DUP4 ADD CALLDATALOAD DUP2 DUP4 ADD MSTORE POP PUSH2 0x120 DUP1 DUP4 ADD CALLDATALOAD DUP2 DUP4 ADD MSTORE POP PUSH2 0x140 DUP1 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x21B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x21BE DUP7 DUP4 DUP8 ADD PUSH2 0x205B JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x160 SWAP3 POP DUP3 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x21DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x21E6 DUP7 DUP4 DUP8 ADD PUSH2 0x205B JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x180 SWAP3 POP DUP3 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x2202 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x220E DUP7 DUP4 DUP8 ADD PUSH2 0x205B JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x1A0 SWAP3 POP DUP3 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x222A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2237 DUP6 DUP3 DUP7 ADD PUSH2 0x205B JUMP JUMPDEST DUP3 DUP5 ADD MSTORE POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2254 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x198D DUP2 PUSH2 0x29A5 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x2273 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x227E DUP2 PUSH2 0x29A5 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x228E DUP2 PUSH2 0x29A5 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x229E DUP2 PUSH2 0x29A5 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x22BE JUMPI DUP1 DUP2 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x22C9 DUP2 PUSH2 0x29A5 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH2 0x22D9 DUP2 PUSH2 0x29A5 JUMP JUMPDEST SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0x22E9 DUP2 PUSH2 0x29A5 JUMP JUMPDEST SWAP2 POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2304 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x2310 DUP8 DUP3 DUP9 ADD PUSH2 0x1FF2 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x2330 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x233B DUP2 PUSH2 0x29A5 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x234B DUP2 PUSH2 0x29A5 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2366 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x2372 DUP7 DUP3 DUP8 ADD PUSH2 0x1FF2 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x2391 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x239C DUP2 PUSH2 0x29A5 JUMP JUMPDEST SWAP4 POP PUSH2 0x23AB DUP7 PUSH1 0x20 DUP8 ADD PUSH2 0x20E2 JUMP JUMPDEST SWAP3 POP PUSH2 0x22E9 DUP7 PUSH1 0x40 DUP8 ADD PUSH2 0x20E2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x23CC JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x23E3 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP6 ADD DUP7 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x23F4 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP3 POP DUP2 DUP4 GT ISZERO PUSH2 0x2404 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP7 PUSH1 0x20 DUP1 DUP6 MUL DUP4 ADD ADD GT ISZERO PUSH2 0x2417 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH1 0x20 ADD SWAP7 SWAP2 SWAP6 POP SWAP1 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x2438 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x244F JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP6 ADD DUP7 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x2460 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP3 POP PUSH2 0x2470 PUSH2 0x1FA6 DUP5 PUSH2 0x2955 JUMP JUMPDEST DUP4 DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD SWAP2 SWAP1 DUP4 DUP2 ADD DUP9 JUMPDEST DUP8 DUP2 LT ISZERO PUSH2 0x24A8 JUMPI PUSH2 0x2496 DUP13 DUP5 DUP5 CALLDATALOAD DUP10 ADD ADD PUSH2 0x20F4 JUMP JUMPDEST DUP6 MSTORE SWAP4 DUP3 ADD SWAP4 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x247F JUMP JUMPDEST POP SWAP2 SWAP8 POP DUP9 ADD CALLDATALOAD SWAP5 POP POP POP POP DUP1 DUP3 GT ISZERO PUSH2 0x24C0 JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x24CD DUP6 DUP3 DUP7 ADD PUSH2 0x1F88 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 DUP6 SUB PUSH1 0xA0 DUP2 SLT ISZERO PUSH2 0x24EC JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x60 DUP2 SLT ISZERO PUSH2 0x24F9 JUMPI DUP2 DUP3 REVERT JUMPDEST POP PUSH2 0x2504 PUSH1 0x60 PUSH2 0x292E JUMP JUMPDEST DUP5 MLOAD PUSH1 0x7 DUP2 LT PUSH2 0x2512 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP6 DUP2 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x40 DUP1 DUP7 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x60 DUP6 ADD MLOAD PUSH1 0x80 DUP7 ADD MLOAD SWAP2 SWAP5 POP SWAP3 POP DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x229E JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2555 JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x258E DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x2975 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP4 CALLDATACOPY SWAP2 ADD SWAP1 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x25E2 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x2975 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 ADD DUP2 DUP5 MSTORE DUP1 DUP6 MLOAD DUP1 DUP4 MSTORE PUSH1 0x40 DUP7 ADD SWAP2 POP PUSH1 0x40 DUP5 DUP3 MUL DUP8 ADD ADD SWAP3 POP DUP4 DUP8 ADD DUP6 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x26D6 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 DUP9 DUP7 SUB ADD DUP5 MSTORE PUSH2 0x26C4 DUP6 DUP4 MLOAD PUSH2 0x2576 JUMP JUMPDEST SWAP5 POP SWAP3 DUP6 ADD SWAP3 SWAP1 DUP6 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x268A JUMP JUMPDEST POP SWAP3 SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 DUP5 ADD SWAP1 PUSH1 0x40 DUP5 ADD SWAP1 DUP4 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x271B JUMPI DUP4 MLOAD DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x26FD JUMP JUMPDEST POP SWAP1 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH1 0x4 DUP6 LT PUSH2 0x2734 JUMPI INVALID JUMPDEST SWAP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH1 0x8 DUP6 LT PUSH2 0x2734 JUMPI INVALID JUMPDEST PUSH1 0xF SWAP4 DUP5 SIGNEXTEND DUP2 MSTORE SWAP2 SWAP1 SWAP3 SIGNEXTEND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x25 SWAP1 DUP3 ADD MSTORE PUSH32 0x455243323042726964676553616D706C65722F494E56414C49445F544F4B454E PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x5F50414952000000000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 MSTORE PUSH2 0x27E5 PUSH1 0x40 DUP4 ADD DUP6 MLOAD PUSH2 0x255C JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD PUSH2 0x27F7 PUSH1 0x60 DUP5 ADD DUP3 PUSH2 0x255C JUMP JUMPDEST POP PUSH1 0x40 DUP5 ADD MLOAD PUSH2 0x280A PUSH1 0x80 DUP5 ADD DUP3 PUSH2 0x255C JUMP JUMPDEST POP PUSH1 0x60 DUP5 ADD MLOAD PUSH2 0x281D PUSH1 0xA0 DUP5 ADD DUP3 PUSH2 0x255C JUMP JUMPDEST POP PUSH1 0x80 DUP5 ADD MLOAD PUSH1 0xC0 DUP4 ADD MSTORE PUSH1 0xA0 DUP5 ADD MLOAD PUSH1 0xE0 DUP4 ADD MSTORE PUSH1 0xC0 DUP5 ADD MLOAD PUSH2 0x100 DUP2 DUP2 DUP6 ADD MSTORE PUSH1 0xE0 DUP7 ADD MLOAD SWAP2 POP PUSH2 0x120 DUP3 DUP2 DUP7 ADD MSTORE DUP2 DUP8 ADD MLOAD SWAP3 POP PUSH2 0x140 SWAP2 POP DUP3 DUP3 DUP7 ADD MSTORE DUP1 DUP8 ADD MLOAD SWAP3 POP POP PUSH2 0x160 DUP3 DUP2 DUP7 ADD MSTORE DUP2 DUP8 ADD MLOAD SWAP3 POP PUSH2 0x1C0 SWAP2 POP PUSH2 0x180 DUP3 DUP2 DUP8 ADD MSTORE PUSH2 0x288E PUSH2 0x200 DUP8 ADD DUP6 PUSH2 0x2576 JUMP JUMPDEST DUP3 DUP10 ADD MLOAD SWAP5 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 SWAP3 POP PUSH2 0x1A0 DUP4 DUP9 DUP4 SUB ADD DUP2 DUP10 ADD MSTORE PUSH2 0x28CD DUP3 DUP8 PUSH2 0x2576 JUMP JUMPDEST DUP4 DUP12 ADD MLOAD SWAP7 POP DUP5 DUP10 DUP3 SUB ADD DUP7 DUP11 ADD MSTORE PUSH2 0x28E6 DUP2 DUP9 PUSH2 0x2576 JUMP JUMPDEST SWAP6 POP POP DUP1 DUP11 ADD MLOAD SWAP6 POP POP POP POP DUP1 DUP6 DUP4 SUB ADD PUSH2 0x1E0 DUP7 ADD MSTORE POP PUSH2 0x2908 DUP2 DUP4 PUSH2 0x2576 JUMP JUMPDEST DUP5 DUP2 SUB PUSH1 0x20 DUP7 ADD MSTORE PUSH2 0x291A DUP2 DUP8 PUSH2 0x2576 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x294D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x296B JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x2990 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2978 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x299F JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x29C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG3 PUSH6 0x627A7A723158 KECCAK256 CALLVALUE 0xE7 0xEA 0xB6 0x48 MULMOD 0xA5 0xAB PUSH21 0x20C524F487AC0CA03A80F2B355B2D12A392DDE2DF0 MSTORE 0x2E PUSH13 0x6578706572696D656E74616CF5 PUSH5 0x736F6C6343 STOP SDIV LT STOP BLOCKHASH ", - "sourceMap": "1303:24401:2:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1303:24401:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17026:1028;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;10322:1057;;;;;;;;;:::i;6976:1559::-;;;;;;;;;:::i;5734:882::-;;;;;;;;;:::i;14357:2252::-;;;;;;;;;:::i;8903:1054::-;;;;;;;;;:::i;2389:515::-;;;;;;;;;:::i;:::-;;;;;;;;11741:2257;;;;;;;;;:::i;3358:1976::-;;;;;;;;;:::i;18533:1559::-;;;;;;;;;:::i;20567:1619::-;;;;;;;;;:::i;22630:625::-;;;;;;;;;:::i;:::-;;;;;;;;17026:1028;17237:34;17287:18;17308:17;:24;17287:45;;17376:10;17362:25;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;17362:25:2;-1:-1:-1;17342:45:2;-1:-1:-1;17402:9:2;17397:651;17421:10;17417:1;:14;17397:651;;;17453:15;17470:23;17513:12;:23;;2019:5;17633:1;17626:27;;;:36;;;;17688:12;17726:10;17762:17;17780:1;17762:20;;;;;;;;;;;;;;17578:226;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;17578:226:2;;;49:4:-1;25:18;;61:17;;17578:226:2;182:15:-1;17578:226:2;;;;179:29:-1;;;;160:49;;;17513:292:2;;;;17578:226;17513:292;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;-1:-1;17452:353:2;;-1:-1:-1;17452:353:2;-1:-1:-1;17819:17:2;17854:138;;;;17911:10;17900:33;;;;;;;;;;;;;;17888:45;;17854:138;;;17972:5;;;;;17854:138;18028:9;18005:17;18023:1;18005:20;;;;;;;;;;;;;;;;;:32;-1:-1:-1;;;17433:3:2;;17397:651;;;;17026:1028;;;;;;;:::o;10322:1057::-;10504:34;10554:40;10571:10;10583;10554:16;:40::i;:::-;10625:24;;10679:25;;;;;;;;;;;;;;;;10625:24;10679:25;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;10679:25:2;-1:-1:-1;10659:45:2;-1:-1:-1;10719:9:2;10714:659;10738:10;10734:1;:14;10714:659;;;10770:15;10787:23;10830:20;:18;:20::i;:::-;:31;;1799:6;10962:1;10953:24;;;:33;;;;11012:10;11048;11084:17;11102:1;11084:20;;;;;;;;;;;;;;10905:221;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;10905:221:2;;;49:4:-1;25:18;;61:17;;10905:221:2;182:15:-1;10905:221:2;;;;179:29:-1;;;;160:49;;;10830:297:2;;;;10905:221;10830:297;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;-1:-1;10769:358:2;;-1:-1:-1;10769:358:2;-1:-1:-1;11141:18:2;11177:139;;;;11235:10;11224:33;;;;;;;;;;;;;;11211:46;;11177:139;;;11296:5;;;;;11177:139;11352:10;11329:17;11347:1;11329:20;;;;;;;;;;;;;;;;;:33;-1:-1:-1;;;10750:3:2;;10714:659;;;;10322:1057;;;;;;:::o;6976:1559::-;7164:34;7214:40;7231:10;7243;7214:16;:40::i;:::-;7264:19;7300:17;:15;:17::i;:::-;7286:31;;:10;:31;;;:64;;7340:10;7286:64;;;3134:42:30;7286:64:2;7264:86;;7360:19;7396:17;:15;:17::i;:::-;7382:31;;:10;:31;;;:64;;7436:10;7382:64;;;3134:42:30;7382:64:2;7360:86;;7456:26;7485:29;7503:10;7485:17;:29::i;:::-;7456:58;;;;7524:26;7553:29;7571:10;7553:17;:29::i;:::-;7524:58;;;;7592:18;7613:17;:24;7592:45;;7681:10;7667:25;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;7667:25:2;-1:-1:-1;7647:45:2;-1:-1:-1;7707:9:2;7702:827;7726:10;7722:1;:14;7702:827;;;7758:15;7775:23;7818:30;:28;:30::i;:::-;:41;;1581:6;7963:1;7949:32;;;:41;;;;8016:11;8053;8090:17;8108:1;8090:20;;;;;;;;;;;;;;7901:231;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;7901:231:2;;;49:4:-1;25:18;;61:17;;7901:231:2;182:15:-1;7901:231:2;;;;179:29:-1;;;;160:49;;;7818:315:2;;;;7901:231;7818:315;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;-1:-1;7757:376:2;;-1:-1:-1;7757:376:2;-1:-1:-1;8147:12:2;8177:133;;;;8229:10;8218:33;;;;;;;;;;;;;;8211:40;;8177:133;;;8290:5;;;;;8177:133;8510:8;8473:18;8467:2;:24;8430:18;8424:2;:24;8385:17;8403:1;8385:20;;;;;;;;;;;;;;8362:4;:43;:86;:129;;;;;;:156;;;;;;8323:17;8341:1;8323:20;;;;;;;;;;;;;;;;;:195;-1:-1:-1;;;7738:3:2;;7702:827;;;;6976:1559;;;;;;;;;;:::o;5734:882::-;5908:47;6004:92;6051:6;6071:15;6004:33;:92::i;:::-;5971:125;-1:-1:-1;6237:9:2;6232:378;6256:6;:13;6252:1;:17;6232:378;;;6294:30;6325:1;6294:33;;;;;;;;;;;;;;6331:1;6294:38;6290:310;;6388:197;6438:30;6469:1;6438:33;;;;;;;;;;;;;;6493:6;6500:1;6493:9;;;;;;;;;;;;;;:26;;;6541:6;6548:1;6541:9;;;;;;;;;;;;;;:26;;;6388:28;:197::i;:::-;6352:30;6383:1;6352:33;;;;;;;;;;;;;:233;;;;;6290:310;6271:3;;6232:378;;;;5734:882;;;;:::o;14357:2252::-;14539:34;14589:40;14606:10;14618;14589:16;:40::i;:::-;14660:24;;14714:25;;;;;;;;;;;;;;;;14660:24;14714:25;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;14714:25:2;;14694:45;;14749:41;14807:17;:15;:17::i;:::-;14793:31;;:10;:31;;;:105;;14867:31;14887:10;14867:19;:31::i;:::-;14793:105;;;14862:1;14793:105;14749:149;;14908:41;14966:17;:15;:17::i;:::-;14952:31;;:10;:31;;;:105;;15026:31;15046:10;15026:19;:31::i;:::-;14952:105;;;15021:1;14952:105;14908:149;-1:-1:-1;15072:9:2;15067:1536;15091:10;15087:1;:14;15067:1536;;;15140:4;15176:17;:15;:17::i;:::-;15162:31;;:10;:31;;;15158:1367;;;15428:20;;15250:216;;15313:18;;15354:52;;15428:17;;15446:1;;15428:20;;;;;;;;;;;;15250:33;:216::i;:::-;15214:17;15232:1;15214:20;;;;;;;;;;;;;15213:253;;;;;;;;;15158:1367;;;15505:17;:15;:17::i;:::-;15491:31;;:10;:31;;;15487:1038;;;15757:20;;15579:216;;15642:18;;15683:52;;15757:17;;15775:1;;15757:20;;;;;15487:1038;16069:20;;15834:15;;15891:216;;15954:18;;15995:52;;16069:17;;16087:1;;16069:20;;;;;15891:216;15867:240;-1:-1:-1;15867:240:2;-1:-1:-1;16129:12:2;;16125:386;;16202:219;16269:18;16314:52;16392:7;16202:33;:219::i;:::-;16166:17;16184:1;16166:20;;;;;;;;;;;;;16165:256;;;;;;;;;16125:386;;;16491:1;16468:17;16486:1;16468:20;;;;;;;;;;;;;:24;;;;;16125:386;15487:1038;;16543:10;16538:55;;16573:5;;;16538:55;-1:-1:-1;15103:3:2;;15067:1536;;;;14357:2252;;;;;;;;:::o;8903:1054::-;9086:34;9136:40;9153:10;9165;9136:16;:40::i;:::-;9207:24;;9261:25;;;;;;;;;;;;;;;;9207:24;9261:25;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;9261:25:2;-1:-1:-1;9241:45:2;-1:-1:-1;9301:9:2;9296:655;9320:10;9316:1;:14;9296:655;;;9352:15;9369:23;9412:20;:18;:20::i;:::-;:31;;1799:6;9544:1;9535:24;;;:33;;;;9594:10;9630;9666:17;9684:1;9666:20;;;;;;;;;;;;;;9487:221;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;9487:221:2;;;49:4:-1;25:18;;61:17;;9487:221:2;182:15:-1;9487:221:2;;;;179:29:-1;;;;160:49;;;9412:297:2;;;;9487:221;9412:297;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;-1:-1;9351:358:2;;-1:-1:-1;9351:358:2;-1:-1:-1;9723:17:2;9758:137;;;;9815:10;9804:33;;;;;;;;;;;;;;9792:45;;9931:9;9908:17;9926:1;9908:20;;;;;;;;;;;;;;;;;:32;-1:-1:-1;;;9332:3:2;;9296:655;;2389:515;2539:29;;;;;;;;;;;;;;;;2483:26;;2551:9;2539:29;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2525:43:2;-1:-1:-1;2583:9:2;2578:320;2598:21;;;2578:320;;2641:15;2658:23;2693:4;2710:9;;2720:1;2710:12;;;;;;;;;;;;-1:-1:-1;30:25;;92:48;100:14;96:29;;;92:48;68:73;;58:2;;155:1;152;145:12;58:2;174:33;;;69:4;55:19;;;-1:-1;16:22;93:18;82:30;;79:2;;;125:1;122;115:12;79:2;155:14;151:38;;;137:53;;134:2;;;203:1;200;193:12;134:2;2685:38:2;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;2640:83:2;;;;2742:10;2737:110;;2819:10;2813:17;2806:4;2794:10;2790:21;2783:48;2781:52;2877:10;2860:11;2872:1;2860:14;;;;;;;;;;;;;;;;;:27;-1:-1:-1;;2621:3:2;;2578:320;;11741:2257;11924:34;11974:40;11991:10;12003;11974:16;:40::i;:::-;12045:24;;12099:25;;;;;;;;;;;;;;;;12045:24;12099:25;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;12099:25:2;;12079:45;;12134:41;12192:17;:15;:17::i;:::-;12178:31;;:10;:31;;;:105;;12252:31;12272:10;12252:19;:31::i;:::-;12178:105;;;12247:1;12178:105;12134:149;;12293:41;12351:17;:15;:17::i;:::-;12337:31;;:10;:31;;;:105;;12411:31;12431:10;12411:19;:31::i;:::-;12337:105;;;12406:1;12337:105;12293:149;-1:-1:-1;12457:9:2;12452:1540;12476:10;12472:1;:14;12452:1540;;;12525:4;12561:17;:15;:17::i;:::-;12547:31;;:10;:31;;;12543:1371;;;12812:20;;12635:215;;12698:18;;12739:51;;12812:17;;12830:1;;12812:20;;;;;12635:215;12599:17;12617:1;12599:20;;;;;;;;;;;;;12598:252;;;;;;;;;12543:1371;;;12889:17;:15;:17::i;:::-;12875:31;;:10;:31;;;12871:1043;;;13140:20;;12963:215;;13026:18;;13067:51;;13140:17;;13158:1;;13140:20;;;;;12871:1043;13455:20;;13217:17;;13278:215;;13341:18;;13382:51;;13455:17;;13473:1;;13455:20;;;;;13278:215;13252:241;-1:-1:-1;13252:241:2;-1:-1:-1;13515:14:2;;13511:389;;13590:220;13657:18;13702:51;13779:9;13590:33;:220::i;:::-;13554:17;13572:1;13554:20;;;;;;;;;;;;;13553:257;;;;;;;;;13511:389;;;13880:1;13857:17;13875:1;13857:20;;;;;;;;;;;;;:24;;;;;13511:389;12871:1043;;13932:10;13927:55;;13962:5;;;13927:55;-1:-1:-1;12488:3:2;;12452:1540;;3358:1976;3532:47;3642:6;:13;3628:28;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;3628:28:2;-1:-1:-1;3595:61:2;-1:-1:-1;3671:9:2;3666:1662;3691:6;:13;3686:1;:18;3666:1662;;3806:15;3822:1;3806:18;;;;;;;;;;;;;;:25;3835:1;3806:30;:81;;;;3856:6;3863:1;3856:9;;;;;;;;;;;;;;:26;;;3886:1;3856:31;3806:81;:132;;;;3907:6;3914:1;3907:9;;;;;;;;;;;;;;:26;;;3937:1;3907:31;3806:132;3802:234;;;3994:1;3958:30;3989:1;3958:33;;;;;;;;;;;;;:37;;;;;4013:8;;3802:234;4088:15;4105:23;4148:21;:19;:21::i;:::-;:53;;1479:5;4325:21;:19;:21::i;:::-;-1:-1:-1;4403:9:2;;4315:63;;4403:6;;4410:1;;4403:9;;;;;;;;;;;;4437:15;4453:1;4437:18;;;;;;;;;;;;;;4268:209;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;4268:209:2;;;49:4:-1;25:18;;61:17;;4268:209:2;182:15:-1;4268:209:2;;;;179:29:-1;;;;160:49;;;4148:330:2;;;;4268:209;4148:330;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;4087:391:2;;;;4534:10;4529:113;;4600:1;4564:30;4595:1;4564:33;;;;;;;;;;;;;:37;;;;;4619:8;;;;4529:113;4673:35;;:::i;:::-;4726:32;4776:21;4842:10;4814:105;;;;;;;;;;;;;;4655:264;;-1:-1:-1;4655:264:2;-1:-1:-1;4655:264:2;-1:-1:-1;5081:29:2;5056:21;;:54;;;;;;;;;;:91;;;;5131:16;5130:17;5056:91;5052:266;;;5203:1;5167:30;5198:1;5167:33;;;;;;;;;;;;;:37;;;;;5052:266;;;5279:24;5243:30;5274:1;5243:33;;;;;;;;;;;;;:60;;;;;5052:266;3666:1662;;;;;;3706:3;;3666:1662;;18533:1559;18767:34;18869:18;18890:17;:24;18869:45;;18958:10;18944:25;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;18944:25:2;;18924:45;;19028:23;19054:119;19100:15;19129:10;19153;19054:32;:119::i;:::-;19028:145;-1:-1:-1;19243:29:2;;;19239:84;;-1:-1:-1;19288:24:2;;-1:-1:-1;19288:24:2;19239:84;19338:9;19333:753;19357:10;19353:1;:14;19333:753;;;19389:15;19406:23;19449:15;:26;;2144:5;19586:1;19567:34;;;:43;;;;19636:10;19672;19708:17;19726:1;19708:20;;;;;;;;;;;;;;19519:231;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;19519:231:2;;;49:4:-1;25:18;;61:17;;19519:231:2;182:15:-1;19519:231:2;;;;179:29:-1;;;;160:49;;;19449:302:2;;;;19519:231;19449:302;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;-1:-1;19388:363:2;;-1:-1:-1;19388:363:2;-1:-1:-1;19765:17:2;19800:230;;;;19857:10;19846:33;;;;;;;;;;;;;;19834:45;;19800:230;;;20010:5;;;;;19800:230;20066:9;20043:17;20061:1;20043:20;;;;;;;;;;;;;;;;;:32;-1:-1:-1;;;19369:3:2;;19333:753;;;;18533:1559;;;;;;;;;:::o;20567:1619::-;20800:34;20902:18;20923:17;:24;20902:45;;20991:10;20977:25;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;20977:25:2;;20957:45;;21061:23;21087:119;21133:15;21162:10;21186;21087:32;:119::i;:::-;21061:145;-1:-1:-1;21276:29:2;;;21272:84;;-1:-1:-1;21321:24:2;;-1:-1:-1;21321:24:2;21272:84;21430:9;21425:755;21449:10;21445:1;:14;21425:755;;;21481:15;21498:23;21541:15;:26;;2144:5;21678:1;21659:33;;;:42;;;;21727:10;21763;21799:17;21817:1;21799:20;;;;;;;;;;;;;;21611:230;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;21611:230:2;;;49:4:-1;25:18;;61:17;;21611:230:2;182:15:-1;21611:230:2;;;;179:29:-1;;;;160:49;;;21541:301:2;;;;21611:230;21541:301;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;-1:-1;21480:362:2;;-1:-1:-1;21480:362:2;-1:-1:-1;21856:18:2;21892:231;;;;21950:10;21939:33;;;;;;;;;;;;;;21926:46;;22159:10;22136:17;22154:1;22136:20;;;;;;;;;;;;;;;;;:33;-1:-1:-1;;;21461:3:2;;21425:755;;22630:625;22875:162;;22812:23;;22851:21;;22911:68;;22875:162;;22993:10;;23017;;22875:162;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;22875:162:2;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;22875:162:2;22851:186;;23048:15;23065:23;23092:15;:26;;23119:8;23092:36;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;23047:81:2;;;;23142:10;:37;;;;;23156:10;:17;23177:2;23156:23;23142:37;23138:111;;;23202:36;23223:10;23235:2;23202:20;:36::i;:::-;23195:43;;;;;;;23138:111;22630:625;;;;;;;;;:::o;25512:190::-;25643:10;25629:24;;:10;:24;;;;25621:74;;;;;;;;;;;;;;;;;;;;;;25512:190;;:::o;4343:144:30:-;1737:42;4343:144;:::o;3724:135::-;732:42;3724:135;:::o;23422:176:2:-;23518:14;23555:36;23578:12;23555:22;:36::i;:::-;23548:43;23422:176;-1:-1:-1;;23422:176:2:o;3454:164:30:-;1042:42;3454:164;:::o;3762:545:17:-;3925:21;4165:104;4257:11;4165:70;4212:22;4257:11;4232:1;4212:22;:19;:22;:::i;:::-;4165:25;:9;4183:6;4165:25;:17;:25;:::i;:::-;:46;:70;:46;:70;:::i;:::-;:91;:104;:91;:104;:::i;25019:316:2:-;25116:31;25242:35;:33;:35::i;:::-;25218:85;;;25304:12;25218:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25218:99:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25218:99:2;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;25218:99:2;;;;;;;;24056:721;24253:20;;24310:36;;;24306:100;;24362:33;;24306:100;24415:23;24487:22;:33;;1688:5;24604:16;24642:11;24560:111;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;24560:111:2;;;49:4:-1;25:18;;61:17;;24560:111:2;182:15:-1;24560:111:2;;;;179:29:-1;;;;160:49;;;24487:185:2;;;;24560:111;24487:185;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;-1:-1;24448:224:2;;-1:-1:-1;24448:224:2;-1:-1:-1;24682:89:2;;;;24738:10;24727:33;;;;;;;;;;;;;;24712:48;;24682:89;24056:721;;;;;;;;:::o;5467:141:30:-;2846:42;5467:141;:::o;10753:1071:31:-;10874:14;10919:5;10927:2;10919:10;10908:1;:8;:21;10904:321;;;10945:269;10967:246;11029:89;11136:1;:8;11162:5;11170:2;11162:10;10967:44;:246::i;:::-;10945:21;:269::i;:::-;-1:-1:-1;11726:13:31;11471:2;11726:13;11720:20;11742:42;11716:69;;10753:1071::o;3192:366:14:-;3272:19;3323:2;3307:18;;3336:15;3353:23;3380:5;:16;;3397:18;;;;;;;;;;;;;;;;;3380:36;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;3335:81:14;;;;3430:10;:37;;;;;3444:10;:17;3465:2;3444:23;3430:37;3426:126;;;3505:35;3526:10;3538:1;3505:20;:35::i;:::-;3483:58;;3426:126;3192:366;;;;;:::o;965:364:35:-;1051:7;1082:1;1078;:5;1074:227;;;1099:191;1121:168;1178:59;1255:1;1274;1121:39;:168::i;1099:191::-;-1:-1:-1;1317:5:35;;;965:364::o;122:448::-;208:7;235:6;231:45;;-1:-1:-1;264:1:35;257:8;;231:45;297:5;;;301:1;297;:5;:1;316:5;;;;;:10;312:234;;342:193;364:170;421:61;500:1;519;364:39;:170::i;1335:383::-;1421:7;1456:5;;;1475;;;1471:223;;;1496:187;1518:164;1575:55;1648:1;1667;1518:39;:164::i;576:383::-;662:7;689:6;685:223;;711:186;733:163;790:54;862:1;881;733:39;:163::i;711:186::-;917:9;933:1;929;:5;;;;;;;576:383;-1:-1:-1;;;;576:383:35:o;4008:176:30:-;1392:42;4008:176;:::o;1292:378:32:-;1480:12;1232:10;1551:37;;1602:9;1625:6;1645:8;1515:148;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;1515:148:32;;;49:4:-1;25:18;;61:17;;1515:148:32;182:15:-1;1515:148:32;;;;179:29:-1;;;;160:49;;;1515:148:32;-1:-1:-1;1292:378:32;;;;;:::o;1511:170:34:-;1654:9;1648:16;1641:4;1630:9;1626:20;1619:46;15929:220:31;16050:14;16097:21;16109:1;16112:5;16097:11;:21::i;731:322:36:-;884:12;196:10;955:28;;997:9;1020:1;1035;919:127;;;;;;;;;;;14133:679:31;14254:14;14299:5;14307:2;14299:10;14288:1;:8;:21;14284:297;;;14325:245;14347:222;14409:92;14519:1;:8;14545:5;14553:2;14545:10;14347:44;:222::i;14325:245::-;-1:-1:-1;14759:13:31;14661:2;14759:13;14753:20;;14133:679::o;1303:24401:2:-;;;;;;;;;;;-1:-1:-1;1303:24401:2;;;;;;;;;;;;;;;:::o;5:130:-1:-;72:20;;97:33;72:20;97:33;;682:693;;804:3;797:4;789:6;785:17;781:27;771:2;;-1:-1;;812:12;771:2;859:6;846:20;881:85;896:69;958:6;896:69;;;881:85;;;994:21;;;872:94;-1:-1;1038:4;1051:14;;;;1026:17;;1146:1;1131:238;1156:6;1153:1;1150:13;1131:238;;;1263:42;1301:3;1038:4;1239:3;1226:17;1030:6;1214:30;;1263:42;;;1251:55;;1038:4;1320:14;;;;1348;;;;;1178:1;1171:9;1131:238;;;1135:14;;;;764:611;;;;;2176:707;;2293:3;2286:4;2278:6;2274:17;2270:27;2260:2;;-1:-1;;2301:12;2260:2;2348:6;2335:20;2370:80;2385:64;2442:6;2385:64;;2370:80;2478:21;;;2361:89;-1:-1;2522:4;2535:14;;;;2510:17;;;2624;;;2615:27;;;;2612:36;-1:-1;2609:2;;;2661:1;;2651:12;2609:2;2686:1;2671:206;2696:6;2693:1;2690:13;2671:206;;;7475:20;;2764:50;;2828:14;;;;2856;;;;2718:1;2711:9;2671:206;;;2675:14;;;;;2253:630;;;;;3168:432;;3265:3;3258:4;3250:6;3246:17;3242:27;3232:2;;-1:-1;;3273:12;3232:2;3320:6;3307:20;26984:18;26976:6;26973:30;26970:2;;;-1:-1;;27006:12;26970:2;3342:60;27147:4;27079:9;3258:4;27064:6;27060:17;27056:33;27137:15;3342:60;;;3333:69;;3422:6;3415:5;3408:21;3526:3;27147:4;3517:6;3450;3508:16;;3505:25;3502:2;;;3543:1;;3533:12;3502:2;30630:6;27147:4;3450:6;3446:17;27147:4;3484:5;3480:16;30607:30;30686:1;30668:16;;;27147:4;30668:16;30661:27;3484:5;3225:375;-1:-1;;3225:375;3781:128;3847:20;;29983:2;29972:21;;;31876:34;;31866:2;;31924:1;;31914:12;4687:2714;;4795:6;;4783:9;4778:3;4774:19;4770:32;4767:2;;;-1:-1;;4805:12;4767:2;4833:22;4795:6;4833:22;;;4824:31;;;4945:49;4990:3;4966:22;4945:49;;;4927:16;4920:75;5097:49;5142:3;5064:2;5122:9;5118:22;5097:49;;;5064:2;5083:5;5079:16;5072:75;5256:49;5301:3;5223:2;5281:9;5277:22;5256:49;;;5223:2;5242:5;5238:16;5231:75;5409:49;5454:3;5376:2;5434:9;5430:22;5409:49;;;5376:2;5395:5;5391:16;5384:75;5532:3;5591:9;5587:22;7475:20;5532:3;5552:5;5548:16;5541:75;5689:3;5748:9;5744:22;7475:20;5689:3;5709:5;5705:16;5698:75;5838:3;5897:9;5893:22;7475:20;5838:3;5858:5;5854:16;5847:75;5987:3;6046:9;6042:22;7475:20;5987:3;6007:5;6003:16;5996:75;6149:3;;6210:9;6206:22;7475:20;6149:3;6169:5;6165:18;6158:77;;6296:3;;6357:9;6353:22;7475:20;6296:3;6316:5;6312:18;6305:77;;6481:3;;6470:9;6466:19;6453:33;6506:18;;6498:6;6495:30;6492:2;;;4913:1;;6528:12;6492:2;6575:54;6625:3;6616:6;6605:9;6601:22;6575:54;;;6481:3;6559:5;6555:18;6548:82;6729:3;;;;6718:9;6714:19;6701:33;6687:47;;6506:18;6746:6;6743:30;6740:2;;;4913:1;;6776:12;6740:2;6823:54;6873:3;6864:6;6853:9;6849:22;6823:54;;;6729:3;6807:5;6803:18;6796:82;6980:3;;;;6969:9;6965:19;6952:33;6938:47;;6506:18;6997:6;6994:30;6991:2;;;4913:1;;7027:12;6991:2;7074:54;7124:3;7115:6;7104:9;7100:22;7074:54;;;6980:3;7058:5;7054:18;7047:82;7231:3;;;;7220:9;7216:19;7203:33;7189:47;;6506:18;7248:6;7245:30;7242:2;;;4913:1;;7278:12;7242:2;;7325:54;7375:3;7366:6;7355:9;7351:22;7325:54;;;7231:3;7309:5;7305:18;7298:82;;;4761:2640;;;;;7686:263;;7801:2;7789:9;7780:7;7776:23;7772:32;7769:2;;;-1:-1;;7807:12;7769:2;226:6;220:13;238:33;265:5;238:33;;7956:491;;;;8094:2;8082:9;8073:7;8069:23;8065:32;8062:2;;;-1:-1;;8100:12;8062:2;85:6;72:20;97:33;124:5;97:33;;;8152:63;-1:-1;8252:2;8291:22;;72:20;97:33;72:20;97:33;;;8260:63;-1:-1;8360:2;8399:22;;72:20;97:33;72:20;97:33;;;8368:63;;;;8056:391;;;;;;8454:753;;;;;8634:3;8622:9;8613:7;8609:23;8605:33;8602:2;;;-1:-1;;8641:12;8602:2;85:6;72:20;97:33;124:5;97:33;;;8693:63;-1:-1;8793:2;8832:22;;72:20;97:33;72:20;97:33;;;8801:63;-1:-1;8901:2;8940:22;;72:20;97:33;72:20;97:33;;;8909:63;-1:-1;9037:2;9022:18;;9009:32;9061:18;9050:30;;9047:2;;;-1:-1;;9083:12;9047:2;9113:78;9183:7;9174:6;9163:9;9159:22;9113:78;;;9103:88;;;8596:611;;;;;;;;9214:627;;;;9377:2;9365:9;9356:7;9352:23;9348:32;9345:2;;;-1:-1;;9383:12;9345:2;85:6;72:20;97:33;124:5;97:33;;;9435:63;-1:-1;9535:2;9574:22;;72:20;97:33;72:20;97:33;;;9543:63;-1:-1;9671:2;9656:18;;9643:32;9695:18;9684:30;;9681:2;;;-1:-1;;9717:12;9681:2;9747:78;9817:7;9808:6;9797:9;9793:22;9747:78;;;9737:88;;;9339:502;;;;;;9848:749;;;;;10026:3;10014:9;10005:7;10001:23;9997:33;9994:2;;;-1:-1;;10033:12;9994:2;85:6;72:20;97:33;124:5;97:33;;;10085:63;-1:-1;10203:52;10247:7;10185:2;10223:22;;10203:52;;;10193:62;;10310:52;10354:7;10292:2;10334:9;10330:22;10310:52;;10604:411;;;10750:2;10738:9;10729:7;10725:23;10721:32;10718:2;;;-1:-1;;10756:12;10718:2;10814:17;10801:31;10852:18;;10844:6;10841:30;10838:2;;;-1:-1;;10874:12;10838:2;10982:6;10971:9;10967:22;436:3;429:4;421:6;417:17;413:27;403:2;;-1:-1;;444:12;403:2;487:6;474:20;464:30;;10852:18;506:6;503:30;500:2;;;-1:-1;;536:12;500:2;631:3;10750:2;;615:6;611:17;572:6;597:32;;594:41;591:2;;;-1:-1;;638:12;591:2;10750;568:17;;10902:97;;-1:-1;10712:303;;-1:-1;;;;10712:303;11022:686;;;11217:2;11205:9;11196:7;11192:23;11188:32;11185:2;;;-1:-1;;11223:12;11185:2;11281:17;11268:31;11319:18;;11311:6;11308:30;11305:2;;;-1:-1;;11341:12;11305:2;11451:6;11440:9;11436:22;1551:3;1544:4;1536:6;1532:17;1528:27;1518:2;;-1:-1;;1559:12;1518:2;1606:6;1593:20;1579:34;;1628:99;1643:83;1719:6;1643:83;;1628:99;1755:21;;;1799:4;1812:14;;;;1733:16;1787:17;;;-1:-1;1892:252;1917:6;1914:1;1911:13;1892:252;;;2024:56;2076:3;1799:4;2000:3;1987:17;1791:6;1975:30;;2024:56;;;2012:69;;2095:14;;;;2123;;;;1939:1;1932:9;1892:252;;;-1:-1;11361:107;;-1:-1;11518:18;;11505:32;;-1:-1;;;;11546:30;;;11543:2;;;-1:-1;;11579:12;11543:2;;11609:83;11684:7;11675:6;11664:9;11660:22;11609:83;;;11599:93;;;11179:529;;;;;;11715:577;;;;11872:9;11863:7;11859:23;11884:3;11859:23;11855:33;11852:2;;;-1:-1;;11891:12;11852:2;4071:4;4050:19;4046:30;4043:2;;;-1:-1;;4079:12;4043:2;;4107:20;4071:4;4107:20;;;3708:6;3702:13;31786:1;31779:5;31776:12;31766:2;;-1:-1;;31792:12;31766:2;4191:102;;4359:2;4424:22;;;3104:13;4374:16;;;4367:86;4537:2;4602:22;;;7623:13;4552:16;;;4545:86;4071:4;12127:22;;7623:13;12196:3;12244:22;;2966:13;4198:16;;-1:-1;7623:13;-1:-1;29470:13;;29463:21;31515:32;;31505:2;;-1:-1;;31551:12;12299:263;;12414:2;12402:9;12393:7;12389:23;12385:32;12382:2;;;-1:-1;;12420:12;12382:2;-1:-1;7623:13;;12376:186;-1:-1;12376:186;12937:103;30078:42;30067:54;12998:37;;12992:48;15519:315;;15643:5;27598:12;28406:6;28401:3;28394:19;15726:52;15771:6;28443:4;28438:3;28434:14;28443:4;15752:5;15748:16;15726:52;;;31067:2;31047:14;31063:7;31043:28;15790:39;;;;28443:4;15790:39;;15595:239;-1:-1;;15595:239;20472:274;;30630:6;30625:3;30620;30607:30;30668:16;;30661:27;;;30668:16;20603:143;-1:-1;20603:143;20753:254;;15316:5;27598:12;15427:52;15472:6;15467:3;15460:4;15453:5;15449:16;15427:52;;;15491:16;;;;;20874:133;-1:-1;;20874:133;21283:213;30078:42;30067:54;;;;12998:37;;21401:2;21386:18;;21372:124;21503:324;30078:42;30067:54;;;12998:37;;30067:54;;21813:2;21798:18;;12998:37;21649:2;21634:18;;21620:207;21834:435;30078:42;30067:54;;;12998:37;;30067:54;;;;22172:2;22157:18;;12998:37;22255:2;22240:18;;20303:37;;;;22008:2;21993:18;;21979:290;22276:381;;22454:2;;22443:9;22439:18;22454:2;22475:17;22468:47;22529:118;13402:5;27598:12;28406:6;28401:3;28394:19;28434:14;22443:9;28434:14;13414:98;;28434:14;22454:2;13569:6;13565:17;22443:9;13556:27;;13544:39;;22454:2;13659:5;27289:14;-1:-1;13698:345;13723:6;13720:1;13717:13;13698:345;;;13775:20;22443:9;13779:4;13775:20;;13770:3;13763:33;12681:60;12737:3;13830:6;13824:13;12681:60;;;13844:82;-1:-1;14022:14;;;;28129;;;;13745:1;13738:9;13698:345;;;-1:-1;22521:126;;22425:232;-1:-1;;;;;;;22425:232;22664:361;22832:2;22846:47;;;27598:12;;22817:18;;;28394:19;;;22664:361;;27289:14;;;28434;;;;22664:361;14529:260;14554:6;14551:1;14548:13;14529:260;;;14615:13;;20303:37;;22832:2;28129:14;;;;12909;;;;14576:1;14569:9;14529:260;;;-1:-1;22899:116;;22803:222;-1:-1;;;;;22803:222;23032:471;23224:2;23209:18;;31173:1;31163:12;;31153:2;;31179:9;31153:2;16627:68;;;23406:2;23391:18;;20303:37;;;;23489:2;23474:18;;;20303:37;23195:308;;23510:501;23717:2;23702:18;;31306:1;31296:12;;31286:2;;31312:9;24018:427;29983:2;29972:21;;;16975:36;;29972:21;;;;24348:2;24333:18;;16975:36;24431:2;24416:18;;20303:37;;;;24188:2;24173:18;;24159:286;24452:407;24643:2;24657:47;;;17248:2;24628:18;;;28394:19;17284:34;28434:14;;;17264:55;17353:7;17339:12;;;17332:29;17380:12;;;24614:245;24866:532;;25068:2;25089:17;25082:47;17707:63;25068:2;25057:9;25053:18;17684:16;17678:23;17707:63;;;17857:4;17850:5;17846:16;17840:23;17869:63;17917:14;25057:9;17917:14;17903:12;17869:63;;;;25068:2;18019:5;18015:16;18009:23;18038:63;18086:14;25057:9;18086:14;18072:12;18038:63;;;;17917:14;18182:5;18178:16;18172:23;18201:63;18249:14;25057:9;18249:14;18235:12;18201:63;;;;18086:14;18348:5;18344:16;18338:23;18415:14;25057:9;18415:14;20303:37;18249:14;18514:5;18510:16;18504:23;18581:14;25057:9;18581:14;20303:37;18415:14;18672:5;18668:16;18662:23;18739:14;18662:23;18739:14;25057:9;18739:14;20303:37;18581:14;18830:5;18826:16;18820:23;;;18897:14;18820:23;18897:14;25057:9;18897:14;20303:37;18739:14;19001:5;18997:18;18991:25;;;19070:16;;;18991:25;19070:16;25057:9;19070:16;20303:37;18897:14;19159:5;19155:18;19149:25;;;;19228:16;19149:25;19228:16;25057:9;19228:16;20303:37;19070:16;19327:5;19323:18;19317:25;19297:45;;17602:6;;;19362:16;17602:6;19362:16;25057:9;19362:16;19355:40;19410:67;17593:16;25057:9;17593:16;19458:12;19410:67;;;19228:16;19565:5;19561:18;19555:25;19535:45;;19618:14;;;19600:16;19618:14;25057:9;19622:4;19618:14;;19600:16;25057:9;19600:16;19593:40;19648:67;19710:4;19696:12;19648:67;;;19362:16;19806:5;19802:18;19796:25;19776:45;;19618:14;25057:9;19863:4;19859:14;;17602:6;25057:9;19841:16;19834:40;19889:67;19951:4;19937:12;19889:67;;;19881:75;;;19600:16;20047:5;20043:18;20037:25;20017:45;;;;;19618:14;25057:9;20104:4;20100:14;;20082:16;25057:9;20082:16;20075:40;;20130:67;20192:4;20178:12;20130:67;;;25291:9;25285:4;25281:20;17857:4;25265:9;25261:18;25254:48;25316:72;25383:4;25374:6;25316:72;;;25308:80;25039:359;-1:-1;;;;;;;25039:359;25405:213;20303:37;;;25523:2;25508:18;;25494:124;25625:256;25687:2;25681:9;25713:17;;;25788:18;25773:34;;25809:22;;;25770:62;25767:2;;;25845:1;;25835:12;25767:2;25687;25854:22;25665:216;;-1:-1;25665:216;25888:309;;26052:18;26044:6;26041:30;26038:2;;;-1:-1;;26074:12;26038:2;-1:-1;26119:4;26107:17;;;26172:15;;25975:222;30703:268;30768:1;30775:101;30789:6;30786:1;30783:13;30775:101;;;30856:11;;;30850:18;30837:11;;;30830:39;30811:2;30804:10;30775:101;;;30891:6;30888:1;30885:13;30882:2;;;30768:1;30947:6;30942:3;30938:16;30931:27;30882:2;;30752:219;;;;31335:117;30078:42;31422:5;30067:54;31397:5;31394:35;31384:2;;31443:1;;31433:12;31384:2;31378:74;" - } - } - }, - "sources": { - "src/ERC20BridgeSampler.sol": { - "id": 2 - }, - "@0x/contracts-asset-proxy/contracts/src/interfaces/IUniswapExchangeFactory.sol": { - "id": 13 - }, - "@0x/contracts-asset-proxy/contracts/src/interfaces/IUniswapExchange.sol": { - "id": 12 - }, - "@0x/contracts-erc20/contracts/src/LibERC20Token.sol": { - "id": 14 - }, - "@0x/contracts-utils/contracts/src/LibRichErrors.sol": { - "id": 34 - }, - "@0x/contracts-utils/contracts/src/LibBytes.sol": { - "id": 31 - }, - "@0x/contracts-utils/contracts/src/LibBytesRichErrors.sol": { - "id": 32 - }, - "@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol": { - "id": 15 - }, - "@0x/contracts-exchange-libs/contracts/src/LibOrder.sol": { - "id": 19 - }, - "@0x/contracts-utils/contracts/src/LibEIP712.sol": { - "id": 33 - }, - "@0x/contracts-exchange-libs/contracts/src/LibMath.sol": { - "id": 17 - }, - "@0x/contracts-utils/contracts/src/LibSafeMath.sol": { - "id": 35 - }, - "@0x/contracts-utils/contracts/src/LibSafeMathRichErrors.sol": { - "id": 36 - }, - "@0x/contracts-exchange-libs/contracts/src/LibMathRichErrors.sol": { - "id": 18 - }, - "@0x/contracts-utils/contracts/src/DeploymentConstants.sol": { - "id": 30 - }, - "src/IDevUtils.sol": { - "id": 4 - }, - "src/IERC20BridgeSampler.sol": { - "id": 5 - }, - "src/IEth2Dai.sol": { - "id": 6 - }, - "src/IKyberNetwork.sol": { - "id": 7 - }, - "src/IUniswapExchangeQuotes.sol": { - "id": 10 - }, - "src/ICurve.sol": { - "id": 3 - }, - "src/ILiquidityProvider.sol": { - "id": 8 - }, - "src/ILiquidityProviderRegistry.sol": { - "id": 9 - } - }, - "sourceCodes": { - "src/ERC20BridgeSampler.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-asset-proxy/contracts/src/interfaces/IUniswapExchangeFactory.sol\";\nimport \"@0x/contracts-erc20/contracts/src/LibERC20Token.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibMath.sol\";\nimport \"@0x/contracts-utils/contracts/src/DeploymentConstants.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibBytes.sol\";\nimport \"./IDevUtils.sol\";\nimport \"./IERC20BridgeSampler.sol\";\nimport \"./IEth2Dai.sol\";\nimport \"./IKyberNetwork.sol\";\nimport \"./IUniswapExchangeQuotes.sol\";\nimport \"./ICurve.sol\";\nimport \"./ILiquidityProvider.sol\";\nimport \"./ILiquidityProviderRegistry.sol\";\n\n\ncontract ERC20BridgeSampler is\n IERC20BridgeSampler,\n DeploymentConstants\n{\n /// @dev Gas limit for DevUtils calls.\n uint256 constant internal DEV_UTILS_CALL_GAS = 500e3; // 500k\n /// @dev Gas limit for Kyber calls.\n uint256 constant internal KYBER_CALL_GAS = 1500e3; // 1.5m\n /// @dev Gas limit for Uniswap calls.\n uint256 constant internal UNISWAP_CALL_GAS = 150e3; // 150k\n /// @dev Base gas limit for Eth2Dai calls.\n uint256 constant internal ETH2DAI_CALL_GAS = 1000e3; // 1m\n /// @dev Base gas limit for Curve calls. Some Curves have multiple tokens\n /// So a reasonable ceil is 150k per token. Biggest Curve has 4 tokens.\n uint256 constant internal CURVE_CALL_GAS = 600e3; // 600k\n /// @dev Default gas limit for liquidity provider calls.\n uint256 constant internal DEFAULT_CALL_GAS = 200e3; // 200k\n\n /// @dev Call multiple public functions on this contract in a single transaction.\n /// @param callDatas ABI-encoded call data for each function call.\n /// @return callResults ABI-encoded results data for each call.\n function batchCall(bytes[] calldata callDatas)\n external\n view\n returns (bytes[] memory callResults)\n {\n callResults = new bytes[](callDatas.length);\n for (uint256 i = 0; i != callDatas.length; ++i) {\n (bool didSucceed, bytes memory resultData) = address(this).staticcall(callDatas[i]);\n if (!didSucceed) {\n assembly { revert(add(resultData, 0x20), mload(resultData)) }\n }\n callResults[i] = resultData;\n }\n }\n\n /// @dev Queries the fillable taker asset amounts of native orders.\n /// Effectively ignores orders that have empty signatures or\n /// maker/taker asset amounts (returning 0).\n /// @param orders Native orders to query.\n /// @param orderSignatures Signatures for each respective order in `orders`.\n /// @return orderFillableTakerAssetAmounts How much taker asset can be filled\n /// by each order in `orders`.\n function getOrderFillableTakerAssetAmounts(\n LibOrder.Order[] memory orders,\n bytes[] memory orderSignatures\n )\n public\n view\n returns (uint256[] memory orderFillableTakerAssetAmounts)\n {\n orderFillableTakerAssetAmounts = new uint256[](orders.length);\n for (uint256 i = 0; i != orders.length; i++) {\n // Ignore orders with no signature or empty maker/taker amounts.\n if (orderSignatures[i].length == 0 ||\n orders[i].makerAssetAmount == 0 ||\n orders[i].takerAssetAmount == 0) {\n orderFillableTakerAssetAmounts[i] = 0;\n continue;\n }\n // solhint-disable indent\n (bool didSucceed, bytes memory resultData) =\n _getDevUtilsAddress()\n .staticcall\n .gas(DEV_UTILS_CALL_GAS)\n (abi.encodeWithSelector(\n IDevUtils(_getDevUtilsAddress()).getOrderRelevantState.selector,\n orders[i],\n orderSignatures[i]\n ));\n // solhint-enable indent\n if (!didSucceed) {\n orderFillableTakerAssetAmounts[i] = 0;\n continue;\n }\n (\n LibOrder.OrderInfo memory orderInfo,\n uint256 fillableTakerAssetAmount,\n bool isValidSignature\n ) = abi.decode(\n resultData,\n (LibOrder.OrderInfo, uint256, bool)\n );\n // The fillable amount is zero if the order is not fillable or if the\n // signature is invalid.\n if (orderInfo.orderStatus != LibOrder.OrderStatus.FILLABLE ||\n !isValidSignature) {\n orderFillableTakerAssetAmounts[i] = 0;\n } else {\n orderFillableTakerAssetAmounts[i] = fillableTakerAssetAmount;\n }\n }\n }\n\n /// @dev Queries the fillable taker asset amounts of native orders.\n /// Effectively ignores orders that have empty signatures or\n /// @param orders Native orders to query.\n /// @param orderSignatures Signatures for each respective order in `orders`.\n /// @return orderFillableMakerAssetAmounts How much maker asset can be filled\n /// by each order in `orders`.\n function getOrderFillableMakerAssetAmounts(\n LibOrder.Order[] memory orders,\n bytes[] memory orderSignatures\n )\n public\n view\n returns (uint256[] memory orderFillableMakerAssetAmounts)\n {\n orderFillableMakerAssetAmounts = getOrderFillableTakerAssetAmounts(\n orders,\n orderSignatures\n );\n // `orderFillableMakerAssetAmounts` now holds taker asset amounts, so\n // convert them to maker asset amounts.\n for (uint256 i = 0; i < orders.length; ++i) {\n if (orderFillableMakerAssetAmounts[i] != 0) {\n orderFillableMakerAssetAmounts[i] = LibMath.getPartialAmountCeil(\n orderFillableMakerAssetAmounts[i],\n orders[i].takerAssetAmount,\n orders[i].makerAssetAmount\n );\n }\n }\n }\n\n /// @dev Sample sell quotes from Kyber.\n /// @param takerToken Address of the taker token (what to sell).\n /// @param makerToken Address of the maker token (what to buy).\n /// @param takerTokenAmounts Taker token sell amount for each sample.\n /// @return makerTokenAmounts Maker amounts bought at each taker token\n /// amount.\n function sampleSellsFromKyberNetwork(\n address takerToken,\n address makerToken,\n uint256[] memory takerTokenAmounts\n )\n public\n view\n returns (uint256[] memory makerTokenAmounts)\n {\n _assertValidPair(makerToken, takerToken);\n address _takerToken = takerToken == _getWethAddress() ? KYBER_ETH_ADDRESS : takerToken;\n address _makerToken = makerToken == _getWethAddress() ? KYBER_ETH_ADDRESS : makerToken;\n uint256 takerTokenDecimals = _getTokenDecimals(takerToken);\n uint256 makerTokenDecimals = _getTokenDecimals(makerToken);\n uint256 numSamples = takerTokenAmounts.length;\n makerTokenAmounts = new uint256[](numSamples);\n for (uint256 i = 0; i < numSamples; i++) {\n (bool didSucceed, bytes memory resultData) =\n _getKyberNetworkProxyAddress().staticcall.gas(KYBER_CALL_GAS)(\n abi.encodeWithSelector(\n IKyberNetwork(0).getExpectedRate.selector,\n _takerToken,\n _makerToken,\n takerTokenAmounts[i]\n ));\n uint256 rate = 0;\n if (didSucceed) {\n rate = abi.decode(resultData, (uint256));\n } else {\n break;\n }\n makerTokenAmounts[i] =\n rate *\n takerTokenAmounts[i] *\n 10 ** makerTokenDecimals /\n 10 ** takerTokenDecimals /\n 10 ** 18;\n }\n }\n\n /// @dev Sample sell quotes from Eth2Dai/Oasis.\n /// @param takerToken Address of the taker token (what to sell).\n /// @param makerToken Address of the maker token (what to buy).\n /// @param takerTokenAmounts Taker token sell amount for each sample.\n /// @return makerTokenAmounts Maker amounts bought at each taker token\n /// amount.\n function sampleSellsFromEth2Dai(\n address takerToken,\n address makerToken,\n uint256[] memory takerTokenAmounts\n )\n public\n view\n returns (uint256[] memory makerTokenAmounts)\n {\n _assertValidPair(makerToken, takerToken);\n uint256 numSamples = takerTokenAmounts.length;\n makerTokenAmounts = new uint256[](numSamples);\n for (uint256 i = 0; i < numSamples; i++) {\n (bool didSucceed, bytes memory resultData) =\n _getEth2DaiAddress().staticcall.gas(ETH2DAI_CALL_GAS)(\n abi.encodeWithSelector(\n IEth2Dai(0).getBuyAmount.selector,\n makerToken,\n takerToken,\n takerTokenAmounts[i]\n ));\n uint256 buyAmount = 0;\n if (didSucceed) {\n buyAmount = abi.decode(resultData, (uint256));\n } else{\n break;\n }\n makerTokenAmounts[i] = buyAmount;\n }\n }\n\n /// @dev Sample buy quotes from Eth2Dai/Oasis.\n /// @param takerToken Address of the taker token (what to sell).\n /// @param makerToken Address of the maker token (what to buy).\n /// @param takerTokenAmounts Maker token sell amount for each sample.\n /// @return takerTokenAmounts Taker amounts sold at each maker token\n /// amount.\n function sampleBuysFromEth2Dai(\n address takerToken,\n address makerToken,\n uint256[] memory makerTokenAmounts\n )\n public\n view\n returns (uint256[] memory takerTokenAmounts)\n {\n _assertValidPair(makerToken, takerToken);\n uint256 numSamples = makerTokenAmounts.length;\n takerTokenAmounts = new uint256[](numSamples);\n for (uint256 i = 0; i < numSamples; i++) {\n (bool didSucceed, bytes memory resultData) =\n _getEth2DaiAddress().staticcall.gas(ETH2DAI_CALL_GAS)(\n abi.encodeWithSelector(\n IEth2Dai(0).getPayAmount.selector,\n takerToken,\n makerToken,\n makerTokenAmounts[i]\n ));\n uint256 sellAmount = 0;\n if (didSucceed) {\n sellAmount = abi.decode(resultData, (uint256));\n } else {\n break;\n }\n takerTokenAmounts[i] = sellAmount;\n }\n }\n\n /// @dev Sample sell quotes from Uniswap.\n /// @param takerToken Address of the taker token (what to sell).\n /// @param makerToken Address of the maker token (what to buy).\n /// @param takerTokenAmounts Taker token sell amount for each sample.\n /// @return makerTokenAmounts Maker amounts bought at each taker token\n /// amount.\n function sampleSellsFromUniswap(\n address takerToken,\n address makerToken,\n uint256[] memory takerTokenAmounts\n )\n public\n view\n returns (uint256[] memory makerTokenAmounts)\n {\n _assertValidPair(makerToken, takerToken);\n uint256 numSamples = takerTokenAmounts.length;\n makerTokenAmounts = new uint256[](numSamples);\n IUniswapExchangeQuotes takerTokenExchange = takerToken == _getWethAddress() ?\n IUniswapExchangeQuotes(0) : _getUniswapExchange(takerToken);\n IUniswapExchangeQuotes makerTokenExchange = makerToken == _getWethAddress() ?\n IUniswapExchangeQuotes(0) : _getUniswapExchange(makerToken);\n for (uint256 i = 0; i < numSamples; i++) {\n bool didSucceed = true;\n if (makerToken == _getWethAddress()) {\n (makerTokenAmounts[i], didSucceed) = _callUniswapExchangePriceFunction(\n address(takerTokenExchange),\n takerTokenExchange.getTokenToEthInputPrice.selector,\n takerTokenAmounts[i]\n );\n } else if (takerToken == _getWethAddress()) {\n (makerTokenAmounts[i], didSucceed) = _callUniswapExchangePriceFunction(\n address(makerTokenExchange),\n makerTokenExchange.getEthToTokenInputPrice.selector,\n takerTokenAmounts[i]\n );\n } else {\n uint256 ethBought;\n (ethBought, didSucceed) = _callUniswapExchangePriceFunction(\n address(takerTokenExchange),\n takerTokenExchange.getTokenToEthInputPrice.selector,\n takerTokenAmounts[i]\n );\n if (ethBought != 0) {\n (makerTokenAmounts[i], didSucceed) = _callUniswapExchangePriceFunction(\n address(makerTokenExchange),\n makerTokenExchange.getEthToTokenInputPrice.selector,\n ethBought\n );\n } else {\n makerTokenAmounts[i] = 0;\n }\n }\n if (!didSucceed) {\n break;\n }\n }\n }\n\n /// @dev Sample buy quotes from Uniswap.\n /// @param takerToken Address of the taker token (what to sell).\n /// @param makerToken Address of the maker token (what to buy).\n /// @param makerTokenAmounts Maker token sell amount for each sample.\n /// @return takerTokenAmounts Taker amounts sold at each maker token\n /// amount.\n function sampleBuysFromUniswap(\n address takerToken,\n address makerToken,\n uint256[] memory makerTokenAmounts\n )\n public\n view\n returns (uint256[] memory takerTokenAmounts)\n {\n _assertValidPair(makerToken, takerToken);\n uint256 numSamples = makerTokenAmounts.length;\n takerTokenAmounts = new uint256[](numSamples);\n IUniswapExchangeQuotes takerTokenExchange = takerToken == _getWethAddress() ?\n IUniswapExchangeQuotes(0) : _getUniswapExchange(takerToken);\n IUniswapExchangeQuotes makerTokenExchange = makerToken == _getWethAddress() ?\n IUniswapExchangeQuotes(0) : _getUniswapExchange(makerToken);\n for (uint256 i = 0; i < numSamples; i++) {\n bool didSucceed = true;\n if (makerToken == _getWethAddress()) {\n (takerTokenAmounts[i], didSucceed) = _callUniswapExchangePriceFunction(\n address(takerTokenExchange),\n takerTokenExchange.getTokenToEthOutputPrice.selector,\n makerTokenAmounts[i]\n );\n } else if (takerToken == _getWethAddress()) {\n (takerTokenAmounts[i], didSucceed) = _callUniswapExchangePriceFunction(\n address(makerTokenExchange),\n makerTokenExchange.getEthToTokenOutputPrice.selector,\n makerTokenAmounts[i]\n );\n } else {\n uint256 ethSold;\n (ethSold, didSucceed) = _callUniswapExchangePriceFunction(\n address(makerTokenExchange),\n makerTokenExchange.getEthToTokenOutputPrice.selector,\n makerTokenAmounts[i]\n );\n if (ethSold != 0) {\n (takerTokenAmounts[i], didSucceed) = _callUniswapExchangePriceFunction(\n address(takerTokenExchange),\n takerTokenExchange.getTokenToEthOutputPrice.selector,\n ethSold\n );\n } else {\n takerTokenAmounts[i] = 0;\n }\n }\n if (!didSucceed) {\n break;\n }\n }\n }\n\n /// @dev Sample sell quotes from Curve.\n /// @param curveAddress Address of the Curve contract.\n /// @param fromTokenIdx Index of the taker token (what to sell).\n /// @param toTokenIdx Index of the maker token (what to buy).\n /// @param takerTokenAmounts Taker token sell amount for each sample.\n /// @return makerTokenAmounts Maker amounts bought at each taker token\n /// amount.\n function sampleSellsFromCurve(\n address curveAddress,\n int128 fromTokenIdx,\n int128 toTokenIdx,\n uint256[] memory takerTokenAmounts\n )\n public\n view\n returns (uint256[] memory makerTokenAmounts)\n {\n uint256 numSamples = takerTokenAmounts.length;\n makerTokenAmounts = new uint256[](numSamples);\n for (uint256 i = 0; i < numSamples; i++) {\n (bool didSucceed, bytes memory resultData) =\n curveAddress.staticcall.gas(CURVE_CALL_GAS)(\n abi.encodeWithSelector(\n ICurve(0).get_dy_underlying.selector,\n fromTokenIdx,\n toTokenIdx,\n takerTokenAmounts[i]\n ));\n uint256 buyAmount = 0;\n if (didSucceed) {\n buyAmount = abi.decode(resultData, (uint256));\n } else {\n break;\n }\n makerTokenAmounts[i] = buyAmount;\n }\n }\n\n /// @dev Sample sell quotes from an arbitrary on-chain liquidity provider.\n /// @param registryAddress Address of the liquidity provider registry contract.\n /// @param takerToken Address of the taker token (what to sell).\n /// @param makerToken Address of the maker token (what to buy).\n /// @param takerTokenAmounts Taker token sell amount for each sample.\n /// @return makerTokenAmounts Maker amounts bought at each taker token\n /// amount.\n function sampleSellsFromLiquidityProviderRegistry(\n address registryAddress,\n address takerToken,\n address makerToken,\n uint256[] memory takerTokenAmounts\n )\n public\n view\n returns (uint256[] memory makerTokenAmounts)\n {\n // Initialize array of maker token amounts.\n uint256 numSamples = takerTokenAmounts.length;\n makerTokenAmounts = new uint256[](numSamples);\n\n // Query registry for provider address.\n address providerAddress = getLiquidityProviderFromRegistry(\n registryAddress,\n takerToken,\n makerToken\n );\n // If provider doesn't exist, return all zeros.\n if (providerAddress == address(0)) {\n return makerTokenAmounts;\n }\n\n for (uint256 i = 0; i < numSamples; i++) {\n (bool didSucceed, bytes memory resultData) =\n providerAddress.staticcall.gas(DEFAULT_CALL_GAS)(\n abi.encodeWithSelector(\n ILiquidityProvider(0).getSellQuote.selector,\n takerToken,\n makerToken,\n takerTokenAmounts[i]\n ));\n uint256 buyAmount = 0;\n if (didSucceed) {\n buyAmount = abi.decode(resultData, (uint256));\n } else {\n // Exit early if the amount is too high for the liquidity provider to serve\n break;\n }\n makerTokenAmounts[i] = buyAmount;\n }\n }\n\n /// @dev Sample buy quotes from an arbitrary on-chain liquidity provider.\n /// @param registryAddress Address of the liquidity provider registry contract.\n /// @param takerToken Address of the taker token (what to sell).\n /// @param makerToken Address of the maker token (what to buy).\n /// @param makerTokenAmounts Maker token buy amount for each sample.\n /// @return takerTokenAmounts Taker amounts sold at each maker token\n /// amount.\n function sampleBuysFromLiquidityProviderRegistry(\n address registryAddress,\n address takerToken,\n address makerToken,\n uint256[] memory makerTokenAmounts\n )\n public\n view\n returns (uint256[] memory takerTokenAmounts)\n {\n // Initialize array of taker token amounts.\n uint256 numSamples = makerTokenAmounts.length;\n takerTokenAmounts = new uint256[](numSamples);\n\n // Query registry for provider address.\n address providerAddress = getLiquidityProviderFromRegistry(\n registryAddress,\n takerToken,\n makerToken\n );\n // If provider doesn't exist, return all zeros.\n if (providerAddress == address(0)) {\n return takerTokenAmounts;\n }\n\n // Otherwise, query liquidity provider for quotes.\n for (uint256 i = 0; i < numSamples; i++) {\n (bool didSucceed, bytes memory resultData) =\n providerAddress.staticcall.gas(DEFAULT_CALL_GAS)(\n abi.encodeWithSelector(\n ILiquidityProvider(0).getBuyQuote.selector,\n takerToken,\n makerToken,\n makerTokenAmounts[i]\n ));\n uint256 sellAmount = 0;\n if (didSucceed) {\n sellAmount = abi.decode(resultData, (uint256));\n } else {\n // Exit early if the amount is too high for the liquidity provider to serve\n break;\n }\n takerTokenAmounts[i] = sellAmount;\n }\n }\n\n /// @dev Returns the address of a liquidity provider for the given market\n /// (takerToken, makerToken), from a registry of liquidity providers.\n /// Returns address(0) if no such provider exists in the registry.\n /// @param takerToken Taker asset managed by liquidity provider.\n /// @param makerToken Maker asset managed by liquidity provider.\n /// @return providerAddress Address of the liquidity provider.\n function getLiquidityProviderFromRegistry(\n address registryAddress,\n address takerToken,\n address makerToken\n )\n public\n view\n returns (address providerAddress)\n {\n bytes memory callData = abi.encodeWithSelector(\n ILiquidityProviderRegistry(0).getLiquidityProviderForMarket.selector,\n takerToken,\n makerToken\n );\n (bool didSucceed, bytes memory returnData) = registryAddress.staticcall(callData);\n if (didSucceed && returnData.length == 32) {\n return LibBytes.readAddress(returnData, 12);\n }\n }\n\n /// @dev Overridable way to get token decimals.\n /// @param tokenAddress Address of the token.\n /// @return decimals The decimal places for the token.\n function _getTokenDecimals(address tokenAddress)\n internal\n view\n returns (uint8 decimals)\n {\n return LibERC20Token.decimals(tokenAddress);\n }\n\n /// @dev Gracefully calls a Uniswap pricing function.\n /// @param uniswapExchangeAddress Address of an `IUniswapExchangeQuotes` exchange.\n /// @param functionSelector Selector of the target function.\n /// @param inputAmount Quantity parameter particular to the pricing function.\n /// @return outputAmount The returned amount from the function call. Will be\n /// zero if the call fails or if `uniswapExchangeAddress` is zero.\n function _callUniswapExchangePriceFunction(\n address uniswapExchangeAddress,\n bytes4 functionSelector,\n uint256 inputAmount\n )\n private\n view\n returns (uint256 outputAmount, bool didSucceed)\n {\n if (uniswapExchangeAddress == address(0)) {\n return (outputAmount, didSucceed);\n }\n bytes memory resultData;\n (didSucceed, resultData) =\n uniswapExchangeAddress.staticcall.gas(UNISWAP_CALL_GAS)(\n abi.encodeWithSelector(\n functionSelector,\n inputAmount\n ));\n if (didSucceed) {\n outputAmount = abi.decode(resultData, (uint256));\n }\n }\n\n /// @dev Retrive an existing Uniswap exchange contract.\n /// Throws if the exchange does not exist.\n /// @param tokenAddress Address of the token contract.\n /// @return exchange `IUniswapExchangeQuotes` for the token.\n function _getUniswapExchange(address tokenAddress)\n private\n view\n returns (IUniswapExchangeQuotes exchange)\n {\n exchange = IUniswapExchangeQuotes(\n address(IUniswapExchangeFactory(_getUniswapExchangeFactoryAddress())\n .getExchange(tokenAddress))\n );\n }\n\n /// @dev Assert that the tokens in a trade pair are valid.\n /// @param makerToken Address of the maker token.\n /// @param takerToken Address of the taker token.\n function _assertValidPair(address makerToken, address takerToken)\n private\n pure\n {\n require(makerToken != takerToken, \"ERC20BridgeSampler/INVALID_TOKEN_PAIR\");\n }\n}\n", - "@0x/contracts-asset-proxy/contracts/src/interfaces/IUniswapExchangeFactory.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"./IUniswapExchange.sol\";\n\n\ninterface IUniswapExchangeFactory {\n\n /// @dev Get the exchange for a token.\n /// @param tokenAddress The address of the token contract.\n function getExchange(address tokenAddress)\n external\n view\n returns (address);\n}\n", - "@0x/contracts-asset-proxy/contracts/src/interfaces/IUniswapExchange.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ninterface IUniswapExchange {\n\n /// @dev Buys at least `minTokensBought` tokens with ETH and transfer them\n /// to `recipient`.\n /// @param minTokensBought The minimum number of tokens to buy.\n /// @param deadline Time when this order expires.\n /// @param recipient Who to transfer the tokens to.\n /// @return tokensBought Amount of tokens bought.\n function ethToTokenTransferInput(\n uint256 minTokensBought,\n uint256 deadline,\n address recipient\n )\n external\n payable\n returns (uint256 tokensBought);\n\n /// @dev Buys at least `minEthBought` ETH with tokens.\n /// @param tokensSold Amount of tokens to sell.\n /// @param minEthBought The minimum amount of ETH to buy.\n /// @param deadline Time when this order expires.\n /// @return ethBought Amount of tokens bought.\n function tokenToEthSwapInput(\n uint256 tokensSold,\n uint256 minEthBought,\n uint256 deadline\n )\n external\n returns (uint256 ethBought);\n\n /// @dev Buys at least `minTokensBought` tokens with the exchange token\n /// and transfer them to `recipient`.\n /// @param minTokensBought The minimum number of tokens to buy.\n /// @param minEthBought The minimum amount of intermediate ETH to buy.\n /// @param deadline Time when this order expires.\n /// @param recipient Who to transfer the tokens to.\n /// @param toTokenAddress The token being bought.\n /// @return tokensBought Amount of tokens bought.\n function tokenToTokenTransferInput(\n uint256 tokensSold,\n uint256 minTokensBought,\n uint256 minEthBought,\n uint256 deadline,\n address recipient,\n address toTokenAddress\n )\n external\n returns (uint256 tokensBought);\n}\n", - "@0x/contracts-erc20/contracts/src/LibERC20Token.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibBytes.sol\";\nimport \"../src/interfaces/IERC20Token.sol\";\n\n\nlibrary LibERC20Token {\n bytes constant private DECIMALS_CALL_DATA = hex\"313ce567\";\n\n /// @dev Calls `IERC20Token(token).approve()`.\n /// Reverts if `false` is returned or if the return\n /// data length is nonzero and not 32 bytes.\n /// @param token The address of the token contract.\n /// @param spender The address that receives an allowance.\n /// @param allowance The allowance to set.\n function approve(\n address token,\n address spender,\n uint256 allowance\n )\n internal\n {\n bytes memory callData = abi.encodeWithSelector(\n IERC20Token(0).approve.selector,\n spender,\n allowance\n );\n _callWithOptionalBooleanResult(token, callData);\n }\n\n /// @dev Calls `IERC20Token(token).transfer()`.\n /// Reverts if `false` is returned or if the return\n /// data length is nonzero and not 32 bytes.\n /// @param token The address of the token contract.\n /// @param to The address that receives the tokens\n /// @param amount Number of tokens to transfer.\n function transfer(\n address token,\n address to,\n uint256 amount\n )\n internal\n {\n bytes memory callData = abi.encodeWithSelector(\n IERC20Token(0).transfer.selector,\n to,\n amount\n );\n _callWithOptionalBooleanResult(token, callData);\n }\n\n /// @dev Calls `IERC20Token(token).transferFrom()`.\n /// Reverts if `false` is returned or if the return\n /// data length is nonzero and not 32 bytes.\n /// @param token The address of the token contract.\n /// @param from The owner of the tokens.\n /// @param to The address that receives the tokens\n /// @param amount Number of tokens to transfer.\n function transferFrom(\n address token,\n address from,\n address to,\n uint256 amount\n )\n internal\n {\n bytes memory callData = abi.encodeWithSelector(\n IERC20Token(0).transferFrom.selector,\n from,\n to,\n amount\n );\n _callWithOptionalBooleanResult(token, callData);\n }\n\n /// @dev Retrieves the number of decimals for a token.\n /// Returns `18` if the call reverts.\n /// @param token The address of the token contract.\n /// @return tokenDecimals The number of decimals places for the token.\n function decimals(address token)\n internal\n view\n returns (uint8 tokenDecimals)\n {\n tokenDecimals = 18;\n (bool didSucceed, bytes memory resultData) = token.staticcall(DECIMALS_CALL_DATA);\n if (didSucceed && resultData.length == 32) {\n tokenDecimals = uint8(LibBytes.readUint256(resultData, 0));\n }\n }\n\n /// @dev Retrieves the allowance for a token, owner, and spender.\n /// Returns `0` if the call reverts.\n /// @param token The address of the token contract.\n /// @param owner The owner of the tokens.\n /// @param spender The address the spender.\n /// @return allowance The allowance for a token, owner, and spender.\n function allowance(address token, address owner, address spender)\n internal\n view\n returns (uint256 allowance_)\n {\n (bool didSucceed, bytes memory resultData) = token.staticcall(\n abi.encodeWithSelector(\n IERC20Token(0).allowance.selector,\n owner,\n spender\n )\n );\n if (didSucceed && resultData.length == 32) {\n allowance_ = LibBytes.readUint256(resultData, 0);\n }\n }\n\n /// @dev Retrieves the balance for a token owner.\n /// Returns `0` if the call reverts.\n /// @param token The address of the token contract.\n /// @param owner The owner of the tokens.\n /// @return balance The token balance of an owner.\n function balanceOf(address token, address owner)\n internal\n view\n returns (uint256 balance)\n {\n (bool didSucceed, bytes memory resultData) = token.staticcall(\n abi.encodeWithSelector(\n IERC20Token(0).balanceOf.selector,\n owner\n )\n );\n if (didSucceed && resultData.length == 32) {\n balance = LibBytes.readUint256(resultData, 0);\n }\n }\n\n /// @dev Executes a call on address `target` with calldata `callData`\n /// and asserts that either nothing was returned or a single boolean\n /// was returned equal to `true`.\n /// @param target The call target.\n /// @param callData The abi-encoded call data.\n function _callWithOptionalBooleanResult(\n address target,\n bytes memory callData\n )\n private\n {\n (bool didSucceed, bytes memory resultData) = target.call(callData);\n if (didSucceed) {\n if (resultData.length == 0) {\n return;\n }\n if (resultData.length == 32) {\n uint256 result = LibBytes.readUint256(resultData, 0);\n if (result == 1) {\n return;\n }\n }\n }\n LibRichErrors.rrevert(resultData);\n }\n}\n", - "@0x/contracts-utils/contracts/src/LibRichErrors.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\nlibrary LibRichErrors {\n\n // bytes4(keccak256(\"Error(string)\"))\n bytes4 internal constant STANDARD_ERROR_SELECTOR =\n 0x08c379a0;\n\n // solhint-disable func-name-mixedcase\n /// @dev ABI encode a standard, string revert error payload.\n /// This is the same payload that would be included by a `revert(string)`\n /// solidity statement. It has the function signature `Error(string)`.\n /// @param message The error string.\n /// @return The ABI encoded error.\n function StandardError(\n string memory message\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n STANDARD_ERROR_SELECTOR,\n bytes(message)\n );\n }\n // solhint-enable func-name-mixedcase\n\n /// @dev Reverts an encoded rich revert reason `errorData`.\n /// @param errorData ABI encoded error data.\n function rrevert(bytes memory errorData)\n internal\n pure\n {\n assembly {\n revert(add(errorData, 0x20), mload(errorData))\n }\n }\n}\n", - "@0x/contracts-utils/contracts/src/LibBytes.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"./LibBytesRichErrors.sol\";\nimport \"./LibRichErrors.sol\";\n\n\nlibrary LibBytes {\n\n using LibBytes for bytes;\n\n /// @dev Gets the memory address for a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of byte array. This\n /// points to the header of the byte array which contains\n /// the length.\n function rawAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := input\n }\n return memoryAddress;\n }\n\n /// @dev Gets the memory address for the contents of a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of the contents of the byte array.\n function contentAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := add(input, 32)\n }\n return memoryAddress;\n }\n\n /// @dev Copies `length` bytes from memory location `source` to `dest`.\n /// @param dest memory address to copy bytes to.\n /// @param source memory address to copy bytes from.\n /// @param length number of bytes to copy.\n function memCopy(\n uint256 dest,\n uint256 source,\n uint256 length\n )\n internal\n pure\n {\n if (length < 32) {\n // Handle a partial word by reading destination and masking\n // off the bits we are interested in.\n // This correctly handles overlap, zero lengths and source == dest\n assembly {\n let mask := sub(exp(256, sub(32, length)), 1)\n let s := and(mload(source), not(mask))\n let d := and(mload(dest), mask)\n mstore(dest, or(s, d))\n }\n } else {\n // Skip the O(length) loop when source == dest.\n if (source == dest) {\n return;\n }\n\n // For large copies we copy whole words at a time. The final\n // word is aligned to the end of the range (instead of after the\n // previous) to handle partial words. So a copy will look like this:\n //\n // ####\n // ####\n // ####\n // ####\n //\n // We handle overlap in the source and destination range by\n // changing the copying direction. This prevents us from\n // overwriting parts of source that we still need to copy.\n //\n // This correctly handles source == dest\n //\n if (source > dest) {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because it\n // is easier to compare with in the loop, and these\n // are also the addresses we need for copying the\n // last bytes.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the last 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the last bytes in\n // source already due to overlap.\n let last := mload(sEnd)\n\n // Copy whole words front to back\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} lt(source, sEnd) {} {\n mstore(dest, mload(source))\n source := add(source, 32)\n dest := add(dest, 32)\n }\n\n // Write the last 32 bytes\n mstore(dEnd, last)\n }\n } else {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because those\n // are the starting points when copying a word at the end.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the first 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the first bytes in\n // source already due to overlap.\n let first := mload(source)\n\n // Copy whole words back to front\n // We use a signed comparisson here to allow dEnd to become\n // negative (happens when source and dest < 32). Valid\n // addresses in local memory will never be larger than\n // 2**255, so they can be safely re-interpreted as signed.\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} slt(dest, dEnd) {} {\n mstore(dEnd, mload(sEnd))\n sEnd := sub(sEnd, 32)\n dEnd := sub(dEnd, 32)\n }\n\n // Write the first 32 bytes\n mstore(dest, first)\n }\n }\n }\n }\n\n /// @dev Returns a slices from a byte array.\n /// @param b The byte array to take a slice from.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n function slice(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n // Ensure that the from and to positions are valid positions for a slice within\n // the byte array that is being used.\n if (from > to) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,\n from,\n to\n ));\n }\n if (to > b.length) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,\n to,\n b.length\n ));\n }\n\n // Create a new bytes structure and copy contents\n result = new bytes(to - from);\n memCopy(\n result.contentAddress(),\n b.contentAddress() + from,\n result.length\n );\n return result;\n }\n\n /// @dev Returns a slice from a byte array without preserving the input.\n /// @param b The byte array to take a slice from. Will be destroyed in the process.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n /// @dev When `from == 0`, the original array will match the slice. In other cases its state will be corrupted.\n function sliceDestructive(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n // Ensure that the from and to positions are valid positions for a slice within\n // the byte array that is being used.\n if (from > to) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,\n from,\n to\n ));\n }\n if (to > b.length) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,\n to,\n b.length\n ));\n }\n\n // Create a new bytes structure around [from, to) in-place.\n assembly {\n result := add(b, from)\n mstore(result, sub(to, from))\n }\n return result;\n }\n\n /// @dev Pops the last byte off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The byte that was popped off.\n function popLastByte(bytes memory b)\n internal\n pure\n returns (bytes1 result)\n {\n if (b.length == 0) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanZeroRequired,\n b.length,\n 0\n ));\n }\n\n // Store last byte.\n result = b[b.length - 1];\n\n assembly {\n // Decrement length of byte array.\n let newLen := sub(mload(b), 1)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Tests equality of two byte arrays.\n /// @param lhs First byte array to compare.\n /// @param rhs Second byte array to compare.\n /// @return True if arrays are the same. False otherwise.\n function equals(\n bytes memory lhs,\n bytes memory rhs\n )\n internal\n pure\n returns (bool equal)\n {\n // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.\n // We early exit on unequal lengths, but keccak would also correctly\n // handle this.\n return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs);\n }\n\n /// @dev Reads an address from a position in a byte array.\n /// @param b Byte array containing an address.\n /// @param index Index in byte array of address.\n /// @return address from byte array.\n function readAddress(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (address result)\n {\n if (b.length < index + 20) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,\n b.length,\n index + 20 // 20 is length of address\n ));\n }\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Read address from array memory\n assembly {\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 20-byte mask to obtain address\n result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n }\n return result;\n }\n\n /// @dev Writes an address into a specific position in a byte array.\n /// @param b Byte array to insert address into.\n /// @param index Index in byte array of address.\n /// @param input Address to put into byte array.\n function writeAddress(\n bytes memory b,\n uint256 index,\n address input\n )\n internal\n pure\n {\n if (b.length < index + 20) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,\n b.length,\n index + 20 // 20 is length of address\n ));\n }\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Store address into array memory\n assembly {\n // The address occupies 20 bytes and mstore stores 32 bytes.\n // First fetch the 32-byte word where we'll be storing the address, then\n // apply a mask so we have only the bytes in the word that the address will not occupy.\n // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n let neighbors := and(\n mload(add(b, index)),\n 0xffffffffffffffffffffffff0000000000000000000000000000000000000000\n )\n\n // Make sure input address is clean.\n // (Solidity does not guarantee this)\n input := and(input, 0xffffffffffffffffffffffffffffffffffffffff)\n\n // Store the neighbors and address into memory\n mstore(add(b, index), xor(input, neighbors))\n }\n }\n\n /// @dev Reads a bytes32 value from a position in a byte array.\n /// @param b Byte array containing a bytes32 value.\n /// @param index Index in byte array of bytes32 value.\n /// @return bytes32 value from byte array.\n function readBytes32(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes32 result)\n {\n if (b.length < index + 32) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,\n b.length,\n index + 32\n ));\n }\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n result := mload(add(b, index))\n }\n return result;\n }\n\n /// @dev Writes a bytes32 into a specific position in a byte array.\n /// @param b Byte array to insert into.\n /// @param index Index in byte array of .\n /// @param input bytes32 to put into byte array.\n function writeBytes32(\n bytes memory b,\n uint256 index,\n bytes32 input\n )\n internal\n pure\n {\n if (b.length < index + 32) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,\n b.length,\n index + 32\n ));\n }\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n mstore(add(b, index), input)\n }\n }\n\n /// @dev Reads a uint256 value from a position in a byte array.\n /// @param b Byte array containing a uint256 value.\n /// @param index Index in byte array of uint256 value.\n /// @return uint256 value from byte array.\n function readUint256(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (uint256 result)\n {\n result = uint256(readBytes32(b, index));\n return result;\n }\n\n /// @dev Writes a uint256 into a specific position in a byte array.\n /// @param b Byte array to insert into.\n /// @param index Index in byte array of .\n /// @param input uint256 to put into byte array.\n function writeUint256(\n bytes memory b,\n uint256 index,\n uint256 input\n )\n internal\n pure\n {\n writeBytes32(b, index, bytes32(input));\n }\n\n /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n /// @param b Byte array containing a bytes4 value.\n /// @param index Index in byte array of bytes4 value.\n /// @return bytes4 value from byte array.\n function readBytes4(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes4 result)\n {\n if (b.length < index + 4) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsFourRequired,\n b.length,\n index + 4\n ));\n }\n\n // Arrays are prefixed by a 32 byte length field\n index += 32;\n\n // Read the bytes4 from array memory\n assembly {\n result := mload(add(b, index))\n // Solidity does not require us to clean the trailing bytes.\n // We do it anyway\n result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)\n }\n return result;\n }\n\n /// @dev Writes a new length to a byte array.\n /// Decreasing length will lead to removing the corresponding lower order bytes from the byte array.\n /// Increasing length may lead to appending adjacent in-memory bytes to the end of the byte array.\n /// @param b Bytes array to write new length to.\n /// @param length New length of byte array.\n function writeLength(bytes memory b, uint256 length)\n internal\n pure\n {\n assembly {\n mstore(b, length)\n }\n }\n}\n", - "@0x/contracts-utils/contracts/src/LibBytesRichErrors.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\nlibrary LibBytesRichErrors {\n\n enum InvalidByteOperationErrorCodes {\n FromLessThanOrEqualsToRequired,\n ToLessThanOrEqualsLengthRequired,\n LengthGreaterThanZeroRequired,\n LengthGreaterThanOrEqualsFourRequired,\n LengthGreaterThanOrEqualsTwentyRequired,\n LengthGreaterThanOrEqualsThirtyTwoRequired,\n LengthGreaterThanOrEqualsNestedBytesLengthRequired,\n DestinationLengthGreaterThanOrEqualSourceLengthRequired\n }\n\n // bytes4(keccak256(\"InvalidByteOperationError(uint8,uint256,uint256)\"))\n bytes4 internal constant INVALID_BYTE_OPERATION_ERROR_SELECTOR =\n 0x28006595;\n\n // solhint-disable func-name-mixedcase\n function InvalidByteOperationError(\n InvalidByteOperationErrorCodes errorCode,\n uint256 offset,\n uint256 required\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n INVALID_BYTE_OPERATION_ERROR_SELECTOR,\n errorCode,\n offset,\n required\n );\n }\n}\n", - "@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ncontract IERC20Token {\n\n // solhint-disable no-simple-event-func-name\n event Transfer(\n address indexed _from,\n address indexed _to,\n uint256 _value\n );\n\n event Approval(\n address indexed _owner,\n address indexed _spender,\n uint256 _value\n );\n\n /// @dev send `value` token to `to` from `msg.sender`\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return True if transfer was successful\n function transfer(address _to, uint256 _value)\n external\n returns (bool);\n\n /// @dev send `value` token to `to` from `from` on the condition it is approved by `from`\n /// @param _from The address of the sender\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return True if transfer was successful\n function transferFrom(\n address _from,\n address _to,\n uint256 _value\n )\n external\n returns (bool);\n\n /// @dev `msg.sender` approves `_spender` to spend `_value` tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @param _value The amount of wei to be approved for transfer\n /// @return Always true if the call has enough gas to complete execution\n function approve(address _spender, uint256 _value)\n external\n returns (bool);\n\n /// @dev Query total supply of token\n /// @return Total supply of token\n function totalSupply()\n external\n view\n returns (uint256);\n\n /// @param _owner The address from which the balance will be retrieved\n /// @return Balance of owner\n function balanceOf(address _owner)\n external\n view\n returns (uint256);\n\n /// @param _owner The address of the account owning tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @return Amount of remaining tokens allowed to spent\n function allowance(address _owner, address _spender)\n external\n view\n returns (uint256);\n}\n", - "@0x/contracts-exchange-libs/contracts/src/LibOrder.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibEIP712.sol\";\n\n\nlibrary LibOrder {\n\n using LibOrder for Order;\n\n // Hash for the EIP712 Order Schema:\n // keccak256(abi.encodePacked(\n // \"Order(\",\n // \"address makerAddress,\",\n // \"address takerAddress,\",\n // \"address feeRecipientAddress,\",\n // \"address senderAddress,\",\n // \"uint256 makerAssetAmount,\",\n // \"uint256 takerAssetAmount,\",\n // \"uint256 makerFee,\",\n // \"uint256 takerFee,\",\n // \"uint256 expirationTimeSeconds,\",\n // \"uint256 salt,\",\n // \"bytes makerAssetData,\",\n // \"bytes takerAssetData,\",\n // \"bytes makerFeeAssetData,\",\n // \"bytes takerFeeAssetData\",\n // \")\"\n // ))\n bytes32 constant internal _EIP712_ORDER_SCHEMA_HASH =\n 0xf80322eb8376aafb64eadf8f0d7623f22130fd9491a221e902b713cb984a7534;\n\n // A valid order remains fillable until it is expired, fully filled, or cancelled.\n // An order's status is unaffected by external factors, like account balances.\n enum OrderStatus {\n INVALID, // Default value\n INVALID_MAKER_ASSET_AMOUNT, // Order does not have a valid maker asset amount\n INVALID_TAKER_ASSET_AMOUNT, // Order does not have a valid taker asset amount\n FILLABLE, // Order is fillable\n EXPIRED, // Order has already expired\n FULLY_FILLED, // Order is fully filled\n CANCELLED // Order has been cancelled\n }\n\n // solhint-disable max-line-length\n /// @dev Canonical order structure.\n struct Order {\n address makerAddress; // Address that created the order.\n address takerAddress; // Address that is allowed to fill the order. If set to 0, any address is allowed to fill the order.\n address feeRecipientAddress; // Address that will recieve fees when order is filled.\n address senderAddress; // Address that is allowed to call Exchange contract methods that affect this order. If set to 0, any address is allowed to call these methods.\n uint256 makerAssetAmount; // Amount of makerAsset being offered by maker. Must be greater than 0.\n uint256 takerAssetAmount; // Amount of takerAsset being bid on by maker. Must be greater than 0.\n uint256 makerFee; // Fee paid to feeRecipient by maker when order is filled.\n uint256 takerFee; // Fee paid to feeRecipient by taker when order is filled.\n uint256 expirationTimeSeconds; // Timestamp in seconds at which order expires.\n uint256 salt; // Arbitrary number to facilitate uniqueness of the order's hash.\n bytes makerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring makerAsset. The leading bytes4 references the id of the asset proxy.\n bytes takerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring takerAsset. The leading bytes4 references the id of the asset proxy.\n bytes makerFeeAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring makerFeeAsset. The leading bytes4 references the id of the asset proxy.\n bytes takerFeeAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring takerFeeAsset. The leading bytes4 references the id of the asset proxy.\n }\n // solhint-enable max-line-length\n\n /// @dev Order information returned by `getOrderInfo()`.\n struct OrderInfo {\n OrderStatus orderStatus; // Status that describes order's validity and fillability.\n bytes32 orderHash; // EIP712 typed data hash of the order (see LibOrder.getTypedDataHash).\n uint256 orderTakerAssetFilledAmount; // Amount of order that has already been filled.\n }\n\n /// @dev Calculates the EIP712 typed data hash of an order with a given domain separator.\n /// @param order The order structure.\n /// @return EIP712 typed data hash of the order.\n function getTypedDataHash(Order memory order, bytes32 eip712ExchangeDomainHash)\n internal\n pure\n returns (bytes32 orderHash)\n {\n orderHash = LibEIP712.hashEIP712Message(\n eip712ExchangeDomainHash,\n order.getStructHash()\n );\n return orderHash;\n }\n\n /// @dev Calculates EIP712 hash of the order struct.\n /// @param order The order structure.\n /// @return EIP712 hash of the order struct.\n function getStructHash(Order memory order)\n internal\n pure\n returns (bytes32 result)\n {\n bytes32 schemaHash = _EIP712_ORDER_SCHEMA_HASH;\n bytes memory makerAssetData = order.makerAssetData;\n bytes memory takerAssetData = order.takerAssetData;\n bytes memory makerFeeAssetData = order.makerFeeAssetData;\n bytes memory takerFeeAssetData = order.takerFeeAssetData;\n\n // Assembly for more efficiently computing:\n // keccak256(abi.encodePacked(\n // EIP712_ORDER_SCHEMA_HASH,\n // uint256(order.makerAddress),\n // uint256(order.takerAddress),\n // uint256(order.feeRecipientAddress),\n // uint256(order.senderAddress),\n // order.makerAssetAmount,\n // order.takerAssetAmount,\n // order.makerFee,\n // order.takerFee,\n // order.expirationTimeSeconds,\n // order.salt,\n // keccak256(order.makerAssetData),\n // keccak256(order.takerAssetData),\n // keccak256(order.makerFeeAssetData),\n // keccak256(order.takerFeeAssetData)\n // ));\n\n assembly {\n // Assert order offset (this is an internal error that should never be triggered)\n if lt(order, 32) {\n invalid()\n }\n\n // Calculate memory addresses that will be swapped out before hashing\n let pos1 := sub(order, 32)\n let pos2 := add(order, 320)\n let pos3 := add(order, 352)\n let pos4 := add(order, 384)\n let pos5 := add(order, 416)\n\n // Backup\n let temp1 := mload(pos1)\n let temp2 := mload(pos2)\n let temp3 := mload(pos3)\n let temp4 := mload(pos4)\n let temp5 := mload(pos5)\n\n // Hash in place\n mstore(pos1, schemaHash)\n mstore(pos2, keccak256(add(makerAssetData, 32), mload(makerAssetData))) // store hash of makerAssetData\n mstore(pos3, keccak256(add(takerAssetData, 32), mload(takerAssetData))) // store hash of takerAssetData\n mstore(pos4, keccak256(add(makerFeeAssetData, 32), mload(makerFeeAssetData))) // store hash of makerFeeAssetData\n mstore(pos5, keccak256(add(takerFeeAssetData, 32), mload(takerFeeAssetData))) // store hash of takerFeeAssetData\n result := keccak256(pos1, 480)\n\n // Restore\n mstore(pos1, temp1)\n mstore(pos2, temp2)\n mstore(pos3, temp3)\n mstore(pos4, temp4)\n mstore(pos5, temp5)\n }\n return result;\n }\n}\n", - "@0x/contracts-utils/contracts/src/LibEIP712.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\nlibrary LibEIP712 {\n\n // Hash of the EIP712 Domain Separator Schema\n // keccak256(abi.encodePacked(\n // \"EIP712Domain(\",\n // \"string name,\",\n // \"string version,\",\n // \"uint256 chainId,\",\n // \"address verifyingContract\",\n // \")\"\n // ))\n bytes32 constant internal _EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f;\n\n /// @dev Calculates a EIP712 domain separator.\n /// @param name The EIP712 domain name.\n /// @param version The EIP712 domain version.\n /// @param verifyingContract The EIP712 verifying contract.\n /// @return EIP712 domain separator.\n function hashEIP712Domain(\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract\n )\n internal\n pure\n returns (bytes32 result)\n {\n bytes32 schemaHash = _EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH;\n\n // Assembly for more efficient computing:\n // keccak256(abi.encodePacked(\n // _EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH,\n // keccak256(bytes(name)),\n // keccak256(bytes(version)),\n // chainId,\n // uint256(verifyingContract)\n // ))\n\n assembly {\n // Calculate hashes of dynamic data\n let nameHash := keccak256(add(name, 32), mload(name))\n let versionHash := keccak256(add(version, 32), mload(version))\n\n // Load free memory pointer\n let memPtr := mload(64)\n\n // Store params in memory\n mstore(memPtr, schemaHash)\n mstore(add(memPtr, 32), nameHash)\n mstore(add(memPtr, 64), versionHash)\n mstore(add(memPtr, 96), chainId)\n mstore(add(memPtr, 128), verifyingContract)\n\n // Compute hash\n result := keccak256(memPtr, 160)\n }\n return result;\n }\n\n /// @dev Calculates EIP712 encoding for a hash struct with a given domain hash.\n /// @param eip712DomainHash Hash of the domain domain separator data, computed\n /// with getDomainHash().\n /// @param hashStruct The EIP712 hash struct.\n /// @return EIP712 hash applied to the given EIP712 Domain.\n function hashEIP712Message(bytes32 eip712DomainHash, bytes32 hashStruct)\n internal\n pure\n returns (bytes32 result)\n {\n // Assembly for more efficient computing:\n // keccak256(abi.encodePacked(\n // EIP191_HEADER,\n // EIP712_DOMAIN_HASH,\n // hashStruct\n // ));\n\n assembly {\n // Load free memory pointer\n let memPtr := mload(64)\n\n mstore(memPtr, 0x1901000000000000000000000000000000000000000000000000000000000000) // EIP191 header\n mstore(add(memPtr, 2), eip712DomainHash) // EIP712 domain hash\n mstore(add(memPtr, 34), hashStruct) // Hash of struct\n\n // Compute hash\n result := keccak256(memPtr, 66)\n }\n return result;\n }\n}\n", - "@0x/contracts-exchange-libs/contracts/src/LibMath.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"./LibMathRichErrors.sol\";\n\n\nlibrary LibMath {\n\n using LibSafeMath for uint256;\n\n /// @dev Calculates partial value given a numerator and denominator rounded down.\n /// Reverts if rounding error is >= 0.1%\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return Partial value of target rounded down.\n function safeGetPartialAmountFloor(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (uint256 partialAmount)\n {\n if (isRoundingErrorFloor(\n numerator,\n denominator,\n target\n )) {\n LibRichErrors.rrevert(LibMathRichErrors.RoundingError(\n numerator,\n denominator,\n target\n ));\n }\n\n partialAmount = numerator.safeMul(target).safeDiv(denominator);\n return partialAmount;\n }\n\n /// @dev Calculates partial value given a numerator and denominator rounded down.\n /// Reverts if rounding error is >= 0.1%\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return Partial value of target rounded up.\n function safeGetPartialAmountCeil(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (uint256 partialAmount)\n {\n if (isRoundingErrorCeil(\n numerator,\n denominator,\n target\n )) {\n LibRichErrors.rrevert(LibMathRichErrors.RoundingError(\n numerator,\n denominator,\n target\n ));\n }\n\n // safeDiv computes `floor(a / b)`. We use the identity (a, b integer):\n // ceil(a / b) = floor((a + b - 1) / b)\n // To implement `ceil(a / b)` using safeDiv.\n partialAmount = numerator.safeMul(target)\n .safeAdd(denominator.safeSub(1))\n .safeDiv(denominator);\n\n return partialAmount;\n }\n\n /// @dev Calculates partial value given a numerator and denominator rounded down.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return Partial value of target rounded down.\n function getPartialAmountFloor(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (uint256 partialAmount)\n {\n partialAmount = numerator.safeMul(target).safeDiv(denominator);\n return partialAmount;\n }\n\n /// @dev Calculates partial value given a numerator and denominator rounded down.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return Partial value of target rounded up.\n function getPartialAmountCeil(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (uint256 partialAmount)\n {\n // safeDiv computes `floor(a / b)`. We use the identity (a, b integer):\n // ceil(a / b) = floor((a + b - 1) / b)\n // To implement `ceil(a / b)` using safeDiv.\n partialAmount = numerator.safeMul(target)\n .safeAdd(denominator.safeSub(1))\n .safeDiv(denominator);\n\n return partialAmount;\n }\n\n /// @dev Checks if rounding error >= 0.1% when rounding down.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to multiply with numerator/denominator.\n /// @return Rounding error is present.\n function isRoundingErrorFloor(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (bool isError)\n {\n if (denominator == 0) {\n LibRichErrors.rrevert(LibMathRichErrors.DivisionByZeroError());\n }\n\n // The absolute rounding error is the difference between the rounded\n // value and the ideal value. The relative rounding error is the\n // absolute rounding error divided by the absolute value of the\n // ideal value. This is undefined when the ideal value is zero.\n //\n // The ideal value is `numerator * target / denominator`.\n // Let's call `numerator * target % denominator` the remainder.\n // The absolute error is `remainder / denominator`.\n //\n // When the ideal value is zero, we require the absolute error to\n // be zero. Fortunately, this is always the case. The ideal value is\n // zero iff `numerator == 0` and/or `target == 0`. In this case the\n // remainder and absolute error are also zero.\n if (target == 0 || numerator == 0) {\n return false;\n }\n\n // Otherwise, we want the relative rounding error to be strictly\n // less than 0.1%.\n // The relative error is `remainder / (numerator * target)`.\n // We want the relative error less than 1 / 1000:\n // remainder / (numerator * denominator) < 1 / 1000\n // or equivalently:\n // 1000 * remainder < numerator * target\n // so we have a rounding error iff:\n // 1000 * remainder >= numerator * target\n uint256 remainder = mulmod(\n target,\n numerator,\n denominator\n );\n isError = remainder.safeMul(1000) >= numerator.safeMul(target);\n return isError;\n }\n\n /// @dev Checks if rounding error >= 0.1% when rounding up.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to multiply with numerator/denominator.\n /// @return Rounding error is present.\n function isRoundingErrorCeil(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (bool isError)\n {\n if (denominator == 0) {\n LibRichErrors.rrevert(LibMathRichErrors.DivisionByZeroError());\n }\n\n // See the comments in `isRoundingError`.\n if (target == 0 || numerator == 0) {\n // When either is zero, the ideal value and rounded value are zero\n // and there is no rounding error. (Although the relative error\n // is undefined.)\n return false;\n }\n // Compute remainder as before\n uint256 remainder = mulmod(\n target,\n numerator,\n denominator\n );\n remainder = denominator.safeSub(remainder) % denominator;\n isError = remainder.safeMul(1000) >= numerator.safeMul(target);\n return isError;\n }\n}\n", - "@0x/contracts-utils/contracts/src/LibSafeMath.sol": "pragma solidity ^0.5.9;\n\nimport \"./LibRichErrors.sol\";\nimport \"./LibSafeMathRichErrors.sol\";\n\n\nlibrary LibSafeMath {\n\n function safeMul(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (a == 0) {\n return 0;\n }\n uint256 c = a * b;\n if (c / a != b) {\n LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n LibSafeMathRichErrors.BinOpErrorCodes.MULTIPLICATION_OVERFLOW,\n a,\n b\n ));\n }\n return c;\n }\n\n function safeDiv(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (b == 0) {\n LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n LibSafeMathRichErrors.BinOpErrorCodes.DIVISION_BY_ZERO,\n a,\n b\n ));\n }\n uint256 c = a / b;\n return c;\n }\n\n function safeSub(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (b > a) {\n LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n LibSafeMathRichErrors.BinOpErrorCodes.SUBTRACTION_UNDERFLOW,\n a,\n b\n ));\n }\n return a - b;\n }\n\n function safeAdd(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a + b;\n if (c < a) {\n LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n LibSafeMathRichErrors.BinOpErrorCodes.ADDITION_OVERFLOW,\n a,\n b\n ));\n }\n return c;\n }\n\n function max256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n}\n", - "@0x/contracts-utils/contracts/src/LibSafeMathRichErrors.sol": "pragma solidity ^0.5.9;\n\n\nlibrary LibSafeMathRichErrors {\n\n // bytes4(keccak256(\"Uint256BinOpError(uint8,uint256,uint256)\"))\n bytes4 internal constant UINT256_BINOP_ERROR_SELECTOR =\n 0xe946c1bb;\n\n // bytes4(keccak256(\"Uint256DowncastError(uint8,uint256)\"))\n bytes4 internal constant UINT256_DOWNCAST_ERROR_SELECTOR =\n 0xc996af7b;\n\n enum BinOpErrorCodes {\n ADDITION_OVERFLOW,\n MULTIPLICATION_OVERFLOW,\n SUBTRACTION_UNDERFLOW,\n DIVISION_BY_ZERO\n }\n\n enum DowncastErrorCodes {\n VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT32,\n VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT64,\n VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT96\n }\n\n // solhint-disable func-name-mixedcase\n function Uint256BinOpError(\n BinOpErrorCodes errorCode,\n uint256 a,\n uint256 b\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n UINT256_BINOP_ERROR_SELECTOR,\n errorCode,\n a,\n b\n );\n }\n\n function Uint256DowncastError(\n DowncastErrorCodes errorCode,\n uint256 a\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n UINT256_DOWNCAST_ERROR_SELECTOR,\n errorCode,\n a\n );\n }\n}\n", - "@0x/contracts-exchange-libs/contracts/src/LibMathRichErrors.sol": "pragma solidity ^0.5.9;\n\n\nlibrary LibMathRichErrors {\n\n // bytes4(keccak256(\"DivisionByZeroError()\"))\n bytes internal constant DIVISION_BY_ZERO_ERROR =\n hex\"a791837c\";\n\n // bytes4(keccak256(\"RoundingError(uint256,uint256,uint256)\"))\n bytes4 internal constant ROUNDING_ERROR_SELECTOR =\n 0x339f3de2;\n\n // solhint-disable func-name-mixedcase\n function DivisionByZeroError()\n internal\n pure\n returns (bytes memory)\n {\n return DIVISION_BY_ZERO_ERROR;\n }\n\n function RoundingError(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n ROUNDING_ERROR_SELECTOR,\n numerator,\n denominator,\n target\n );\n }\n}\n", - "@0x/contracts-utils/contracts/src/DeploymentConstants.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ncontract DeploymentConstants {\n /// @dev Mainnet address of the WETH contract.\n address constant private WETH_ADDRESS = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;\n // /// @dev Kovan address of the WETH contract.\n // address constant private WETH_ADDRESS = 0xd0A1E359811322d97991E03f863a0C30C2cF029C;\n /// @dev Mainnet address of the KyberNetworkProxy contract.\n address constant private KYBER_NETWORK_PROXY_ADDRESS = 0x818E6FECD516Ecc3849DAf6845e3EC868087B755;\n // /// @dev Kovan address of the KyberNetworkProxy contract.\n // address constant private KYBER_NETWORK_PROXY_ADDRESS = 0x692f391bCc85cefCe8C237C01e1f636BbD70EA4D;\n /// @dev Mainnet address of the `UniswapExchangeFactory` contract.\n address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0xc0a47dFe034B400B47bDaD5FecDa2621de6c4d95;\n // /// @dev Kovan address of the `UniswapExchangeFactory` contract.\n // address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0xD3E51Ef092B2845f10401a0159B2B96e8B6c3D30;\n /// @dev Mainnet address of the Eth2Dai `MatchingMarket` contract.\n address constant private ETH2DAI_ADDRESS = 0x794e6e91555438aFc3ccF1c5076A74F42133d08D;\n // /// @dev Kovan address of the Eth2Dai `MatchingMarket` contract.\n // address constant private ETH2DAI_ADDRESS = 0xe325acB9765b02b8b418199bf9650972299235F4;\n /// @dev Mainnet address of the `ERC20BridgeProxy` contract\n address constant private ERC20_BRIDGE_PROXY_ADDRESS = 0x8ED95d1746bf1E4dAb58d8ED4724f1Ef95B20Db0;\n // /// @dev Kovan address of the `ERC20BridgeProxy` contract\n // address constant private ERC20_BRIDGE_PROXY_ADDRESS = 0xFb2DD2A1366dE37f7241C83d47DA58fd503E2C64;\n ///@dev Mainnet address of the `Dai` (multi-collateral) contract\n address constant private DAI_ADDRESS = 0x6B175474E89094C44Da98b954EedeAC495271d0F;\n // ///@dev Kovan address of the `Dai` (multi-collateral) contract\n // address constant private DAI_ADDRESS = 0x4F96Fe3b7A6Cf9725f59d353F723c1bDb64CA6Aa;\n /// @dev Mainnet address of the `Chai` contract\n address constant private CHAI_ADDRESS = 0x06AF07097C9Eeb7fD685c692751D5C66dB49c215;\n /// @dev Mainnet address of the 0x DevUtils contract.\n address constant private DEV_UTILS_ADDRESS = 0x74134CF88b21383713E096a5ecF59e297dc7f547;\n // /// @dev Kovan address of the 0x DevUtils contract.\n // address constant private DEV_UTILS_ADDRESS = 0x161793Cdca4fF9E766A706c2C49c36AC1340bbcd;\n /// @dev Kyber ETH pseudo-address.\n address constant internal KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n /// @dev Mainnet address of the dYdX contract.\n address constant private DYDX_ADDRESS = 0x1E0447b19BB6EcFdAe1e4AE1694b0C3659614e4e;\n\n /// @dev Overridable way to get the `KyberNetworkProxy` address.\n /// @return kyberAddress The `IKyberNetworkProxy` address.\n function _getKyberNetworkProxyAddress()\n internal\n view\n returns (address kyberAddress)\n {\n return KYBER_NETWORK_PROXY_ADDRESS;\n }\n\n /// @dev Overridable way to get the WETH address.\n /// @return wethAddress The WETH address.\n function _getWethAddress()\n internal\n view\n returns (address wethAddress)\n {\n return WETH_ADDRESS;\n }\n\n /// @dev Overridable way to get the `UniswapExchangeFactory` address.\n /// @return uniswapAddress The `UniswapExchangeFactory` address.\n function _getUniswapExchangeFactoryAddress()\n internal\n view\n returns (address uniswapAddress)\n {\n return UNISWAP_EXCHANGE_FACTORY_ADDRESS;\n }\n\n /// @dev An overridable way to retrieve the Eth2Dai `MatchingMarket` contract.\n /// @return eth2daiAddress The Eth2Dai `MatchingMarket` contract.\n function _getEth2DaiAddress()\n internal\n view\n returns (address eth2daiAddress)\n {\n return ETH2DAI_ADDRESS;\n }\n\n /// @dev An overridable way to retrieve the `ERC20BridgeProxy` contract.\n /// @return erc20BridgeProxyAddress The `ERC20BridgeProxy` contract.\n function _getERC20BridgeProxyAddress()\n internal\n view\n returns (address erc20BridgeProxyAddress)\n {\n return ERC20_BRIDGE_PROXY_ADDRESS;\n }\n\n /// @dev An overridable way to retrieve the `Dai` contract.\n /// @return daiAddress The `Dai` contract.\n function _getDaiAddress()\n internal\n view\n returns (address daiAddress)\n {\n return DAI_ADDRESS;\n }\n\n /// @dev An overridable way to retrieve the `Chai` contract.\n /// @return chaiAddress The `Chai` contract.\n function _getChaiAddress()\n internal\n view\n returns (address chaiAddress)\n {\n return CHAI_ADDRESS;\n }\n\n /// @dev An overridable way to retrieve the 0x `DevUtils` contract address.\n /// @return devUtils The 0x `DevUtils` contract address.\n function _getDevUtilsAddress()\n internal\n view\n returns (address devUtils)\n {\n return DEV_UTILS_ADDRESS;\n }\n\n /// @dev Overridable way to get the DyDx contract.\n /// @return exchange The DyDx exchange contract.\n function _getDydxAddress()\n internal\n view\n returns (address dydxAddress)\n {\n return DYDX_ADDRESS;\n }\n}\n", - "src/IDevUtils.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\n\n\ninterface IDevUtils {\n\n /// @dev Fetches all order-relevant information needed to validate if the supplied order is fillable.\n /// @param order The order structure.\n /// @param signature Signature provided by maker that proves the order's authenticity.\n /// `0x01` can always be provided if the signature does not need to be validated.\n /// @return The orderInfo (hash, status, and `takerAssetAmount` already filled for the given order),\n /// fillableTakerAssetAmount (amount of the order's `takerAssetAmount` that is fillable given all on-chain state),\n /// and isValidSignature (validity of the provided signature).\n /// NOTE: If the `takerAssetData` encodes data for multiple assets, `fillableTakerAssetAmount` will represent a \"scaled\"\n /// amount, meaning it must be multiplied by all the individual asset amounts within the `takerAssetData` to get the final\n /// amount of each asset that can be filled.\n function getOrderRelevantState(LibOrder.Order calldata order, bytes calldata signature)\n external\n view\n returns (\n LibOrder.OrderInfo memory orderInfo,\n uint256 fillableTakerAssetAmount,\n bool isValidSignature\n );\n}\n", - "src/IERC20BridgeSampler.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\n\n\ninterface IERC20BridgeSampler {\n\n /// @dev Call multiple public functions on this contract in a single transaction.\n /// @param callDatas ABI-encoded call data for each function call.\n /// @return callResults ABI-encoded results data for each call.\n function batchCall(bytes[] calldata callDatas)\n external\n view\n returns (bytes[] memory callResults);\n\n /// @dev Queries the fillable taker asset amounts of native orders.\n /// @param orders Native orders to query.\n /// @param orderSignatures Signatures for each respective order in `orders`.\n /// @return orderFillableTakerAssetAmounts How much taker asset can be filled\n /// by each order in `orders`.\n function getOrderFillableTakerAssetAmounts(\n LibOrder.Order[] calldata orders,\n bytes[] calldata orderSignatures\n )\n external\n view\n returns (uint256[] memory orderFillableTakerAssetAmounts);\n\n /// @dev Queries the fillable maker asset amounts of native orders.\n /// @param orders Native orders to query.\n /// @param orderSignatures Signatures for each respective order in `orders`.\n /// @return orderFillableMakerAssetAmounts How much maker asset can be filled\n /// by each order in `orders`.\n function getOrderFillableMakerAssetAmounts(\n LibOrder.Order[] calldata orders,\n bytes[] calldata orderSignatures\n )\n external\n view\n returns (uint256[] memory orderFillableMakerAssetAmounts);\n\n /// @dev Sample sell quotes from Kyber.\n /// @param takerToken Address of the taker token (what to sell).\n /// @param makerToken Address of the maker token (what to buy).\n /// @param takerTokenAmounts Taker token sell amount for each sample.\n /// @return makerTokenAmounts Maker amounts bought at each taker token\n /// amount.\n function sampleSellsFromKyberNetwork(\n address takerToken,\n address makerToken,\n uint256[] calldata takerTokenAmounts\n )\n external\n view\n returns (uint256[] memory makerTokenAmounts);\n\n /// @dev Sample sell quotes from Eth2Dai/Oasis.\n /// @param takerToken Address of the taker token (what to sell).\n /// @param makerToken Address of the maker token (what to buy).\n /// @param takerTokenAmounts Taker token sell amount for each sample.\n /// @return makerTokenAmounts Maker amounts bought at each taker token\n /// amount.\n function sampleSellsFromEth2Dai(\n address takerToken,\n address makerToken,\n uint256[] calldata takerTokenAmounts\n )\n external\n view\n returns (uint256[] memory makerTokenAmounts);\n\n /// @dev Sample sell quotes from Uniswap.\n /// @param takerToken Address of the taker token (what to sell).\n /// @param makerToken Address of the maker token (what to buy).\n /// @param takerTokenAmounts Taker token sell amount for each sample.\n /// @return makerTokenAmounts Maker amounts bought at each taker token\n /// amount.\n function sampleSellsFromUniswap(\n address takerToken,\n address makerToken,\n uint256[] calldata takerTokenAmounts\n )\n external\n view\n returns (uint256[] memory makerTokenAmounts);\n\n /// @dev Sample buy quotes from Uniswap.\n /// @param takerToken Address of the taker token (what to sell).\n /// @param makerToken Address of the maker token (what to buy).\n /// @param makerTokenAmounts Maker token sell amount for each sample.\n /// @return takerTokenAmounts Taker amounts sold at each maker token\n /// amount.\n function sampleBuysFromUniswap(\n address takerToken,\n address makerToken,\n uint256[] calldata makerTokenAmounts\n )\n external\n view\n returns (uint256[] memory takerTokenAmounts);\n\n /// @dev Sample buy quotes from Eth2Dai/Oasis.\n /// @param takerToken Address of the taker token (what to sell).\n /// @param makerToken Address of the maker token (what to buy).\n /// @param takerTokenAmounts Maker token sell amount for each sample.\n /// @return takerTokenAmounts Taker amounts sold at each maker token\n /// amount.\n function sampleBuysFromEth2Dai(\n address takerToken,\n address makerToken,\n uint256[] calldata makerTokenAmounts\n )\n external\n view\n returns (uint256[] memory takerTokenAmounts);\n\n /// @dev Sample sell quotes from Curve.\n /// @param curveAddress Address of the Curve contract.\n /// @param fromTokenIdx Index of the taker token (what to sell).\n /// @param toTokenIdx Index of the maker token (what to buy).\n /// @param takerTokenAmounts Taker token sell amount for each sample.\n /// @return makerTokenAmounts Maker amounts bought at each taker token\n /// amount.\n function sampleSellsFromCurve(\n address curveAddress,\n int128 fromTokenIdx,\n int128 toTokenIdx,\n uint256[] calldata takerTokenAmounts\n )\n external\n view\n returns (uint256[] memory makerTokenAmounts);\n\n /// @dev Sample sell quotes from an arbitrary on-chain liquidity provider.\n /// @param registryAddress Address of the liquidity provider registry contract.\n /// @param takerToken Address of the taker token (what to sell).\n /// @param makerToken Address of the maker token (what to buy).\n /// @param takerTokenAmounts Taker token sell amount for each sample.\n /// @return makerTokenAmounts Maker amounts bought at each taker token\n /// amount.\n function sampleSellsFromLiquidityProviderRegistry(\n address registryAddress,\n address takerToken,\n address makerToken,\n uint256[] calldata takerTokenAmounts\n )\n external\n view\n returns (uint256[] memory makerTokenAmounts);\n\n /// @dev Sample buy quotes from an arbitrary on-chain liquidity provider.\n /// @param registryAddress Address of the liquidity provider registry contract.\n /// @param takerToken Address of the taker token (what to sell).\n /// @param makerToken Address of the maker token (what to buy).\n /// @param makerTokenAmounts Maker token buy amount for each sample.\n /// @return takerTokenAmounts Taker amounts sold at each maker token\n /// amount.\n function sampleBuysFromLiquidityProviderRegistry(\n address registryAddress,\n address takerToken,\n address makerToken,\n uint256[] calldata makerTokenAmounts\n )\n external\n view\n returns (uint256[] memory takerTokenAmounts);\n\n /// @dev Returns the address of a liquidity provider for the given market\n /// (takerToken, makerToken), from a registry of liquidity providers.\n /// Returns address(0) if no such provider exists in the registry.\n /// @param takerToken Taker asset managed by liquidity provider.\n /// @param makerToken Maker asset managed by liquidity provider.\n /// @return providerAddress Address of the liquidity provider.\n function getLiquidityProviderFromRegistry(\n address registryAddress,\n address takerToken,\n address makerToken\n )\n external\n view\n returns (address providerAddress);\n}\n", - "src/IEth2Dai.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ninterface IEth2Dai {\n\n function getBuyAmount(\n address buyToken,\n address payToken,\n uint256 payAmount\n )\n external\n view\n returns (uint256 buyAmount);\n\n function getPayAmount(\n address payToken,\n address buyToken,\n uint256 buyAmount\n )\n external\n view\n returns (uint256 payAmount);\n}\n", - "src/IKyberNetwork.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ninterface IKyberNetwork {\n\n function getExpectedRate(\n address fromToken,\n address toToken,\n uint256 fromAmount\n )\n external\n view\n returns (uint256 expectedRate, uint256 slippageRate);\n}\n", - "src/IUniswapExchangeQuotes.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ninterface IUniswapExchangeQuotes {\n\n function getEthToTokenInputPrice(\n uint256 ethSold\n )\n external\n view\n returns (uint256 tokensBought);\n\n function getEthToTokenOutputPrice(\n uint256 tokensBought\n )\n external\n view\n returns (uint256 ethSold);\n\n function getTokenToEthInputPrice(\n uint256 tokensSold\n )\n external\n view\n returns (uint256 ethBought);\n\n function getTokenToEthOutputPrice(\n uint256 ethBought\n )\n external\n view\n returns (uint256 tokensSold);\n}\n", - "src/ICurve.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\n// solhint-disable func-name-mixedcase\ninterface ICurve {\n\n /// @dev Sell `sellAmount` of `fromToken` token and receive `toToken` token.\n /// This function exists on early versions of Curve (USDC/DAI)\n /// @param i The token index being sold.\n /// @param j The token index being bought.\n /// @param sellAmount The amount of token being bought.\n /// @param minBuyAmount The minimum buy amount of the token being bought.\n /// @param deadline The time in seconds when this operation should expire.\n function exchange_underlying(\n int128 i,\n int128 j,\n uint256 sellAmount,\n uint256 minBuyAmount,\n uint256 deadline\n )\n external;\n\n /// @dev Sell `sellAmount` of `fromToken` token and receive `toToken` token.\n /// This function exists on later versions of Curve (USDC/DAI/USDT)\n /// @param i The token index being sold.\n /// @param j The token index being bought.\n /// @param sellAmount The amount of token being bought.\n /// @param minBuyAmount The minimum buy amount of the token being bought.\n function exchange_underlying(\n int128 i,\n int128 j,\n uint256 sellAmount,\n uint256 minBuyAmount\n )\n external;\n\n /// @dev Get the amount of `toToken` by selling `sellAmount` of `fromToken`\n /// @param i The token index being sold.\n /// @param j The token index being bought.\n /// @param sellAmount The amount of token being bought.\n function get_dy_underlying(\n int128 i,\n int128 j,\n uint256 sellAmount\n )\n external\n returns (uint256 dy);\n\n /// @dev Get the amount of `fromToken` by buying `buyAmount` of `toToken`\n /// This function exists on later versions of Curve (USDC/DAI/USDT)\n /// @param i The token index being sold.\n /// @param j The token index being bought.\n /// @param buyAmount The amount of token being bought.\n function get_dx_underlying(\n int128 i,\n int128 j,\n uint256 buyAmount\n )\n external\n returns (uint256 dx);\n\n /// @dev Get the underlying token address from the token index\n /// @param i The token index.\n function underlying_coins(\n int128 i\n )\n external\n returns (address tokenAddress);\n}\n", - "src/ILiquidityProvider.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ninterface ILiquidityProvider {\n\n /// @dev Transfers `amount` of the ERC20 `tokenAddress` from `from` to `to`.\n /// @param tokenAddress The address of the ERC20 token to transfer.\n /// @param from Address to transfer asset from.\n /// @param to Address to transfer asset to.\n /// @param amount Amount of asset to transfer.\n /// @param bridgeData Arbitrary asset data needed by the bridge contract.\n /// @return success The magic bytes `0xdc1600f3` if successful.\n function bridgeTransferFrom(\n address tokenAddress,\n address from,\n address to,\n uint256 amount,\n bytes calldata bridgeData\n )\n external\n returns (bytes4 success);\n\n /// @dev Quotes the amount of `makerToken` that would be obtained by\n /// selling `sellAmount` of `takerToken`.\n /// @param takerToken Address of the taker token (what to sell).\n /// @param makerToken Address of the maker token (what to buy).\n /// @param sellAmount Amount of `takerToken` to sell.\n /// @return makerTokenAmount Amount of `makerToken` that would be obtained.\n function getSellQuote(\n address takerToken,\n address makerToken,\n uint256 sellAmount\n )\n external\n view\n returns (uint256 makerTokenAmount);\n\n /// @dev Quotes the amount of `takerToken` that would need to be sold in\n /// order to obtain `buyAmount` of `makerToken`.\n /// @param takerToken Address of the taker token (what to sell).\n /// @param makerToken Address of the maker token (what to buy).\n /// @param buyAmount Amount of `makerToken` to buy.\n /// @return takerTokenAmount Amount of `takerToken` that would need to be sold.\n function getBuyQuote(\n address takerToken,\n address makerToken,\n uint256 buyAmount\n )\n external\n view\n returns (uint256 takerTokenAmount);\n}\n", - "src/ILiquidityProviderRegistry.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ninterface ILiquidityProviderRegistry {\n\n /// @dev Returns the address of a liquidity provider for the given market\n /// (takerToken, makerToken), reverting if the pool does not exist.\n /// @param takerToken Taker asset managed by liquidity provider.\n /// @param makerToken Maker asset managed by liquidity provider.\n /// @return Address of the liquidity provider.\n function getLiquidityProviderForMarket(\n address takerToken,\n address makerToken\n )\n external\n view\n returns (address providerAddress);\n}\n" - }, - "sourceTreeHashHex": "0xdcc722938dee24bce0d1dac282553c4b23d179aab5c29920caecaf0b69c4cce8", - "compiler": { - "name": "solc", - "version": "soljson-v0.5.16+commit.9c3226ce.js", - "settings": { - "optimizer": { - "enabled": true, - "runs": 1000000, - "details": { - "yul": true, - "deduplicate": true, - "cse": true, - "constantOptimizer": true - } - }, - "outputSelection": { - "*": { - "*": [ - "abi", - "devdoc", - "evm.bytecode.object", - "evm.bytecode.sourceMap", - "evm.deployedBytecode.object", - "evm.deployedBytecode.sourceMap" - ] - } - }, - "evmVersion": "istanbul", - "remappings": [ - "@0x/contracts-asset-proxy=/Users/danielpyrathon/Desktop/Projects/0x-monorepo/contracts/erc20-bridge-sampler/node_modules/@0x/contracts-asset-proxy", - "@0x/contracts-erc20=/Users/danielpyrathon/Desktop/Projects/0x-monorepo/contracts/erc20-bridge-sampler/node_modules/@0x/contracts-erc20", - "@0x/contracts-utils=/Users/danielpyrathon/Desktop/Projects/0x-monorepo/contracts/erc20-bridge-sampler/node_modules/@0x/contracts-utils", - "@0x/contracts-exchange-libs=/Users/danielpyrathon/Desktop/Projects/0x-monorepo/contracts/erc20-bridge-sampler/node_modules/@0x/contracts-exchange-libs", - "@0x/contracts-exchange=/Users/danielpyrathon/Desktop/Projects/0x-monorepo/contracts/erc20-bridge-sampler/node_modules/@0x/contracts-exchange" - ] - } - }, - "chains": {} -} \ No newline at end of file + "schemaVersion": "2.0.0", + "contractName": "ERC20BridgeSampler", + "compilerOutput": { + "abi": [ + { + "constant": true, + "inputs": [{ "internalType": "bytes[]", "name": "callDatas", "type": "bytes[]" }], + "name": "batchCall", + "outputs": [{ "internalType": "bytes[]", "name": "callResults", "type": "bytes[]" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "registryAddress", "type": "address" }, + { "internalType": "address", "name": "takerToken", "type": "address" }, + { "internalType": "address", "name": "makerToken", "type": "address" } + ], + "name": "getLiquidityProviderFromRegistry", + "outputs": [{ "internalType": "address", "name": "providerAddress", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "components": [ + { "internalType": "address", "name": "makerAddress", "type": "address" }, + { "internalType": "address", "name": "takerAddress", "type": "address" }, + { "internalType": "address", "name": "feeRecipientAddress", "type": "address" }, + { "internalType": "address", "name": "senderAddress", "type": "address" }, + { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "makerFee", "type": "uint256" }, + { "internalType": "uint256", "name": "takerFee", "type": "uint256" }, + { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" }, + { "internalType": "uint256", "name": "salt", "type": "uint256" }, + { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" } + ], + "internalType": "struct LibOrder.Order[]", + "name": "orders", + "type": "tuple[]" + }, + { "internalType": "bytes[]", "name": "orderSignatures", "type": "bytes[]" } + ], + "name": "getOrderFillableMakerAssetAmounts", + "outputs": [ + { "internalType": "uint256[]", "name": "orderFillableMakerAssetAmounts", "type": "uint256[]" } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "components": [ + { "internalType": "address", "name": "makerAddress", "type": "address" }, + { "internalType": "address", "name": "takerAddress", "type": "address" }, + { "internalType": "address", "name": "feeRecipientAddress", "type": "address" }, + { "internalType": "address", "name": "senderAddress", "type": "address" }, + { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "makerFee", "type": "uint256" }, + { "internalType": "uint256", "name": "takerFee", "type": "uint256" }, + { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" }, + { "internalType": "uint256", "name": "salt", "type": "uint256" }, + { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" } + ], + "internalType": "struct LibOrder.Order[]", + "name": "orders", + "type": "tuple[]" + }, + { "internalType": "bytes[]", "name": "orderSignatures", "type": "bytes[]" } + ], + "name": "getOrderFillableTakerAssetAmounts", + "outputs": [ + { "internalType": "uint256[]", "name": "orderFillableTakerAssetAmounts", "type": "uint256[]" } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "takerToken", "type": "address" }, + { "internalType": "address", "name": "makerToken", "type": "address" }, + { "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" } + ], + "name": "sampleBuysFromEth2Dai", + "outputs": [{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "registryAddress", "type": "address" }, + { "internalType": "address", "name": "takerToken", "type": "address" }, + { "internalType": "address", "name": "makerToken", "type": "address" }, + { "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" } + ], + "name": "sampleBuysFromLiquidityProviderRegistry", + "outputs": [{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "takerToken", "type": "address" }, + { "internalType": "address", "name": "makerToken", "type": "address" }, + { "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" } + ], + "name": "sampleBuysFromUniswap", + "outputs": [{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "curveAddress", "type": "address" }, + { "internalType": "int128", "name": "fromTokenIdx", "type": "int128" }, + { "internalType": "int128", "name": "toTokenIdx", "type": "int128" }, + { "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" } + ], + "name": "sampleSellsFromCurve", + "outputs": [{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "takerToken", "type": "address" }, + { "internalType": "address", "name": "makerToken", "type": "address" }, + { "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" } + ], + "name": "sampleSellsFromEth2Dai", + "outputs": [{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "takerToken", "type": "address" }, + { "internalType": "address", "name": "makerToken", "type": "address" }, + { "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" } + ], + "name": "sampleSellsFromKyberNetwork", + "outputs": [{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "registryAddress", "type": "address" }, + { "internalType": "address", "name": "takerToken", "type": "address" }, + { "internalType": "address", "name": "makerToken", "type": "address" }, + { "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" } + ], + "name": "sampleSellsFromLiquidityProviderRegistry", + "outputs": [{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "takerToken", "type": "address" }, + { "internalType": "address", "name": "makerToken", "type": "address" }, + { "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" } + ], + "name": "sampleSellsFromUniswap", + "outputs": [{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }], + "payable": false, + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "methods": { + "batchCall(bytes[])": { + "details": "Call multiple public functions on this contract in a single transaction.", + "params": { "callDatas": "ABI-encoded call data for each function call." }, + "return": "callResults ABI-encoded results data for each call." + }, + "getLiquidityProviderFromRegistry(address,address,address)": { + "details": "Returns the address of a liquidity provider for the given market (takerToken, makerToken), from a registry of liquidity providers. Returns address(0) if no such provider exists in the registry.", + "params": { + "makerToken": "Maker asset managed by liquidity provider.", + "takerToken": "Taker asset managed by liquidity provider." + }, + "return": "providerAddress Address of the liquidity provider." + }, + "getOrderFillableMakerAssetAmounts((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[])": { + "details": "Queries the fillable taker asset amounts of native orders. Effectively ignores orders that have empty signatures or", + "params": { + "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[])": { + "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": { + "orderSignatures": "Signatures for each respective order in `orders`.", + "orders": "Native orders to query." + }, + "return": "orderFillableTakerAssetAmounts How much taker asset can be filled by each order in `orders`." + }, + "sampleBuysFromEth2Dai(address,address,uint256[])": { + "details": "Sample buy quotes from Eth2Dai/Oasis.", + "params": { + "makerToken": "Address of the maker token (what to buy).", + "takerToken": "Address of the taker token (what to sell).", + "takerTokenAmounts": "Maker token sell amount for each sample." + }, + "return": "takerTokenAmounts Taker amounts sold at each maker token amount." + }, + "sampleBuysFromLiquidityProviderRegistry(address,address,address,uint256[])": { + "details": "Sample buy quotes from an arbitrary on-chain liquidity provider.", + "params": { + "makerToken": "Address of the maker token (what to buy).", + "makerTokenAmounts": "Maker token buy amount for each sample.", + "registryAddress": "Address of the liquidity provider registry contract.", + "takerToken": "Address of the taker token (what to sell)." + }, + "return": "takerTokenAmounts Taker amounts sold at each maker token amount." + }, + "sampleBuysFromUniswap(address,address,uint256[])": { + "details": "Sample buy quotes from Uniswap.", + "params": { + "makerToken": "Address of the maker token (what to buy).", + "makerTokenAmounts": "Maker token sell amount for each sample.", + "takerToken": "Address of the taker token (what to sell)." + }, + "return": "takerTokenAmounts Taker amounts sold at each maker token amount." + }, + "sampleSellsFromCurve(address,int128,int128,uint256[])": { + "details": "Sample sell quotes from Curve.", + "params": { + "curveAddress": "Address of the Curve contract.", + "fromTokenIdx": "Index of the taker token (what to sell).", + "takerTokenAmounts": "Taker token sell amount for each sample.", + "toTokenIdx": "Index of the maker token (what to buy)." + }, + "return": "makerTokenAmounts Maker amounts bought at each taker token amount." + }, + "sampleSellsFromEth2Dai(address,address,uint256[])": { + "details": "Sample sell quotes from Eth2Dai/Oasis.", + "params": { + "makerToken": "Address of the maker token (what to buy).", + "takerToken": "Address of the taker token (what to sell).", + "takerTokenAmounts": "Taker token sell amount for each sample." + }, + "return": "makerTokenAmounts Maker amounts bought at each taker token amount." + }, + "sampleSellsFromKyberNetwork(address,address,uint256[])": { + "details": "Sample sell quotes from Kyber.", + "params": { + "makerToken": "Address of the maker token (what to buy).", + "takerToken": "Address of the taker token (what to sell).", + "takerTokenAmounts": "Taker token sell amount for each sample." + }, + "return": "makerTokenAmounts Maker amounts bought at each taker token amount." + }, + "sampleSellsFromLiquidityProviderRegistry(address,address,address,uint256[])": { + "details": "Sample sell quotes from an arbitrary on-chain liquidity provider.", + "params": { + "makerToken": "Address of the maker token (what to buy).", + "registryAddress": "Address of the liquidity provider registry contract.", + "takerToken": "Address of the taker token (what to sell).", + "takerTokenAmounts": "Taker token sell amount for each sample." + }, + "return": "makerTokenAmounts Maker amounts bought at each taker token amount." + }, + "sampleSellsFromUniswap(address,address,uint256[])": { + "details": "Sample sell quotes from Uniswap.", + "params": { + "makerToken": "Address of the maker token (what to buy).", + "takerToken": "Address of the taker token (what to sell).", + "takerTokenAmounts": "Taker token sell amount for each sample." + }, + "return": "makerTokenAmounts Maker amounts bought at each taker token amount." + } + } + }, + "evm": { + "bytecode": { + "object": "0x608060405234801561001057600080fd5b50612a0d806100206000396000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c806368be3cf2116100815780639f76ad351161005b5780639f76ad35146101a7578063a2c28d4b146101ba578063c7f7142e146101cd576100d4565b806368be3cf2146101615780636dd6b78d146101815780638b123a0214610194576100d4565b806359f515d0116100b257806359f515d01461012857806360ee052a1461013b57806364ee6ade1461014e576100d4565b8063354152a3146100d95780634703a7e6146101025780634cb8e25314610115575b600080fd5b6100ec6100e736600461237c565b6101ed565b6040516100f991906126e3565b60405180910390f35b6100ec61011036600461231c565b6103be565b6100ec61012336600461231c565b61059a565b6100ec610136366004612426565b61088a565b6100ec61014936600461231c565b610933565b6100ec61015c36600461231c565b610bf3565b61017461016f3660046123ba565b610db9565b6040516100f99190612665565b6100ec61018f36600461231c565b610ef8565b6100ec6101a2366004612426565b6111a0565b6100ec6101b53660046122a9565b611468565b6100ec6101c83660046122a9565b61166d565b6101e06101db36600461225f565b611859565b6040516100f991906125ec565b60606000825190508060405190808252806020026020018201604052801561021f578160200160208202803883390190505b50915060005b818110156103b457600060608873ffffffffffffffffffffffffffffffffffffffff16620927c0600073ffffffffffffffffffffffffffffffffffffffff166307211ef7905060e01b8a8a8a888151811061027c57fe5b602002602001015160405160240161029693929190612756565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161031f91906125d0565b6000604051808303818686fa925050503d806000811461035b576040519150601f19603f3d011682016040523d82523d6000602084013e610360565b606091505b5090925090506000821561038957818060200190516103829190810190612544565b9050610391565b5050506103b4565b8086858151811061039e57fe5b6020908102919091010152505050600101610225565b5050949350505050565b60606103ca8385611994565b81516040805182815260208084028201019091528180156103f5578160200160208202803883390190505b50915060005b81811015610591576000606061040f611a07565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663ff1fd974905060e01b8a8a8a888151811061045957fe5b602002602001015160405160240161047393929190612634565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516104fc91906125d0565b6000604051808303818686fa925050503d8060008114610538576040519150601f19603f3d011682016040523d82523d6000602084013e61053d565b606091505b50909250905060008215610566578180602001905161055f9190810190612544565b905061056e565b505050610591565b8086858151811061057b57fe5b60209081029190910101525050506001016103fb565b50509392505050565b60606105a68385611994565b60006105b0611a1f565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146105e857846105fe565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b9050600061060a611a1f565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146106425784610658565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b9050600061066587611a37565b60ff169050600061067587611a37565b60ff169050600086519050806040519080825280602002602001820160405280156106aa578160200160208202803883390190505b50955060005b8181101561087d57600060606106c4611a48565b73ffffffffffffffffffffffffffffffffffffffff166216e360600073ffffffffffffffffffffffffffffffffffffffff1663809a9e55905060e01b8a8a8e888151811061070e57fe5b602002602001015160405160240161072893929190612634565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516107b191906125d0565b6000604051808303818686fa925050503d80600081146107ed576040519150601f19603f3d011682016040523d82523d6000602084013e6107f2565b606091505b5090925090506000821561081b57818060200190516108149190810190612544565b9050610823565b50505061087d565b670de0b6b3a764000087600a0a87600a0a8d878151811061084057fe5b60200260200101518402028161085257fe5b048161085a57fe5b048a858151811061086757fe5b60209081029190910101525050506001016106b0565b5050505050509392505050565b606061089683836111a0565b905060005b835181101561092c578181815181106108b057fe5b60200260200101516000146109245761090b8282815181106108ce57fe5b60200260200101518583815181106108e257fe5b602002602001015160a001518684815181106108fa57fe5b602002602001015160800151611a60565b82828151811061091757fe5b6020026020010181815250505b60010161089b565b5092915050565b606061093f8385611994565b815160408051828152602080840282010190915281801561096a578160200160208202803883390190505b5091506000610977611a1f565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146109b7576109b286611aa2565b6109ba565b60005b905060006109c6611a1f565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610a0657610a0186611aa2565b610a09565b60005b905060005b83811015610be8576001610a20611a1f565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415610ab7578651610a969085907f2640f62c00000000000000000000000000000000000000000000000000000000908a9086908110610a8957fe5b6020026020010151611b34565b878481518110610aa257fe5b60200260200101819350828152505050610bd4565b610abf611a1f565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161415610b28578651610a969084907f59e9486200000000000000000000000000000000000000000000000000000000908a9086908110610a8957fe5b8651600090610b619085907f59e9486200000000000000000000000000000000000000000000000000000000908b9087908110610a8957fe5b925090508015610bb757610b96857f2640f62c0000000000000000000000000000000000000000000000000000000083611b34565b888581518110610ba257fe5b60200260200101819450828152505050610bd2565b6000878481518110610bc557fe5b6020026020010181815250505b505b80610bdf5750610be8565b50600101610a0e565b505050509392505050565b6060610bff8385611994565b8151604080518281526020808402820101909152818015610c2a578160200160208202803883390190505b50915060005b818110156105915760006060610c44611a07565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663144a2752905060e01b898b8a8881518110610c8e57fe5b6020026020010151604051602401610ca893929190612634565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051610d3191906125d0565b6000604051808303818686fa925050503d8060008114610d6d576040519150601f19603f3d011682016040523d82523d6000602084013e610d72565b606091505b509092509050600082156105665781806020019051610d949190810190612544565b905080868581518110610da357fe5b6020908102919091010152505050600101610c30565b604080518281526020808402820101909152606090828015610def57816020015b6060815260200190600190039081610dda5790505b50905060005b80831461092c576000606030868685818110610e0d57fe5b6020028201905080357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe136849003018112610e4757600080fd5b9091016020810191503567ffffffffffffffff811115610e6657600080fd5b36819003821315610e7657600080fd5b604051610e849291906125c0565b600060405180830381855afa9150503d8060008114610ebf576040519150601f19603f3d011682016040523d82523d6000602084013e610ec4565b606091505b509150915081610ed657805160208201fd5b80848481518110610ee357fe5b60209081029190910101525050600101610df5565b6060610f048385611994565b8151604080518281526020808402820101909152818015610f2f578160200160208202803883390190505b5091506000610f3c611a1f565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610f7c57610f7786611aa2565b610f7f565b60005b90506000610f8b611a1f565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610fcb57610fc686611aa2565b610fce565b60005b905060005b83811015610be8576001610fe5611a1f565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16141561106f57865161104e9085907f95b68fe700000000000000000000000000000000000000000000000000000000908a9086908110610a8957fe5b87848151811061105a57fe5b6020026020010181935082815250505061118c565b611077611a1f565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614156110e057865161104e9084907fcd7724c300000000000000000000000000000000000000000000000000000000908a9086908110610a8957fe5b86516000906111199086907f95b68fe700000000000000000000000000000000000000000000000000000000908b9087908110610a8957fe5b92509050801561116f5761114e847fcd7724c30000000000000000000000000000000000000000000000000000000083611b34565b88858151811061115a57fe5b6020026020010181945082815250505061118a565b600087848151811061117d57fe5b6020026020010181815250505b505b806111975750610be8565b50600101610fd3565b606082516040519080825280602002602001820160405280156111cd578160200160208202803883390190505b50905060005b8351811461092c578281815181106111e757fe5b60200260200101515160001480611215575083818151811061120557fe5b6020026020010151608001516000145b80611237575083818151811061122757fe5b602002602001015160a001516000145b1561125b57600082828151811061124a57fe5b602002602001018181525050611460565b60006060611267611c7d565b73ffffffffffffffffffffffffffffffffffffffff166207a120611289611c7d565b5087517fe77286eb00000000000000000000000000000000000000000000000000000000908990879081106112ba57fe5b60200260200101518887815181106112ce57fe5b60200260200101516040516024016112e79291906127d1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161137091906125d0565b6000604051808303818686fa925050503d80600081146113ac576040519150601f19603f3d011682016040523d82523d6000602084013e6113b1565b606091505b5091509150816113dc5760008484815181106113c957fe5b6020026020010181815250505050611460565b6113e4611f5b565b600080838060200190516113fb91908101906124d7565b9194509250905060038351600681111561141157fe5b14158061141c575080155b1561144057600087878151811061142f57fe5b60200260200101818152505061145a565b8187878151811061144d57fe5b6020026020010181815250505b50505050505b6001016111d3565b60606000825190508060405190808252806020026020018201604052801561149a578160200160208202803883390190505b50915060006114aa878787611859565b905073ffffffffffffffffffffffffffffffffffffffff81166114cf57506116659050565b60005b8281101561166157600060608373ffffffffffffffffffffffffffffffffffffffff1662030d40600073ffffffffffffffffffffffffffffffffffffffff1663343fbcdd905060e01b8b8b8b888151811061152957fe5b602002602001015160405160240161154393929190612634565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516115cc91906125d0565b6000604051808303818686fa925050503d8060008114611608576040519150601f19603f3d011682016040523d82523d6000602084013e61160d565b606091505b50909250905060008215611636578180602001905161162f9190810190612544565b905061163e565b505050611661565b8087858151811061164b57fe5b60209081029190910101525050506001016114d2565b5050505b949350505050565b60606000825190508060405190808252806020026020018201604052801561169f578160200160208202803883390190505b50915060006116af878787611859565b905073ffffffffffffffffffffffffffffffffffffffff81166116d457506116659050565b60005b8281101561166157600060608373ffffffffffffffffffffffffffffffffffffffff1662030d40600073ffffffffffffffffffffffffffffffffffffffff166345060eb0905060e01b8b8b8b888151811061172e57fe5b602002602001015160405160240161174893929190612634565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516117d191906125d0565b6000604051808303818686fa925050503d806000811461180d576040519150601f19603f3d011682016040523d82523d6000602084013e611812565b606091505b5090925090506000821561163657818060200190516118349190810190612544565b90508087858151811061184357fe5b60209081029190910101525050506001016116d7565b6040516000906060907f153f59970000000000000000000000000000000000000000000000000000000090611894908690869060240161260d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608673ffffffffffffffffffffffffffffffffffffffff168360405161191c91906125d0565b600060405180830381855afa9150503d8060008114611957576040519150601f19603f3d011682016040523d82523d6000602084013e61195c565b606091505b509150915081801561196f575080516020145b156119895761197f81600c611c95565b935050505061198d565b5050505b9392505050565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fa90612774565b60405180910390fd5b5050565b73794e6e91555438afc3ccf1c5076a74f42133d08d90565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290565b6000611a4282611cda565b92915050565b73818e6fecd516ecc3849daf6845e3ec868087b75590565b600061166583611a96611a7a82600163ffffffff611dab16565b611a8a888763ffffffff611dca16565b9063ffffffff611dfb16565b9063ffffffff611e1716565b6000611aac611e41565b73ffffffffffffffffffffffffffffffffffffffff166306f2bf62836040518263ffffffff1660e01b8152600401611ae491906125ec565b60206040518083038186803b158015611afc57600080fd5b505afa158015611b10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611a429190810190612243565b60008073ffffffffffffffffffffffffffffffffffffffff8516611b5757611c75565b60608573ffffffffffffffffffffffffffffffffffffffff16620249f08686604051602401611b869190612925565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611c0f91906125d0565b6000604051808303818686fa925050503d8060008114611c4b576040519150601f19603f3d011682016040523d82523d6000602084013e611c50565b606091505b5090925090508115611c735780806020019051611c709190810190612544565b92505b505b935093915050565b7374134cf88b21383713e096a5ecf59e297dc7f54790565b60008160140183511015611cbb57611cbb611cb66004855185601401611e59565b611efe565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b600060129050600060608373ffffffffffffffffffffffffffffffffffffffff166040518060400160405280600481526020017f313ce56700000000000000000000000000000000000000000000000000000000815250604051611d3e91906125d0565b600060405180830381855afa9150503d8060008114611d79576040519150601f19603f3d011682016040523d82523d6000602084013e611d7e565b606091505b5091509150818015611d91575080516020145b15611da457611da1816000611f06565b92505b5050919050565b600082821115611dc457611dc4611cb660028585611f12565b50900390565b600082611dd957506000611a42565b82820282848281611de657fe5b041461198d5761198d611cb660018686611f12565b60008282018381101561198d5761198d611cb660008686611f12565b600081611e2d57611e2d611cb660038585611f12565b6000828481611e3857fe5b04949350505050565b73c0a47dfe034b400b47bdad5fecda2621de6c4d9590565b6060632800659560e01b848484604051602401611e7893929190612748565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b600061198d8383611f31565b606063e946c1bb60e01b848484604051602401611e7893929190612726565b60008160200183511015611f5257611f52611cb66005855185602001611e59565b50016020015190565b6040805160608101909152806000815260006020820181905260409091015290565b8035611a42816129a5565b600082601f830112611f98578081fd5b8135611fab611fa682612955565b61292e565b8181529150602080830190840160005b83811015611fe857611fd3876020843589010161205b565b83526020928301929190910190600101611fbb565b5050505092915050565b600082601f830112612002578081fd5b8135612010611fa682612955565b81815291506020808301908481018184028601820187101561203157600080fd5b60005b8481101561205057813584529282019290820190600101612034565b505050505092915050565b600082601f83011261206b578081fd5b813567ffffffffffffffff811115612081578182fd5b6120b260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161292e565b91508082528360208285010111156120c957600080fd5b8060208401602084013760009082016020015292915050565b8035600f81900b8114611a4257600080fd5b60006101c0808385031215612107578182fd5b6121108161292e565b91505061211d8383611f7d565b815261212c8360208401611f7d565b602082015261213e8360408401611f7d565b60408201526121508360608401611f7d565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff808211156121b257600080fd5b6121be8683870161205b565b838501526101609250828501359150808211156121da57600080fd5b6121e68683870161205b565b8385015261018092508285013591508082111561220257600080fd5b61220e8683870161205b565b838501526101a092508285013591508082111561222a57600080fd5b506122378582860161205b565b82840152505092915050565b600060208284031215612254578081fd5b815161198d816129a5565b600080600060608486031215612273578182fd5b833561227e816129a5565b9250602084013561228e816129a5565b9150604084013561229e816129a5565b809150509250925092565b600080600080608085870312156122be578081fd5b84356122c9816129a5565b935060208501356122d9816129a5565b925060408501356122e9816129a5565b9150606085013567ffffffffffffffff811115612304578182fd5b61231087828801611ff2565b91505092959194509250565b600080600060608486031215612330578283fd5b833561233b816129a5565b9250602084013561234b816129a5565b9150604084013567ffffffffffffffff811115612366578182fd5b61237286828701611ff2565b9150509250925092565b60008060008060808587031215612391578182fd5b843561239c816129a5565b93506123ab86602087016120e2565b92506122e986604087016120e2565b600080602083850312156123cc578182fd5b823567ffffffffffffffff808211156123e3578384fd5b81850186601f8201126123f4578485fd5b8035925081831115612404578485fd5b8660208085028301011115612417578485fd5b60200196919550909350505050565b60008060408385031215612438578182fd5b823567ffffffffffffffff8082111561244f578384fd5b81850186601f820112612460578485fd5b80359250612470611fa684612955565b83815260208082019190838101885b878110156124a8576124968c8484358901016120f4565b8552938201939082019060010161247f565b509197508801359450505050808211156124c0578283fd5b506124cd85828601611f88565b9150509250929050565b600080600083850360a08112156124ec578182fd5b60608112156124f9578182fd5b50612504606061292e565b845160078110612512578283fd5b81526020858101519082015260408086015190820152606085015160808601519194509250801515811461229e578182fd5b600060208284031215612555578081fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845261258e816020860160208601612975565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000828483379101908152919050565b600082516125e2818460208701612975565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b6000602080830181845280855180835260408601915060408482028701019250838701855b828110156126d6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526126c4858351612576565b9450928501929085019060010161268a565b5092979650505050505050565b602080825282518282018190526000918401906040840190835b8181101561271b5783518352602093840193909201916001016126fd565b509095945050505050565b606081016004851061273457fe5b938152602081019290925260409091015290565b606081016008851061273457fe5b600f93840b81529190920b6020820152604081019190915260600190565b60208082526025908201527f455243323042726964676553616d706c65722f494e56414c49445f544f4b454e60408201527f5f50414952000000000000000000000000000000000000000000000000000000606082015260800190565b6000604082526127e560408301855161255c565b60208401516127f7606084018261255c565b50604084015161280a608084018261255c565b50606084015161281d60a084018261255c565b50608084015160c083015260a084015160e083015260c0840151610100818185015260e086015191506101208281860152818701519250610140915082828601528087015192505061016082818601528187015192506101c09150610180828187015261288e610200870185612576565b8289015194507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc092506101a08388830301818901526128cd8287612576565b838b015196508489820301868a01526128e68188612576565b955050808a0151955050505080858303016101e0860152506129088183612576565b848103602086015261291a8187612576565b979650505050505050565b90815260200190565b60405181810167ffffffffffffffff8111828210171561294d57600080fd5b604052919050565b600067ffffffffffffffff82111561296b578081fd5b5060209081020190565b60005b83811015612990578181015183820152602001612978565b8381111561299f576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff811681146129c757600080fd5b5056fea365627a7a7231582034e7eab64809a5ab7420c524f487ac0ca03a80f2b355b2d12a392dde2df0522e6c6578706572696d656e74616cf564736f6c63430005100040" + }, + "deployedBytecode": { + "object": "0x608060405234801561001057600080fd5b50600436106100d45760003560e01c806368be3cf2116100815780639f76ad351161005b5780639f76ad35146101a7578063a2c28d4b146101ba578063c7f7142e146101cd576100d4565b806368be3cf2146101615780636dd6b78d146101815780638b123a0214610194576100d4565b806359f515d0116100b257806359f515d01461012857806360ee052a1461013b57806364ee6ade1461014e576100d4565b8063354152a3146100d95780634703a7e6146101025780634cb8e25314610115575b600080fd5b6100ec6100e736600461237c565b6101ed565b6040516100f991906126e3565b60405180910390f35b6100ec61011036600461231c565b6103be565b6100ec61012336600461231c565b61059a565b6100ec610136366004612426565b61088a565b6100ec61014936600461231c565b610933565b6100ec61015c36600461231c565b610bf3565b61017461016f3660046123ba565b610db9565b6040516100f99190612665565b6100ec61018f36600461231c565b610ef8565b6100ec6101a2366004612426565b6111a0565b6100ec6101b53660046122a9565b611468565b6100ec6101c83660046122a9565b61166d565b6101e06101db36600461225f565b611859565b6040516100f991906125ec565b60606000825190508060405190808252806020026020018201604052801561021f578160200160208202803883390190505b50915060005b818110156103b457600060608873ffffffffffffffffffffffffffffffffffffffff16620927c0600073ffffffffffffffffffffffffffffffffffffffff166307211ef7905060e01b8a8a8a888151811061027c57fe5b602002602001015160405160240161029693929190612756565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161031f91906125d0565b6000604051808303818686fa925050503d806000811461035b576040519150601f19603f3d011682016040523d82523d6000602084013e610360565b606091505b5090925090506000821561038957818060200190516103829190810190612544565b9050610391565b5050506103b4565b8086858151811061039e57fe5b6020908102919091010152505050600101610225565b5050949350505050565b60606103ca8385611994565b81516040805182815260208084028201019091528180156103f5578160200160208202803883390190505b50915060005b81811015610591576000606061040f611a07565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663ff1fd974905060e01b8a8a8a888151811061045957fe5b602002602001015160405160240161047393929190612634565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516104fc91906125d0565b6000604051808303818686fa925050503d8060008114610538576040519150601f19603f3d011682016040523d82523d6000602084013e61053d565b606091505b50909250905060008215610566578180602001905161055f9190810190612544565b905061056e565b505050610591565b8086858151811061057b57fe5b60209081029190910101525050506001016103fb565b50509392505050565b60606105a68385611994565b60006105b0611a1f565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146105e857846105fe565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b9050600061060a611a1f565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146106425784610658565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b9050600061066587611a37565b60ff169050600061067587611a37565b60ff169050600086519050806040519080825280602002602001820160405280156106aa578160200160208202803883390190505b50955060005b8181101561087d57600060606106c4611a48565b73ffffffffffffffffffffffffffffffffffffffff166216e360600073ffffffffffffffffffffffffffffffffffffffff1663809a9e55905060e01b8a8a8e888151811061070e57fe5b602002602001015160405160240161072893929190612634565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516107b191906125d0565b6000604051808303818686fa925050503d80600081146107ed576040519150601f19603f3d011682016040523d82523d6000602084013e6107f2565b606091505b5090925090506000821561081b57818060200190516108149190810190612544565b9050610823565b50505061087d565b670de0b6b3a764000087600a0a87600a0a8d878151811061084057fe5b60200260200101518402028161085257fe5b048161085a57fe5b048a858151811061086757fe5b60209081029190910101525050506001016106b0565b5050505050509392505050565b606061089683836111a0565b905060005b835181101561092c578181815181106108b057fe5b60200260200101516000146109245761090b8282815181106108ce57fe5b60200260200101518583815181106108e257fe5b602002602001015160a001518684815181106108fa57fe5b602002602001015160800151611a60565b82828151811061091757fe5b6020026020010181815250505b60010161089b565b5092915050565b606061093f8385611994565b815160408051828152602080840282010190915281801561096a578160200160208202803883390190505b5091506000610977611a1f565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146109b7576109b286611aa2565b6109ba565b60005b905060006109c6611a1f565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610a0657610a0186611aa2565b610a09565b60005b905060005b83811015610be8576001610a20611a1f565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415610ab7578651610a969085907f2640f62c00000000000000000000000000000000000000000000000000000000908a9086908110610a8957fe5b6020026020010151611b34565b878481518110610aa257fe5b60200260200101819350828152505050610bd4565b610abf611a1f565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161415610b28578651610a969084907f59e9486200000000000000000000000000000000000000000000000000000000908a9086908110610a8957fe5b8651600090610b619085907f59e9486200000000000000000000000000000000000000000000000000000000908b9087908110610a8957fe5b925090508015610bb757610b96857f2640f62c0000000000000000000000000000000000000000000000000000000083611b34565b888581518110610ba257fe5b60200260200101819450828152505050610bd2565b6000878481518110610bc557fe5b6020026020010181815250505b505b80610bdf5750610be8565b50600101610a0e565b505050509392505050565b6060610bff8385611994565b8151604080518281526020808402820101909152818015610c2a578160200160208202803883390190505b50915060005b818110156105915760006060610c44611a07565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663144a2752905060e01b898b8a8881518110610c8e57fe5b6020026020010151604051602401610ca893929190612634565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051610d3191906125d0565b6000604051808303818686fa925050503d8060008114610d6d576040519150601f19603f3d011682016040523d82523d6000602084013e610d72565b606091505b509092509050600082156105665781806020019051610d949190810190612544565b905080868581518110610da357fe5b6020908102919091010152505050600101610c30565b604080518281526020808402820101909152606090828015610def57816020015b6060815260200190600190039081610dda5790505b50905060005b80831461092c576000606030868685818110610e0d57fe5b6020028201905080357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe136849003018112610e4757600080fd5b9091016020810191503567ffffffffffffffff811115610e6657600080fd5b36819003821315610e7657600080fd5b604051610e849291906125c0565b600060405180830381855afa9150503d8060008114610ebf576040519150601f19603f3d011682016040523d82523d6000602084013e610ec4565b606091505b509150915081610ed657805160208201fd5b80848481518110610ee357fe5b60209081029190910101525050600101610df5565b6060610f048385611994565b8151604080518281526020808402820101909152818015610f2f578160200160208202803883390190505b5091506000610f3c611a1f565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610f7c57610f7786611aa2565b610f7f565b60005b90506000610f8b611a1f565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610fcb57610fc686611aa2565b610fce565b60005b905060005b83811015610be8576001610fe5611a1f565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16141561106f57865161104e9085907f95b68fe700000000000000000000000000000000000000000000000000000000908a9086908110610a8957fe5b87848151811061105a57fe5b6020026020010181935082815250505061118c565b611077611a1f565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614156110e057865161104e9084907fcd7724c300000000000000000000000000000000000000000000000000000000908a9086908110610a8957fe5b86516000906111199086907f95b68fe700000000000000000000000000000000000000000000000000000000908b9087908110610a8957fe5b92509050801561116f5761114e847fcd7724c30000000000000000000000000000000000000000000000000000000083611b34565b88858151811061115a57fe5b6020026020010181945082815250505061118a565b600087848151811061117d57fe5b6020026020010181815250505b505b806111975750610be8565b50600101610fd3565b606082516040519080825280602002602001820160405280156111cd578160200160208202803883390190505b50905060005b8351811461092c578281815181106111e757fe5b60200260200101515160001480611215575083818151811061120557fe5b6020026020010151608001516000145b80611237575083818151811061122757fe5b602002602001015160a001516000145b1561125b57600082828151811061124a57fe5b602002602001018181525050611460565b60006060611267611c7d565b73ffffffffffffffffffffffffffffffffffffffff166207a120611289611c7d565b5087517fe77286eb00000000000000000000000000000000000000000000000000000000908990879081106112ba57fe5b60200260200101518887815181106112ce57fe5b60200260200101516040516024016112e79291906127d1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161137091906125d0565b6000604051808303818686fa925050503d80600081146113ac576040519150601f19603f3d011682016040523d82523d6000602084013e6113b1565b606091505b5091509150816113dc5760008484815181106113c957fe5b6020026020010181815250505050611460565b6113e4611f5b565b600080838060200190516113fb91908101906124d7565b9194509250905060038351600681111561141157fe5b14158061141c575080155b1561144057600087878151811061142f57fe5b60200260200101818152505061145a565b8187878151811061144d57fe5b6020026020010181815250505b50505050505b6001016111d3565b60606000825190508060405190808252806020026020018201604052801561149a578160200160208202803883390190505b50915060006114aa878787611859565b905073ffffffffffffffffffffffffffffffffffffffff81166114cf57506116659050565b60005b8281101561166157600060608373ffffffffffffffffffffffffffffffffffffffff1662030d40600073ffffffffffffffffffffffffffffffffffffffff1663343fbcdd905060e01b8b8b8b888151811061152957fe5b602002602001015160405160240161154393929190612634565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516115cc91906125d0565b6000604051808303818686fa925050503d8060008114611608576040519150601f19603f3d011682016040523d82523d6000602084013e61160d565b606091505b50909250905060008215611636578180602001905161162f9190810190612544565b905061163e565b505050611661565b8087858151811061164b57fe5b60209081029190910101525050506001016114d2565b5050505b949350505050565b60606000825190508060405190808252806020026020018201604052801561169f578160200160208202803883390190505b50915060006116af878787611859565b905073ffffffffffffffffffffffffffffffffffffffff81166116d457506116659050565b60005b8281101561166157600060608373ffffffffffffffffffffffffffffffffffffffff1662030d40600073ffffffffffffffffffffffffffffffffffffffff166345060eb0905060e01b8b8b8b888151811061172e57fe5b602002602001015160405160240161174893929190612634565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516117d191906125d0565b6000604051808303818686fa925050503d806000811461180d576040519150601f19603f3d011682016040523d82523d6000602084013e611812565b606091505b5090925090506000821561163657818060200190516118349190810190612544565b90508087858151811061184357fe5b60209081029190910101525050506001016116d7565b6040516000906060907f153f59970000000000000000000000000000000000000000000000000000000090611894908690869060240161260d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608673ffffffffffffffffffffffffffffffffffffffff168360405161191c91906125d0565b600060405180830381855afa9150503d8060008114611957576040519150601f19603f3d011682016040523d82523d6000602084013e61195c565b606091505b509150915081801561196f575080516020145b156119895761197f81600c611c95565b935050505061198d565b5050505b9392505050565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fa90612774565b60405180910390fd5b5050565b73794e6e91555438afc3ccf1c5076a74f42133d08d90565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290565b6000611a4282611cda565b92915050565b73818e6fecd516ecc3849daf6845e3ec868087b75590565b600061166583611a96611a7a82600163ffffffff611dab16565b611a8a888763ffffffff611dca16565b9063ffffffff611dfb16565b9063ffffffff611e1716565b6000611aac611e41565b73ffffffffffffffffffffffffffffffffffffffff166306f2bf62836040518263ffffffff1660e01b8152600401611ae491906125ec565b60206040518083038186803b158015611afc57600080fd5b505afa158015611b10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611a429190810190612243565b60008073ffffffffffffffffffffffffffffffffffffffff8516611b5757611c75565b60608573ffffffffffffffffffffffffffffffffffffffff16620249f08686604051602401611b869190612925565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611c0f91906125d0565b6000604051808303818686fa925050503d8060008114611c4b576040519150601f19603f3d011682016040523d82523d6000602084013e611c50565b606091505b5090925090508115611c735780806020019051611c709190810190612544565b92505b505b935093915050565b7374134cf88b21383713e096a5ecf59e297dc7f54790565b60008160140183511015611cbb57611cbb611cb66004855185601401611e59565b611efe565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b600060129050600060608373ffffffffffffffffffffffffffffffffffffffff166040518060400160405280600481526020017f313ce56700000000000000000000000000000000000000000000000000000000815250604051611d3e91906125d0565b600060405180830381855afa9150503d8060008114611d79576040519150601f19603f3d011682016040523d82523d6000602084013e611d7e565b606091505b5091509150818015611d91575080516020145b15611da457611da1816000611f06565b92505b5050919050565b600082821115611dc457611dc4611cb660028585611f12565b50900390565b600082611dd957506000611a42565b82820282848281611de657fe5b041461198d5761198d611cb660018686611f12565b60008282018381101561198d5761198d611cb660008686611f12565b600081611e2d57611e2d611cb660038585611f12565b6000828481611e3857fe5b04949350505050565b73c0a47dfe034b400b47bdad5fecda2621de6c4d9590565b6060632800659560e01b848484604051602401611e7893929190612748565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b600061198d8383611f31565b606063e946c1bb60e01b848484604051602401611e7893929190612726565b60008160200183511015611f5257611f52611cb66005855185602001611e59565b50016020015190565b6040805160608101909152806000815260006020820181905260409091015290565b8035611a42816129a5565b600082601f830112611f98578081fd5b8135611fab611fa682612955565b61292e565b8181529150602080830190840160005b83811015611fe857611fd3876020843589010161205b565b83526020928301929190910190600101611fbb565b5050505092915050565b600082601f830112612002578081fd5b8135612010611fa682612955565b81815291506020808301908481018184028601820187101561203157600080fd5b60005b8481101561205057813584529282019290820190600101612034565b505050505092915050565b600082601f83011261206b578081fd5b813567ffffffffffffffff811115612081578182fd5b6120b260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161292e565b91508082528360208285010111156120c957600080fd5b8060208401602084013760009082016020015292915050565b8035600f81900b8114611a4257600080fd5b60006101c0808385031215612107578182fd5b6121108161292e565b91505061211d8383611f7d565b815261212c8360208401611f7d565b602082015261213e8360408401611f7d565b60408201526121508360608401611f7d565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff808211156121b257600080fd5b6121be8683870161205b565b838501526101609250828501359150808211156121da57600080fd5b6121e68683870161205b565b8385015261018092508285013591508082111561220257600080fd5b61220e8683870161205b565b838501526101a092508285013591508082111561222a57600080fd5b506122378582860161205b565b82840152505092915050565b600060208284031215612254578081fd5b815161198d816129a5565b600080600060608486031215612273578182fd5b833561227e816129a5565b9250602084013561228e816129a5565b9150604084013561229e816129a5565b809150509250925092565b600080600080608085870312156122be578081fd5b84356122c9816129a5565b935060208501356122d9816129a5565b925060408501356122e9816129a5565b9150606085013567ffffffffffffffff811115612304578182fd5b61231087828801611ff2565b91505092959194509250565b600080600060608486031215612330578283fd5b833561233b816129a5565b9250602084013561234b816129a5565b9150604084013567ffffffffffffffff811115612366578182fd5b61237286828701611ff2565b9150509250925092565b60008060008060808587031215612391578182fd5b843561239c816129a5565b93506123ab86602087016120e2565b92506122e986604087016120e2565b600080602083850312156123cc578182fd5b823567ffffffffffffffff808211156123e3578384fd5b81850186601f8201126123f4578485fd5b8035925081831115612404578485fd5b8660208085028301011115612417578485fd5b60200196919550909350505050565b60008060408385031215612438578182fd5b823567ffffffffffffffff8082111561244f578384fd5b81850186601f820112612460578485fd5b80359250612470611fa684612955565b83815260208082019190838101885b878110156124a8576124968c8484358901016120f4565b8552938201939082019060010161247f565b509197508801359450505050808211156124c0578283fd5b506124cd85828601611f88565b9150509250929050565b600080600083850360a08112156124ec578182fd5b60608112156124f9578182fd5b50612504606061292e565b845160078110612512578283fd5b81526020858101519082015260408086015190820152606085015160808601519194509250801515811461229e578182fd5b600060208284031215612555578081fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845261258e816020860160208601612975565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000828483379101908152919050565b600082516125e2818460208701612975565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b6000602080830181845280855180835260408601915060408482028701019250838701855b828110156126d6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526126c4858351612576565b9450928501929085019060010161268a565b5092979650505050505050565b602080825282518282018190526000918401906040840190835b8181101561271b5783518352602093840193909201916001016126fd565b509095945050505050565b606081016004851061273457fe5b938152602081019290925260409091015290565b606081016008851061273457fe5b600f93840b81529190920b6020820152604081019190915260600190565b60208082526025908201527f455243323042726964676553616d706c65722f494e56414c49445f544f4b454e60408201527f5f50414952000000000000000000000000000000000000000000000000000000606082015260800190565b6000604082526127e560408301855161255c565b60208401516127f7606084018261255c565b50604084015161280a608084018261255c565b50606084015161281d60a084018261255c565b50608084015160c083015260a084015160e083015260c0840151610100818185015260e086015191506101208281860152818701519250610140915082828601528087015192505061016082818601528187015192506101c09150610180828187015261288e610200870185612576565b8289015194507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc092506101a08388830301818901526128cd8287612576565b838b015196508489820301868a01526128e68188612576565b955050808a0151955050505080858303016101e0860152506129088183612576565b848103602086015261291a8187612576565b979650505050505050565b90815260200190565b60405181810167ffffffffffffffff8111828210171561294d57600080fd5b604052919050565b600067ffffffffffffffff82111561296b578081fd5b5060209081020190565b60005b83811015612990578181015183820152602001612978565b8381111561299f576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff811681146129c757600080fd5b5056fea365627a7a7231582034e7eab64809a5ab7420c524f487ac0ca03a80f2b355b2d12a392dde2df0522e6c6578706572696d656e74616cf564736f6c63430005100040" + } + } + }, + "compiler": { + "name": "solc", + "version": "soljson-v0.5.16+commit.9c3226ce.js", + "settings": { + "optimizer": { + "enabled": true, + "runs": 1000000, + "details": { "yul": true, "deduplicate": true, "cse": true, "constantOptimizer": true } + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "devdoc", + "evm.bytecode.object", + "evm.bytecode.sourceMap", + "evm.deployedBytecode.object", + "evm.deployedBytecode.sourceMap" + ] + } + }, + "evmVersion": "istanbul" + } + }, + "chains": {} +} diff --git a/packages/contract-artifacts/artifacts/IERC20BridgeSampler.json b/packages/contract-artifacts/artifacts/IERC20BridgeSampler.json index 6a123729c9..a851bba79c 100644 --- a/packages/contract-artifacts/artifacts/IERC20BridgeSampler.json +++ b/packages/contract-artifacts/artifacts/IERC20BridgeSampler.json @@ -1,697 +1,339 @@ { - "schemaVersion": "2.0.0", - "contractName": "IERC20BridgeSampler", - "compilerOutput": { - "abi": [ - { - "constant": true, - "inputs": [ - { - "internalType": "bytes[]", - "name": "callDatas", - "type": "bytes[]" - } - ], - "name": "batchCall", - "outputs": [ - { - "internalType": "bytes[]", - "name": "callResults", - "type": "bytes[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "registryAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "takerToken", - "type": "address" - }, - { - "internalType": "address", - "name": "makerToken", - "type": "address" - } - ], - "name": "getLiquidityProviderFromRegistry", - "outputs": [ - { - "internalType": "address", - "name": "providerAddress", - "type": "address" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "components": [ - { - "internalType": "address", - "name": "makerAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "takerAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "feeRecipientAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "senderAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "makerAssetAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "takerAssetAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "makerFee", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "takerFee", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "expirationTimeSeconds", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "salt", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "makerAssetData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "takerAssetData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "makerFeeAssetData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "takerFeeAssetData", - "type": "bytes" - } - ], - "internalType": "struct LibOrder.Order[]", - "name": "orders", - "type": "tuple[]" - }, - { - "internalType": "bytes[]", - "name": "orderSignatures", - "type": "bytes[]" - } - ], - "name": "getOrderFillableMakerAssetAmounts", - "outputs": [ - { - "internalType": "uint256[]", - "name": "orderFillableMakerAssetAmounts", - "type": "uint256[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "components": [ - { - "internalType": "address", - "name": "makerAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "takerAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "feeRecipientAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "senderAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "makerAssetAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "takerAssetAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "makerFee", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "takerFee", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "expirationTimeSeconds", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "salt", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "makerAssetData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "takerAssetData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "makerFeeAssetData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "takerFeeAssetData", - "type": "bytes" - } - ], - "internalType": "struct LibOrder.Order[]", - "name": "orders", - "type": "tuple[]" - }, - { - "internalType": "bytes[]", - "name": "orderSignatures", - "type": "bytes[]" - } - ], - "name": "getOrderFillableTakerAssetAmounts", - "outputs": [ - { - "internalType": "uint256[]", - "name": "orderFillableTakerAssetAmounts", - "type": "uint256[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "takerToken", - "type": "address" - }, - { - "internalType": "address", - "name": "makerToken", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "makerTokenAmounts", - "type": "uint256[]" - } - ], - "name": "sampleBuysFromEth2Dai", - "outputs": [ - { - "internalType": "uint256[]", - "name": "takerTokenAmounts", - "type": "uint256[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "registryAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "takerToken", - "type": "address" - }, - { - "internalType": "address", - "name": "makerToken", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "makerTokenAmounts", - "type": "uint256[]" - } - ], - "name": "sampleBuysFromLiquidityProviderRegistry", - "outputs": [ - { - "internalType": "uint256[]", - "name": "takerTokenAmounts", - "type": "uint256[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "takerToken", - "type": "address" - }, - { - "internalType": "address", - "name": "makerToken", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "makerTokenAmounts", - "type": "uint256[]" - } - ], - "name": "sampleBuysFromUniswap", - "outputs": [ - { - "internalType": "uint256[]", - "name": "takerTokenAmounts", - "type": "uint256[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "curveAddress", - "type": "address" - }, - { - "internalType": "int128", - "name": "fromTokenIdx", - "type": "int128" - }, - { - "internalType": "int128", - "name": "toTokenIdx", - "type": "int128" - }, - { - "internalType": "uint256[]", - "name": "takerTokenAmounts", - "type": "uint256[]" - } - ], - "name": "sampleSellsFromCurve", - "outputs": [ - { - "internalType": "uint256[]", - "name": "makerTokenAmounts", - "type": "uint256[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "takerToken", - "type": "address" - }, - { - "internalType": "address", - "name": "makerToken", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "takerTokenAmounts", - "type": "uint256[]" - } - ], - "name": "sampleSellsFromEth2Dai", - "outputs": [ - { - "internalType": "uint256[]", - "name": "makerTokenAmounts", - "type": "uint256[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "takerToken", - "type": "address" - }, - { - "internalType": "address", - "name": "makerToken", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "takerTokenAmounts", - "type": "uint256[]" - } - ], - "name": "sampleSellsFromKyberNetwork", - "outputs": [ - { - "internalType": "uint256[]", - "name": "makerTokenAmounts", - "type": "uint256[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "registryAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "takerToken", - "type": "address" - }, - { - "internalType": "address", - "name": "makerToken", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "takerTokenAmounts", - "type": "uint256[]" - } - ], - "name": "sampleSellsFromLiquidityProviderRegistry", - "outputs": [ - { - "internalType": "uint256[]", - "name": "makerTokenAmounts", - "type": "uint256[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "takerToken", - "type": "address" - }, - { - "internalType": "address", - "name": "makerToken", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "takerTokenAmounts", - "type": "uint256[]" - } - ], - "name": "sampleSellsFromUniswap", - "outputs": [ - { - "internalType": "uint256[]", - "name": "makerTokenAmounts", - "type": "uint256[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - } - ], - "devdoc": { - "methods": { - "batchCall(bytes[])": { - "details": "Call multiple public functions on this contract in a single transaction.", - "params": { - "callDatas": "ABI-encoded call data for each function call." - }, - "return": "callResults ABI-encoded results data for each call." - }, - "getLiquidityProviderFromRegistry(address,address,address)": { - "details": "Returns the address of a liquidity provider for the given market (takerToken, makerToken), from a registry of liquidity providers. Returns address(0) if no such provider exists in the registry.", - "params": { - "makerToken": "Maker asset managed by liquidity provider.", - "takerToken": "Taker asset managed by liquidity provider." - }, - "return": "providerAddress Address of the liquidity provider." - }, - "getOrderFillableMakerAssetAmounts((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[])": { - "details": "Queries the fillable maker asset amounts of native orders.", - "params": { - "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[])": { - "details": "Queries the fillable taker asset amounts of native orders.", - "params": { - "orderSignatures": "Signatures for each respective order in `orders`.", - "orders": "Native orders to query." - }, - "return": "orderFillableTakerAssetAmounts How much taker asset can be filled by each order in `orders`." - }, - "sampleBuysFromEth2Dai(address,address,uint256[])": { - "details": "Sample buy quotes from Eth2Dai/Oasis.", - "params": { - "makerToken": "Address of the maker token (what to buy).", - "takerToken": "Address of the taker token (what to sell).", - "takerTokenAmounts": "Maker token sell amount for each sample." - }, - "return": "takerTokenAmounts Taker amounts sold at each maker token amount." - }, - "sampleBuysFromLiquidityProviderRegistry(address,address,address,uint256[])": { - "details": "Sample buy quotes from an arbitrary on-chain liquidity provider.", - "params": { - "makerToken": "Address of the maker token (what to buy).", - "makerTokenAmounts": "Maker token buy amount for each sample.", - "registryAddress": "Address of the liquidity provider registry contract.", - "takerToken": "Address of the taker token (what to sell)." - }, - "return": "takerTokenAmounts Taker amounts sold at each maker token amount." - }, - "sampleBuysFromUniswap(address,address,uint256[])": { - "details": "Sample buy quotes from Uniswap.", - "params": { - "makerToken": "Address of the maker token (what to buy).", - "makerTokenAmounts": "Maker token sell amount for each sample.", - "takerToken": "Address of the taker token (what to sell)." - }, - "return": "takerTokenAmounts Taker amounts sold at each maker token amount." - }, - "sampleSellsFromCurve(address,int128,int128,uint256[])": { - "details": "Sample sell quotes from Curve.", - "params": { - "curveAddress": "Address of the Curve contract.", - "fromTokenIdx": "Index of the taker token (what to sell).", - "takerTokenAmounts": "Taker token sell amount for each sample.", - "toTokenIdx": "Index of the maker token (what to buy)." - }, - "return": "makerTokenAmounts Maker amounts bought at each taker token amount." - }, - "sampleSellsFromEth2Dai(address,address,uint256[])": { - "details": "Sample sell quotes from Eth2Dai/Oasis.", - "params": { - "makerToken": "Address of the maker token (what to buy).", - "takerToken": "Address of the taker token (what to sell).", - "takerTokenAmounts": "Taker token sell amount for each sample." - }, - "return": "makerTokenAmounts Maker amounts bought at each taker token amount." - }, - "sampleSellsFromKyberNetwork(address,address,uint256[])": { - "details": "Sample sell quotes from Kyber.", - "params": { - "makerToken": "Address of the maker token (what to buy).", - "takerToken": "Address of the taker token (what to sell).", - "takerTokenAmounts": "Taker token sell amount for each sample." - }, - "return": "makerTokenAmounts Maker amounts bought at each taker token amount." - }, - "sampleSellsFromLiquidityProviderRegistry(address,address,address,uint256[])": { - "details": "Sample sell quotes from an arbitrary on-chain liquidity provider.", - "params": { - "makerToken": "Address of the maker token (what to buy).", - "registryAddress": "Address of the liquidity provider registry contract.", - "takerToken": "Address of the taker token (what to sell).", - "takerTokenAmounts": "Taker token sell amount for each sample." - }, - "return": "makerTokenAmounts Maker amounts bought at each taker token amount." - }, - "sampleSellsFromUniswap(address,address,uint256[])": { - "details": "Sample sell quotes from Uniswap.", - "params": { - "makerToken": "Address of the maker token (what to buy).", - "takerToken": "Address of the taker token (what to sell).", - "takerTokenAmounts": "Taker token sell amount for each sample." - }, - "return": "makerTokenAmounts Maker amounts bought at each taker token amount." - } - } - }, - "evm": { - "bytecode": { - "linkReferences": {}, - "object": "0x", - "opcodes": "", - "sourceMap": "" - }, - "deployedBytecode": { - "linkReferences": {}, - "object": "0x", - "opcodes": "", - "sourceMap": "" - } - } - }, - "sources": { - "src/IERC20BridgeSampler.sol": { - "id": 5 - }, - "@0x/contracts-exchange-libs/contracts/src/LibOrder.sol": { - "id": 19 - }, - "@0x/contracts-utils/contracts/src/LibEIP712.sol": { - "id": 33 - } - }, - "sourceCodes": { - "src/IERC20BridgeSampler.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\n\n\ninterface IERC20BridgeSampler {\n\n /// @dev Call multiple public functions on this contract in a single transaction.\n /// @param callDatas ABI-encoded call data for each function call.\n /// @return callResults ABI-encoded results data for each call.\n function batchCall(bytes[] calldata callDatas)\n external\n view\n returns (bytes[] memory callResults);\n\n /// @dev Queries the fillable taker asset amounts of native orders.\n /// @param orders Native orders to query.\n /// @param orderSignatures Signatures for each respective order in `orders`.\n /// @return orderFillableTakerAssetAmounts How much taker asset can be filled\n /// by each order in `orders`.\n function getOrderFillableTakerAssetAmounts(\n LibOrder.Order[] calldata orders,\n bytes[] calldata orderSignatures\n )\n external\n view\n returns (uint256[] memory orderFillableTakerAssetAmounts);\n\n /// @dev Queries the fillable maker asset amounts of native orders.\n /// @param orders Native orders to query.\n /// @param orderSignatures Signatures for each respective order in `orders`.\n /// @return orderFillableMakerAssetAmounts How much maker asset can be filled\n /// by each order in `orders`.\n function getOrderFillableMakerAssetAmounts(\n LibOrder.Order[] calldata orders,\n bytes[] calldata orderSignatures\n )\n external\n view\n returns (uint256[] memory orderFillableMakerAssetAmounts);\n\n /// @dev Sample sell quotes from Kyber.\n /// @param takerToken Address of the taker token (what to sell).\n /// @param makerToken Address of the maker token (what to buy).\n /// @param takerTokenAmounts Taker token sell amount for each sample.\n /// @return makerTokenAmounts Maker amounts bought at each taker token\n /// amount.\n function sampleSellsFromKyberNetwork(\n address takerToken,\n address makerToken,\n uint256[] calldata takerTokenAmounts\n )\n external\n view\n returns (uint256[] memory makerTokenAmounts);\n\n /// @dev Sample sell quotes from Eth2Dai/Oasis.\n /// @param takerToken Address of the taker token (what to sell).\n /// @param makerToken Address of the maker token (what to buy).\n /// @param takerTokenAmounts Taker token sell amount for each sample.\n /// @return makerTokenAmounts Maker amounts bought at each taker token\n /// amount.\n function sampleSellsFromEth2Dai(\n address takerToken,\n address makerToken,\n uint256[] calldata takerTokenAmounts\n )\n external\n view\n returns (uint256[] memory makerTokenAmounts);\n\n /// @dev Sample sell quotes from Uniswap.\n /// @param takerToken Address of the taker token (what to sell).\n /// @param makerToken Address of the maker token (what to buy).\n /// @param takerTokenAmounts Taker token sell amount for each sample.\n /// @return makerTokenAmounts Maker amounts bought at each taker token\n /// amount.\n function sampleSellsFromUniswap(\n address takerToken,\n address makerToken,\n uint256[] calldata takerTokenAmounts\n )\n external\n view\n returns (uint256[] memory makerTokenAmounts);\n\n /// @dev Sample buy quotes from Uniswap.\n /// @param takerToken Address of the taker token (what to sell).\n /// @param makerToken Address of the maker token (what to buy).\n /// @param makerTokenAmounts Maker token sell amount for each sample.\n /// @return takerTokenAmounts Taker amounts sold at each maker token\n /// amount.\n function sampleBuysFromUniswap(\n address takerToken,\n address makerToken,\n uint256[] calldata makerTokenAmounts\n )\n external\n view\n returns (uint256[] memory takerTokenAmounts);\n\n /// @dev Sample buy quotes from Eth2Dai/Oasis.\n /// @param takerToken Address of the taker token (what to sell).\n /// @param makerToken Address of the maker token (what to buy).\n /// @param takerTokenAmounts Maker token sell amount for each sample.\n /// @return takerTokenAmounts Taker amounts sold at each maker token\n /// amount.\n function sampleBuysFromEth2Dai(\n address takerToken,\n address makerToken,\n uint256[] calldata makerTokenAmounts\n )\n external\n view\n returns (uint256[] memory takerTokenAmounts);\n\n /// @dev Sample sell quotes from Curve.\n /// @param curveAddress Address of the Curve contract.\n /// @param fromTokenIdx Index of the taker token (what to sell).\n /// @param toTokenIdx Index of the maker token (what to buy).\n /// @param takerTokenAmounts Taker token sell amount for each sample.\n /// @return makerTokenAmounts Maker amounts bought at each taker token\n /// amount.\n function sampleSellsFromCurve(\n address curveAddress,\n int128 fromTokenIdx,\n int128 toTokenIdx,\n uint256[] calldata takerTokenAmounts\n )\n external\n view\n returns (uint256[] memory makerTokenAmounts);\n\n /// @dev Sample sell quotes from an arbitrary on-chain liquidity provider.\n /// @param registryAddress Address of the liquidity provider registry contract.\n /// @param takerToken Address of the taker token (what to sell).\n /// @param makerToken Address of the maker token (what to buy).\n /// @param takerTokenAmounts Taker token sell amount for each sample.\n /// @return makerTokenAmounts Maker amounts bought at each taker token\n /// amount.\n function sampleSellsFromLiquidityProviderRegistry(\n address registryAddress,\n address takerToken,\n address makerToken,\n uint256[] calldata takerTokenAmounts\n )\n external\n view\n returns (uint256[] memory makerTokenAmounts);\n\n /// @dev Sample buy quotes from an arbitrary on-chain liquidity provider.\n /// @param registryAddress Address of the liquidity provider registry contract.\n /// @param takerToken Address of the taker token (what to sell).\n /// @param makerToken Address of the maker token (what to buy).\n /// @param makerTokenAmounts Maker token buy amount for each sample.\n /// @return takerTokenAmounts Taker amounts sold at each maker token\n /// amount.\n function sampleBuysFromLiquidityProviderRegistry(\n address registryAddress,\n address takerToken,\n address makerToken,\n uint256[] calldata makerTokenAmounts\n )\n external\n view\n returns (uint256[] memory takerTokenAmounts);\n\n /// @dev Returns the address of a liquidity provider for the given market\n /// (takerToken, makerToken), from a registry of liquidity providers.\n /// Returns address(0) if no such provider exists in the registry.\n /// @param takerToken Taker asset managed by liquidity provider.\n /// @param makerToken Maker asset managed by liquidity provider.\n /// @return providerAddress Address of the liquidity provider.\n function getLiquidityProviderFromRegistry(\n address registryAddress,\n address takerToken,\n address makerToken\n )\n external\n view\n returns (address providerAddress);\n}\n", - "@0x/contracts-exchange-libs/contracts/src/LibOrder.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibEIP712.sol\";\n\n\nlibrary LibOrder {\n\n using LibOrder for Order;\n\n // Hash for the EIP712 Order Schema:\n // keccak256(abi.encodePacked(\n // \"Order(\",\n // \"address makerAddress,\",\n // \"address takerAddress,\",\n // \"address feeRecipientAddress,\",\n // \"address senderAddress,\",\n // \"uint256 makerAssetAmount,\",\n // \"uint256 takerAssetAmount,\",\n // \"uint256 makerFee,\",\n // \"uint256 takerFee,\",\n // \"uint256 expirationTimeSeconds,\",\n // \"uint256 salt,\",\n // \"bytes makerAssetData,\",\n // \"bytes takerAssetData,\",\n // \"bytes makerFeeAssetData,\",\n // \"bytes takerFeeAssetData\",\n // \")\"\n // ))\n bytes32 constant internal _EIP712_ORDER_SCHEMA_HASH =\n 0xf80322eb8376aafb64eadf8f0d7623f22130fd9491a221e902b713cb984a7534;\n\n // A valid order remains fillable until it is expired, fully filled, or cancelled.\n // An order's status is unaffected by external factors, like account balances.\n enum OrderStatus {\n INVALID, // Default value\n INVALID_MAKER_ASSET_AMOUNT, // Order does not have a valid maker asset amount\n INVALID_TAKER_ASSET_AMOUNT, // Order does not have a valid taker asset amount\n FILLABLE, // Order is fillable\n EXPIRED, // Order has already expired\n FULLY_FILLED, // Order is fully filled\n CANCELLED // Order has been cancelled\n }\n\n // solhint-disable max-line-length\n /// @dev Canonical order structure.\n struct Order {\n address makerAddress; // Address that created the order.\n address takerAddress; // Address that is allowed to fill the order. If set to 0, any address is allowed to fill the order.\n address feeRecipientAddress; // Address that will recieve fees when order is filled.\n address senderAddress; // Address that is allowed to call Exchange contract methods that affect this order. If set to 0, any address is allowed to call these methods.\n uint256 makerAssetAmount; // Amount of makerAsset being offered by maker. Must be greater than 0.\n uint256 takerAssetAmount; // Amount of takerAsset being bid on by maker. Must be greater than 0.\n uint256 makerFee; // Fee paid to feeRecipient by maker when order is filled.\n uint256 takerFee; // Fee paid to feeRecipient by taker when order is filled.\n uint256 expirationTimeSeconds; // Timestamp in seconds at which order expires.\n uint256 salt; // Arbitrary number to facilitate uniqueness of the order's hash.\n bytes makerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring makerAsset. The leading bytes4 references the id of the asset proxy.\n bytes takerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring takerAsset. The leading bytes4 references the id of the asset proxy.\n bytes makerFeeAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring makerFeeAsset. The leading bytes4 references the id of the asset proxy.\n bytes takerFeeAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring takerFeeAsset. The leading bytes4 references the id of the asset proxy.\n }\n // solhint-enable max-line-length\n\n /// @dev Order information returned by `getOrderInfo()`.\n struct OrderInfo {\n OrderStatus orderStatus; // Status that describes order's validity and fillability.\n bytes32 orderHash; // EIP712 typed data hash of the order (see LibOrder.getTypedDataHash).\n uint256 orderTakerAssetFilledAmount; // Amount of order that has already been filled.\n }\n\n /// @dev Calculates the EIP712 typed data hash of an order with a given domain separator.\n /// @param order The order structure.\n /// @return EIP712 typed data hash of the order.\n function getTypedDataHash(Order memory order, bytes32 eip712ExchangeDomainHash)\n internal\n pure\n returns (bytes32 orderHash)\n {\n orderHash = LibEIP712.hashEIP712Message(\n eip712ExchangeDomainHash,\n order.getStructHash()\n );\n return orderHash;\n }\n\n /// @dev Calculates EIP712 hash of the order struct.\n /// @param order The order structure.\n /// @return EIP712 hash of the order struct.\n function getStructHash(Order memory order)\n internal\n pure\n returns (bytes32 result)\n {\n bytes32 schemaHash = _EIP712_ORDER_SCHEMA_HASH;\n bytes memory makerAssetData = order.makerAssetData;\n bytes memory takerAssetData = order.takerAssetData;\n bytes memory makerFeeAssetData = order.makerFeeAssetData;\n bytes memory takerFeeAssetData = order.takerFeeAssetData;\n\n // Assembly for more efficiently computing:\n // keccak256(abi.encodePacked(\n // EIP712_ORDER_SCHEMA_HASH,\n // uint256(order.makerAddress),\n // uint256(order.takerAddress),\n // uint256(order.feeRecipientAddress),\n // uint256(order.senderAddress),\n // order.makerAssetAmount,\n // order.takerAssetAmount,\n // order.makerFee,\n // order.takerFee,\n // order.expirationTimeSeconds,\n // order.salt,\n // keccak256(order.makerAssetData),\n // keccak256(order.takerAssetData),\n // keccak256(order.makerFeeAssetData),\n // keccak256(order.takerFeeAssetData)\n // ));\n\n assembly {\n // Assert order offset (this is an internal error that should never be triggered)\n if lt(order, 32) {\n invalid()\n }\n\n // Calculate memory addresses that will be swapped out before hashing\n let pos1 := sub(order, 32)\n let pos2 := add(order, 320)\n let pos3 := add(order, 352)\n let pos4 := add(order, 384)\n let pos5 := add(order, 416)\n\n // Backup\n let temp1 := mload(pos1)\n let temp2 := mload(pos2)\n let temp3 := mload(pos3)\n let temp4 := mload(pos4)\n let temp5 := mload(pos5)\n\n // Hash in place\n mstore(pos1, schemaHash)\n mstore(pos2, keccak256(add(makerAssetData, 32), mload(makerAssetData))) // store hash of makerAssetData\n mstore(pos3, keccak256(add(takerAssetData, 32), mload(takerAssetData))) // store hash of takerAssetData\n mstore(pos4, keccak256(add(makerFeeAssetData, 32), mload(makerFeeAssetData))) // store hash of makerFeeAssetData\n mstore(pos5, keccak256(add(takerFeeAssetData, 32), mload(takerFeeAssetData))) // store hash of takerFeeAssetData\n result := keccak256(pos1, 480)\n\n // Restore\n mstore(pos1, temp1)\n mstore(pos2, temp2)\n mstore(pos3, temp3)\n mstore(pos4, temp4)\n mstore(pos5, temp5)\n }\n return result;\n }\n}\n", - "@0x/contracts-utils/contracts/src/LibEIP712.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\nlibrary LibEIP712 {\n\n // Hash of the EIP712 Domain Separator Schema\n // keccak256(abi.encodePacked(\n // \"EIP712Domain(\",\n // \"string name,\",\n // \"string version,\",\n // \"uint256 chainId,\",\n // \"address verifyingContract\",\n // \")\"\n // ))\n bytes32 constant internal _EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f;\n\n /// @dev Calculates a EIP712 domain separator.\n /// @param name The EIP712 domain name.\n /// @param version The EIP712 domain version.\n /// @param verifyingContract The EIP712 verifying contract.\n /// @return EIP712 domain separator.\n function hashEIP712Domain(\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract\n )\n internal\n pure\n returns (bytes32 result)\n {\n bytes32 schemaHash = _EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH;\n\n // Assembly for more efficient computing:\n // keccak256(abi.encodePacked(\n // _EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH,\n // keccak256(bytes(name)),\n // keccak256(bytes(version)),\n // chainId,\n // uint256(verifyingContract)\n // ))\n\n assembly {\n // Calculate hashes of dynamic data\n let nameHash := keccak256(add(name, 32), mload(name))\n let versionHash := keccak256(add(version, 32), mload(version))\n\n // Load free memory pointer\n let memPtr := mload(64)\n\n // Store params in memory\n mstore(memPtr, schemaHash)\n mstore(add(memPtr, 32), nameHash)\n mstore(add(memPtr, 64), versionHash)\n mstore(add(memPtr, 96), chainId)\n mstore(add(memPtr, 128), verifyingContract)\n\n // Compute hash\n result := keccak256(memPtr, 160)\n }\n return result;\n }\n\n /// @dev Calculates EIP712 encoding for a hash struct with a given domain hash.\n /// @param eip712DomainHash Hash of the domain domain separator data, computed\n /// with getDomainHash().\n /// @param hashStruct The EIP712 hash struct.\n /// @return EIP712 hash applied to the given EIP712 Domain.\n function hashEIP712Message(bytes32 eip712DomainHash, bytes32 hashStruct)\n internal\n pure\n returns (bytes32 result)\n {\n // Assembly for more efficient computing:\n // keccak256(abi.encodePacked(\n // EIP191_HEADER,\n // EIP712_DOMAIN_HASH,\n // hashStruct\n // ));\n\n assembly {\n // Load free memory pointer\n let memPtr := mload(64)\n\n mstore(memPtr, 0x1901000000000000000000000000000000000000000000000000000000000000) // EIP191 header\n mstore(add(memPtr, 2), eip712DomainHash) // EIP712 domain hash\n mstore(add(memPtr, 34), hashStruct) // Hash of struct\n\n // Compute hash\n result := keccak256(memPtr, 66)\n }\n return result;\n }\n}\n" - }, - "sourceTreeHashHex": "0x97bf0a1df3d54f15dde82fd55fa032db7bcf5523dcbceac63deb4dc6255e76bb", - "compiler": { - "name": "solc", - "version": "soljson-v0.5.16+commit.9c3226ce.js", - "settings": { - "optimizer": { - "enabled": true, - "runs": 1000000, - "details": { - "yul": true, - "deduplicate": true, - "cse": true, - "constantOptimizer": true - } - }, - "outputSelection": { - "*": { - "*": [ - "abi", - "devdoc", - "evm.bytecode.object", - "evm.bytecode.sourceMap", - "evm.deployedBytecode.object", - "evm.deployedBytecode.sourceMap" - ] - } - }, - "evmVersion": "istanbul", - "remappings": [ - "@0x/contracts-asset-proxy=/Users/danielpyrathon/Desktop/Projects/0x-monorepo/contracts/erc20-bridge-sampler/node_modules/@0x/contracts-asset-proxy", - "@0x/contracts-erc20=/Users/danielpyrathon/Desktop/Projects/0x-monorepo/contracts/erc20-bridge-sampler/node_modules/@0x/contracts-erc20", - "@0x/contracts-utils=/Users/danielpyrathon/Desktop/Projects/0x-monorepo/contracts/erc20-bridge-sampler/node_modules/@0x/contracts-utils", - "@0x/contracts-exchange-libs=/Users/danielpyrathon/Desktop/Projects/0x-monorepo/contracts/erc20-bridge-sampler/node_modules/@0x/contracts-exchange-libs", - "@0x/contracts-exchange=/Users/danielpyrathon/Desktop/Projects/0x-monorepo/contracts/erc20-bridge-sampler/node_modules/@0x/contracts-exchange" - ] - } - }, - "chains": {} -} \ No newline at end of file + "schemaVersion": "2.0.0", + "contractName": "IERC20BridgeSampler", + "compilerOutput": { + "abi": [ + { + "constant": true, + "inputs": [{ "internalType": "bytes[]", "name": "callDatas", "type": "bytes[]" }], + "name": "batchCall", + "outputs": [{ "internalType": "bytes[]", "name": "callResults", "type": "bytes[]" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "registryAddress", "type": "address" }, + { "internalType": "address", "name": "takerToken", "type": "address" }, + { "internalType": "address", "name": "makerToken", "type": "address" } + ], + "name": "getLiquidityProviderFromRegistry", + "outputs": [{ "internalType": "address", "name": "providerAddress", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "components": [ + { "internalType": "address", "name": "makerAddress", "type": "address" }, + { "internalType": "address", "name": "takerAddress", "type": "address" }, + { "internalType": "address", "name": "feeRecipientAddress", "type": "address" }, + { "internalType": "address", "name": "senderAddress", "type": "address" }, + { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "makerFee", "type": "uint256" }, + { "internalType": "uint256", "name": "takerFee", "type": "uint256" }, + { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" }, + { "internalType": "uint256", "name": "salt", "type": "uint256" }, + { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" } + ], + "internalType": "struct LibOrder.Order[]", + "name": "orders", + "type": "tuple[]" + }, + { "internalType": "bytes[]", "name": "orderSignatures", "type": "bytes[]" } + ], + "name": "getOrderFillableMakerAssetAmounts", + "outputs": [ + { "internalType": "uint256[]", "name": "orderFillableMakerAssetAmounts", "type": "uint256[]" } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "components": [ + { "internalType": "address", "name": "makerAddress", "type": "address" }, + { "internalType": "address", "name": "takerAddress", "type": "address" }, + { "internalType": "address", "name": "feeRecipientAddress", "type": "address" }, + { "internalType": "address", "name": "senderAddress", "type": "address" }, + { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "makerFee", "type": "uint256" }, + { "internalType": "uint256", "name": "takerFee", "type": "uint256" }, + { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" }, + { "internalType": "uint256", "name": "salt", "type": "uint256" }, + { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" } + ], + "internalType": "struct LibOrder.Order[]", + "name": "orders", + "type": "tuple[]" + }, + { "internalType": "bytes[]", "name": "orderSignatures", "type": "bytes[]" } + ], + "name": "getOrderFillableTakerAssetAmounts", + "outputs": [ + { "internalType": "uint256[]", "name": "orderFillableTakerAssetAmounts", "type": "uint256[]" } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "takerToken", "type": "address" }, + { "internalType": "address", "name": "makerToken", "type": "address" }, + { "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" } + ], + "name": "sampleBuysFromEth2Dai", + "outputs": [{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "registryAddress", "type": "address" }, + { "internalType": "address", "name": "takerToken", "type": "address" }, + { "internalType": "address", "name": "makerToken", "type": "address" }, + { "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" } + ], + "name": "sampleBuysFromLiquidityProviderRegistry", + "outputs": [{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "takerToken", "type": "address" }, + { "internalType": "address", "name": "makerToken", "type": "address" }, + { "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" } + ], + "name": "sampleBuysFromUniswap", + "outputs": [{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "curveAddress", "type": "address" }, + { "internalType": "int128", "name": "fromTokenIdx", "type": "int128" }, + { "internalType": "int128", "name": "toTokenIdx", "type": "int128" }, + { "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" } + ], + "name": "sampleSellsFromCurve", + "outputs": [{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "takerToken", "type": "address" }, + { "internalType": "address", "name": "makerToken", "type": "address" }, + { "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" } + ], + "name": "sampleSellsFromEth2Dai", + "outputs": [{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "takerToken", "type": "address" }, + { "internalType": "address", "name": "makerToken", "type": "address" }, + { "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" } + ], + "name": "sampleSellsFromKyberNetwork", + "outputs": [{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "registryAddress", "type": "address" }, + { "internalType": "address", "name": "takerToken", "type": "address" }, + { "internalType": "address", "name": "makerToken", "type": "address" }, + { "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" } + ], + "name": "sampleSellsFromLiquidityProviderRegistry", + "outputs": [{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "takerToken", "type": "address" }, + { "internalType": "address", "name": "makerToken", "type": "address" }, + { "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" } + ], + "name": "sampleSellsFromUniswap", + "outputs": [{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }], + "payable": false, + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "methods": { + "batchCall(bytes[])": { + "details": "Call multiple public functions on this contract in a single transaction.", + "params": { "callDatas": "ABI-encoded call data for each function call." }, + "return": "callResults ABI-encoded results data for each call." + }, + "getLiquidityProviderFromRegistry(address,address,address)": { + "details": "Returns the address of a liquidity provider for the given market (takerToken, makerToken), from a registry of liquidity providers. Returns address(0) if no such provider exists in the registry.", + "params": { + "makerToken": "Maker asset managed by liquidity provider.", + "takerToken": "Taker asset managed by liquidity provider." + }, + "return": "providerAddress Address of the liquidity provider." + }, + "getOrderFillableMakerAssetAmounts((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[])": { + "details": "Queries the fillable maker asset amounts of native orders.", + "params": { + "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[])": { + "details": "Queries the fillable taker asset amounts of native orders.", + "params": { + "orderSignatures": "Signatures for each respective order in `orders`.", + "orders": "Native orders to query." + }, + "return": "orderFillableTakerAssetAmounts How much taker asset can be filled by each order in `orders`." + }, + "sampleBuysFromEth2Dai(address,address,uint256[])": { + "details": "Sample buy quotes from Eth2Dai/Oasis.", + "params": { + "makerToken": "Address of the maker token (what to buy).", + "takerToken": "Address of the taker token (what to sell).", + "takerTokenAmounts": "Maker token sell amount for each sample." + }, + "return": "takerTokenAmounts Taker amounts sold at each maker token amount." + }, + "sampleBuysFromLiquidityProviderRegistry(address,address,address,uint256[])": { + "details": "Sample buy quotes from an arbitrary on-chain liquidity provider.", + "params": { + "makerToken": "Address of the maker token (what to buy).", + "makerTokenAmounts": "Maker token buy amount for each sample.", + "registryAddress": "Address of the liquidity provider registry contract.", + "takerToken": "Address of the taker token (what to sell)." + }, + "return": "takerTokenAmounts Taker amounts sold at each maker token amount." + }, + "sampleBuysFromUniswap(address,address,uint256[])": { + "details": "Sample buy quotes from Uniswap.", + "params": { + "makerToken": "Address of the maker token (what to buy).", + "makerTokenAmounts": "Maker token sell amount for each sample.", + "takerToken": "Address of the taker token (what to sell)." + }, + "return": "takerTokenAmounts Taker amounts sold at each maker token amount." + }, + "sampleSellsFromCurve(address,int128,int128,uint256[])": { + "details": "Sample sell quotes from Curve.", + "params": { + "curveAddress": "Address of the Curve contract.", + "fromTokenIdx": "Index of the taker token (what to sell).", + "takerTokenAmounts": "Taker token sell amount for each sample.", + "toTokenIdx": "Index of the maker token (what to buy)." + }, + "return": "makerTokenAmounts Maker amounts bought at each taker token amount." + }, + "sampleSellsFromEth2Dai(address,address,uint256[])": { + "details": "Sample sell quotes from Eth2Dai/Oasis.", + "params": { + "makerToken": "Address of the maker token (what to buy).", + "takerToken": "Address of the taker token (what to sell).", + "takerTokenAmounts": "Taker token sell amount for each sample." + }, + "return": "makerTokenAmounts Maker amounts bought at each taker token amount." + }, + "sampleSellsFromKyberNetwork(address,address,uint256[])": { + "details": "Sample sell quotes from Kyber.", + "params": { + "makerToken": "Address of the maker token (what to buy).", + "takerToken": "Address of the taker token (what to sell).", + "takerTokenAmounts": "Taker token sell amount for each sample." + }, + "return": "makerTokenAmounts Maker amounts bought at each taker token amount." + }, + "sampleSellsFromLiquidityProviderRegistry(address,address,address,uint256[])": { + "details": "Sample sell quotes from an arbitrary on-chain liquidity provider.", + "params": { + "makerToken": "Address of the maker token (what to buy).", + "registryAddress": "Address of the liquidity provider registry contract.", + "takerToken": "Address of the taker token (what to sell).", + "takerTokenAmounts": "Taker token sell amount for each sample." + }, + "return": "makerTokenAmounts Maker amounts bought at each taker token amount." + }, + "sampleSellsFromUniswap(address,address,uint256[])": { + "details": "Sample sell quotes from Uniswap.", + "params": { + "makerToken": "Address of the maker token (what to buy).", + "takerToken": "Address of the taker token (what to sell).", + "takerTokenAmounts": "Taker token sell amount for each sample." + }, + "return": "makerTokenAmounts Maker amounts bought at each taker token amount." + } + } + }, + "evm": { "bytecode": { "object": "0x" }, "deployedBytecode": { "object": "0x" } } + }, + "compiler": { + "name": "solc", + "version": "soljson-v0.5.16+commit.9c3226ce.js", + "settings": { + "optimizer": { + "enabled": true, + "runs": 1000000, + "details": { "yul": true, "deduplicate": true, "cse": true, "constantOptimizer": true } + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "devdoc", + "evm.bytecode.object", + "evm.bytecode.sourceMap", + "evm.deployedBytecode.object", + "evm.deployedBytecode.sourceMap" + ] + } + }, + "evmVersion": "istanbul" + } + }, + "chains": {} +} diff --git a/packages/contract-artifacts/artifacts/ILiquidityProvider.json b/packages/contract-artifacts/artifacts/ILiquidityProvider.json index 5d9c3c0d4c..ce14770f26 100644 --- a/packages/contract-artifacts/artifacts/ILiquidityProvider.json +++ b/packages/contract-artifacts/artifacts/ILiquidityProvider.json @@ -1,204 +1,108 @@ { - "schemaVersion": "2.0.0", - "contractName": "ILiquidityProvider", - "compilerOutput": { - "abi": [ - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "tokenAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "bridgeData", - "type": "bytes" - } - ], - "name": "bridgeTransferFrom", - "outputs": [ - { - "internalType": "bytes4", - "name": "success", - "type": "bytes4" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "takerToken", - "type": "address" - }, - { - "internalType": "address", - "name": "makerToken", - "type": "address" - }, - { - "internalType": "uint256", - "name": "buyAmount", - "type": "uint256" - } - ], - "name": "getBuyQuote", - "outputs": [ - { - "internalType": "uint256", - "name": "takerTokenAmount", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "takerToken", - "type": "address" - }, - { - "internalType": "address", - "name": "makerToken", - "type": "address" - }, - { - "internalType": "uint256", - "name": "sellAmount", - "type": "uint256" - } - ], - "name": "getSellQuote", - "outputs": [ - { - "internalType": "uint256", - "name": "makerTokenAmount", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - } - ], - "devdoc": { - "methods": { - "bridgeTransferFrom(address,address,address,uint256,bytes)": { - "details": "Transfers `amount` of the ERC20 `tokenAddress` from `from` to `to`.", - "params": { - "amount": "Amount of asset to transfer.", - "bridgeData": "Arbitrary asset data needed by the bridge contract.", - "from": "Address to transfer asset from.", - "to": "Address to transfer asset to.", - "tokenAddress": "The address of the ERC20 token to transfer." - }, - "return": "success The magic bytes `0xdc1600f3` if successful." - }, - "getBuyQuote(address,address,uint256)": { - "details": "Quotes the amount of `takerToken` that would need to be sold in order to obtain `buyAmount` of `makerToken`.", - "params": { - "buyAmount": "Amount of `makerToken` to buy.", - "makerToken": "Address of the maker token (what to buy).", - "takerToken": "Address of the taker token (what to sell)." - }, - "return": "takerTokenAmount Amount of `takerToken` that would need to be sold." - }, - "getSellQuote(address,address,uint256)": { - "details": "Quotes the amount of `makerToken` that would be obtained by selling `sellAmount` of `takerToken`.", - "params": { - "makerToken": "Address of the maker token (what to buy).", - "sellAmount": "Amount of `takerToken` to sell.", - "takerToken": "Address of the taker token (what to sell)." - }, - "return": "makerTokenAmount Amount of `makerToken` that would be obtained." - } - } - }, - "evm": { - "bytecode": { - "linkReferences": {}, - "object": "0x", - "opcodes": "", - "sourceMap": "" - }, - "deployedBytecode": { - "linkReferences": {}, - "object": "0x", - "opcodes": "", - "sourceMap": "" - } - } - }, - "sources": { - "src/ILiquidityProvider.sol": { - "id": 8 - } - }, - "sourceCodes": { - "src/ILiquidityProvider.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ninterface ILiquidityProvider {\n\n /// @dev Transfers `amount` of the ERC20 `tokenAddress` from `from` to `to`.\n /// @param tokenAddress The address of the ERC20 token to transfer.\n /// @param from Address to transfer asset from.\n /// @param to Address to transfer asset to.\n /// @param amount Amount of asset to transfer.\n /// @param bridgeData Arbitrary asset data needed by the bridge contract.\n /// @return success The magic bytes `0xdc1600f3` if successful.\n function bridgeTransferFrom(\n address tokenAddress,\n address from,\n address to,\n uint256 amount,\n bytes calldata bridgeData\n )\n external\n returns (bytes4 success);\n\n /// @dev Quotes the amount of `makerToken` that would be obtained by\n /// selling `sellAmount` of `takerToken`.\n /// @param takerToken Address of the taker token (what to sell).\n /// @param makerToken Address of the maker token (what to buy).\n /// @param sellAmount Amount of `takerToken` to sell.\n /// @return makerTokenAmount Amount of `makerToken` that would be obtained.\n function getSellQuote(\n address takerToken,\n address makerToken,\n uint256 sellAmount\n )\n external\n view\n returns (uint256 makerTokenAmount);\n\n /// @dev Quotes the amount of `takerToken` that would need to be sold in\n /// order to obtain `buyAmount` of `makerToken`.\n /// @param takerToken Address of the taker token (what to sell).\n /// @param makerToken Address of the maker token (what to buy).\n /// @param buyAmount Amount of `makerToken` to buy.\n /// @return takerTokenAmount Amount of `takerToken` that would need to be sold.\n function getBuyQuote(\n address takerToken,\n address makerToken,\n uint256 buyAmount\n )\n external\n view\n returns (uint256 takerTokenAmount);\n}\n" - }, - "sourceTreeHashHex": "0x3aa914bd3a043f6b6d9bfa0670279ac5544994c2fe62d4764879b109ee620699", - "compiler": { - "name": "solc", - "version": "soljson-v0.5.16+commit.9c3226ce.js", - "settings": { - "optimizer": { - "enabled": true, - "runs": 1000000, - "details": { - "yul": true, - "deduplicate": true, - "cse": true, - "constantOptimizer": true - } - }, - "outputSelection": { - "*": { - "*": [ - "abi", - "devdoc", - "evm.bytecode.object", - "evm.bytecode.sourceMap", - "evm.deployedBytecode.object", - "evm.deployedBytecode.sourceMap" - ] - } - }, - "evmVersion": "istanbul", - "remappings": [ - "@0x/contracts-asset-proxy=/Users/danielpyrathon/Desktop/Projects/0x-monorepo/contracts/erc20-bridge-sampler/node_modules/@0x/contracts-asset-proxy", - "@0x/contracts-erc20=/Users/danielpyrathon/Desktop/Projects/0x-monorepo/contracts/erc20-bridge-sampler/node_modules/@0x/contracts-erc20", - "@0x/contracts-utils=/Users/danielpyrathon/Desktop/Projects/0x-monorepo/contracts/erc20-bridge-sampler/node_modules/@0x/contracts-utils", - "@0x/contracts-exchange-libs=/Users/danielpyrathon/Desktop/Projects/0x-monorepo/contracts/erc20-bridge-sampler/node_modules/@0x/contracts-exchange-libs", - "@0x/contracts-exchange=/Users/danielpyrathon/Desktop/Projects/0x-monorepo/contracts/erc20-bridge-sampler/node_modules/@0x/contracts-exchange" - ] - } - }, - "chains": {} -} \ No newline at end of file + "schemaVersion": "2.0.0", + "contractName": "ILiquidityProvider", + "compilerOutput": { + "abi": [ + { + "constant": false, + "inputs": [ + { "internalType": "address", "name": "tokenAddress", "type": "address" }, + { "internalType": "address", "name": "from", "type": "address" }, + { "internalType": "address", "name": "to", "type": "address" }, + { "internalType": "uint256", "name": "amount", "type": "uint256" }, + { "internalType": "bytes", "name": "bridgeData", "type": "bytes" } + ], + "name": "bridgeTransferFrom", + "outputs": [{ "internalType": "bytes4", "name": "success", "type": "bytes4" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "takerToken", "type": "address" }, + { "internalType": "address", "name": "makerToken", "type": "address" }, + { "internalType": "uint256", "name": "buyAmount", "type": "uint256" } + ], + "name": "getBuyQuote", + "outputs": [{ "internalType": "uint256", "name": "takerTokenAmount", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "takerToken", "type": "address" }, + { "internalType": "address", "name": "makerToken", "type": "address" }, + { "internalType": "uint256", "name": "sellAmount", "type": "uint256" } + ], + "name": "getSellQuote", + "outputs": [{ "internalType": "uint256", "name": "makerTokenAmount", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "methods": { + "bridgeTransferFrom(address,address,address,uint256,bytes)": { + "details": "Transfers `amount` of the ERC20 `tokenAddress` from `from` to `to`.", + "params": { + "amount": "Amount of asset to transfer.", + "bridgeData": "Arbitrary asset data needed by the bridge contract.", + "from": "Address to transfer asset from.", + "to": "Address to transfer asset to.", + "tokenAddress": "The address of the ERC20 token to transfer." + }, + "return": "success The magic bytes `0xdc1600f3` if successful." + }, + "getBuyQuote(address,address,uint256)": { + "details": "Quotes the amount of `takerToken` that would need to be sold in order to obtain `buyAmount` of `makerToken`.", + "params": { + "buyAmount": "Amount of `makerToken` to buy.", + "makerToken": "Address of the maker token (what to buy).", + "takerToken": "Address of the taker token (what to sell)." + }, + "return": "takerTokenAmount Amount of `takerToken` that would need to be sold." + }, + "getSellQuote(address,address,uint256)": { + "details": "Quotes the amount of `makerToken` that would be obtained by selling `sellAmount` of `takerToken`.", + "params": { + "makerToken": "Address of the maker token (what to buy).", + "sellAmount": "Amount of `takerToken` to sell.", + "takerToken": "Address of the taker token (what to sell)." + }, + "return": "makerTokenAmount Amount of `makerToken` that would be obtained." + } + } + }, + "evm": { "bytecode": { "object": "0x" }, "deployedBytecode": { "object": "0x" } } + }, + "compiler": { + "name": "solc", + "version": "soljson-v0.5.16+commit.9c3226ce.js", + "settings": { + "optimizer": { + "enabled": true, + "runs": 1000000, + "details": { "yul": true, "deduplicate": true, "cse": true, "constantOptimizer": true } + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "devdoc", + "evm.bytecode.object", + "evm.bytecode.sourceMap", + "evm.deployedBytecode.object", + "evm.deployedBytecode.sourceMap" + ] + } + }, + "evmVersion": "istanbul" + } + }, + "chains": {} +} diff --git a/packages/contract-artifacts/artifacts/ILiquidityProviderRegistry.json b/packages/contract-artifacts/artifacts/ILiquidityProviderRegistry.json index 5c64e68092..6264ca0b0d 100644 --- a/packages/contract-artifacts/artifacts/ILiquidityProviderRegistry.json +++ b/packages/contract-artifacts/artifacts/ILiquidityProviderRegistry.json @@ -1,106 +1,58 @@ { - "schemaVersion": "2.0.0", - "contractName": "ILiquidityProviderRegistry", - "compilerOutput": { - "abi": [ - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "takerToken", - "type": "address" - }, - { - "internalType": "address", - "name": "makerToken", - "type": "address" - } - ], - "name": "getLiquidityProviderForMarket", - "outputs": [ - { - "internalType": "address", - "name": "providerAddress", - "type": "address" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - } - ], - "devdoc": { - "methods": { - "getLiquidityProviderForMarket(address,address)": { - "details": "Returns the address of a liquidity provider for the given market (takerToken, makerToken), reverting if the pool does not exist.", - "params": { - "makerToken": "Maker asset managed by liquidity provider.", - "takerToken": "Taker asset managed by liquidity provider." - }, - "return": "Address of the liquidity provider." - } - } - }, - "evm": { - "bytecode": { - "linkReferences": {}, - "object": "0x", - "opcodes": "", - "sourceMap": "" - }, - "deployedBytecode": { - "linkReferences": {}, - "object": "0x", - "opcodes": "", - "sourceMap": "" - } - } - }, - "sources": { - "src/ILiquidityProviderRegistry.sol": { - "id": 9 - } - }, - "sourceCodes": { - "src/ILiquidityProviderRegistry.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ninterface ILiquidityProviderRegistry {\n\n /// @dev Returns the address of a liquidity provider for the given market\n /// (takerToken, makerToken), reverting if the pool does not exist.\n /// @param takerToken Taker asset managed by liquidity provider.\n /// @param makerToken Maker asset managed by liquidity provider.\n /// @return Address of the liquidity provider.\n function getLiquidityProviderForMarket(\n address takerToken,\n address makerToken\n )\n external\n view\n returns (address providerAddress);\n}\n" - }, - "sourceTreeHashHex": "0x580f250d5134c119fad782c3e9cd3762e3ebd9af20b9768f257c2a0544e62d88", - "compiler": { - "name": "solc", - "version": "soljson-v0.5.16+commit.9c3226ce.js", - "settings": { - "optimizer": { - "enabled": true, - "runs": 1000000, - "details": { - "yul": true, - "deduplicate": true, - "cse": true, - "constantOptimizer": true - } - }, - "outputSelection": { - "*": { - "*": [ - "abi", - "devdoc", - "evm.bytecode.object", - "evm.bytecode.sourceMap", - "evm.deployedBytecode.object", - "evm.deployedBytecode.sourceMap" - ] - } - }, - "evmVersion": "istanbul", - "remappings": [ - "@0x/contracts-asset-proxy=/Users/danielpyrathon/Desktop/Projects/0x-monorepo/contracts/erc20-bridge-sampler/node_modules/@0x/contracts-asset-proxy", - "@0x/contracts-erc20=/Users/danielpyrathon/Desktop/Projects/0x-monorepo/contracts/erc20-bridge-sampler/node_modules/@0x/contracts-erc20", - "@0x/contracts-utils=/Users/danielpyrathon/Desktop/Projects/0x-monorepo/contracts/erc20-bridge-sampler/node_modules/@0x/contracts-utils", - "@0x/contracts-exchange-libs=/Users/danielpyrathon/Desktop/Projects/0x-monorepo/contracts/erc20-bridge-sampler/node_modules/@0x/contracts-exchange-libs", - "@0x/contracts-exchange=/Users/danielpyrathon/Desktop/Projects/0x-monorepo/contracts/erc20-bridge-sampler/node_modules/@0x/contracts-exchange" - ] - } - }, - "chains": {} -} \ No newline at end of file + "schemaVersion": "2.0.0", + "contractName": "ILiquidityProviderRegistry", + "compilerOutput": { + "abi": [ + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "takerToken", "type": "address" }, + { "internalType": "address", "name": "makerToken", "type": "address" } + ], + "name": "getLiquidityProviderForMarket", + "outputs": [{ "internalType": "address", "name": "providerAddress", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "methods": { + "getLiquidityProviderForMarket(address,address)": { + "details": "Returns the address of a liquidity provider for the given market (takerToken, makerToken), reverting if the pool does not exist.", + "params": { + "makerToken": "Maker asset managed by liquidity provider.", + "takerToken": "Taker asset managed by liquidity provider." + }, + "return": "Address of the liquidity provider." + } + } + }, + "evm": { "bytecode": { "object": "0x" }, "deployedBytecode": { "object": "0x" } } + }, + "compiler": { + "name": "solc", + "version": "soljson-v0.5.16+commit.9c3226ce.js", + "settings": { + "optimizer": { + "enabled": true, + "runs": 1000000, + "details": { "yul": true, "deduplicate": true, "cse": true, "constantOptimizer": true } + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "devdoc", + "evm.bytecode.object", + "evm.bytecode.sourceMap", + "evm.deployedBytecode.object", + "evm.deployedBytecode.sourceMap" + ] + } + }, + "evmVersion": "istanbul" + } + }, + "chains": {} +}