diff --git a/packages/contract-artifacts/artifacts/ERC20BridgeSampler.json b/packages/contract-artifacts/artifacts/ERC20BridgeSampler.json
new file mode 100644
index 0000000000..070c100c19
--- /dev/null
+++ b/packages/contract-artifacts/artifacts/ERC20BridgeSampler.json
@@ -0,0 +1,777 @@
+{
+ "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": "0x608060405234801561001057600080fd5b50612a00806100206000396000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c806368be3cf2116100815780639f76ad351161005b5780639f76ad35146101a7578063a2c28d4b146101ba578063c7f7142e146101cd576100d4565b806368be3cf2146101615780636dd6b78d146101815780638b123a0214610194576100d4565b806359f515d0116100b257806359f515d01461012857806360ee052a1461013b57806364ee6ade1461014e576100d4565b8063354152a3146100d95780634703a7e6146101025780634cb8e25314610115575b600080fd5b6100ec6100e736600461236f565b6101ed565b6040516100f991906126d6565b60405180910390f35b6100ec61011036600461230f565b6103be565b6100ec61012336600461230f565b61059a565b6100ec610136366004612419565b61088a565b6100ec61014936600461230f565b610933565b6100ec61015c36600461230f565b610bf3565b61017461016f3660046123ad565b610db9565b6040516100f99190612658565b6100ec61018f36600461230f565b610ef8565b6100ec6101a2366004612419565b6111a0565b6100ec6101b536600461229c565b611468565b6100ec6101c836600461229c565b61166d565b6101e06101db366004612252565b611859565b6040516100f991906125df565b60606000825190508060405190808252806020026020018201604052801561021f578160200160208202803883390190505b50915060005b818110156103b457600060608873ffffffffffffffffffffffffffffffffffffffff16620927c0600073ffffffffffffffffffffffffffffffffffffffff166307211ef7905060e01b8a8a8a888151811061027c57fe5b602002602001015160405160240161029693929190612749565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161031f91906125c3565b6000604051808303818686fa925050503d806000811461035b576040519150601f19603f3d011682016040523d82523d6000602084013e610360565b606091505b5090925090506000821561038957818060200190516103829190810190612537565b9050610391565b5050506103b4565b8086858151811061039e57fe5b6020908102919091010152505050600101610225565b5050949350505050565b60606103ca8385611987565b81516040805182815260208084028201019091528180156103f5578160200160208202803883390190505b50915060005b81811015610591576000606061040f6119fa565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663ff1fd974905060e01b8a8a8a888151811061045957fe5b602002602001015160405160240161047393929190612627565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516104fc91906125c3565b6000604051808303818686fa925050503d8060008114610538576040519150601f19603f3d011682016040523d82523d6000602084013e61053d565b606091505b50909250905060008215610566578180602001905161055f9190810190612537565b905061056e565b505050610591565b8086858151811061057b57fe5b60209081029190910101525050506001016103fb565b50509392505050565b60606105a68385611987565b60006105b0611a12565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146105e857846105fe565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b9050600061060a611a12565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146106425784610658565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b9050600061066587611a2a565b60ff169050600061067587611a2a565b60ff169050600086519050806040519080825280602002602001820160405280156106aa578160200160208202803883390190505b50955060005b8181101561087d57600060606106c4611a3b565b73ffffffffffffffffffffffffffffffffffffffff166216e360600073ffffffffffffffffffffffffffffffffffffffff1663809a9e55905060e01b8a8a8e888151811061070e57fe5b602002602001015160405160240161072893929190612627565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516107b191906125c3565b6000604051808303818686fa925050503d80600081146107ed576040519150601f19603f3d011682016040523d82523d6000602084013e6107f2565b606091505b5090925090506000821561081b57818060200190516108149190810190612537565b9050610823565b50505061087d565b670de0b6b3a764000087600a0a87600a0a8d878151811061084057fe5b60200260200101518402028161085257fe5b048161085a57fe5b048a858151811061086757fe5b60209081029190910101525050506001016106b0565b5050505050509392505050565b606061089683836111a0565b905060005b835181101561092c578181815181106108b057fe5b60200260200101516000146109245761090b8282815181106108ce57fe5b60200260200101518583815181106108e257fe5b602002602001015160a001518684815181106108fa57fe5b602002602001015160800151611a53565b82828151811061091757fe5b6020026020010181815250505b60010161089b565b5092915050565b606061093f8385611987565b815160408051828152602080840282010190915281801561096a578160200160208202803883390190505b5091506000610977611a12565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146109b7576109b286611a95565b6109ba565b60005b905060006109c6611a12565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610a0657610a0186611a95565b610a09565b60005b905060005b83811015610be8576001610a20611a12565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415610ab7578651610a969085907f2640f62c00000000000000000000000000000000000000000000000000000000908a9086908110610a8957fe5b6020026020010151611b27565b878481518110610aa257fe5b60200260200101819350828152505050610bd4565b610abf611a12565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161415610b28578651610a969084907f59e9486200000000000000000000000000000000000000000000000000000000908a9086908110610a8957fe5b8651600090610b619085907f59e9486200000000000000000000000000000000000000000000000000000000908b9087908110610a8957fe5b925090508015610bb757610b96857f2640f62c0000000000000000000000000000000000000000000000000000000083611b27565b888581518110610ba257fe5b60200260200101819450828152505050610bd2565b6000878481518110610bc557fe5b6020026020010181815250505b505b80610bdf5750610be8565b50600101610a0e565b505050509392505050565b6060610bff8385611987565b8151604080518281526020808402820101909152818015610c2a578160200160208202803883390190505b50915060005b818110156105915760006060610c446119fa565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663144a2752905060e01b898b8a8881518110610c8e57fe5b6020026020010151604051602401610ca893929190612627565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051610d3191906125c3565b6000604051808303818686fa925050503d8060008114610d6d576040519150601f19603f3d011682016040523d82523d6000602084013e610d72565b606091505b509092509050600082156105665781806020019051610d949190810190612537565b905080868581518110610da357fe5b6020908102919091010152505050600101610c30565b604080518281526020808402820101909152606090828015610def57816020015b6060815260200190600190039081610dda5790505b50905060005b80831461092c576000606030868685818110610e0d57fe5b6020028201905080357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe136849003018112610e4757600080fd5b9091016020810191503567ffffffffffffffff811115610e6657600080fd5b36819003821315610e7657600080fd5b604051610e849291906125b3565b600060405180830381855afa9150503d8060008114610ebf576040519150601f19603f3d011682016040523d82523d6000602084013e610ec4565b606091505b509150915081610ed657805160208201fd5b80848481518110610ee357fe5b60209081029190910101525050600101610df5565b6060610f048385611987565b8151604080518281526020808402820101909152818015610f2f578160200160208202803883390190505b5091506000610f3c611a12565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610f7c57610f7786611a95565b610f7f565b60005b90506000610f8b611a12565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610fcb57610fc686611a95565b610fce565b60005b905060005b83811015610be8576001610fe5611a12565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16141561106f57865161104e9085907f95b68fe700000000000000000000000000000000000000000000000000000000908a9086908110610a8957fe5b87848151811061105a57fe5b6020026020010181935082815250505061118c565b611077611a12565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614156110e057865161104e9084907fcd7724c300000000000000000000000000000000000000000000000000000000908a9086908110610a8957fe5b86516000906111199086907f95b68fe700000000000000000000000000000000000000000000000000000000908b9087908110610a8957fe5b92509050801561116f5761114e847fcd7724c30000000000000000000000000000000000000000000000000000000083611b27565b88858151811061115a57fe5b6020026020010181945082815250505061118a565b600087848151811061117d57fe5b6020026020010181815250505b505b806111975750610be8565b50600101610fd3565b606082516040519080825280602002602001820160405280156111cd578160200160208202803883390190505b50905060005b8351811461092c578281815181106111e757fe5b60200260200101515160001480611215575083818151811061120557fe5b6020026020010151608001516000145b80611237575083818151811061122757fe5b602002602001015160a001516000145b1561125b57600082828151811061124a57fe5b602002602001018181525050611460565b60006060611267611c70565b73ffffffffffffffffffffffffffffffffffffffff166207a120611289611c70565b5087517fe77286eb00000000000000000000000000000000000000000000000000000000908990879081106112ba57fe5b60200260200101518887815181106112ce57fe5b60200260200101516040516024016112e79291906127c4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161137091906125c3565b6000604051808303818686fa925050503d80600081146113ac576040519150601f19603f3d011682016040523d82523d6000602084013e6113b1565b606091505b5091509150816113dc5760008484815181106113c957fe5b6020026020010181815250505050611460565b6113e4611f4e565b600080838060200190516113fb91908101906124ca565b9194509250905060038351600681111561141157fe5b14158061141c575080155b1561144057600087878151811061142f57fe5b60200260200101818152505061145a565b8187878151811061144d57fe5b6020026020010181815250505b50505050505b6001016111d3565b60606000825190508060405190808252806020026020018201604052801561149a578160200160208202803883390190505b50915060006114aa878787611859565b905073ffffffffffffffffffffffffffffffffffffffff81166114cf57506116659050565b60005b8281101561166157600060608373ffffffffffffffffffffffffffffffffffffffff1662030d40600073ffffffffffffffffffffffffffffffffffffffff1663343fbcdd905060e01b8b8b8b888151811061152957fe5b602002602001015160405160240161154393929190612627565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516115cc91906125c3565b6000604051808303818686fa925050503d8060008114611608576040519150601f19603f3d011682016040523d82523d6000602084013e61160d565b606091505b50909250905060008215611636578180602001905161162f9190810190612537565b905061163e565b505050611661565b8087858151811061164b57fe5b60209081029190910101525050506001016114d2565b5050505b949350505050565b60606000825190508060405190808252806020026020018201604052801561169f578160200160208202803883390190505b50915060006116af878787611859565b905073ffffffffffffffffffffffffffffffffffffffff81166116d457506116659050565b60005b8281101561166157600060608373ffffffffffffffffffffffffffffffffffffffff1662030d40600073ffffffffffffffffffffffffffffffffffffffff166345060eb0905060e01b8b8b8b888151811061172e57fe5b602002602001015160405160240161174893929190612627565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516117d191906125c3565b6000604051808303818686fa925050503d806000811461180d576040519150601f19603f3d011682016040523d82523d6000602084013e611812565b606091505b5090925090506000821561163657818060200190516118349190810190612537565b90508087858151811061184357fe5b60209081029190910101525050506001016116d7565b6040516000906060907f153f599700000000000000000000000000000000000000000000000000000000906118949086908690602401612600565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608673ffffffffffffffffffffffffffffffffffffffff168360405161191c91906125c3565b600060405180830381855afa9150503d8060008114611957576040519150601f19603f3d011682016040523d82523d6000602084013e61195c565b606091505b5091509150811561197c57611972816000611c88565b9350505050611980565b5050505b9392505050565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ed90612767565b60405180910390fd5b5050565b73794e6e91555438afc3ccf1c5076a74f42133d08d90565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290565b6000611a3582611ccd565b92915050565b73818e6fecd516ecc3849daf6845e3ec868087b75590565b600061166583611a89611a6d82600163ffffffff611d9e16565b611a7d888763ffffffff611dbd16565b9063ffffffff611dee16565b9063ffffffff611e0a16565b6000611a9f611e34565b73ffffffffffffffffffffffffffffffffffffffff166306f2bf62836040518263ffffffff1660e01b8152600401611ad791906125df565b60206040518083038186803b158015611aef57600080fd5b505afa158015611b03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611a359190810190612236565b60008073ffffffffffffffffffffffffffffffffffffffff8516611b4a57611c68565b60608573ffffffffffffffffffffffffffffffffffffffff16620249f08686604051602401611b799190612918565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611c0291906125c3565b6000604051808303818686fa925050503d8060008114611c3e576040519150601f19603f3d011682016040523d82523d6000602084013e611c43565b606091505b5090925090508115611c665780806020019051611c639190810190612537565b92505b505b935093915050565b7374134cf88b21383713e096a5ecf59e297dc7f54790565b60008160140183511015611cae57611cae611ca96004855185601401611e4c565b611ef1565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b600060129050600060608373ffffffffffffffffffffffffffffffffffffffff166040518060400160405280600481526020017f313ce56700000000000000000000000000000000000000000000000000000000815250604051611d3191906125c3565b600060405180830381855afa9150503d8060008114611d6c576040519150601f19603f3d011682016040523d82523d6000602084013e611d71565b606091505b5091509150818015611d84575080516020145b15611d9757611d94816000611ef9565b92505b5050919050565b600082821115611db757611db7611ca960028585611f05565b50900390565b600082611dcc57506000611a35565b82820282848281611dd957fe5b041461198057611980611ca960018686611f05565b60008282018381101561198057611980611ca960008686611f05565b600081611e2057611e20611ca960038585611f05565b6000828481611e2b57fe5b04949350505050565b73c0a47dfe034b400b47bdad5fecda2621de6c4d9590565b6060632800659560e01b848484604051602401611e6b9392919061273b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b60006119808383611f24565b606063e946c1bb60e01b848484604051602401611e6b93929190612719565b60008160200183511015611f4557611f45611ca96005855185602001611e4c565b50016020015190565b6040805160608101909152806000815260006020820181905260409091015290565b8035611a3581612998565b600082601f830112611f8b578081fd5b8135611f9e611f9982612948565b612921565b8181529150602080830190840160005b83811015611fdb57611fc6876020843589010161204e565b83526020928301929190910190600101611fae565b5050505092915050565b600082601f830112611ff5578081fd5b8135612003611f9982612948565b81815291506020808301908481018184028601820187101561202457600080fd5b60005b8481101561204357813584529282019290820190600101612027565b505050505092915050565b600082601f83011261205e578081fd5b813567ffffffffffffffff811115612074578182fd5b6120a560207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612921565b91508082528360208285010111156120bc57600080fd5b8060208401602084013760009082016020015292915050565b8035600f81900b8114611a3557600080fd5b60006101c08083850312156120fa578182fd5b61210381612921565b9150506121108383611f70565b815261211f8360208401611f70565b60208201526121318360408401611f70565b60408201526121438360608401611f70565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff808211156121a557600080fd5b6121b18683870161204e565b838501526101609250828501359150808211156121cd57600080fd5b6121d98683870161204e565b838501526101809250828501359150808211156121f557600080fd5b6122018683870161204e565b838501526101a092508285013591508082111561221d57600080fd5b5061222a8582860161204e565b82840152505092915050565b600060208284031215612247578081fd5b815161198081612998565b600080600060608486031215612266578182fd5b833561227181612998565b9250602084013561228181612998565b9150604084013561229181612998565b809150509250925092565b600080600080608085870312156122b1578081fd5b84356122bc81612998565b935060208501356122cc81612998565b925060408501356122dc81612998565b9150606085013567ffffffffffffffff8111156122f7578182fd5b61230387828801611fe5565b91505092959194509250565b600080600060608486031215612323578283fd5b833561232e81612998565b9250602084013561233e81612998565b9150604084013567ffffffffffffffff811115612359578182fd5b61236586828701611fe5565b9150509250925092565b60008060008060808587031215612384578182fd5b843561238f81612998565b935061239e86602087016120d5565b92506122dc86604087016120d5565b600080602083850312156123bf578182fd5b823567ffffffffffffffff808211156123d6578384fd5b81850186601f8201126123e7578485fd5b80359250818311156123f7578485fd5b866020808502830101111561240a578485fd5b60200196919550909350505050565b6000806040838503121561242b578182fd5b823567ffffffffffffffff80821115612442578384fd5b81850186601f820112612453578485fd5b80359250612463611f9984612948565b83815260208082019190838101885b8781101561249b576124898c8484358901016120e7565b85529382019390820190600101612472565b509197508801359450505050808211156124b3578283fd5b506124c085828601611f7b565b9150509250929050565b600080600083850360a08112156124df578182fd5b60608112156124ec578182fd5b506124f76060612921565b845160078110612505578283fd5b815260208581015190820152604080860151908201526060850151608086015191945092508015158114612291578182fd5b600060208284031215612548578081fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff169052565b60008151808452612581816020860160208601612968565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000828483379101908152919050565b600082516125d5818460208701612968565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b6000602080830181845280855180835260408601915060408482028701019250838701855b828110156126c9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526126b7858351612569565b9450928501929085019060010161267d565b5092979650505050505050565b602080825282518282018190526000918401906040840190835b8181101561270e5783518352602093840193909201916001016126f0565b509095945050505050565b606081016004851061272757fe5b938152602081019290925260409091015290565b606081016008851061272757fe5b600f93840b81529190920b6020820152604081019190915260600190565b60208082526025908201527f455243323042726964676553616d706c65722f494e56414c49445f544f4b454e60408201527f5f50414952000000000000000000000000000000000000000000000000000000606082015260800190565b6000604082526127d860408301855161254f565b60208401516127ea606084018261254f565b5060408401516127fd608084018261254f565b50606084015161281060a084018261254f565b50608084015160c083015260a084015160e083015260c0840151610100818185015260e086015191506101208281860152818701519250610140915082828601528087015192505061016082818601528187015192506101c091506101808281870152612881610200870185612569565b8289015194507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc092506101a08388830301818901526128c08287612569565b838b015196508489820301868a01526128d98188612569565b955050808a0151955050505080858303016101e0860152506128fb8183612569565b848103602086015261290d8187612569565b979650505050505050565b90815260200190565b60405181810167ffffffffffffffff8111828210171561294057600080fd5b604052919050565b600067ffffffffffffffff82111561295e578081fd5b5060209081020190565b60005b8381101561298357818101518382015260200161296b565b83811115612992576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff811681146129ba57600080fd5b5056fea365627a7a72315820b96a5ae2969f8fb5130d6d7dd33f47f66c480071ee39e69c12bdceb0e1acc0096c6578706572696d656e74616cf564736f6c63430005100040",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2A00 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 0x236F JUMP JUMPDEST PUSH2 0x1ED JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xF9 SWAP2 SWAP1 PUSH2 0x26D6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xEC PUSH2 0x110 CALLDATASIZE PUSH1 0x4 PUSH2 0x230F JUMP JUMPDEST PUSH2 0x3BE JUMP JUMPDEST PUSH2 0xEC PUSH2 0x123 CALLDATASIZE PUSH1 0x4 PUSH2 0x230F JUMP JUMPDEST PUSH2 0x59A JUMP JUMPDEST PUSH2 0xEC PUSH2 0x136 CALLDATASIZE PUSH1 0x4 PUSH2 0x2419 JUMP JUMPDEST PUSH2 0x88A JUMP JUMPDEST PUSH2 0xEC PUSH2 0x149 CALLDATASIZE PUSH1 0x4 PUSH2 0x230F JUMP JUMPDEST PUSH2 0x933 JUMP JUMPDEST PUSH2 0xEC PUSH2 0x15C CALLDATASIZE PUSH1 0x4 PUSH2 0x230F JUMP JUMPDEST PUSH2 0xBF3 JUMP JUMPDEST PUSH2 0x174 PUSH2 0x16F CALLDATASIZE PUSH1 0x4 PUSH2 0x23AD JUMP JUMPDEST PUSH2 0xDB9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xF9 SWAP2 SWAP1 PUSH2 0x2658 JUMP JUMPDEST PUSH2 0xEC PUSH2 0x18F CALLDATASIZE PUSH1 0x4 PUSH2 0x230F JUMP JUMPDEST PUSH2 0xEF8 JUMP JUMPDEST PUSH2 0xEC PUSH2 0x1A2 CALLDATASIZE PUSH1 0x4 PUSH2 0x2419 JUMP JUMPDEST PUSH2 0x11A0 JUMP JUMPDEST PUSH2 0xEC PUSH2 0x1B5 CALLDATASIZE PUSH1 0x4 PUSH2 0x229C JUMP JUMPDEST PUSH2 0x1468 JUMP JUMPDEST PUSH2 0xEC PUSH2 0x1C8 CALLDATASIZE PUSH1 0x4 PUSH2 0x229C JUMP JUMPDEST PUSH2 0x166D JUMP JUMPDEST PUSH2 0x1E0 PUSH2 0x1DB CALLDATASIZE PUSH1 0x4 PUSH2 0x2252 JUMP JUMPDEST PUSH2 0x1859 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xF9 SWAP2 SWAP1 PUSH2 0x25DF 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 0x2749 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 0x25C3 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 0x2537 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 0x1987 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 0x19FA 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 0x2627 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 0x25C3 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 0x2537 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 0x1987 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5B0 PUSH2 0x1A12 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 0x1A12 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 0x1A2A JUMP JUMPDEST PUSH1 0xFF AND SWAP1 POP PUSH1 0x0 PUSH2 0x675 DUP8 PUSH2 0x1A2A 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 0x1A3B 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 0x2627 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 0x25C3 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 0x2537 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 0x1A53 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 0x1987 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 0x1A12 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x9B7 JUMPI PUSH2 0x9B2 DUP7 PUSH2 0x1A95 JUMP JUMPDEST PUSH2 0x9BA JUMP JUMPDEST PUSH1 0x0 JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x9C6 PUSH2 0x1A12 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xA06 JUMPI PUSH2 0xA01 DUP7 PUSH2 0x1A95 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 0x1A12 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 0x1B27 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 0x1A12 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 0x1B27 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 0x1987 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 0x19FA 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 0x2627 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 0x25C3 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 0x2537 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 0x25B3 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 0x1987 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 0x1A12 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xF7C JUMPI PUSH2 0xF77 DUP7 PUSH2 0x1A95 JUMP JUMPDEST PUSH2 0xF7F JUMP JUMPDEST PUSH1 0x0 JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xF8B PUSH2 0x1A12 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xFCB JUMPI PUSH2 0xFC6 DUP7 PUSH2 0x1A95 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 0x1A12 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 0x1A12 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 0x1B27 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 0x1C70 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH3 0x7A120 PUSH2 0x1289 PUSH2 0x1C70 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 0x27C4 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 0x25C3 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 0x1F4E JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x13FB SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x24CA 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 0x2627 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 0x25C3 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 0x2537 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 0x2627 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 0x25C3 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 0x2537 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 0x2600 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 0x25C3 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 ISZERO PUSH2 0x197C JUMPI PUSH2 0x1972 DUP2 PUSH1 0x0 PUSH2 0x1C88 JUMP JUMPDEST SWAP4 POP POP POP POP PUSH2 0x1980 JUMP JUMPDEST POP POP POP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x19F6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x19ED SWAP1 PUSH2 0x2767 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 0x1A35 DUP3 PUSH2 0x1CCD JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0x818E6FECD516ECC3849DAF6845E3EC868087B755 SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1665 DUP4 PUSH2 0x1A89 PUSH2 0x1A6D DUP3 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x1D9E AND JUMP JUMPDEST PUSH2 0x1A7D DUP9 DUP8 PUSH4 0xFFFFFFFF PUSH2 0x1DBD AND JUMP JUMPDEST SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1DEE AND JUMP JUMPDEST SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1E0A AND JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1A9F PUSH2 0x1E34 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x6F2BF62 DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1AD7 SWAP2 SWAP1 PUSH2 0x25DF JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1AEF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1B03 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 0x1A35 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2236 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH2 0x1B4A JUMPI PUSH2 0x1C68 JUMP JUMPDEST PUSH1 0x60 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH3 0x249F0 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1B79 SWAP2 SWAP1 PUSH2 0x2918 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 0x1C02 SWAP2 SWAP1 PUSH2 0x25C3 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 0x1C3E 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 0x1C43 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP DUP2 ISZERO PUSH2 0x1C66 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x1C63 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2537 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 0x1CAE JUMPI PUSH2 0x1CAE PUSH2 0x1CA9 PUSH1 0x4 DUP6 MLOAD DUP6 PUSH1 0x14 ADD PUSH2 0x1E4C JUMP JUMPDEST PUSH2 0x1EF1 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 0x1D31 SWAP2 SWAP1 PUSH2 0x25C3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1D6C 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 0x1D71 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x1D84 JUMPI POP DUP1 MLOAD PUSH1 0x20 EQ JUMPDEST ISZERO PUSH2 0x1D97 JUMPI PUSH2 0x1D94 DUP2 PUSH1 0x0 PUSH2 0x1EF9 JUMP JUMPDEST SWAP3 POP JUMPDEST POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x1DB7 JUMPI PUSH2 0x1DB7 PUSH2 0x1CA9 PUSH1 0x2 DUP6 DUP6 PUSH2 0x1F05 JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1DCC JUMPI POP PUSH1 0x0 PUSH2 0x1A35 JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x1DD9 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x1980 JUMPI PUSH2 0x1980 PUSH2 0x1CA9 PUSH1 0x1 DUP7 DUP7 PUSH2 0x1F05 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x1980 JUMPI PUSH2 0x1980 PUSH2 0x1CA9 PUSH1 0x0 DUP7 DUP7 PUSH2 0x1F05 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x1E20 JUMPI PUSH2 0x1E20 PUSH2 0x1CA9 PUSH1 0x3 DUP6 DUP6 PUSH2 0x1F05 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP2 PUSH2 0x1E2B 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 0x1E6B SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x273B 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 0x1980 DUP4 DUP4 PUSH2 0x1F24 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xE946C1BB PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1E6B SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2719 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH2 0x1F45 JUMPI PUSH2 0x1F45 PUSH2 0x1CA9 PUSH1 0x5 DUP6 MLOAD DUP6 PUSH1 0x20 ADD PUSH2 0x1E4C 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 0x1A35 DUP2 PUSH2 0x2998 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1F8B JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1F9E PUSH2 0x1F99 DUP3 PUSH2 0x2948 JUMP JUMPDEST PUSH2 0x2921 JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 ADD PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1FDB JUMPI PUSH2 0x1FC6 DUP8 PUSH1 0x20 DUP5 CALLDATALOAD DUP10 ADD ADD PUSH2 0x204E JUMP JUMPDEST DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1FAE JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1FF5 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x2003 PUSH2 0x1F99 DUP3 PUSH2 0x2948 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 0x2024 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x2043 JUMPI DUP2 CALLDATALOAD DUP5 MSTORE SWAP3 DUP3 ADD SWAP3 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x2027 JUMP JUMPDEST POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x205E JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2074 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x20A5 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD PUSH2 0x2921 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x20BC 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 0x1A35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1C0 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x20FA JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x2103 DUP2 PUSH2 0x2921 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x2110 DUP4 DUP4 PUSH2 0x1F70 JUMP JUMPDEST DUP2 MSTORE PUSH2 0x211F DUP4 PUSH1 0x20 DUP5 ADD PUSH2 0x1F70 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x2131 DUP4 PUSH1 0x40 DUP5 ADD PUSH2 0x1F70 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x2143 DUP4 PUSH1 0x60 DUP5 ADD PUSH2 0x1F70 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 0x21A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x21B1 DUP7 DUP4 DUP8 ADD PUSH2 0x204E JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x160 SWAP3 POP DUP3 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x21CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x21D9 DUP7 DUP4 DUP8 ADD PUSH2 0x204E JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x180 SWAP3 POP DUP3 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x21F5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2201 DUP7 DUP4 DUP8 ADD PUSH2 0x204E JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x1A0 SWAP3 POP DUP3 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x221D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x222A DUP6 DUP3 DUP7 ADD PUSH2 0x204E JUMP JUMPDEST DUP3 DUP5 ADD MSTORE POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2247 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x1980 DUP2 PUSH2 0x2998 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x2266 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x2271 DUP2 PUSH2 0x2998 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x2281 DUP2 PUSH2 0x2998 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x2291 DUP2 PUSH2 0x2998 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 0x22B1 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x22BC DUP2 PUSH2 0x2998 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH2 0x22CC DUP2 PUSH2 0x2998 JUMP JUMPDEST SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0x22DC DUP2 PUSH2 0x2998 JUMP JUMPDEST SWAP2 POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x22F7 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x2303 DUP8 DUP3 DUP9 ADD PUSH2 0x1FE5 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 0x2323 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x232E DUP2 PUSH2 0x2998 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x233E DUP2 PUSH2 0x2998 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2359 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x2365 DUP7 DUP3 DUP8 ADD PUSH2 0x1FE5 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 0x2384 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x238F DUP2 PUSH2 0x2998 JUMP JUMPDEST SWAP4 POP PUSH2 0x239E DUP7 PUSH1 0x20 DUP8 ADD PUSH2 0x20D5 JUMP JUMPDEST SWAP3 POP PUSH2 0x22DC DUP7 PUSH1 0x40 DUP8 ADD PUSH2 0x20D5 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x23BF JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x23D6 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP6 ADD DUP7 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x23E7 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP3 POP DUP2 DUP4 GT ISZERO PUSH2 0x23F7 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP7 PUSH1 0x20 DUP1 DUP6 MUL DUP4 ADD ADD GT ISZERO PUSH2 0x240A 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 0x242B JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x2442 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP6 ADD DUP7 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x2453 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP3 POP PUSH2 0x2463 PUSH2 0x1F99 DUP5 PUSH2 0x2948 JUMP JUMPDEST DUP4 DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD SWAP2 SWAP1 DUP4 DUP2 ADD DUP9 JUMPDEST DUP8 DUP2 LT ISZERO PUSH2 0x249B JUMPI PUSH2 0x2489 DUP13 DUP5 DUP5 CALLDATALOAD DUP10 ADD ADD PUSH2 0x20E7 JUMP JUMPDEST DUP6 MSTORE SWAP4 DUP3 ADD SWAP4 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x2472 JUMP JUMPDEST POP SWAP2 SWAP8 POP DUP9 ADD CALLDATALOAD SWAP5 POP POP POP POP DUP1 DUP3 GT ISZERO PUSH2 0x24B3 JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x24C0 DUP6 DUP3 DUP7 ADD PUSH2 0x1F7B 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 0x24DF JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x60 DUP2 SLT ISZERO PUSH2 0x24EC JUMPI DUP2 DUP3 REVERT JUMPDEST POP PUSH2 0x24F7 PUSH1 0x60 PUSH2 0x2921 JUMP JUMPDEST DUP5 MLOAD PUSH1 0x7 DUP2 LT PUSH2 0x2505 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 0x2291 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2548 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 0x2581 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x2968 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 0x25D5 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x2968 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 0x26C9 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 DUP9 DUP7 SUB ADD DUP5 MSTORE PUSH2 0x26B7 DUP6 DUP4 MLOAD PUSH2 0x2569 JUMP JUMPDEST SWAP5 POP SWAP3 DUP6 ADD SWAP3 SWAP1 DUP6 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x267D 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 0x270E JUMPI DUP4 MLOAD DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x26F0 JUMP JUMPDEST POP SWAP1 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH1 0x4 DUP6 LT PUSH2 0x2727 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 0x2727 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 0x27D8 PUSH1 0x40 DUP4 ADD DUP6 MLOAD PUSH2 0x254F JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD PUSH2 0x27EA PUSH1 0x60 DUP5 ADD DUP3 PUSH2 0x254F JUMP JUMPDEST POP PUSH1 0x40 DUP5 ADD MLOAD PUSH2 0x27FD PUSH1 0x80 DUP5 ADD DUP3 PUSH2 0x254F JUMP JUMPDEST POP PUSH1 0x60 DUP5 ADD MLOAD PUSH2 0x2810 PUSH1 0xA0 DUP5 ADD DUP3 PUSH2 0x254F 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 0x2881 PUSH2 0x200 DUP8 ADD DUP6 PUSH2 0x2569 JUMP JUMPDEST DUP3 DUP10 ADD MLOAD SWAP5 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 SWAP3 POP PUSH2 0x1A0 DUP4 DUP9 DUP4 SUB ADD DUP2 DUP10 ADD MSTORE PUSH2 0x28C0 DUP3 DUP8 PUSH2 0x2569 JUMP JUMPDEST DUP4 DUP12 ADD MLOAD SWAP7 POP DUP5 DUP10 DUP3 SUB ADD DUP7 DUP11 ADD MSTORE PUSH2 0x28D9 DUP2 DUP9 PUSH2 0x2569 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 0x28FB DUP2 DUP4 PUSH2 0x2569 JUMP JUMPDEST DUP5 DUP2 SUB PUSH1 0x20 DUP7 ADD MSTORE PUSH2 0x290D DUP2 DUP8 PUSH2 0x2569 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 0x2940 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x295E JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x2983 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x296B JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x2992 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x29BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG3 PUSH6 0x627A7A723158 KECCAK256 0xB9 PUSH11 0x5AE2969F8FB5130D6D7DD3 EXTCODEHASH SELFBALANCE 0xF6 PUSH13 0x480071EE39E69C12BDCEB0E1AC 0xC0 MULMOD PUSH13 0x6578706572696D656E74616CF5 PUSH5 0x736F6C6343 STOP SDIV LT STOP BLOCKHASH ",
+ "sourceMap": "1303:24373:2:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1303:24373:2;;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x608060405234801561001057600080fd5b50600436106100d45760003560e01c806368be3cf2116100815780639f76ad351161005b5780639f76ad35146101a7578063a2c28d4b146101ba578063c7f7142e146101cd576100d4565b806368be3cf2146101615780636dd6b78d146101815780638b123a0214610194576100d4565b806359f515d0116100b257806359f515d01461012857806360ee052a1461013b57806364ee6ade1461014e576100d4565b8063354152a3146100d95780634703a7e6146101025780634cb8e25314610115575b600080fd5b6100ec6100e736600461236f565b6101ed565b6040516100f991906126d6565b60405180910390f35b6100ec61011036600461230f565b6103be565b6100ec61012336600461230f565b61059a565b6100ec610136366004612419565b61088a565b6100ec61014936600461230f565b610933565b6100ec61015c36600461230f565b610bf3565b61017461016f3660046123ad565b610db9565b6040516100f99190612658565b6100ec61018f36600461230f565b610ef8565b6100ec6101a2366004612419565b6111a0565b6100ec6101b536600461229c565b611468565b6100ec6101c836600461229c565b61166d565b6101e06101db366004612252565b611859565b6040516100f991906125df565b60606000825190508060405190808252806020026020018201604052801561021f578160200160208202803883390190505b50915060005b818110156103b457600060608873ffffffffffffffffffffffffffffffffffffffff16620927c0600073ffffffffffffffffffffffffffffffffffffffff166307211ef7905060e01b8a8a8a888151811061027c57fe5b602002602001015160405160240161029693929190612749565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161031f91906125c3565b6000604051808303818686fa925050503d806000811461035b576040519150601f19603f3d011682016040523d82523d6000602084013e610360565b606091505b5090925090506000821561038957818060200190516103829190810190612537565b9050610391565b5050506103b4565b8086858151811061039e57fe5b6020908102919091010152505050600101610225565b5050949350505050565b60606103ca8385611987565b81516040805182815260208084028201019091528180156103f5578160200160208202803883390190505b50915060005b81811015610591576000606061040f6119fa565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663ff1fd974905060e01b8a8a8a888151811061045957fe5b602002602001015160405160240161047393929190612627565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516104fc91906125c3565b6000604051808303818686fa925050503d8060008114610538576040519150601f19603f3d011682016040523d82523d6000602084013e61053d565b606091505b50909250905060008215610566578180602001905161055f9190810190612537565b905061056e565b505050610591565b8086858151811061057b57fe5b60209081029190910101525050506001016103fb565b50509392505050565b60606105a68385611987565b60006105b0611a12565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146105e857846105fe565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b9050600061060a611a12565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146106425784610658565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b9050600061066587611a2a565b60ff169050600061067587611a2a565b60ff169050600086519050806040519080825280602002602001820160405280156106aa578160200160208202803883390190505b50955060005b8181101561087d57600060606106c4611a3b565b73ffffffffffffffffffffffffffffffffffffffff166216e360600073ffffffffffffffffffffffffffffffffffffffff1663809a9e55905060e01b8a8a8e888151811061070e57fe5b602002602001015160405160240161072893929190612627565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516107b191906125c3565b6000604051808303818686fa925050503d80600081146107ed576040519150601f19603f3d011682016040523d82523d6000602084013e6107f2565b606091505b5090925090506000821561081b57818060200190516108149190810190612537565b9050610823565b50505061087d565b670de0b6b3a764000087600a0a87600a0a8d878151811061084057fe5b60200260200101518402028161085257fe5b048161085a57fe5b048a858151811061086757fe5b60209081029190910101525050506001016106b0565b5050505050509392505050565b606061089683836111a0565b905060005b835181101561092c578181815181106108b057fe5b60200260200101516000146109245761090b8282815181106108ce57fe5b60200260200101518583815181106108e257fe5b602002602001015160a001518684815181106108fa57fe5b602002602001015160800151611a53565b82828151811061091757fe5b6020026020010181815250505b60010161089b565b5092915050565b606061093f8385611987565b815160408051828152602080840282010190915281801561096a578160200160208202803883390190505b5091506000610977611a12565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146109b7576109b286611a95565b6109ba565b60005b905060006109c6611a12565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610a0657610a0186611a95565b610a09565b60005b905060005b83811015610be8576001610a20611a12565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415610ab7578651610a969085907f2640f62c00000000000000000000000000000000000000000000000000000000908a9086908110610a8957fe5b6020026020010151611b27565b878481518110610aa257fe5b60200260200101819350828152505050610bd4565b610abf611a12565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161415610b28578651610a969084907f59e9486200000000000000000000000000000000000000000000000000000000908a9086908110610a8957fe5b8651600090610b619085907f59e9486200000000000000000000000000000000000000000000000000000000908b9087908110610a8957fe5b925090508015610bb757610b96857f2640f62c0000000000000000000000000000000000000000000000000000000083611b27565b888581518110610ba257fe5b60200260200101819450828152505050610bd2565b6000878481518110610bc557fe5b6020026020010181815250505b505b80610bdf5750610be8565b50600101610a0e565b505050509392505050565b6060610bff8385611987565b8151604080518281526020808402820101909152818015610c2a578160200160208202803883390190505b50915060005b818110156105915760006060610c446119fa565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663144a2752905060e01b898b8a8881518110610c8e57fe5b6020026020010151604051602401610ca893929190612627565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051610d3191906125c3565b6000604051808303818686fa925050503d8060008114610d6d576040519150601f19603f3d011682016040523d82523d6000602084013e610d72565b606091505b509092509050600082156105665781806020019051610d949190810190612537565b905080868581518110610da357fe5b6020908102919091010152505050600101610c30565b604080518281526020808402820101909152606090828015610def57816020015b6060815260200190600190039081610dda5790505b50905060005b80831461092c576000606030868685818110610e0d57fe5b6020028201905080357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe136849003018112610e4757600080fd5b9091016020810191503567ffffffffffffffff811115610e6657600080fd5b36819003821315610e7657600080fd5b604051610e849291906125b3565b600060405180830381855afa9150503d8060008114610ebf576040519150601f19603f3d011682016040523d82523d6000602084013e610ec4565b606091505b509150915081610ed657805160208201fd5b80848481518110610ee357fe5b60209081029190910101525050600101610df5565b6060610f048385611987565b8151604080518281526020808402820101909152818015610f2f578160200160208202803883390190505b5091506000610f3c611a12565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610f7c57610f7786611a95565b610f7f565b60005b90506000610f8b611a12565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610fcb57610fc686611a95565b610fce565b60005b905060005b83811015610be8576001610fe5611a12565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16141561106f57865161104e9085907f95b68fe700000000000000000000000000000000000000000000000000000000908a9086908110610a8957fe5b87848151811061105a57fe5b6020026020010181935082815250505061118c565b611077611a12565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614156110e057865161104e9084907fcd7724c300000000000000000000000000000000000000000000000000000000908a9086908110610a8957fe5b86516000906111199086907f95b68fe700000000000000000000000000000000000000000000000000000000908b9087908110610a8957fe5b92509050801561116f5761114e847fcd7724c30000000000000000000000000000000000000000000000000000000083611b27565b88858151811061115a57fe5b6020026020010181945082815250505061118a565b600087848151811061117d57fe5b6020026020010181815250505b505b806111975750610be8565b50600101610fd3565b606082516040519080825280602002602001820160405280156111cd578160200160208202803883390190505b50905060005b8351811461092c578281815181106111e757fe5b60200260200101515160001480611215575083818151811061120557fe5b6020026020010151608001516000145b80611237575083818151811061122757fe5b602002602001015160a001516000145b1561125b57600082828151811061124a57fe5b602002602001018181525050611460565b60006060611267611c70565b73ffffffffffffffffffffffffffffffffffffffff166207a120611289611c70565b5087517fe77286eb00000000000000000000000000000000000000000000000000000000908990879081106112ba57fe5b60200260200101518887815181106112ce57fe5b60200260200101516040516024016112e79291906127c4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161137091906125c3565b6000604051808303818686fa925050503d80600081146113ac576040519150601f19603f3d011682016040523d82523d6000602084013e6113b1565b606091505b5091509150816113dc5760008484815181106113c957fe5b6020026020010181815250505050611460565b6113e4611f4e565b600080838060200190516113fb91908101906124ca565b9194509250905060038351600681111561141157fe5b14158061141c575080155b1561144057600087878151811061142f57fe5b60200260200101818152505061145a565b8187878151811061144d57fe5b6020026020010181815250505b50505050505b6001016111d3565b60606000825190508060405190808252806020026020018201604052801561149a578160200160208202803883390190505b50915060006114aa878787611859565b905073ffffffffffffffffffffffffffffffffffffffff81166114cf57506116659050565b60005b8281101561166157600060608373ffffffffffffffffffffffffffffffffffffffff1662030d40600073ffffffffffffffffffffffffffffffffffffffff1663343fbcdd905060e01b8b8b8b888151811061152957fe5b602002602001015160405160240161154393929190612627565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516115cc91906125c3565b6000604051808303818686fa925050503d8060008114611608576040519150601f19603f3d011682016040523d82523d6000602084013e61160d565b606091505b50909250905060008215611636578180602001905161162f9190810190612537565b905061163e565b505050611661565b8087858151811061164b57fe5b60209081029190910101525050506001016114d2565b5050505b949350505050565b60606000825190508060405190808252806020026020018201604052801561169f578160200160208202803883390190505b50915060006116af878787611859565b905073ffffffffffffffffffffffffffffffffffffffff81166116d457506116659050565b60005b8281101561166157600060608373ffffffffffffffffffffffffffffffffffffffff1662030d40600073ffffffffffffffffffffffffffffffffffffffff166345060eb0905060e01b8b8b8b888151811061172e57fe5b602002602001015160405160240161174893929190612627565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516117d191906125c3565b6000604051808303818686fa925050503d806000811461180d576040519150601f19603f3d011682016040523d82523d6000602084013e611812565b606091505b5090925090506000821561163657818060200190516118349190810190612537565b90508087858151811061184357fe5b60209081029190910101525050506001016116d7565b6040516000906060907f153f599700000000000000000000000000000000000000000000000000000000906118949086908690602401612600565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608673ffffffffffffffffffffffffffffffffffffffff168360405161191c91906125c3565b600060405180830381855afa9150503d8060008114611957576040519150601f19603f3d011682016040523d82523d6000602084013e61195c565b606091505b5091509150811561197c57611972816000611c88565b9350505050611980565b5050505b9392505050565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ed90612767565b60405180910390fd5b5050565b73794e6e91555438afc3ccf1c5076a74f42133d08d90565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290565b6000611a3582611ccd565b92915050565b73818e6fecd516ecc3849daf6845e3ec868087b75590565b600061166583611a89611a6d82600163ffffffff611d9e16565b611a7d888763ffffffff611dbd16565b9063ffffffff611dee16565b9063ffffffff611e0a16565b6000611a9f611e34565b73ffffffffffffffffffffffffffffffffffffffff166306f2bf62836040518263ffffffff1660e01b8152600401611ad791906125df565b60206040518083038186803b158015611aef57600080fd5b505afa158015611b03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611a359190810190612236565b60008073ffffffffffffffffffffffffffffffffffffffff8516611b4a57611c68565b60608573ffffffffffffffffffffffffffffffffffffffff16620249f08686604051602401611b799190612918565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611c0291906125c3565b6000604051808303818686fa925050503d8060008114611c3e576040519150601f19603f3d011682016040523d82523d6000602084013e611c43565b606091505b5090925090508115611c665780806020019051611c639190810190612537565b92505b505b935093915050565b7374134cf88b21383713e096a5ecf59e297dc7f54790565b60008160140183511015611cae57611cae611ca96004855185601401611e4c565b611ef1565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b600060129050600060608373ffffffffffffffffffffffffffffffffffffffff166040518060400160405280600481526020017f313ce56700000000000000000000000000000000000000000000000000000000815250604051611d3191906125c3565b600060405180830381855afa9150503d8060008114611d6c576040519150601f19603f3d011682016040523d82523d6000602084013e611d71565b606091505b5091509150818015611d84575080516020145b15611d9757611d94816000611ef9565b92505b5050919050565b600082821115611db757611db7611ca960028585611f05565b50900390565b600082611dcc57506000611a35565b82820282848281611dd957fe5b041461198057611980611ca960018686611f05565b60008282018381101561198057611980611ca960008686611f05565b600081611e2057611e20611ca960038585611f05565b6000828481611e2b57fe5b04949350505050565b73c0a47dfe034b400b47bdad5fecda2621de6c4d9590565b6060632800659560e01b848484604051602401611e6b9392919061273b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b60006119808383611f24565b606063e946c1bb60e01b848484604051602401611e6b93929190612719565b60008160200183511015611f4557611f45611ca96005855185602001611e4c565b50016020015190565b6040805160608101909152806000815260006020820181905260409091015290565b8035611a3581612998565b600082601f830112611f8b578081fd5b8135611f9e611f9982612948565b612921565b8181529150602080830190840160005b83811015611fdb57611fc6876020843589010161204e565b83526020928301929190910190600101611fae565b5050505092915050565b600082601f830112611ff5578081fd5b8135612003611f9982612948565b81815291506020808301908481018184028601820187101561202457600080fd5b60005b8481101561204357813584529282019290820190600101612027565b505050505092915050565b600082601f83011261205e578081fd5b813567ffffffffffffffff811115612074578182fd5b6120a560207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612921565b91508082528360208285010111156120bc57600080fd5b8060208401602084013760009082016020015292915050565b8035600f81900b8114611a3557600080fd5b60006101c08083850312156120fa578182fd5b61210381612921565b9150506121108383611f70565b815261211f8360208401611f70565b60208201526121318360408401611f70565b60408201526121438360608401611f70565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff808211156121a557600080fd5b6121b18683870161204e565b838501526101609250828501359150808211156121cd57600080fd5b6121d98683870161204e565b838501526101809250828501359150808211156121f557600080fd5b6122018683870161204e565b838501526101a092508285013591508082111561221d57600080fd5b5061222a8582860161204e565b82840152505092915050565b600060208284031215612247578081fd5b815161198081612998565b600080600060608486031215612266578182fd5b833561227181612998565b9250602084013561228181612998565b9150604084013561229181612998565b809150509250925092565b600080600080608085870312156122b1578081fd5b84356122bc81612998565b935060208501356122cc81612998565b925060408501356122dc81612998565b9150606085013567ffffffffffffffff8111156122f7578182fd5b61230387828801611fe5565b91505092959194509250565b600080600060608486031215612323578283fd5b833561232e81612998565b9250602084013561233e81612998565b9150604084013567ffffffffffffffff811115612359578182fd5b61236586828701611fe5565b9150509250925092565b60008060008060808587031215612384578182fd5b843561238f81612998565b935061239e86602087016120d5565b92506122dc86604087016120d5565b600080602083850312156123bf578182fd5b823567ffffffffffffffff808211156123d6578384fd5b81850186601f8201126123e7578485fd5b80359250818311156123f7578485fd5b866020808502830101111561240a578485fd5b60200196919550909350505050565b6000806040838503121561242b578182fd5b823567ffffffffffffffff80821115612442578384fd5b81850186601f820112612453578485fd5b80359250612463611f9984612948565b83815260208082019190838101885b8781101561249b576124898c8484358901016120e7565b85529382019390820190600101612472565b509197508801359450505050808211156124b3578283fd5b506124c085828601611f7b565b9150509250929050565b600080600083850360a08112156124df578182fd5b60608112156124ec578182fd5b506124f76060612921565b845160078110612505578283fd5b815260208581015190820152604080860151908201526060850151608086015191945092508015158114612291578182fd5b600060208284031215612548578081fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff169052565b60008151808452612581816020860160208601612968565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000828483379101908152919050565b600082516125d5818460208701612968565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b6000602080830181845280855180835260408601915060408482028701019250838701855b828110156126c9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526126b7858351612569565b9450928501929085019060010161267d565b5092979650505050505050565b602080825282518282018190526000918401906040840190835b8181101561270e5783518352602093840193909201916001016126f0565b509095945050505050565b606081016004851061272757fe5b938152602081019290925260409091015290565b606081016008851061272757fe5b600f93840b81529190920b6020820152604081019190915260600190565b60208082526025908201527f455243323042726964676553616d706c65722f494e56414c49445f544f4b454e60408201527f5f50414952000000000000000000000000000000000000000000000000000000606082015260800190565b6000604082526127d860408301855161254f565b60208401516127ea606084018261254f565b5060408401516127fd608084018261254f565b50606084015161281060a084018261254f565b50608084015160c083015260a084015160e083015260c0840151610100818185015260e086015191506101208281860152818701519250610140915082828601528087015192505061016082818601528187015192506101c091506101808281870152612881610200870185612569565b8289015194507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc092506101a08388830301818901526128c08287612569565b838b015196508489820301868a01526128d98188612569565b955050808a0151955050505080858303016101e0860152506128fb8183612569565b848103602086015261290d8187612569565b979650505050505050565b90815260200190565b60405181810167ffffffffffffffff8111828210171561294057600080fd5b604052919050565b600067ffffffffffffffff82111561295e578081fd5b5060209081020190565b60005b8381101561298357818101518382015260200161296b565b83811115612992576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff811681146129ba57600080fd5b5056fea365627a7a72315820b96a5ae2969f8fb5130d6d7dd33f47f66c480071ee39e69c12bdceb0e1acc0096c6578706572696d656e74616cf564736f6c63430005100040",
+ "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 0x236F JUMP JUMPDEST PUSH2 0x1ED JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xF9 SWAP2 SWAP1 PUSH2 0x26D6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xEC PUSH2 0x110 CALLDATASIZE PUSH1 0x4 PUSH2 0x230F JUMP JUMPDEST PUSH2 0x3BE JUMP JUMPDEST PUSH2 0xEC PUSH2 0x123 CALLDATASIZE PUSH1 0x4 PUSH2 0x230F JUMP JUMPDEST PUSH2 0x59A JUMP JUMPDEST PUSH2 0xEC PUSH2 0x136 CALLDATASIZE PUSH1 0x4 PUSH2 0x2419 JUMP JUMPDEST PUSH2 0x88A JUMP JUMPDEST PUSH2 0xEC PUSH2 0x149 CALLDATASIZE PUSH1 0x4 PUSH2 0x230F JUMP JUMPDEST PUSH2 0x933 JUMP JUMPDEST PUSH2 0xEC PUSH2 0x15C CALLDATASIZE PUSH1 0x4 PUSH2 0x230F JUMP JUMPDEST PUSH2 0xBF3 JUMP JUMPDEST PUSH2 0x174 PUSH2 0x16F CALLDATASIZE PUSH1 0x4 PUSH2 0x23AD JUMP JUMPDEST PUSH2 0xDB9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xF9 SWAP2 SWAP1 PUSH2 0x2658 JUMP JUMPDEST PUSH2 0xEC PUSH2 0x18F CALLDATASIZE PUSH1 0x4 PUSH2 0x230F JUMP JUMPDEST PUSH2 0xEF8 JUMP JUMPDEST PUSH2 0xEC PUSH2 0x1A2 CALLDATASIZE PUSH1 0x4 PUSH2 0x2419 JUMP JUMPDEST PUSH2 0x11A0 JUMP JUMPDEST PUSH2 0xEC PUSH2 0x1B5 CALLDATASIZE PUSH1 0x4 PUSH2 0x229C JUMP JUMPDEST PUSH2 0x1468 JUMP JUMPDEST PUSH2 0xEC PUSH2 0x1C8 CALLDATASIZE PUSH1 0x4 PUSH2 0x229C JUMP JUMPDEST PUSH2 0x166D JUMP JUMPDEST PUSH2 0x1E0 PUSH2 0x1DB CALLDATASIZE PUSH1 0x4 PUSH2 0x2252 JUMP JUMPDEST PUSH2 0x1859 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xF9 SWAP2 SWAP1 PUSH2 0x25DF 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 0x2749 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 0x25C3 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 0x2537 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 0x1987 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 0x19FA 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 0x2627 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 0x25C3 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 0x2537 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 0x1987 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5B0 PUSH2 0x1A12 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 0x1A12 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 0x1A2A JUMP JUMPDEST PUSH1 0xFF AND SWAP1 POP PUSH1 0x0 PUSH2 0x675 DUP8 PUSH2 0x1A2A 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 0x1A3B 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 0x2627 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 0x25C3 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 0x2537 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 0x1A53 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 0x1987 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 0x1A12 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x9B7 JUMPI PUSH2 0x9B2 DUP7 PUSH2 0x1A95 JUMP JUMPDEST PUSH2 0x9BA JUMP JUMPDEST PUSH1 0x0 JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x9C6 PUSH2 0x1A12 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xA06 JUMPI PUSH2 0xA01 DUP7 PUSH2 0x1A95 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 0x1A12 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 0x1B27 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 0x1A12 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 0x1B27 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 0x1987 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 0x19FA 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 0x2627 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 0x25C3 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 0x2537 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 0x25B3 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 0x1987 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 0x1A12 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xF7C JUMPI PUSH2 0xF77 DUP7 PUSH2 0x1A95 JUMP JUMPDEST PUSH2 0xF7F JUMP JUMPDEST PUSH1 0x0 JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xF8B PUSH2 0x1A12 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xFCB JUMPI PUSH2 0xFC6 DUP7 PUSH2 0x1A95 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 0x1A12 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 0x1A12 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 0x1B27 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 0x1C70 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH3 0x7A120 PUSH2 0x1289 PUSH2 0x1C70 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 0x27C4 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 0x25C3 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 0x1F4E JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x13FB SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x24CA 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 0x2627 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 0x25C3 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 0x2537 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 0x2627 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 0x25C3 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 0x2537 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 0x2600 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 0x25C3 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 ISZERO PUSH2 0x197C JUMPI PUSH2 0x1972 DUP2 PUSH1 0x0 PUSH2 0x1C88 JUMP JUMPDEST SWAP4 POP POP POP POP PUSH2 0x1980 JUMP JUMPDEST POP POP POP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x19F6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x19ED SWAP1 PUSH2 0x2767 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 0x1A35 DUP3 PUSH2 0x1CCD JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0x818E6FECD516ECC3849DAF6845E3EC868087B755 SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1665 DUP4 PUSH2 0x1A89 PUSH2 0x1A6D DUP3 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x1D9E AND JUMP JUMPDEST PUSH2 0x1A7D DUP9 DUP8 PUSH4 0xFFFFFFFF PUSH2 0x1DBD AND JUMP JUMPDEST SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1DEE AND JUMP JUMPDEST SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1E0A AND JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1A9F PUSH2 0x1E34 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x6F2BF62 DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1AD7 SWAP2 SWAP1 PUSH2 0x25DF JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1AEF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1B03 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 0x1A35 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2236 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH2 0x1B4A JUMPI PUSH2 0x1C68 JUMP JUMPDEST PUSH1 0x60 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH3 0x249F0 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1B79 SWAP2 SWAP1 PUSH2 0x2918 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 0x1C02 SWAP2 SWAP1 PUSH2 0x25C3 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 0x1C3E 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 0x1C43 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP DUP2 ISZERO PUSH2 0x1C66 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x1C63 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2537 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 0x1CAE JUMPI PUSH2 0x1CAE PUSH2 0x1CA9 PUSH1 0x4 DUP6 MLOAD DUP6 PUSH1 0x14 ADD PUSH2 0x1E4C JUMP JUMPDEST PUSH2 0x1EF1 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 0x1D31 SWAP2 SWAP1 PUSH2 0x25C3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1D6C 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 0x1D71 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x1D84 JUMPI POP DUP1 MLOAD PUSH1 0x20 EQ JUMPDEST ISZERO PUSH2 0x1D97 JUMPI PUSH2 0x1D94 DUP2 PUSH1 0x0 PUSH2 0x1EF9 JUMP JUMPDEST SWAP3 POP JUMPDEST POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x1DB7 JUMPI PUSH2 0x1DB7 PUSH2 0x1CA9 PUSH1 0x2 DUP6 DUP6 PUSH2 0x1F05 JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1DCC JUMPI POP PUSH1 0x0 PUSH2 0x1A35 JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x1DD9 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x1980 JUMPI PUSH2 0x1980 PUSH2 0x1CA9 PUSH1 0x1 DUP7 DUP7 PUSH2 0x1F05 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x1980 JUMPI PUSH2 0x1980 PUSH2 0x1CA9 PUSH1 0x0 DUP7 DUP7 PUSH2 0x1F05 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x1E20 JUMPI PUSH2 0x1E20 PUSH2 0x1CA9 PUSH1 0x3 DUP6 DUP6 PUSH2 0x1F05 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP2 PUSH2 0x1E2B 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 0x1E6B SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x273B 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 0x1980 DUP4 DUP4 PUSH2 0x1F24 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xE946C1BB PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1E6B SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2719 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH2 0x1F45 JUMPI PUSH2 0x1F45 PUSH2 0x1CA9 PUSH1 0x5 DUP6 MLOAD DUP6 PUSH1 0x20 ADD PUSH2 0x1E4C 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 0x1A35 DUP2 PUSH2 0x2998 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1F8B JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1F9E PUSH2 0x1F99 DUP3 PUSH2 0x2948 JUMP JUMPDEST PUSH2 0x2921 JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 ADD PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1FDB JUMPI PUSH2 0x1FC6 DUP8 PUSH1 0x20 DUP5 CALLDATALOAD DUP10 ADD ADD PUSH2 0x204E JUMP JUMPDEST DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1FAE JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1FF5 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x2003 PUSH2 0x1F99 DUP3 PUSH2 0x2948 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 0x2024 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x2043 JUMPI DUP2 CALLDATALOAD DUP5 MSTORE SWAP3 DUP3 ADD SWAP3 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x2027 JUMP JUMPDEST POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x205E JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2074 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x20A5 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD PUSH2 0x2921 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x20BC 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 0x1A35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1C0 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x20FA JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x2103 DUP2 PUSH2 0x2921 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x2110 DUP4 DUP4 PUSH2 0x1F70 JUMP JUMPDEST DUP2 MSTORE PUSH2 0x211F DUP4 PUSH1 0x20 DUP5 ADD PUSH2 0x1F70 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x2131 DUP4 PUSH1 0x40 DUP5 ADD PUSH2 0x1F70 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x2143 DUP4 PUSH1 0x60 DUP5 ADD PUSH2 0x1F70 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 0x21A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x21B1 DUP7 DUP4 DUP8 ADD PUSH2 0x204E JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x160 SWAP3 POP DUP3 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x21CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x21D9 DUP7 DUP4 DUP8 ADD PUSH2 0x204E JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x180 SWAP3 POP DUP3 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x21F5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2201 DUP7 DUP4 DUP8 ADD PUSH2 0x204E JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x1A0 SWAP3 POP DUP3 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x221D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x222A DUP6 DUP3 DUP7 ADD PUSH2 0x204E JUMP JUMPDEST DUP3 DUP5 ADD MSTORE POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2247 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x1980 DUP2 PUSH2 0x2998 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x2266 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x2271 DUP2 PUSH2 0x2998 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x2281 DUP2 PUSH2 0x2998 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x2291 DUP2 PUSH2 0x2998 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 0x22B1 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x22BC DUP2 PUSH2 0x2998 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH2 0x22CC DUP2 PUSH2 0x2998 JUMP JUMPDEST SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0x22DC DUP2 PUSH2 0x2998 JUMP JUMPDEST SWAP2 POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x22F7 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x2303 DUP8 DUP3 DUP9 ADD PUSH2 0x1FE5 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 0x2323 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x232E DUP2 PUSH2 0x2998 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x233E DUP2 PUSH2 0x2998 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2359 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x2365 DUP7 DUP3 DUP8 ADD PUSH2 0x1FE5 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 0x2384 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x238F DUP2 PUSH2 0x2998 JUMP JUMPDEST SWAP4 POP PUSH2 0x239E DUP7 PUSH1 0x20 DUP8 ADD PUSH2 0x20D5 JUMP JUMPDEST SWAP3 POP PUSH2 0x22DC DUP7 PUSH1 0x40 DUP8 ADD PUSH2 0x20D5 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x23BF JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x23D6 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP6 ADD DUP7 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x23E7 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP3 POP DUP2 DUP4 GT ISZERO PUSH2 0x23F7 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP7 PUSH1 0x20 DUP1 DUP6 MUL DUP4 ADD ADD GT ISZERO PUSH2 0x240A 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 0x242B JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x2442 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP6 ADD DUP7 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x2453 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP3 POP PUSH2 0x2463 PUSH2 0x1F99 DUP5 PUSH2 0x2948 JUMP JUMPDEST DUP4 DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD SWAP2 SWAP1 DUP4 DUP2 ADD DUP9 JUMPDEST DUP8 DUP2 LT ISZERO PUSH2 0x249B JUMPI PUSH2 0x2489 DUP13 DUP5 DUP5 CALLDATALOAD DUP10 ADD ADD PUSH2 0x20E7 JUMP JUMPDEST DUP6 MSTORE SWAP4 DUP3 ADD SWAP4 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x2472 JUMP JUMPDEST POP SWAP2 SWAP8 POP DUP9 ADD CALLDATALOAD SWAP5 POP POP POP POP DUP1 DUP3 GT ISZERO PUSH2 0x24B3 JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x24C0 DUP6 DUP3 DUP7 ADD PUSH2 0x1F7B 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 0x24DF JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x60 DUP2 SLT ISZERO PUSH2 0x24EC JUMPI DUP2 DUP3 REVERT JUMPDEST POP PUSH2 0x24F7 PUSH1 0x60 PUSH2 0x2921 JUMP JUMPDEST DUP5 MLOAD PUSH1 0x7 DUP2 LT PUSH2 0x2505 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 0x2291 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2548 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 0x2581 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x2968 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 0x25D5 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x2968 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 0x26C9 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 DUP9 DUP7 SUB ADD DUP5 MSTORE PUSH2 0x26B7 DUP6 DUP4 MLOAD PUSH2 0x2569 JUMP JUMPDEST SWAP5 POP SWAP3 DUP6 ADD SWAP3 SWAP1 DUP6 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x267D 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 0x270E JUMPI DUP4 MLOAD DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x26F0 JUMP JUMPDEST POP SWAP1 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH1 0x4 DUP6 LT PUSH2 0x2727 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 0x2727 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 0x27D8 PUSH1 0x40 DUP4 ADD DUP6 MLOAD PUSH2 0x254F JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD PUSH2 0x27EA PUSH1 0x60 DUP5 ADD DUP3 PUSH2 0x254F JUMP JUMPDEST POP PUSH1 0x40 DUP5 ADD MLOAD PUSH2 0x27FD PUSH1 0x80 DUP5 ADD DUP3 PUSH2 0x254F JUMP JUMPDEST POP PUSH1 0x60 DUP5 ADD MLOAD PUSH2 0x2810 PUSH1 0xA0 DUP5 ADD DUP3 PUSH2 0x254F 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 0x2881 PUSH2 0x200 DUP8 ADD DUP6 PUSH2 0x2569 JUMP JUMPDEST DUP3 DUP10 ADD MLOAD SWAP5 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 SWAP3 POP PUSH2 0x1A0 DUP4 DUP9 DUP4 SUB ADD DUP2 DUP10 ADD MSTORE PUSH2 0x28C0 DUP3 DUP8 PUSH2 0x2569 JUMP JUMPDEST DUP4 DUP12 ADD MLOAD SWAP7 POP DUP5 DUP10 DUP3 SUB ADD DUP7 DUP11 ADD MSTORE PUSH2 0x28D9 DUP2 DUP9 PUSH2 0x2569 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 0x28FB DUP2 DUP4 PUSH2 0x2569 JUMP JUMPDEST DUP5 DUP2 SUB PUSH1 0x20 DUP7 ADD MSTORE PUSH2 0x290D DUP2 DUP8 PUSH2 0x2569 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 0x2940 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x295E JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x2983 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x296B JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x2992 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x29BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG3 PUSH6 0x627A7A723158 KECCAK256 0xB9 PUSH11 0x5AE2969F8FB5130D6D7DD3 EXTCODEHASH SELFBALANCE 0xF6 PUSH13 0x480071EE39E69C12BDCEB0E1AC 0xC0 MULMOD PUSH13 0x6578706572696D656E74616CF5 PUSH5 0x736F6C6343 STOP SDIV LT STOP BLOCKHASH ",
+ "sourceMap": "1303:24373:2:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1303:24373: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:597::-;;;;;;;;;:::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:597;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;23138:83;;;23175:35;23196:10;23208:1;23175:20;:35::i;:::-;23168:42;;;;;;;23138:83;22630:597;;;;;;;;;:::o;25484:190::-;25615:10;25601:24;;:10;:24;;;;25593:74;;;;;;;;;;;;;;;;;;;;;;25484:190;;:::o;4343:144:30:-;1737:42;4343:144;:::o;3724:135::-;732:42;3724:135;:::o;23394:176:2:-;23490:14;23527:36;23550:12;23527:22;:36::i;:::-;23520:43;23394:176;-1:-1:-1;;23394: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;24991:316:2:-;25088:31;25214:35;:33;:35::i;:::-;25190:85;;;25276:12;25190:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25190:99:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25190: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;25190:99:2;;;;;;;;24028:721;24225:20;;24282:36;;;24278:100;;24334:33;;24278:100;24387:23;24459:22;:33;;1688:5;24576:16;24614:11;24532:111;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;24532:111:2;;;49:4:-1;25:18;;61:17;;24532:111:2;182:15:-1;24532:111:2;;;;179:29:-1;;;;160:49;;;24459:185:2;;;;24532:111;24459: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;24420:224:2;;-1:-1:-1;24420:224:2;-1:-1:-1;24654:89:2;;;;24710:10;24699:33;;;;;;;;;;;;;;24684:48;;24654:89;24028: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:24373:2:-;;;;;;;;;;;-1:-1:-1;1303:24373: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) {\n return LibBytes.readAddress(returnData, 0);\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": "0x76a9557a738a41089ef513f83f238915b1f34310866cfb1fdcd165e4d3fdec52",
+ "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
diff --git a/packages/contract-artifacts/artifacts/IERC20BridgeSampler.json b/packages/contract-artifacts/artifacts/IERC20BridgeSampler.json
index bcf5c1fd6a..6a123729c9 100644
--- a/packages/contract-artifacts/artifacts/IERC20BridgeSampler.json
+++ b/packages/contract-artifacts/artifacts/IERC20BridgeSampler.json
@@ -1,270 +1,697 @@
{
- "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": [
- {
- "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": "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": "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."
- },
- "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."
- },
- "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."
- },
- "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": {}
-}
+ "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
diff --git a/packages/contract-wrappers/package.json b/packages/contract-wrappers/package.json
index bbb39e9449..4d6524a6eb 100644
--- a/packages/contract-wrappers/package.json
+++ b/packages/contract-wrappers/package.json
@@ -31,7 +31,7 @@
"wrappers:generate": "abi-gen --abis ${npm_package_config_abis} --output src/generated-wrappers --backend ethers"
},
"config": {
- "abis": "../contract-artifacts/artifacts/@(DevUtils|ERC20Token|ERC721Token|Exchange|Forwarder|IAssetData|LibTransactionDecoder|WETH9|Coordinator|Staking|StakingProxy|IERC20BridgeSampler|GodsUnchainedValidator|Broker|ILiquidityProvider|ILiquidityProviderRegistry|DummyLiquidityProvider|DummyLiquidityProviderRegistry).json"
+ "abis": "../contract-artifacts/artifacts/@(DevUtils|ERC20Token|ERC721Token|Exchange|Forwarder|IAssetData|LibTransactionDecoder|WETH9|Coordinator|Staking|StakingProxy|IERC20BridgeSampler|ERC20BridgeSampler|GodsUnchainedValidator|Broker|ILiquidityProvider|ILiquidityProviderRegistry|DummyLiquidityProvider|DummyLiquidityProviderRegistry).json"
},
"repository": {
"type": "git",
diff --git a/packages/contract-wrappers/src/generated-wrappers/erc20_bridge_sampler.ts b/packages/contract-wrappers/src/generated-wrappers/erc20_bridge_sampler.ts
new file mode 100644
index 0000000000..7be2b9eec7
--- /dev/null
+++ b/packages/contract-wrappers/src/generated-wrappers/erc20_bridge_sampler.ts
@@ -0,0 +1,1176 @@
+// tslint:disable:no-consecutive-blank-lines ordered-imports align trailing-comma enum-naming
+// tslint:disable:whitespace no-unbound-method no-trailing-whitespace
+// tslint:disable:no-unused-variable
+import {
+ AwaitTransactionSuccessOpts,
+ ContractFunctionObj,
+ ContractTxFunctionObj,
+ SendTransactionOpts,
+ BaseContract,
+ PromiseWithTransactionHash,
+ methodAbiToFunctionSignature,
+ linkLibrariesInBytecode,
+} from '@0x/base-contract';
+import { schemas } from '@0x/json-schemas';
+import {
+ BlockParam,
+ BlockParamLiteral,
+ BlockRange,
+ CallData,
+ ContractAbi,
+ ContractArtifact,
+ DecodedLogArgs,
+ MethodAbi,
+ TransactionReceiptWithDecodedLogs,
+ TxData,
+ TxDataPayable,
+ SupportedProvider,
+} from 'ethereum-types';
+import { BigNumber, classUtils, hexUtils, logUtils, providerUtils } from '@0x/utils';
+import { EventCallback, IndexedFilterValues, SimpleContractArtifact } from '@0x/types';
+import { Web3Wrapper } from '@0x/web3-wrapper';
+import { assert } from '@0x/assert';
+import * as ethers from 'ethers';
+// tslint:enable:no-unused-variable
+
+
+
+/* istanbul ignore next */
+// tslint:disable:array-type
+// tslint:disable:no-parameter-reassignment
+// tslint:disable-next-line:class-name
+export class ERC20BridgeSamplerContract extends BaseContract {
+ /**
+ * @ignore
+ */
+public static deployedBytecode: string | undefined;
+public static contractName = 'ERC20BridgeSampler';
+ private readonly _methodABIIndex: { [name: string]: number } = {};
+public static async deployFrom0xArtifactAsync(
+ artifact: ContractArtifact | SimpleContractArtifact,
+ supportedProvider: SupportedProvider,
+ txDefaults: Partial,
+ logDecodeDependencies: { [contractName: string]: (ContractArtifact | SimpleContractArtifact) },
+ ): Promise {
+ assert.doesConformToSchema('txDefaults', txDefaults, schemas.txDataSchema, [
+ schemas.addressSchema,
+ schemas.numberSchema,
+ schemas.jsNumber,
+ ]);
+ if (artifact.compilerOutput === undefined) {
+ throw new Error('Compiler output not found in the artifact file');
+ }
+ const provider = providerUtils.standardizeOrThrow(supportedProvider);
+ const bytecode = artifact.compilerOutput.evm.bytecode.object;
+ const abi = artifact.compilerOutput.abi;
+ const logDecodeDependenciesAbiOnly: { [contractName: string]: ContractAbi } = {};
+ if (Object.keys(logDecodeDependencies) !== undefined) {
+ for (const key of Object.keys(logDecodeDependencies)) {
+ logDecodeDependenciesAbiOnly[key] = logDecodeDependencies[key].compilerOutput.abi;
+ }
+ }
+ return ERC20BridgeSamplerContract.deployAsync(bytecode, abi, provider, txDefaults, logDecodeDependenciesAbiOnly, );
+ }
+
+ public static async deployWithLibrariesFrom0xArtifactAsync(
+ artifact: ContractArtifact,
+ libraryArtifacts: { [libraryName: string]: ContractArtifact },
+ supportedProvider: SupportedProvider,
+ txDefaults: Partial,
+ logDecodeDependencies: { [contractName: string]: (ContractArtifact | SimpleContractArtifact) },
+ ): Promise {
+ assert.doesConformToSchema('txDefaults', txDefaults, schemas.txDataSchema, [
+ schemas.addressSchema,
+ schemas.numberSchema,
+ schemas.jsNumber,
+ ]);
+ if (artifact.compilerOutput === undefined) {
+ throw new Error('Compiler output not found in the artifact file');
+ }
+ const provider = providerUtils.standardizeOrThrow(supportedProvider);
+ const abi = artifact.compilerOutput.abi;
+ const logDecodeDependenciesAbiOnly: { [contractName: string]: ContractAbi } = {};
+ if (Object.keys(logDecodeDependencies) !== undefined) {
+ for (const key of Object.keys(logDecodeDependencies)) {
+ logDecodeDependenciesAbiOnly[key] = logDecodeDependencies[key].compilerOutput.abi;
+ }
+ }
+ const libraryAddresses = await ERC20BridgeSamplerContract._deployLibrariesAsync(
+ artifact,
+ libraryArtifacts,
+ new Web3Wrapper(provider),
+ txDefaults
+ );
+ const bytecode = linkLibrariesInBytecode(
+ artifact,
+ libraryAddresses,
+ );
+ return ERC20BridgeSamplerContract.deployAsync(bytecode, abi, provider, txDefaults, logDecodeDependenciesAbiOnly, );
+ }
+
+ public static async deployAsync(
+ bytecode: string,
+ abi: ContractAbi,
+ supportedProvider: SupportedProvider,
+ txDefaults: Partial,
+ logDecodeDependencies: { [contractName: string]: ContractAbi },
+ ): Promise {
+ assert.isHexString('bytecode', bytecode);
+ assert.doesConformToSchema('txDefaults', txDefaults, schemas.txDataSchema, [
+ schemas.addressSchema,
+ schemas.numberSchema,
+ schemas.jsNumber,
+ ]);
+ const provider = providerUtils.standardizeOrThrow(supportedProvider);
+ const constructorAbi = BaseContract._lookupConstructorAbi(abi);
+ [] = BaseContract._formatABIDataItemList(
+ constructorAbi.inputs,
+ [],
+ BaseContract._bigNumberToString,
+ );
+ const iface = new ethers.utils.Interface(abi);
+ const deployInfo = iface.deployFunction;
+ const txData = deployInfo.encode(bytecode, []);
+ const web3Wrapper = new Web3Wrapper(provider);
+ const txDataWithDefaults = await BaseContract._applyDefaultsToContractTxDataAsync(
+ {
+ data: txData,
+ ...txDefaults,
+ },
+ web3Wrapper.estimateGasAsync.bind(web3Wrapper),
+ );
+ const txHash = await web3Wrapper.sendTransactionAsync(txDataWithDefaults);
+ logUtils.log(`transactionHash: ${txHash}`);
+ const txReceipt = await web3Wrapper.awaitTransactionSuccessAsync(txHash);
+ logUtils.log(`ERC20BridgeSampler successfully deployed at ${txReceipt.contractAddress}`);
+ const contractInstance = new ERC20BridgeSamplerContract(txReceipt.contractAddress as string, provider, txDefaults, logDecodeDependencies);
+ contractInstance.constructorArgs = [];
+ return contractInstance;
+ }
+
+ /**
+ * @returns The contract ABI
+ */
+ public static ABI(): ContractAbi {
+ const abi = [
+ {
+ constant: true,
+ inputs: [
+ {
+ name: 'callDatas',
+ type: 'bytes[]',
+ },
+ ],
+ name: 'batchCall',
+ outputs: [
+ {
+ name: 'callResults',
+ type: 'bytes[]',
+ },
+ ],
+ payable: false,
+ stateMutability: 'view',
+ type: 'function',
+ },
+ {
+ constant: true,
+ inputs: [
+ {
+ name: 'registryAddress',
+ type: 'address',
+ },
+ {
+ name: 'takerToken',
+ type: 'address',
+ },
+ {
+ name: 'makerToken',
+ type: 'address',
+ },
+ ],
+ name: 'getLiquidityProviderFromRegistry',
+ outputs: [
+ {
+ name: 'providerAddress',
+ type: 'address',
+ },
+ ],
+ payable: false,
+ stateMutability: 'view',
+ type: 'function',
+ },
+ {
+ constant: true,
+ inputs: [
+ {
+ name: 'orders',
+ type: 'tuple[]',
+ components: [
+ {
+ name: 'makerAddress',
+ type: 'address',
+ },
+ {
+ name: 'takerAddress',
+ type: 'address',
+ },
+ {
+ name: 'feeRecipientAddress',
+ type: 'address',
+ },
+ {
+ name: 'senderAddress',
+ type: 'address',
+ },
+ {
+ name: 'makerAssetAmount',
+ type: 'uint256',
+ },
+ {
+ name: 'takerAssetAmount',
+ type: 'uint256',
+ },
+ {
+ name: 'makerFee',
+ type: 'uint256',
+ },
+ {
+ name: 'takerFee',
+ type: 'uint256',
+ },
+ {
+ name: 'expirationTimeSeconds',
+ type: 'uint256',
+ },
+ {
+ name: 'salt',
+ type: 'uint256',
+ },
+ {
+ name: 'makerAssetData',
+ type: 'bytes',
+ },
+ {
+ name: 'takerAssetData',
+ type: 'bytes',
+ },
+ {
+ name: 'makerFeeAssetData',
+ type: 'bytes',
+ },
+ {
+ name: 'takerFeeAssetData',
+ type: 'bytes',
+ },
+ ]
+ },
+ {
+ name: 'orderSignatures',
+ type: 'bytes[]',
+ },
+ ],
+ name: 'getOrderFillableMakerAssetAmounts',
+ outputs: [
+ {
+ name: 'orderFillableMakerAssetAmounts',
+ type: 'uint256[]',
+ },
+ ],
+ payable: false,
+ stateMutability: 'view',
+ type: 'function',
+ },
+ {
+ constant: true,
+ inputs: [
+ {
+ name: 'orders',
+ type: 'tuple[]',
+ components: [
+ {
+ name: 'makerAddress',
+ type: 'address',
+ },
+ {
+ name: 'takerAddress',
+ type: 'address',
+ },
+ {
+ name: 'feeRecipientAddress',
+ type: 'address',
+ },
+ {
+ name: 'senderAddress',
+ type: 'address',
+ },
+ {
+ name: 'makerAssetAmount',
+ type: 'uint256',
+ },
+ {
+ name: 'takerAssetAmount',
+ type: 'uint256',
+ },
+ {
+ name: 'makerFee',
+ type: 'uint256',
+ },
+ {
+ name: 'takerFee',
+ type: 'uint256',
+ },
+ {
+ name: 'expirationTimeSeconds',
+ type: 'uint256',
+ },
+ {
+ name: 'salt',
+ type: 'uint256',
+ },
+ {
+ name: 'makerAssetData',
+ type: 'bytes',
+ },
+ {
+ name: 'takerAssetData',
+ type: 'bytes',
+ },
+ {
+ name: 'makerFeeAssetData',
+ type: 'bytes',
+ },
+ {
+ name: 'takerFeeAssetData',
+ type: 'bytes',
+ },
+ ]
+ },
+ {
+ name: 'orderSignatures',
+ type: 'bytes[]',
+ },
+ ],
+ name: 'getOrderFillableTakerAssetAmounts',
+ outputs: [
+ {
+ name: 'orderFillableTakerAssetAmounts',
+ type: 'uint256[]',
+ },
+ ],
+ payable: false,
+ stateMutability: 'view',
+ type: 'function',
+ },
+ {
+ constant: true,
+ inputs: [
+ {
+ name: 'takerToken',
+ type: 'address',
+ },
+ {
+ name: 'makerToken',
+ type: 'address',
+ },
+ {
+ name: 'makerTokenAmounts',
+ type: 'uint256[]',
+ },
+ ],
+ name: 'sampleBuysFromEth2Dai',
+ outputs: [
+ {
+ name: 'takerTokenAmounts',
+ type: 'uint256[]',
+ },
+ ],
+ payable: false,
+ stateMutability: 'view',
+ type: 'function',
+ },
+ {
+ constant: true,
+ inputs: [
+ {
+ name: 'registryAddress',
+ type: 'address',
+ },
+ {
+ name: 'takerToken',
+ type: 'address',
+ },
+ {
+ name: 'makerToken',
+ type: 'address',
+ },
+ {
+ name: 'makerTokenAmounts',
+ type: 'uint256[]',
+ },
+ ],
+ name: 'sampleBuysFromLiquidityProviderRegistry',
+ outputs: [
+ {
+ name: 'takerTokenAmounts',
+ type: 'uint256[]',
+ },
+ ],
+ payable: false,
+ stateMutability: 'view',
+ type: 'function',
+ },
+ {
+ constant: true,
+ inputs: [
+ {
+ name: 'takerToken',
+ type: 'address',
+ },
+ {
+ name: 'makerToken',
+ type: 'address',
+ },
+ {
+ name: 'makerTokenAmounts',
+ type: 'uint256[]',
+ },
+ ],
+ name: 'sampleBuysFromUniswap',
+ outputs: [
+ {
+ name: 'takerTokenAmounts',
+ type: 'uint256[]',
+ },
+ ],
+ payable: false,
+ stateMutability: 'view',
+ type: 'function',
+ },
+ {
+ constant: true,
+ inputs: [
+ {
+ name: 'curveAddress',
+ type: 'address',
+ },
+ {
+ name: 'fromTokenIdx',
+ type: 'int128',
+ },
+ {
+ name: 'toTokenIdx',
+ type: 'int128',
+ },
+ {
+ name: 'takerTokenAmounts',
+ type: 'uint256[]',
+ },
+ ],
+ name: 'sampleSellsFromCurve',
+ outputs: [
+ {
+ name: 'makerTokenAmounts',
+ type: 'uint256[]',
+ },
+ ],
+ payable: false,
+ stateMutability: 'view',
+ type: 'function',
+ },
+ {
+ constant: true,
+ inputs: [
+ {
+ name: 'takerToken',
+ type: 'address',
+ },
+ {
+ name: 'makerToken',
+ type: 'address',
+ },
+ {
+ name: 'takerTokenAmounts',
+ type: 'uint256[]',
+ },
+ ],
+ name: 'sampleSellsFromEth2Dai',
+ outputs: [
+ {
+ name: 'makerTokenAmounts',
+ type: 'uint256[]',
+ },
+ ],
+ payable: false,
+ stateMutability: 'view',
+ type: 'function',
+ },
+ {
+ constant: true,
+ inputs: [
+ {
+ name: 'takerToken',
+ type: 'address',
+ },
+ {
+ name: 'makerToken',
+ type: 'address',
+ },
+ {
+ name: 'takerTokenAmounts',
+ type: 'uint256[]',
+ },
+ ],
+ name: 'sampleSellsFromKyberNetwork',
+ outputs: [
+ {
+ name: 'makerTokenAmounts',
+ type: 'uint256[]',
+ },
+ ],
+ payable: false,
+ stateMutability: 'view',
+ type: 'function',
+ },
+ {
+ constant: true,
+ inputs: [
+ {
+ name: 'registryAddress',
+ type: 'address',
+ },
+ {
+ name: 'takerToken',
+ type: 'address',
+ },
+ {
+ name: 'makerToken',
+ type: 'address',
+ },
+ {
+ name: 'takerTokenAmounts',
+ type: 'uint256[]',
+ },
+ ],
+ name: 'sampleSellsFromLiquidityProviderRegistry',
+ outputs: [
+ {
+ name: 'makerTokenAmounts',
+ type: 'uint256[]',
+ },
+ ],
+ payable: false,
+ stateMutability: 'view',
+ type: 'function',
+ },
+ {
+ constant: true,
+ inputs: [
+ {
+ name: 'takerToken',
+ type: 'address',
+ },
+ {
+ name: 'makerToken',
+ type: 'address',
+ },
+ {
+ name: 'takerTokenAmounts',
+ type: 'uint256[]',
+ },
+ ],
+ name: 'sampleSellsFromUniswap',
+ outputs: [
+ {
+ name: 'makerTokenAmounts',
+ type: 'uint256[]',
+ },
+ ],
+ payable: false,
+ stateMutability: 'view',
+ type: 'function',
+ },
+ ] as ContractAbi;
+ return abi;
+ }
+
+ protected static async _deployLibrariesAsync(
+ artifact: ContractArtifact,
+ libraryArtifacts: { [libraryName: string]: ContractArtifact },
+ web3Wrapper: Web3Wrapper,
+ txDefaults: Partial,
+ libraryAddresses: { [libraryName: string]: string } = {},
+ ): Promise<{ [libraryName: string]: string }> {
+ const links = artifact.compilerOutput.evm.bytecode.linkReferences;
+ // Go through all linked libraries, recursively deploying them if necessary.
+ for (const link of Object.values(links)) {
+ for (const libraryName of Object.keys(link)) {
+ if (!libraryAddresses[libraryName]) {
+ // Library not yet deployed.
+ const libraryArtifact = libraryArtifacts[libraryName];
+ if (!libraryArtifact) {
+ throw new Error(`Missing artifact for linked library "${libraryName}"`);
+ }
+ // Deploy any dependent libraries used by this library.
+ await ERC20BridgeSamplerContract._deployLibrariesAsync(
+ libraryArtifact,
+ libraryArtifacts,
+ web3Wrapper,
+ txDefaults,
+ libraryAddresses,
+ );
+ // Deploy this library.
+ const linkedLibraryBytecode = linkLibrariesInBytecode(
+ libraryArtifact,
+ libraryAddresses,
+ );
+ const txDataWithDefaults = await BaseContract._applyDefaultsToContractTxDataAsync(
+ {
+ data: linkedLibraryBytecode,
+ ...txDefaults,
+ },
+ web3Wrapper.estimateGasAsync.bind(web3Wrapper),
+ );
+ const txHash = await web3Wrapper.sendTransactionAsync(txDataWithDefaults);
+ logUtils.log(`transactionHash: ${txHash}`);
+ const { contractAddress } = await web3Wrapper.awaitTransactionSuccessAsync(txHash);
+ logUtils.log(`${libraryArtifact.contractName} successfully deployed at ${contractAddress}`);
+ libraryAddresses[libraryArtifact.contractName] = contractAddress as string;
+ }
+ }
+ }
+ return libraryAddresses;
+ }
+
+ public getFunctionSignature(methodName: string): string {
+ const index = this._methodABIIndex[methodName];
+ const methodAbi = ERC20BridgeSamplerContract.ABI()[index] as MethodAbi; // tslint:disable-line:no-unnecessary-type-assertion
+ const functionSignature = methodAbiToFunctionSignature(methodAbi);
+ return functionSignature;
+ }
+
+ public getABIDecodedTransactionData(methodName: string, callData: string): T {
+ const functionSignature = this.getFunctionSignature(methodName);
+ const self = (this as any) as ERC20BridgeSamplerContract;
+ const abiEncoder = self._lookupAbiEncoder(functionSignature);
+ const abiDecodedCallData = abiEncoder.strictDecode(callData);
+ return abiDecodedCallData;
+ }
+
+ public getABIDecodedReturnData(methodName: string, callData: string): T {
+ const functionSignature = this.getFunctionSignature(methodName);
+ const self = (this as any) as ERC20BridgeSamplerContract;
+ const abiEncoder = self._lookupAbiEncoder(functionSignature);
+ const abiDecodedCallData = abiEncoder.strictDecodeReturnValue(callData);
+ return abiDecodedCallData;
+ }
+
+ public getSelector(methodName: string): string {
+ const functionSignature = this.getFunctionSignature(methodName);
+ const self = (this as any) as ERC20BridgeSamplerContract;
+ const abiEncoder = self._lookupAbiEncoder(functionSignature);
+ return abiEncoder.getSelector();
+ }
+
+ /**
+ * Call multiple public functions on this contract in a single transaction.
+ * @param callDatas ABI-encoded call data for each function call.
+ * @returns callResults ABI-encoded results data for each call.
+ */
+ public batchCall(
+ callDatas: string[],
+ ): ContractFunctionObj {
+ const self = this as any as ERC20BridgeSamplerContract;
+ assert.isArray('callDatas', callDatas);
+ const functionSignature = 'batchCall(bytes[])';
+
+ return {
+ async callAsync(
+ callData: Partial = {},
+ defaultBlock?: BlockParam,
+ ): Promise {
+ BaseContract._assertCallParams(callData, defaultBlock);
+ const rawCallResult = await self._performCallAsync({ ...callData, data: this.getABIEncodedTransactionData() }, defaultBlock);
+ const abiEncoder = self._lookupAbiEncoder(functionSignature);
+ BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
+ return abiEncoder.strictDecodeReturnValue(rawCallResult);
+ },
+ getABIEncodedTransactionData(): string {
+ return self._strictEncodeArguments(functionSignature, [callDatas
+ ]);
+ },
+ }
+ };
+ /**
+ * 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.
+ * @param takerToken Taker asset managed by liquidity provider.
+ * @param makerToken Maker asset managed by liquidity provider.
+ * @returns providerAddress Address of the liquidity provider.
+ */
+ public getLiquidityProviderFromRegistry(
+ registryAddress: string,
+ takerToken: string,
+ makerToken: string,
+ ): ContractFunctionObj {
+ const self = this as any as ERC20BridgeSamplerContract;
+ assert.isString('registryAddress', registryAddress);
+ assert.isString('takerToken', takerToken);
+ assert.isString('makerToken', makerToken);
+ const functionSignature = 'getLiquidityProviderFromRegistry(address,address,address)';
+
+ return {
+ async callAsync(
+ callData: Partial = {},
+ defaultBlock?: BlockParam,
+ ): Promise {
+ BaseContract._assertCallParams(callData, defaultBlock);
+ const rawCallResult = await self._performCallAsync({ ...callData, data: this.getABIEncodedTransactionData() }, defaultBlock);
+ const abiEncoder = self._lookupAbiEncoder(functionSignature);
+ BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
+ return abiEncoder.strictDecodeReturnValue(rawCallResult);
+ },
+ getABIEncodedTransactionData(): string {
+ return self._strictEncodeArguments(functionSignature, [registryAddress.toLowerCase(),
+ takerToken.toLowerCase(),
+ makerToken.toLowerCase()
+ ]);
+ },
+ }
+ };
+ /**
+ * Queries the fillable taker asset amounts of native orders.
+ * Effectively ignores orders that have empty signatures or
+ * @param orders Native orders to query.
+ * @param orderSignatures Signatures for each respective order in `orders`.
+ * @returns orderFillableMakerAssetAmounts How much maker asset can be filled by each order in `orders`.
+ */
+ public getOrderFillableMakerAssetAmounts(
+ orders: Array<{makerAddress: string;takerAddress: string;feeRecipientAddress: string;senderAddress: string;makerAssetAmount: BigNumber;takerAssetAmount: BigNumber;makerFee: BigNumber;takerFee: BigNumber;expirationTimeSeconds: BigNumber;salt: BigNumber;makerAssetData: string;takerAssetData: string;makerFeeAssetData: string;takerFeeAssetData: string}>,
+ orderSignatures: string[],
+ ): ContractFunctionObj {
+ const self = this as any as ERC20BridgeSamplerContract;
+ assert.isArray('orders', orders);
+ assert.isArray('orderSignatures', orderSignatures);
+ const functionSignature = 'getOrderFillableMakerAssetAmounts((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[])';
+
+ return {
+ async callAsync(
+ callData: Partial = {},
+ defaultBlock?: BlockParam,
+ ): Promise {
+ BaseContract._assertCallParams(callData, defaultBlock);
+ const rawCallResult = await self._performCallAsync({ ...callData, data: this.getABIEncodedTransactionData() }, defaultBlock);
+ const abiEncoder = self._lookupAbiEncoder(functionSignature);
+ BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
+ return abiEncoder.strictDecodeReturnValue(rawCallResult);
+ },
+ getABIEncodedTransactionData(): string {
+ return self._strictEncodeArguments(functionSignature, [orders,
+ orderSignatures
+ ]);
+ },
+ }
+ };
+ /**
+ * Queries the fillable taker asset amounts of native orders.
+ * Effectively ignores orders that have empty signatures or
+ * maker/taker asset amounts (returning 0).
+ * @param orders Native orders to query.
+ * @param orderSignatures Signatures for each respective order in `orders`.
+ * @returns orderFillableTakerAssetAmounts How much taker asset can be filled by each order in `orders`.
+ */
+ public getOrderFillableTakerAssetAmounts(
+ orders: Array<{makerAddress: string;takerAddress: string;feeRecipientAddress: string;senderAddress: string;makerAssetAmount: BigNumber;takerAssetAmount: BigNumber;makerFee: BigNumber;takerFee: BigNumber;expirationTimeSeconds: BigNumber;salt: BigNumber;makerAssetData: string;takerAssetData: string;makerFeeAssetData: string;takerFeeAssetData: string}>,
+ orderSignatures: string[],
+ ): ContractFunctionObj {
+ const self = this as any as ERC20BridgeSamplerContract;
+ assert.isArray('orders', orders);
+ assert.isArray('orderSignatures', orderSignatures);
+ const functionSignature = 'getOrderFillableTakerAssetAmounts((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[])';
+
+ return {
+ async callAsync(
+ callData: Partial = {},
+ defaultBlock?: BlockParam,
+ ): Promise {
+ BaseContract._assertCallParams(callData, defaultBlock);
+ const rawCallResult = await self._performCallAsync({ ...callData, data: this.getABIEncodedTransactionData() }, defaultBlock);
+ const abiEncoder = self._lookupAbiEncoder(functionSignature);
+ BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
+ return abiEncoder.strictDecodeReturnValue(rawCallResult);
+ },
+ getABIEncodedTransactionData(): string {
+ return self._strictEncodeArguments(functionSignature, [orders,
+ orderSignatures
+ ]);
+ },
+ }
+ };
+ /**
+ * Sample buy quotes from Eth2Dai/Oasis.
+ * @param takerToken Address of the taker token (what to sell).
+ * @param makerToken Address of the maker token (what to buy).
+ * @returns takerTokenAmounts Taker amounts sold at each maker token amount.
+ */
+ public sampleBuysFromEth2Dai(
+ takerToken: string,
+ makerToken: string,
+ makerTokenAmounts: BigNumber[],
+ ): ContractFunctionObj {
+ const self = this as any as ERC20BridgeSamplerContract;
+ assert.isString('takerToken', takerToken);
+ assert.isString('makerToken', makerToken);
+ assert.isArray('makerTokenAmounts', makerTokenAmounts);
+ const functionSignature = 'sampleBuysFromEth2Dai(address,address,uint256[])';
+
+ return {
+ async callAsync(
+ callData: Partial = {},
+ defaultBlock?: BlockParam,
+ ): Promise {
+ BaseContract._assertCallParams(callData, defaultBlock);
+ const rawCallResult = await self._performCallAsync({ ...callData, data: this.getABIEncodedTransactionData() }, defaultBlock);
+ const abiEncoder = self._lookupAbiEncoder(functionSignature);
+ BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
+ return abiEncoder.strictDecodeReturnValue(rawCallResult);
+ },
+ getABIEncodedTransactionData(): string {
+ return self._strictEncodeArguments(functionSignature, [takerToken.toLowerCase(),
+ makerToken.toLowerCase(),
+ makerTokenAmounts
+ ]);
+ },
+ }
+ };
+ /**
+ * Sample buy quotes from an arbitrary on-chain liquidity provider.
+ * @param registryAddress Address of the liquidity provider registry contract.
+ * @param takerToken Address of the taker token (what to sell).
+ * @param makerToken Address of the maker token (what to buy).
+ * @param makerTokenAmounts Maker token buy amount for each sample.
+ * @returns takerTokenAmounts Taker amounts sold at each maker token amount.
+ */
+ public sampleBuysFromLiquidityProviderRegistry(
+ registryAddress: string,
+ takerToken: string,
+ makerToken: string,
+ makerTokenAmounts: BigNumber[],
+ ): ContractFunctionObj {
+ const self = this as any as ERC20BridgeSamplerContract;
+ assert.isString('registryAddress', registryAddress);
+ assert.isString('takerToken', takerToken);
+ assert.isString('makerToken', makerToken);
+ assert.isArray('makerTokenAmounts', makerTokenAmounts);
+ const functionSignature = 'sampleBuysFromLiquidityProviderRegistry(address,address,address,uint256[])';
+
+ return {
+ async callAsync(
+ callData: Partial = {},
+ defaultBlock?: BlockParam,
+ ): Promise {
+ BaseContract._assertCallParams(callData, defaultBlock);
+ const rawCallResult = await self._performCallAsync({ ...callData, data: this.getABIEncodedTransactionData() }, defaultBlock);
+ const abiEncoder = self._lookupAbiEncoder(functionSignature);
+ BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
+ return abiEncoder.strictDecodeReturnValue(rawCallResult);
+ },
+ getABIEncodedTransactionData(): string {
+ return self._strictEncodeArguments(functionSignature, [registryAddress.toLowerCase(),
+ takerToken.toLowerCase(),
+ makerToken.toLowerCase(),
+ makerTokenAmounts
+ ]);
+ },
+ }
+ };
+ /**
+ * Sample buy quotes from Uniswap.
+ * @param takerToken Address of the taker token (what to sell).
+ * @param makerToken Address of the maker token (what to buy).
+ * @param makerTokenAmounts Maker token sell amount for each sample.
+ * @returns takerTokenAmounts Taker amounts sold at each maker token amount.
+ */
+ public sampleBuysFromUniswap(
+ takerToken: string,
+ makerToken: string,
+ makerTokenAmounts: BigNumber[],
+ ): ContractFunctionObj {
+ const self = this as any as ERC20BridgeSamplerContract;
+ assert.isString('takerToken', takerToken);
+ assert.isString('makerToken', makerToken);
+ assert.isArray('makerTokenAmounts', makerTokenAmounts);
+ const functionSignature = 'sampleBuysFromUniswap(address,address,uint256[])';
+
+ return {
+ async callAsync(
+ callData: Partial = {},
+ defaultBlock?: BlockParam,
+ ): Promise {
+ BaseContract._assertCallParams(callData, defaultBlock);
+ const rawCallResult = await self._performCallAsync({ ...callData, data: this.getABIEncodedTransactionData() }, defaultBlock);
+ const abiEncoder = self._lookupAbiEncoder(functionSignature);
+ BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
+ return abiEncoder.strictDecodeReturnValue(rawCallResult);
+ },
+ getABIEncodedTransactionData(): string {
+ return self._strictEncodeArguments(functionSignature, [takerToken.toLowerCase(),
+ makerToken.toLowerCase(),
+ makerTokenAmounts
+ ]);
+ },
+ }
+ };
+ /**
+ * Sample sell quotes from Curve.
+ * @param curveAddress Address of the Curve contract.
+ * @param fromTokenIdx Index of the taker token (what to sell).
+ * @param toTokenIdx Index of the maker token (what to buy).
+ * @param takerTokenAmounts Taker token sell amount for each sample.
+ * @returns makerTokenAmounts Maker amounts bought at each taker token amount.
+ */
+ public sampleSellsFromCurve(
+ curveAddress: string,
+ fromTokenIdx: BigNumber,
+ toTokenIdx: BigNumber,
+ takerTokenAmounts: BigNumber[],
+ ): ContractFunctionObj {
+ const self = this as any as ERC20BridgeSamplerContract;
+ assert.isString('curveAddress', curveAddress);
+ assert.isBigNumber('fromTokenIdx', fromTokenIdx);
+ assert.isBigNumber('toTokenIdx', toTokenIdx);
+ assert.isArray('takerTokenAmounts', takerTokenAmounts);
+ const functionSignature = 'sampleSellsFromCurve(address,int128,int128,uint256[])';
+
+ return {
+ async callAsync(
+ callData: Partial = {},
+ defaultBlock?: BlockParam,
+ ): Promise {
+ BaseContract._assertCallParams(callData, defaultBlock);
+ const rawCallResult = await self._performCallAsync({ ...callData, data: this.getABIEncodedTransactionData() }, defaultBlock);
+ const abiEncoder = self._lookupAbiEncoder(functionSignature);
+ BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
+ return abiEncoder.strictDecodeReturnValue(rawCallResult);
+ },
+ getABIEncodedTransactionData(): string {
+ return self._strictEncodeArguments(functionSignature, [curveAddress.toLowerCase(),
+ fromTokenIdx,
+ toTokenIdx,
+ takerTokenAmounts
+ ]);
+ },
+ }
+ };
+ /**
+ * Sample sell quotes from Eth2Dai/Oasis.
+ * @param takerToken Address of the taker token (what to sell).
+ * @param makerToken Address of the maker token (what to buy).
+ * @param takerTokenAmounts Taker token sell amount for each sample.
+ * @returns makerTokenAmounts Maker amounts bought at each taker token amount.
+ */
+ public sampleSellsFromEth2Dai(
+ takerToken: string,
+ makerToken: string,
+ takerTokenAmounts: BigNumber[],
+ ): ContractFunctionObj {
+ const self = this as any as ERC20BridgeSamplerContract;
+ assert.isString('takerToken', takerToken);
+ assert.isString('makerToken', makerToken);
+ assert.isArray('takerTokenAmounts', takerTokenAmounts);
+ const functionSignature = 'sampleSellsFromEth2Dai(address,address,uint256[])';
+
+ return {
+ async callAsync(
+ callData: Partial = {},
+ defaultBlock?: BlockParam,
+ ): Promise {
+ BaseContract._assertCallParams(callData, defaultBlock);
+ const rawCallResult = await self._performCallAsync({ ...callData, data: this.getABIEncodedTransactionData() }, defaultBlock);
+ const abiEncoder = self._lookupAbiEncoder(functionSignature);
+ BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
+ return abiEncoder.strictDecodeReturnValue(rawCallResult);
+ },
+ getABIEncodedTransactionData(): string {
+ return self._strictEncodeArguments(functionSignature, [takerToken.toLowerCase(),
+ makerToken.toLowerCase(),
+ takerTokenAmounts
+ ]);
+ },
+ }
+ };
+ /**
+ * Sample sell quotes from Kyber.
+ * @param takerToken Address of the taker token (what to sell).
+ * @param makerToken Address of the maker token (what to buy).
+ * @param takerTokenAmounts Taker token sell amount for each sample.
+ * @returns makerTokenAmounts Maker amounts bought at each taker token amount.
+ */
+ public sampleSellsFromKyberNetwork(
+ takerToken: string,
+ makerToken: string,
+ takerTokenAmounts: BigNumber[],
+ ): ContractFunctionObj {
+ const self = this as any as ERC20BridgeSamplerContract;
+ assert.isString('takerToken', takerToken);
+ assert.isString('makerToken', makerToken);
+ assert.isArray('takerTokenAmounts', takerTokenAmounts);
+ const functionSignature = 'sampleSellsFromKyberNetwork(address,address,uint256[])';
+
+ return {
+ async callAsync(
+ callData: Partial = {},
+ defaultBlock?: BlockParam,
+ ): Promise {
+ BaseContract._assertCallParams(callData, defaultBlock);
+ const rawCallResult = await self._performCallAsync({ ...callData, data: this.getABIEncodedTransactionData() }, defaultBlock);
+ const abiEncoder = self._lookupAbiEncoder(functionSignature);
+ BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
+ return abiEncoder.strictDecodeReturnValue(rawCallResult);
+ },
+ getABIEncodedTransactionData(): string {
+ return self._strictEncodeArguments(functionSignature, [takerToken.toLowerCase(),
+ makerToken.toLowerCase(),
+ takerTokenAmounts
+ ]);
+ },
+ }
+ };
+ /**
+ * Sample sell quotes from an arbitrary on-chain liquidity provider.
+ * @param registryAddress Address of the liquidity provider registry contract.
+ * @param takerToken Address of the taker token (what to sell).
+ * @param makerToken Address of the maker token (what to buy).
+ * @param takerTokenAmounts Taker token sell amount for each sample.
+ * @returns makerTokenAmounts Maker amounts bought at each taker token amount.
+ */
+ public sampleSellsFromLiquidityProviderRegistry(
+ registryAddress: string,
+ takerToken: string,
+ makerToken: string,
+ takerTokenAmounts: BigNumber[],
+ ): ContractFunctionObj {
+ const self = this as any as ERC20BridgeSamplerContract;
+ assert.isString('registryAddress', registryAddress);
+ assert.isString('takerToken', takerToken);
+ assert.isString('makerToken', makerToken);
+ assert.isArray('takerTokenAmounts', takerTokenAmounts);
+ const functionSignature = 'sampleSellsFromLiquidityProviderRegistry(address,address,address,uint256[])';
+
+ return {
+ async callAsync(
+ callData: Partial = {},
+ defaultBlock?: BlockParam,
+ ): Promise {
+ BaseContract._assertCallParams(callData, defaultBlock);
+ const rawCallResult = await self._performCallAsync({ ...callData, data: this.getABIEncodedTransactionData() }, defaultBlock);
+ const abiEncoder = self._lookupAbiEncoder(functionSignature);
+ BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
+ return abiEncoder.strictDecodeReturnValue(rawCallResult);
+ },
+ getABIEncodedTransactionData(): string {
+ return self._strictEncodeArguments(functionSignature, [registryAddress.toLowerCase(),
+ takerToken.toLowerCase(),
+ makerToken.toLowerCase(),
+ takerTokenAmounts
+ ]);
+ },
+ }
+ };
+ /**
+ * Sample sell quotes from Uniswap.
+ * @param takerToken Address of the taker token (what to sell).
+ * @param makerToken Address of the maker token (what to buy).
+ * @param takerTokenAmounts Taker token sell amount for each sample.
+ * @returns makerTokenAmounts Maker amounts bought at each taker token amount.
+ */
+ public sampleSellsFromUniswap(
+ takerToken: string,
+ makerToken: string,
+ takerTokenAmounts: BigNumber[],
+ ): ContractFunctionObj {
+ const self = this as any as ERC20BridgeSamplerContract;
+ assert.isString('takerToken', takerToken);
+ assert.isString('makerToken', makerToken);
+ assert.isArray('takerTokenAmounts', takerTokenAmounts);
+ const functionSignature = 'sampleSellsFromUniswap(address,address,uint256[])';
+
+ return {
+ async callAsync(
+ callData: Partial = {},
+ defaultBlock?: BlockParam,
+ ): Promise {
+ BaseContract._assertCallParams(callData, defaultBlock);
+ const rawCallResult = await self._performCallAsync({ ...callData, data: this.getABIEncodedTransactionData() }, defaultBlock);
+ const abiEncoder = self._lookupAbiEncoder(functionSignature);
+ BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
+ return abiEncoder.strictDecodeReturnValue(rawCallResult);
+ },
+ getABIEncodedTransactionData(): string {
+ return self._strictEncodeArguments(functionSignature, [takerToken.toLowerCase(),
+ makerToken.toLowerCase(),
+ takerTokenAmounts
+ ]);
+ },
+ }
+ };
+
+
+
+ constructor(
+ address: string,
+ supportedProvider: SupportedProvider,
+ txDefaults?: Partial,
+ logDecodeDependencies?: { [contractName: string]: ContractAbi },
+ deployedBytecode: string | undefined = ERC20BridgeSamplerContract.deployedBytecode,
+ ) {
+ super('ERC20BridgeSampler', ERC20BridgeSamplerContract.ABI(), address, supportedProvider, txDefaults, logDecodeDependencies, deployedBytecode);
+ classUtils.bindAll(this, ['_abiEncoderByFunctionSignature', 'address', '_web3Wrapper']);
+ERC20BridgeSamplerContract.ABI().forEach((item, index) => {
+ if (item.type === 'function') {
+ const methodAbi = item as MethodAbi;
+ this._methodABIIndex[methodAbi.name] = index;
+ }
+ });
+ }
+}
+
+// tslint:disable:max-file-line-count
+// tslint:enable:no-unbound-method no-parameter-reassignment no-consecutive-blank-lines ordered-imports align
+// tslint:enable:trailing-comma whitespace no-trailing-whitespace
diff --git a/packages/contract-wrappers/src/generated-wrappers/i_erc20_bridge_sampler.ts b/packages/contract-wrappers/src/generated-wrappers/i_erc20_bridge_sampler.ts
index 2b68743e82..51b39a8f44 100644
--- a/packages/contract-wrappers/src/generated-wrappers/i_erc20_bridge_sampler.ts
+++ b/packages/contract-wrappers/src/generated-wrappers/i_erc20_bridge_sampler.ts
@@ -33,6 +33,8 @@ import { assert } from '@0x/assert';
import * as ethers from 'ethers';
// tslint:enable:no-unused-variable
+
+
/* istanbul ignore next */
// tslint:disable:array-type
// tslint:disable:no-parameter-reassignment
@@ -41,14 +43,14 @@ export class IERC20BridgeSamplerContract extends BaseContract {
/**
* @ignore
*/
- public static deployedBytecode: string | undefined;
- public static contractName = 'IERC20BridgeSampler';
+public static deployedBytecode: string | undefined;
+public static contractName = 'IERC20BridgeSampler';
private readonly _methodABIIndex: { [name: string]: number } = {};
- public static async deployFrom0xArtifactAsync(
+public static async deployFrom0xArtifactAsync(
artifact: ContractArtifact | SimpleContractArtifact,
supportedProvider: SupportedProvider,
txDefaults: Partial,
- logDecodeDependencies: { [contractName: string]: ContractArtifact | SimpleContractArtifact },
+ logDecodeDependencies: { [contractName: string]: (ContractArtifact | SimpleContractArtifact) },
): Promise {
assert.doesConformToSchema('txDefaults', txDefaults, schemas.txDataSchema, [
schemas.addressSchema,
@@ -67,13 +69,7 @@ export class IERC20BridgeSamplerContract extends BaseContract {
logDecodeDependenciesAbiOnly[key] = logDecodeDependencies[key].compilerOutput.abi;
}
}
- return IERC20BridgeSamplerContract.deployAsync(
- bytecode,
- abi,
- provider,
- txDefaults,
- logDecodeDependenciesAbiOnly,
- );
+ return IERC20BridgeSamplerContract.deployAsync(bytecode, abi, provider, txDefaults, logDecodeDependenciesAbiOnly, );
}
public static async deployWithLibrariesFrom0xArtifactAsync(
@@ -81,7 +77,7 @@ export class IERC20BridgeSamplerContract extends BaseContract {
libraryArtifacts: { [libraryName: string]: ContractArtifact },
supportedProvider: SupportedProvider,
txDefaults: Partial,
- logDecodeDependencies: { [contractName: string]: ContractArtifact | SimpleContractArtifact },
+ logDecodeDependencies: { [contractName: string]: (ContractArtifact | SimpleContractArtifact) },
): Promise {
assert.doesConformToSchema('txDefaults', txDefaults, schemas.txDataSchema, [
schemas.addressSchema,
@@ -103,16 +99,13 @@ export class IERC20BridgeSamplerContract extends BaseContract {
artifact,
libraryArtifacts,
new Web3Wrapper(provider),
- txDefaults,
+ txDefaults
);
- const bytecode = linkLibrariesInBytecode(artifact, libraryAddresses);
- return IERC20BridgeSamplerContract.deployAsync(
- bytecode,
- abi,
- provider,
- txDefaults,
- logDecodeDependenciesAbiOnly,
+ const bytecode = linkLibrariesInBytecode(
+ artifact,
+ libraryAddresses,
);
+ return IERC20BridgeSamplerContract.deployAsync(bytecode, abi, provider, txDefaults, logDecodeDependenciesAbiOnly, );
}
public static async deployAsync(
@@ -130,7 +123,11 @@ export class IERC20BridgeSamplerContract extends BaseContract {
]);
const provider = providerUtils.standardizeOrThrow(supportedProvider);
const constructorAbi = BaseContract._lookupConstructorAbi(abi);
- [] = BaseContract._formatABIDataItemList(constructorAbi.inputs, [], BaseContract._bigNumberToString);
+ [] = BaseContract._formatABIDataItemList(
+ constructorAbi.inputs,
+ [],
+ BaseContract._bigNumberToString,
+ );
const iface = new ethers.utils.Interface(abi);
const deployInfo = iface.deployFunction;
const txData = deployInfo.encode(bytecode, []);
@@ -146,12 +143,7 @@ export class IERC20BridgeSamplerContract extends BaseContract {
logUtils.log(`transactionHash: ${txHash}`);
const txReceipt = await web3Wrapper.awaitTransactionSuccessAsync(txHash);
logUtils.log(`IERC20BridgeSampler successfully deployed at ${txReceipt.contractAddress}`);
- const contractInstance = new IERC20BridgeSamplerContract(
- txReceipt.contractAddress as string,
- provider,
- txDefaults,
- logDecodeDependencies,
- );
+ const contractInstance = new IERC20BridgeSamplerContract(txReceipt.contractAddress as string, provider, txDefaults, logDecodeDependencies);
contractInstance.constructorArgs = [];
return contractInstance;
}
@@ -161,7 +153,7 @@ export class IERC20BridgeSamplerContract extends BaseContract {
*/
public static ABI(): ContractAbi {
const abi = [
- {
+ {
constant: true,
inputs: [
{
@@ -180,7 +172,34 @@ export class IERC20BridgeSamplerContract extends BaseContract {
stateMutability: 'view',
type: 'function',
},
- {
+ {
+ constant: true,
+ inputs: [
+ {
+ name: 'registryAddress',
+ type: 'address',
+ },
+ {
+ name: 'takerToken',
+ type: 'address',
+ },
+ {
+ name: 'makerToken',
+ type: 'address',
+ },
+ ],
+ name: 'getLiquidityProviderFromRegistry',
+ outputs: [
+ {
+ name: 'providerAddress',
+ type: 'address',
+ },
+ ],
+ payable: false,
+ stateMutability: 'view',
+ type: 'function',
+ },
+ {
constant: true,
inputs: [
{
@@ -243,7 +262,7 @@ export class IERC20BridgeSamplerContract extends BaseContract {
name: 'takerFeeAssetData',
type: 'bytes',
},
- ],
+ ]
},
{
name: 'orderSignatures',
@@ -261,7 +280,7 @@ export class IERC20BridgeSamplerContract extends BaseContract {
stateMutability: 'view',
type: 'function',
},
- {
+ {
constant: true,
inputs: [
{
@@ -324,7 +343,7 @@ export class IERC20BridgeSamplerContract extends BaseContract {
name: 'takerFeeAssetData',
type: 'bytes',
},
- ],
+ ]
},
{
name: 'orderSignatures',
@@ -342,7 +361,7 @@ export class IERC20BridgeSamplerContract extends BaseContract {
stateMutability: 'view',
type: 'function',
},
- {
+ {
constant: true,
inputs: [
{
@@ -369,7 +388,38 @@ export class IERC20BridgeSamplerContract extends BaseContract {
stateMutability: 'view',
type: 'function',
},
- {
+ {
+ constant: true,
+ inputs: [
+ {
+ name: 'registryAddress',
+ type: 'address',
+ },
+ {
+ name: 'takerToken',
+ type: 'address',
+ },
+ {
+ name: 'makerToken',
+ type: 'address',
+ },
+ {
+ name: 'makerTokenAmounts',
+ type: 'uint256[]',
+ },
+ ],
+ name: 'sampleBuysFromLiquidityProviderRegistry',
+ outputs: [
+ {
+ name: 'takerTokenAmounts',
+ type: 'uint256[]',
+ },
+ ],
+ payable: false,
+ stateMutability: 'view',
+ type: 'function',
+ },
+ {
constant: true,
inputs: [
{
@@ -396,7 +446,7 @@ export class IERC20BridgeSamplerContract extends BaseContract {
stateMutability: 'view',
type: 'function',
},
- {
+ {
constant: true,
inputs: [
{
@@ -427,7 +477,7 @@ export class IERC20BridgeSamplerContract extends BaseContract {
stateMutability: 'view',
type: 'function',
},
- {
+ {
constant: true,
inputs: [
{
@@ -454,7 +504,7 @@ export class IERC20BridgeSamplerContract extends BaseContract {
stateMutability: 'view',
type: 'function',
},
- {
+ {
constant: true,
inputs: [
{
@@ -481,7 +531,38 @@ export class IERC20BridgeSamplerContract extends BaseContract {
stateMutability: 'view',
type: 'function',
},
- {
+ {
+ constant: true,
+ inputs: [
+ {
+ name: 'registryAddress',
+ type: 'address',
+ },
+ {
+ name: 'takerToken',
+ type: 'address',
+ },
+ {
+ name: 'makerToken',
+ type: 'address',
+ },
+ {
+ name: 'takerTokenAmounts',
+ type: 'uint256[]',
+ },
+ ],
+ name: 'sampleSellsFromLiquidityProviderRegistry',
+ outputs: [
+ {
+ name: 'makerTokenAmounts',
+ type: 'uint256[]',
+ },
+ ],
+ payable: false,
+ stateMutability: 'view',
+ type: 'function',
+ },
+ {
constant: true,
inputs: [
{
@@ -538,7 +619,10 @@ export class IERC20BridgeSamplerContract extends BaseContract {
libraryAddresses,
);
// Deploy this library.
- const linkedLibraryBytecode = linkLibrariesInBytecode(libraryArtifact, libraryAddresses);
+ const linkedLibraryBytecode = linkLibrariesInBytecode(
+ libraryArtifact,
+ libraryAddresses,
+ );
const txDataWithDefaults = await BaseContract._applyDefaultsToContractTxDataAsync(
{
data: linkedLibraryBytecode,
@@ -589,355 +673,482 @@ export class IERC20BridgeSamplerContract extends BaseContract {
/**
* Call multiple public functions on this contract in a single transaction.
- * @param callDatas ABI-encoded call data for each function call.
- * @returns callResults ABI-encoded results data for each call.
+ * @param callDatas ABI-encoded call data for each function call.
+ * @returns callResults ABI-encoded results data for each call.
*/
- public batchCall(callDatas: string[]): ContractFunctionObj {
- const self = (this as any) as IERC20BridgeSamplerContract;
- assert.isArray('callDatas', callDatas);
+ public batchCall(
+ callDatas: string[],
+ ): ContractFunctionObj {
+ const self = this as any as IERC20BridgeSamplerContract;
+ assert.isArray('callDatas', callDatas);
const functionSignature = 'batchCall(bytes[])';
return {
- async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise {
+ async callAsync(
+ callData: Partial = {},
+ defaultBlock?: BlockParam,
+ ): Promise {
BaseContract._assertCallParams(callData, defaultBlock);
- const rawCallResult = await self._performCallAsync(
- { ...callData, data: this.getABIEncodedTransactionData() },
- defaultBlock,
- );
+ const rawCallResult = await self._performCallAsync({ ...callData, data: this.getABIEncodedTransactionData() }, defaultBlock);
const abiEncoder = self._lookupAbiEncoder(functionSignature);
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
- return abiEncoder.strictDecodeReturnValue(rawCallResult);
+ return abiEncoder.strictDecodeReturnValue(rawCallResult);
},
getABIEncodedTransactionData(): string {
- return self._strictEncodeArguments(functionSignature, [callDatas]);
+ return self._strictEncodeArguments(functionSignature, [callDatas
+ ]);
},
- };
- }
+ }
+ };
+ /**
+ * 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.
+ * @param takerToken Taker asset managed by liquidity provider.
+ * @param makerToken Maker asset managed by liquidity provider.
+ * @returns providerAddress Address of the liquidity provider.
+ */
+ public getLiquidityProviderFromRegistry(
+ registryAddress: string,
+ takerToken: string,
+ makerToken: string,
+ ): ContractFunctionObj {
+ const self = this as any as IERC20BridgeSamplerContract;
+ assert.isString('registryAddress', registryAddress);
+ assert.isString('takerToken', takerToken);
+ assert.isString('makerToken', makerToken);
+ const functionSignature = 'getLiquidityProviderFromRegistry(address,address,address)';
+
+ return {
+ async callAsync(
+ callData: Partial = {},
+ defaultBlock?: BlockParam,
+ ): Promise {
+ BaseContract._assertCallParams(callData, defaultBlock);
+ const rawCallResult = await self._performCallAsync({ ...callData, data: this.getABIEncodedTransactionData() }, defaultBlock);
+ const abiEncoder = self._lookupAbiEncoder(functionSignature);
+ BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
+ return abiEncoder.strictDecodeReturnValue(rawCallResult);
+ },
+ getABIEncodedTransactionData(): string {
+ return self._strictEncodeArguments(functionSignature, [registryAddress.toLowerCase(),
+ takerToken.toLowerCase(),
+ makerToken.toLowerCase()
+ ]);
+ },
+ }
+ };
/**
* Queries the fillable maker asset amounts of native orders.
- * @param orders Native orders to query.
- * @param orderSignatures Signatures for each respective order in `orders`.
- * @returns orderFillableMakerAssetAmounts How much maker asset can be filled by each order in `orders`.
+ * @param orders Native orders to query.
+ * @param orderSignatures Signatures for each respective order in `orders`.
+ * @returns orderFillableMakerAssetAmounts How much maker asset can be filled by each order in `orders`.
*/
public getOrderFillableMakerAssetAmounts(
- orders: Array<{
- makerAddress: string;
- takerAddress: string;
- feeRecipientAddress: string;
- senderAddress: string;
- makerAssetAmount: BigNumber;
- takerAssetAmount: BigNumber;
- makerFee: BigNumber;
- takerFee: BigNumber;
- expirationTimeSeconds: BigNumber;
- salt: BigNumber;
- makerAssetData: string;
- takerAssetData: string;
- makerFeeAssetData: string;
- takerFeeAssetData: string;
- }>,
- orderSignatures: string[],
- ): ContractFunctionObj {
- const self = (this as any) as IERC20BridgeSamplerContract;
- assert.isArray('orders', orders);
- assert.isArray('orderSignatures', orderSignatures);
- const functionSignature =
- 'getOrderFillableMakerAssetAmounts((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[])';
+ orders: Array<{makerAddress: string;takerAddress: string;feeRecipientAddress: string;senderAddress: string;makerAssetAmount: BigNumber;takerAssetAmount: BigNumber;makerFee: BigNumber;takerFee: BigNumber;expirationTimeSeconds: BigNumber;salt: BigNumber;makerAssetData: string;takerAssetData: string;makerFeeAssetData: string;takerFeeAssetData: string}>,
+ orderSignatures: string[],
+ ): ContractFunctionObj {
+ const self = this as any as IERC20BridgeSamplerContract;
+ assert.isArray('orders', orders);
+ assert.isArray('orderSignatures', orderSignatures);
+ const functionSignature = 'getOrderFillableMakerAssetAmounts((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[])';
return {
- async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise {
+ async callAsync(
+ callData: Partial = {},
+ defaultBlock?: BlockParam,
+ ): Promise {
BaseContract._assertCallParams(callData, defaultBlock);
- const rawCallResult = await self._performCallAsync(
- { ...callData, data: this.getABIEncodedTransactionData() },
- defaultBlock,
- );
+ const rawCallResult = await self._performCallAsync({ ...callData, data: this.getABIEncodedTransactionData() }, defaultBlock);
const abiEncoder = self._lookupAbiEncoder(functionSignature);
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
- return abiEncoder.strictDecodeReturnValue(rawCallResult);
+ return abiEncoder.strictDecodeReturnValue(rawCallResult);
},
getABIEncodedTransactionData(): string {
- return self._strictEncodeArguments(functionSignature, [orders, orderSignatures]);
+ return self._strictEncodeArguments(functionSignature, [orders,
+ orderSignatures
+ ]);
},
- };
- }
+ }
+ };
/**
* Queries the fillable taker asset amounts of native orders.
- * @param orders Native orders to query.
- * @param orderSignatures Signatures for each respective order in `orders`.
- * @returns orderFillableTakerAssetAmounts How much taker asset can be filled by each order in `orders`.
+ * @param orders Native orders to query.
+ * @param orderSignatures Signatures for each respective order in `orders`.
+ * @returns orderFillableTakerAssetAmounts How much taker asset can be filled by each order in `orders`.
*/
public getOrderFillableTakerAssetAmounts(
- orders: Array<{
- makerAddress: string;
- takerAddress: string;
- feeRecipientAddress: string;
- senderAddress: string;
- makerAssetAmount: BigNumber;
- takerAssetAmount: BigNumber;
- makerFee: BigNumber;
- takerFee: BigNumber;
- expirationTimeSeconds: BigNumber;
- salt: BigNumber;
- makerAssetData: string;
- takerAssetData: string;
- makerFeeAssetData: string;
- takerFeeAssetData: string;
- }>,
- orderSignatures: string[],
- ): ContractFunctionObj {
- const self = (this as any) as IERC20BridgeSamplerContract;
- assert.isArray('orders', orders);
- assert.isArray('orderSignatures', orderSignatures);
- const functionSignature =
- 'getOrderFillableTakerAssetAmounts((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[])';
+ orders: Array<{makerAddress: string;takerAddress: string;feeRecipientAddress: string;senderAddress: string;makerAssetAmount: BigNumber;takerAssetAmount: BigNumber;makerFee: BigNumber;takerFee: BigNumber;expirationTimeSeconds: BigNumber;salt: BigNumber;makerAssetData: string;takerAssetData: string;makerFeeAssetData: string;takerFeeAssetData: string}>,
+ orderSignatures: string[],
+ ): ContractFunctionObj {
+ const self = this as any as IERC20BridgeSamplerContract;
+ assert.isArray('orders', orders);
+ assert.isArray('orderSignatures', orderSignatures);
+ const functionSignature = 'getOrderFillableTakerAssetAmounts((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[])';
return {
- async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise {
+ async callAsync(
+ callData: Partial = {},
+ defaultBlock?: BlockParam,
+ ): Promise {
BaseContract._assertCallParams(callData, defaultBlock);
- const rawCallResult = await self._performCallAsync(
- { ...callData, data: this.getABIEncodedTransactionData() },
- defaultBlock,
- );
+ const rawCallResult = await self._performCallAsync({ ...callData, data: this.getABIEncodedTransactionData() }, defaultBlock);
const abiEncoder = self._lookupAbiEncoder(functionSignature);
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
- return abiEncoder.strictDecodeReturnValue(rawCallResult);
+ return abiEncoder.strictDecodeReturnValue(rawCallResult);
},
getABIEncodedTransactionData(): string {
- return self._strictEncodeArguments(functionSignature, [orders, orderSignatures]);
+ return self._strictEncodeArguments(functionSignature, [orders,
+ orderSignatures
+ ]);
},
- };
- }
+ }
+ };
/**
* Sample buy quotes from Eth2Dai/Oasis.
- * @param takerToken Address of the taker token (what to sell).
- * @param makerToken Address of the maker token (what to buy).
- * @returns takerTokenAmounts Taker amounts sold at each maker token amount.
+ * @param takerToken Address of the taker token (what to sell).
+ * @param makerToken Address of the maker token (what to buy).
+ * @returns takerTokenAmounts Taker amounts sold at each maker token amount.
*/
public sampleBuysFromEth2Dai(
- takerToken: string,
- makerToken: string,
- makerTokenAmounts: BigNumber[],
- ): ContractFunctionObj {
- const self = (this as any) as IERC20BridgeSamplerContract;
- assert.isString('takerToken', takerToken);
- assert.isString('makerToken', makerToken);
- assert.isArray('makerTokenAmounts', makerTokenAmounts);
+ takerToken: string,
+ makerToken: string,
+ makerTokenAmounts: BigNumber[],
+ ): ContractFunctionObj {
+ const self = this as any as IERC20BridgeSamplerContract;
+ assert.isString('takerToken', takerToken);
+ assert.isString('makerToken', makerToken);
+ assert.isArray('makerTokenAmounts', makerTokenAmounts);
const functionSignature = 'sampleBuysFromEth2Dai(address,address,uint256[])';
return {
- async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise {
+ async callAsync(
+ callData: Partial = {},
+ defaultBlock?: BlockParam,
+ ): Promise {
BaseContract._assertCallParams(callData, defaultBlock);
- const rawCallResult = await self._performCallAsync(
- { ...callData, data: this.getABIEncodedTransactionData() },
- defaultBlock,
- );
+ const rawCallResult = await self._performCallAsync({ ...callData, data: this.getABIEncodedTransactionData() }, defaultBlock);
const abiEncoder = self._lookupAbiEncoder(functionSignature);
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
- return abiEncoder.strictDecodeReturnValue(rawCallResult);
+ return abiEncoder.strictDecodeReturnValue(rawCallResult);
},
getABIEncodedTransactionData(): string {
- return self._strictEncodeArguments(functionSignature, [
- takerToken.toLowerCase(),
- makerToken.toLowerCase(),
- makerTokenAmounts,
- ]);
+ return self._strictEncodeArguments(functionSignature, [takerToken.toLowerCase(),
+ makerToken.toLowerCase(),
+ makerTokenAmounts
+ ]);
},
- };
- }
+ }
+ };
+ /**
+ * Sample buy quotes from an arbitrary on-chain liquidity provider.
+ * @param registryAddress Address of the liquidity provider registry contract.
+ * @param takerToken Address of the taker token (what to sell).
+ * @param makerToken Address of the maker token (what to buy).
+ * @param makerTokenAmounts Maker token buy amount for each sample.
+ * @returns takerTokenAmounts Taker amounts sold at each maker token amount.
+ */
+ public sampleBuysFromLiquidityProviderRegistry(
+ registryAddress: string,
+ takerToken: string,
+ makerToken: string,
+ makerTokenAmounts: BigNumber[],
+ ): ContractFunctionObj {
+ const self = this as any as IERC20BridgeSamplerContract;
+ assert.isString('registryAddress', registryAddress);
+ assert.isString('takerToken', takerToken);
+ assert.isString('makerToken', makerToken);
+ assert.isArray('makerTokenAmounts', makerTokenAmounts);
+ const functionSignature = 'sampleBuysFromLiquidityProviderRegistry(address,address,address,uint256[])';
+
+ return {
+ async callAsync(
+ callData: Partial = {},
+ defaultBlock?: BlockParam,
+ ): Promise {
+ BaseContract._assertCallParams(callData, defaultBlock);
+ const rawCallResult = await self._performCallAsync({ ...callData, data: this.getABIEncodedTransactionData() }, defaultBlock);
+ const abiEncoder = self._lookupAbiEncoder(functionSignature);
+ BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
+ return abiEncoder.strictDecodeReturnValue(rawCallResult);
+ },
+ getABIEncodedTransactionData(): string {
+ return self._strictEncodeArguments(functionSignature, [registryAddress.toLowerCase(),
+ takerToken.toLowerCase(),
+ makerToken.toLowerCase(),
+ makerTokenAmounts
+ ]);
+ },
+ }
+ };
/**
* Sample buy quotes from Uniswap.
- * @param takerToken Address of the taker token (what to sell).
- * @param makerToken Address of the maker token (what to buy).
- * @param makerTokenAmounts Maker token sell amount for each sample.
- * @returns takerTokenAmounts Taker amounts sold at each maker token amount.
+ * @param takerToken Address of the taker token (what to sell).
+ * @param makerToken Address of the maker token (what to buy).
+ * @param makerTokenAmounts Maker token sell amount for each sample.
+ * @returns takerTokenAmounts Taker amounts sold at each maker token amount.
*/
public sampleBuysFromUniswap(
- takerToken: string,
- makerToken: string,
- makerTokenAmounts: BigNumber[],
- ): ContractFunctionObj {
- const self = (this as any) as IERC20BridgeSamplerContract;
- assert.isString('takerToken', takerToken);
- assert.isString('makerToken', makerToken);
- assert.isArray('makerTokenAmounts', makerTokenAmounts);
+ takerToken: string,
+ makerToken: string,
+ makerTokenAmounts: BigNumber[],
+ ): ContractFunctionObj {
+ const self = this as any as IERC20BridgeSamplerContract;
+ assert.isString('takerToken', takerToken);
+ assert.isString('makerToken', makerToken);
+ assert.isArray('makerTokenAmounts', makerTokenAmounts);
const functionSignature = 'sampleBuysFromUniswap(address,address,uint256[])';
return {
- async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise {
+ async callAsync(
+ callData: Partial = {},
+ defaultBlock?: BlockParam,
+ ): Promise {
BaseContract._assertCallParams(callData, defaultBlock);
- const rawCallResult = await self._performCallAsync(
- { ...callData, data: this.getABIEncodedTransactionData() },
- defaultBlock,
- );
+ const rawCallResult = await self._performCallAsync({ ...callData, data: this.getABIEncodedTransactionData() }, defaultBlock);
const abiEncoder = self._lookupAbiEncoder(functionSignature);
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
- return abiEncoder.strictDecodeReturnValue(rawCallResult);
+ return abiEncoder.strictDecodeReturnValue(rawCallResult);
},
getABIEncodedTransactionData(): string {
- return self._strictEncodeArguments(functionSignature, [
- takerToken.toLowerCase(),
- makerToken.toLowerCase(),
- makerTokenAmounts,
- ]);
+ return self._strictEncodeArguments(functionSignature, [takerToken.toLowerCase(),
+ makerToken.toLowerCase(),
+ makerTokenAmounts
+ ]);
},
- };
- }
+ }
+ };
/**
* Sample sell quotes from Curve.
- * @param curveAddress Address of the Curve contract.
- * @param fromTokenIdx Index of the taker token (what to sell).
- * @param toTokenIdx Index of the maker token (what to buy).
- * @param takerTokenAmounts Taker token sell amount for each sample.
- * @returns makerTokenAmounts Maker amounts bought at each taker token amount.
+ * @param curveAddress Address of the Curve contract.
+ * @param fromTokenIdx Index of the taker token (what to sell).
+ * @param toTokenIdx Index of the maker token (what to buy).
+ * @param takerTokenAmounts Taker token sell amount for each sample.
+ * @returns makerTokenAmounts Maker amounts bought at each taker token amount.
*/
public sampleSellsFromCurve(
- curveAddress: string,
- fromTokenIdx: BigNumber,
- toTokenIdx: BigNumber,
- takerTokenAmounts: BigNumber[],
- ): ContractFunctionObj {
- const self = (this as any) as IERC20BridgeSamplerContract;
- assert.isString('curveAddress', curveAddress);
- assert.isBigNumber('fromTokenIdx', fromTokenIdx);
- assert.isBigNumber('toTokenIdx', toTokenIdx);
- assert.isArray('takerTokenAmounts', takerTokenAmounts);
+ curveAddress: string,
+ fromTokenIdx: BigNumber,
+ toTokenIdx: BigNumber,
+ takerTokenAmounts: BigNumber[],
+ ): ContractFunctionObj {
+ const self = this as any as IERC20BridgeSamplerContract;
+ assert.isString('curveAddress', curveAddress);
+ assert.isBigNumber('fromTokenIdx', fromTokenIdx);
+ assert.isBigNumber('toTokenIdx', toTokenIdx);
+ assert.isArray('takerTokenAmounts', takerTokenAmounts);
const functionSignature = 'sampleSellsFromCurve(address,int128,int128,uint256[])';
return {
- async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise {
+ async callAsync(
+ callData: Partial = {},
+ defaultBlock?: BlockParam,
+ ): Promise {
BaseContract._assertCallParams(callData, defaultBlock);
- const rawCallResult = await self._performCallAsync(
- { ...callData, data: this.getABIEncodedTransactionData() },
- defaultBlock,
- );
+ const rawCallResult = await self._performCallAsync({ ...callData, data: this.getABIEncodedTransactionData() }, defaultBlock);
const abiEncoder = self._lookupAbiEncoder(functionSignature);
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
- return abiEncoder.strictDecodeReturnValue(rawCallResult);
+ return abiEncoder.strictDecodeReturnValue(rawCallResult);
},
getABIEncodedTransactionData(): string {
- return self._strictEncodeArguments(functionSignature, [
- curveAddress.toLowerCase(),
- fromTokenIdx,
- toTokenIdx,
- takerTokenAmounts,
- ]);
+ return self._strictEncodeArguments(functionSignature, [curveAddress.toLowerCase(),
+ fromTokenIdx,
+ toTokenIdx,
+ takerTokenAmounts
+ ]);
},
- };
- }
+ }
+ };
/**
* Sample sell quotes from Eth2Dai/Oasis.
- * @param takerToken Address of the taker token (what to sell).
- * @param makerToken Address of the maker token (what to buy).
- * @param takerTokenAmounts Taker token sell amount for each sample.
- * @returns makerTokenAmounts Maker amounts bought at each taker token amount.
+ * @param takerToken Address of the taker token (what to sell).
+ * @param makerToken Address of the maker token (what to buy).
+ * @param takerTokenAmounts Taker token sell amount for each sample.
+ * @returns makerTokenAmounts Maker amounts bought at each taker token amount.
*/
public sampleSellsFromEth2Dai(
- takerToken: string,
- makerToken: string,
- takerTokenAmounts: BigNumber[],
- ): ContractFunctionObj {
- const self = (this as any) as IERC20BridgeSamplerContract;
- assert.isString('takerToken', takerToken);
- assert.isString('makerToken', makerToken);
- assert.isArray('takerTokenAmounts', takerTokenAmounts);
+ takerToken: string,
+ makerToken: string,
+ takerTokenAmounts: BigNumber[],
+ ): ContractFunctionObj {
+ const self = this as any as IERC20BridgeSamplerContract;
+ assert.isString('takerToken', takerToken);
+ assert.isString('makerToken', makerToken);
+ assert.isArray('takerTokenAmounts', takerTokenAmounts);
const functionSignature = 'sampleSellsFromEth2Dai(address,address,uint256[])';
return {
- async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise {
+ async callAsync(
+ callData: Partial = {},
+ defaultBlock?: BlockParam,
+ ): Promise {
BaseContract._assertCallParams(callData, defaultBlock);
- const rawCallResult = await self._performCallAsync(
- { ...callData, data: this.getABIEncodedTransactionData() },
- defaultBlock,
- );
+ const rawCallResult = await self._performCallAsync({ ...callData, data: this.getABIEncodedTransactionData() }, defaultBlock);
const abiEncoder = self._lookupAbiEncoder(functionSignature);
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
- return abiEncoder.strictDecodeReturnValue(rawCallResult);
+ return abiEncoder.strictDecodeReturnValue(rawCallResult);
},
getABIEncodedTransactionData(): string {
- return self._strictEncodeArguments(functionSignature, [
- takerToken.toLowerCase(),
- makerToken.toLowerCase(),
- takerTokenAmounts,
- ]);
+ return self._strictEncodeArguments(functionSignature, [takerToken.toLowerCase(),
+ makerToken.toLowerCase(),
+ takerTokenAmounts
+ ]);
},
- };
- }
+ }
+ };
/**
* Sample sell quotes from Kyber.
- * @param takerToken Address of the taker token (what to sell).
- * @param makerToken Address of the maker token (what to buy).
- * @param takerTokenAmounts Taker token sell amount for each sample.
- * @returns makerTokenAmounts Maker amounts bought at each taker token amount.
+ * @param takerToken Address of the taker token (what to sell).
+ * @param makerToken Address of the maker token (what to buy).
+ * @param takerTokenAmounts Taker token sell amount for each sample.
+ * @returns makerTokenAmounts Maker amounts bought at each taker token amount.
*/
public sampleSellsFromKyberNetwork(
- takerToken: string,
- makerToken: string,
- takerTokenAmounts: BigNumber[],
- ): ContractFunctionObj {
- const self = (this as any) as IERC20BridgeSamplerContract;
- assert.isString('takerToken', takerToken);
- assert.isString('makerToken', makerToken);
- assert.isArray('takerTokenAmounts', takerTokenAmounts);
+ takerToken: string,
+ makerToken: string,
+ takerTokenAmounts: BigNumber[],
+ ): ContractFunctionObj {
+ const self = this as any as IERC20BridgeSamplerContract;
+ assert.isString('takerToken', takerToken);
+ assert.isString('makerToken', makerToken);
+ assert.isArray('takerTokenAmounts', takerTokenAmounts);
const functionSignature = 'sampleSellsFromKyberNetwork(address,address,uint256[])';
return {
- async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise {
+ async callAsync(
+ callData: Partial = {},
+ defaultBlock?: BlockParam,
+ ): Promise {
BaseContract._assertCallParams(callData, defaultBlock);
- const rawCallResult = await self._performCallAsync(
- { ...callData, data: this.getABIEncodedTransactionData() },
- defaultBlock,
- );
+ const rawCallResult = await self._performCallAsync({ ...callData, data: this.getABIEncodedTransactionData() }, defaultBlock);
const abiEncoder = self._lookupAbiEncoder(functionSignature);
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
- return abiEncoder.strictDecodeReturnValue(rawCallResult);
+ return abiEncoder.strictDecodeReturnValue(rawCallResult);
},
getABIEncodedTransactionData(): string {
- return self._strictEncodeArguments(functionSignature, [
- takerToken.toLowerCase(),
- makerToken.toLowerCase(),
- takerTokenAmounts,
- ]);
+ return self._strictEncodeArguments(functionSignature, [takerToken.toLowerCase(),
+ makerToken.toLowerCase(),
+ takerTokenAmounts
+ ]);
},
- };
- }
+ }
+ };
+ /**
+ * Sample sell quotes from an arbitrary on-chain liquidity provider.
+ * @param registryAddress Address of the liquidity provider registry contract.
+ * @param takerToken Address of the taker token (what to sell).
+ * @param makerToken Address of the maker token (what to buy).
+ * @param takerTokenAmounts Taker token sell amount for each sample.
+ * @returns makerTokenAmounts Maker amounts bought at each taker token amount.
+ */
+ public sampleSellsFromLiquidityProviderRegistry(
+ registryAddress: string,
+ takerToken: string,
+ makerToken: string,
+ takerTokenAmounts: BigNumber[],
+ ): ContractFunctionObj {
+ const self = this as any as IERC20BridgeSamplerContract;
+ assert.isString('registryAddress', registryAddress);
+ assert.isString('takerToken', takerToken);
+ assert.isString('makerToken', makerToken);
+ assert.isArray('takerTokenAmounts', takerTokenAmounts);
+ const functionSignature = 'sampleSellsFromLiquidityProviderRegistry(address,address,address,uint256[])';
+
+ return {
+ async callAsync(
+ callData: Partial = {},
+ defaultBlock?: BlockParam,
+ ): Promise {
+ BaseContract._assertCallParams(callData, defaultBlock);
+ const rawCallResult = await self._performCallAsync({ ...callData, data: this.getABIEncodedTransactionData() }, defaultBlock);
+ const abiEncoder = self._lookupAbiEncoder(functionSignature);
+ BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
+ return abiEncoder.strictDecodeReturnValue(rawCallResult);
+ },
+ getABIEncodedTransactionData(): string {
+ return self._strictEncodeArguments(functionSignature, [registryAddress.toLowerCase(),
+ takerToken.toLowerCase(),
+ makerToken.toLowerCase(),
+ takerTokenAmounts
+ ]);
+ },
+ }
+ };
/**
* Sample sell quotes from Uniswap.
- * @param takerToken Address of the taker token (what to sell).
- * @param makerToken Address of the maker token (what to buy).
- * @param takerTokenAmounts Taker token sell amount for each sample.
- * @returns makerTokenAmounts Maker amounts bought at each taker token amount.
+ * @param takerToken Address of the taker token (what to sell).
+ * @param makerToken Address of the maker token (what to buy).
+ * @param takerTokenAmounts Taker token sell amount for each sample.
+ * @returns makerTokenAmounts Maker amounts bought at each taker token amount.
*/
public sampleSellsFromUniswap(
- takerToken: string,
- makerToken: string,
- takerTokenAmounts: BigNumber[],
- ): ContractFunctionObj {
- const self = (this as any) as IERC20BridgeSamplerContract;
- assert.isString('takerToken', takerToken);
- assert.isString('makerToken', makerToken);
- assert.isArray('takerTokenAmounts', takerTokenAmounts);
+ takerToken: string,
+ makerToken: string,
+ takerTokenAmounts: BigNumber[],
+ ): ContractFunctionObj {
+ const self = this as any as IERC20BridgeSamplerContract;
+ assert.isString('takerToken', takerToken);
+ assert.isString('makerToken', makerToken);
+ assert.isArray('takerTokenAmounts', takerTokenAmounts);
const functionSignature = 'sampleSellsFromUniswap(address,address,uint256[])';
return {
- async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise {
+ async callAsync(
+ callData: Partial = {},
+ defaultBlock?: BlockParam,
+ ): Promise {
BaseContract._assertCallParams(callData, defaultBlock);
- const rawCallResult = await self._performCallAsync(
- { ...callData, data: this.getABIEncodedTransactionData() },
- defaultBlock,
- );
+ const rawCallResult = await self._performCallAsync({ ...callData, data: this.getABIEncodedTransactionData() }, defaultBlock);
const abiEncoder = self._lookupAbiEncoder(functionSignature);
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
- return abiEncoder.strictDecodeReturnValue(rawCallResult);
+ return abiEncoder.strictDecodeReturnValue(rawCallResult);
},
getABIEncodedTransactionData(): string {
- return self._strictEncodeArguments(functionSignature, [
- takerToken.toLowerCase(),
- makerToken.toLowerCase(),
- takerTokenAmounts,
- ]);
+ return self._strictEncodeArguments(functionSignature, [takerToken.toLowerCase(),
+ makerToken.toLowerCase(),
+ takerTokenAmounts
+ ]);
},
- };
- }
+ }
+ };
+
+
constructor(
address: string,
@@ -946,17 +1157,9 @@ export class IERC20BridgeSamplerContract extends BaseContract {
logDecodeDependencies?: { [contractName: string]: ContractAbi },
deployedBytecode: string | undefined = IERC20BridgeSamplerContract.deployedBytecode,
) {
- super(
- 'IERC20BridgeSampler',
- IERC20BridgeSamplerContract.ABI(),
- address,
- supportedProvider,
- txDefaults,
- logDecodeDependencies,
- deployedBytecode,
- );
+ super('IERC20BridgeSampler', IERC20BridgeSamplerContract.ABI(), address, supportedProvider, txDefaults, logDecodeDependencies, deployedBytecode);
classUtils.bindAll(this, ['_abiEncoderByFunctionSignature', 'address', '_web3Wrapper']);
- IERC20BridgeSamplerContract.ABI().forEach((item, index) => {
+IERC20BridgeSamplerContract.ABI().forEach((item, index) => {
if (item.type === 'function') {
const methodAbi = item as MethodAbi;
this._methodABIIndex[methodAbi.name] = index;
diff --git a/packages/contract-wrappers/src/index.ts b/packages/contract-wrappers/src/index.ts
index afe2195848..67d3679ac6 100644
--- a/packages/contract-wrappers/src/index.ts
+++ b/packages/contract-wrappers/src/index.ts
@@ -1,3 +1,7 @@
+export { DummyLiquidityProviderContract } from './generated-wrappers/dummy_liquidity_provider';
+export { DummyLiquidityProviderRegistryContract } from './generated-wrappers/dummy_liquidity_provider_registry';
+export { ERC20BridgeSamplerContract } from './generated-wrappers/erc20_bridge_sampler';
+
export { ContractAddresses } from '@0x/contract-addresses';
export { ContractWrappers } from './contract_wrappers';
@@ -156,4 +160,4 @@ export {
ContractFunctionObj,
ContractTxFunctionObj,
SubscriptionErrors,
-} from '@0x/base-contract';
+} from '@0x/base-contract';
\ No newline at end of file