{
  "id": "a9af78da887ea13f0964b0f3dc78d9e5",
  "_format": "hh-sol-build-info-1",
  "solcVersion": "0.6.10",
  "solcLongVersion": "0.6.10+commit.00c0fcaf",
  "input": {
    "language": "Solidity",
    "sources": {
      "contracts/protocol/integration/exchange/UniswapV2ExchangeAdapterV2.sol": {
        "content": "/*\n    Copyright 2021 Set Labs Inc.\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    SPDX-License-Identifier: Apache License, Version 2.0\n*/\n\npragma solidity 0.6.10;\npragma experimental \"ABIEncoderV2\";\n\n/**\n * @title UniswapV2ExchangeAdapterV2\n * @author Set Protocol\n *\n * A Uniswap Router02 exchange adapter that returns calldata for trading. Includes option for 2 different trade types on Uniswap.\n *\n * CHANGE LOG:\n * - Add helper that encodes path and boolean into bytes\n * - Generalized ability to choose whether to swap an exact amount of source token for a min amount of receive token or swap a max amount of source token for\n * an exact amount of receive token\n * - Add helper to generate data parameter for `getTradeCallData`\n *\n */\ncontract UniswapV2ExchangeAdapterV2 {\n\n    /* ============ State Variables ============ */\n\n    // Address of Uniswap V2 Router02 contract\n    address public immutable router;\n    // Uniswap router function string for swapping exact tokens for a minimum of receive tokens\n    string internal constant SWAP_EXACT_TOKENS_FOR_TOKENS = \"swapExactTokensForTokens(uint256,uint256,address[],address,uint256)\";\n    // Uniswap router function string for swapping tokens for an exact amount of receive tokens\n    string internal constant SWAP_TOKENS_FOR_EXACT_TOKENS = \"swapTokensForExactTokens(uint256,uint256,address[],address,uint256)\";\n\n    /* ============ Constructor ============ */\n\n    /**\n     * Set state variables\n     *\n     * @param _router       Address of Uniswap V2 Router02 contract\n     */\n    constructor(address _router) public {\n        router = _router;\n    }\n\n    /* ============ External Getter Functions ============ */\n\n    /**\n     * Return calldata for Uniswap V2 Router02. Trade paths and bool to select trade function are encoded in the arbitrary data parameter.\n     *\n     * Note: When selecting the swap for exact tokens function, _sourceQuantity is defined as the max token quantity you are willing to trade, and\n     * _minDestinationQuantity is the exact quantity of token you are receiving.\n     *\n     * @param  _destinationAddress       Address that assets should be transferred to\n     * @param  _sourceQuantity           Fixed/Max amount of source token to sell\n     * @param  _destinationQuantity      Min/Fixed amount of destination token to buy\n     * @param  _data                     Arbitrary bytes containing trade path and bool to determine function string\n     *\n     * @return address                   Target contract address\n     * @return uint256                   Call value\n     * @return bytes                     Trade calldata\n     */\n    function getTradeCalldata(\n        address /* _sourceToken */,\n        address /* _destinationToken */,\n        address _destinationAddress,\n        uint256 _sourceQuantity,\n        uint256 _destinationQuantity,\n        bytes memory _data\n    )\n        external\n        view\n        returns (address, uint256, bytes memory)\n    {\n        (\n            address[] memory path,\n            bool shouldSwapExactTokensForTokens\n        ) = abi.decode(_data, (address[],bool));\n\n        bytes memory callData = abi.encodeWithSignature(\n            shouldSwapExactTokensForTokens ? SWAP_EXACT_TOKENS_FOR_TOKENS : SWAP_TOKENS_FOR_EXACT_TOKENS,\n            shouldSwapExactTokensForTokens ? _sourceQuantity : _destinationQuantity,\n            shouldSwapExactTokensForTokens ? _destinationQuantity : _sourceQuantity,\n            path,\n            _destinationAddress,\n            block.timestamp\n        );\n        return (router, 0, callData);\n    }\n\n    /**\n     * Generate data parameter to be passed to `getTradeCallData`. Returns encoded trade paths and bool to select trade function.\n     *\n     * @param _sourceToken          Address of the source token to be sold\n     * @param _destinationToken     Address of the destination token to buy\n     * @param _fixIn                Boolean representing if input tokens amount is fixed\n     *\n     * @return bytes                Data parameter to be passed to `getTradeCallData`\n     */\n    function generateDataParam(address _sourceToken, address _destinationToken, bool _fixIn)\n        external\n        pure\n        returns (bytes memory)\n    {\n        address[] memory path = new address[](2);\n        path[0] = _sourceToken;\n        path[1] = _destinationToken;\n        return abi.encode(path, _fixIn);\n    }\n\n    /**\n     * Returns the address to approve source tokens to for trading. This is the Uniswap router address\n     *\n     * @return address             Address of the contract to approve tokens to\n     */\n    function getSpender() external view returns (address) {\n        return router;\n    }\n\n    /**\n     * Helper that returns the encoded data of trade path and boolean indicating the Uniswap function to use\n     *\n     * @return bytes               Encoded data used for trading on Uniswap\n     */\n    function getUniswapExchangeData(address[] memory _path, bool _shouldSwapExactTokensForTokens) external pure returns (bytes memory) {\n        return abi.encode(_path, _shouldSwapExactTokensForTokens);\n    }\n}"
      }
    },
    "settings": {
      "optimizer": {
        "enabled": true,
        "runs": 200
      },
      "outputSelection": {
        "*": {
          "*": [
            "abi",
            "evm.bytecode",
            "evm.deployedBytecode",
            "evm.methodIdentifiers"
          ],
          "": [
            "ast"
          ]
        }
      }
    }
  },
  "output": {
    "contracts": {
      "contracts/protocol/integration/exchange/UniswapV2ExchangeAdapterV2.sol": {
        "UniswapV2ExchangeAdapterV2": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_router",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "constructor"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_sourceToken",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "_destinationToken",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "_fixIn",
                  "type": "bool"
                }
              ],
              "name": "generateDataParam",
              "outputs": [
                {
                  "internalType": "bytes",
                  "name": "",
                  "type": "bytes"
                }
              ],
              "stateMutability": "pure",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "getSpender",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "_destinationAddress",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "_sourceQuantity",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "_destinationQuantity",
                  "type": "uint256"
                },
                {
                  "internalType": "bytes",
                  "name": "_data",
                  "type": "bytes"
                }
              ],
              "name": "getTradeCalldata",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                },
                {
                  "internalType": "bytes",
                  "name": "",
                  "type": "bytes"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address[]",
                  "name": "_path",
                  "type": "address[]"
                },
                {
                  "internalType": "bool",
                  "name": "_shouldSwapExactTokensForTokens",
                  "type": "bool"
                }
              ],
              "name": "getUniswapExchangeData",
              "outputs": [
                {
                  "internalType": "bytes",
                  "name": "",
                  "type": "bytes"
                }
              ],
              "stateMutability": "pure",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "router",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60a060405234801561001057600080fd5b506040516108e23803806108e283398101604081905261002f91610044565b60601b6001600160601b031916608052610072565b600060208284031215610055578081fd5b81516001600160a01b038116811461006b578182fd5b9392505050565b60805160601c6108496100996000398061010652806102a052806102d852506108496000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80632173867a1461005c578063334fc2891461008557806347e6fbc01461009a578063e171fcab146100ad578063f887ea40146100cf575b600080fd5b61006f61006a366004610421565b6100d7565b60405161007c919061066a565b60405180910390f35b61008d610104565b60405161007c9190610602565b61006f6100a83660046103d7565b610128565b6100c06100bb366004610310565b6101c9565b60405161007c93929190610616565b61008d6102d6565b606082826040516020016100ec929190610646565b60405160208183030381529060405290505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b604080516002808252606080830184529283929190602083019080368337019050509050848160008151811061015a57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050838160018151811061018857fe5b6001600160a01b039092166020928302919091018201526040516101b0918391869101610646565b6040516020818303038152906040529150509392505050565b6000806060806000858060200190518101906101e591906104d3565b9150915060608161020e576040518060800160405280604381526020016107d160439139610228565b60405180608001604052806043815260200161078e604391395b826102335788610235565b895b83610240578a610242565b895b858d42604051602401610259959493929190610684565b60408051601f198184030181529082905291610274916105e6565b6040519081900390206020820180516001600160e01b03166001600160e01b03199092169190911790527f0000000000000000000000000000000000000000000000000000000000000000965060009550935050505096509650969350505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b80356100fe8161077f565b80516100fe8161077f565b60008060008060008060c08789031215610328578182fd5b863561033381610767565b9550602087013561034381610767565b9450604087013561035381610767565b9350606087013592506080870135915060a087013567ffffffffffffffff81111561037c578182fd5b80880189601f82011261038d578283fd5b803591506103a261039d83610707565b6106c0565b8281528a60208484010111156103b6578384fd5b6103c783602083016020850161072b565b8093505050509295509295509295565b6000806000606084860312156103eb578283fd5b83356103f681610767565b9250602084013561040681610767565b915060408401356104168161077f565b809150509250925092565b60008060408385031215610433578182fd5b823567ffffffffffffffff811115610449578283fd5b80840185601f82011261045a578384fd5b8035915061046a61039d836106e7565b80838252602080830192508084018982838802870101111561048a578788fd5b8794505b858510156104b55780356104a181610767565b84526001949094019392810192810161048e565b508196506104c589828a016102fa565b955050505050509250929050565b600080604083850312156104e5578182fd5b825167ffffffffffffffff8111156104fb578283fd5b80840185601f82011261050c578384fd5b8051915061051c61039d836106e7565b80838252602080830192508084018982838802870101111561053c578788fd5b8794505b8585101561056757805161055381610767565b845260019490940193928101928101610540565b508196506104c589828a01610305565b6000815180845260208085019450808401835b838110156105af5781516001600160a01b03168752958201959082019060010161058a565b509495945050505050565b600081518084526105d2816020860160208601610737565b601f01601f19169290920160200192915050565b600082516105f8818460208701610737565b9190910192915050565b6001600160a01b0391909116815260200190565b600060018060a01b03851682528360208301526060604083015261063d60608301846105ba565b95945050505050565b6000604082526106596040830185610577565b905082151560208301529392505050565b60006020825261067d60208301846105ba565b9392505050565b600086825285602083015260a060408301526106a360a0830186610577565b6001600160a01b0394909416606083015250608001529392505050565b60405181810167ffffffffffffffff811182821017156106df57600080fd5b604052919050565b600067ffffffffffffffff8211156106fd578081fd5b5060209081020190565b600067ffffffffffffffff82111561071d578081fd5b50601f01601f191660200190565b82818337506000910152565b60005b8381101561075257818101518382015260200161073a565b83811115610761576000848401525b50505050565b6001600160a01b038116811461077c57600080fd5b50565b801515811461077c57600080fdfe737761704578616374546f6b656e73466f72546f6b656e732875696e743235362c75696e743235362c616464726573735b5d2c616464726573732c75696e743235362973776170546f6b656e73466f724578616374546f6b656e732875696e743235362c75696e743235362c616464726573735b5d2c616464726573732c75696e7432353629a264697066735822122082d8603562da8a34190e2afeb854bacfed79780401b4a17108537504d4907a3864736f6c634300060a0033",
              "opcodes": "PUSH1 0xA0 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x8E2 CODESIZE SUB DUP1 PUSH2 0x8E2 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x2F SWAP2 PUSH2 0x44 JUMP JUMPDEST PUSH1 0x60 SHL PUSH1 0x1 PUSH1 0x1 PUSH1 0x60 SHL SUB NOT AND PUSH1 0x80 MSTORE PUSH2 0x72 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x55 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x6B JUMPI DUP2 DUP3 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH1 0x60 SHR PUSH2 0x849 PUSH2 0x99 PUSH1 0x0 CODECOPY DUP1 PUSH2 0x106 MSTORE DUP1 PUSH2 0x2A0 MSTORE DUP1 PUSH2 0x2D8 MSTORE POP PUSH2 0x849 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 0x57 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x2173867A EQ PUSH2 0x5C JUMPI DUP1 PUSH4 0x334FC289 EQ PUSH2 0x85 JUMPI DUP1 PUSH4 0x47E6FBC0 EQ PUSH2 0x9A JUMPI DUP1 PUSH4 0xE171FCAB EQ PUSH2 0xAD JUMPI DUP1 PUSH4 0xF887EA40 EQ PUSH2 0xCF JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x6F PUSH2 0x6A CALLDATASIZE PUSH1 0x4 PUSH2 0x421 JUMP JUMPDEST PUSH2 0xD7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x7C SWAP2 SWAP1 PUSH2 0x66A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x8D PUSH2 0x104 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x7C SWAP2 SWAP1 PUSH2 0x602 JUMP JUMPDEST PUSH2 0x6F PUSH2 0xA8 CALLDATASIZE PUSH1 0x4 PUSH2 0x3D7 JUMP JUMPDEST PUSH2 0x128 JUMP JUMPDEST PUSH2 0xC0 PUSH2 0xBB CALLDATASIZE PUSH1 0x4 PUSH2 0x310 JUMP JUMPDEST PUSH2 0x1C9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x7C SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x616 JUMP JUMPDEST PUSH2 0x8D PUSH2 0x2D6 JUMP JUMPDEST PUSH1 0x60 DUP3 DUP3 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0xEC SWAP3 SWAP2 SWAP1 PUSH2 0x646 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 DUP1 DUP3 MSTORE PUSH1 0x60 DUP1 DUP4 ADD DUP5 MSTORE SWAP3 DUP4 SWAP3 SWAP2 SWAP1 PUSH1 0x20 DUP4 ADD SWAP1 DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP POP SWAP1 POP DUP5 DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x15A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE POP POP DUP4 DUP2 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0x188 JUMPI INVALID JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP2 SWAP1 SWAP2 ADD DUP3 ADD MSTORE PUSH1 0x40 MLOAD PUSH2 0x1B0 SWAP2 DUP4 SWAP2 DUP7 SWAP2 ADD PUSH2 0x646 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP2 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 DUP1 PUSH1 0x0 DUP6 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x1E5 SWAP2 SWAP1 PUSH2 0x4D3 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH1 0x60 DUP2 PUSH2 0x20E JUMPI PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x43 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x7D1 PUSH1 0x43 SWAP2 CODECOPY PUSH2 0x228 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x43 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x78E PUSH1 0x43 SWAP2 CODECOPY JUMPDEST DUP3 PUSH2 0x233 JUMPI DUP9 PUSH2 0x235 JUMP JUMPDEST DUP10 JUMPDEST DUP4 PUSH2 0x240 JUMPI DUP11 PUSH2 0x242 JUMP JUMPDEST DUP10 JUMPDEST DUP6 DUP14 TIMESTAMP PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x259 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x684 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP1 DUP3 SWAP1 MSTORE SWAP2 PUSH2 0x274 SWAP2 PUSH2 0x5E6 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 SWAP1 SUB SWAP1 KECCAK256 PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 MSTORE PUSH32 0x0 SWAP7 POP PUSH1 0x0 SWAP6 POP SWAP4 POP POP POP POP SWAP7 POP SWAP7 POP SWAP7 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH2 0xFE DUP2 PUSH2 0x77F JUMP JUMPDEST DUP1 MLOAD PUSH2 0xFE DUP2 PUSH2 0x77F JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x328 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x333 DUP2 PUSH2 0x767 JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH2 0x343 DUP2 PUSH2 0x767 JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH2 0x353 DUP2 PUSH2 0x767 JUMP JUMPDEST SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD SWAP2 POP PUSH1 0xA0 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x37C JUMPI DUP2 DUP3 REVERT JUMPDEST DUP1 DUP9 ADD DUP10 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x38D JUMPI DUP3 DUP4 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP2 POP PUSH2 0x3A2 PUSH2 0x39D DUP4 PUSH2 0x707 JUMP JUMPDEST PUSH2 0x6C0 JUMP JUMPDEST DUP3 DUP2 MSTORE DUP11 PUSH1 0x20 DUP5 DUP5 ADD ADD GT ISZERO PUSH2 0x3B6 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x3C7 DUP4 PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP6 ADD PUSH2 0x72B JUMP JUMPDEST DUP1 SWAP4 POP POP POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3EB JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x3F6 DUP2 PUSH2 0x767 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x406 DUP2 PUSH2 0x767 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x416 DUP2 PUSH2 0x77F JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x433 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x449 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP1 DUP5 ADD DUP6 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x45A JUMPI DUP4 DUP5 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP2 POP PUSH2 0x46A PUSH2 0x39D DUP4 PUSH2 0x6E7 JUMP JUMPDEST DUP1 DUP4 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP3 POP DUP1 DUP5 ADD DUP10 DUP3 DUP4 DUP9 MUL DUP8 ADD ADD GT ISZERO PUSH2 0x48A JUMPI DUP8 DUP9 REVERT JUMPDEST DUP8 SWAP5 POP JUMPDEST DUP6 DUP6 LT ISZERO PUSH2 0x4B5 JUMPI DUP1 CALLDATALOAD PUSH2 0x4A1 DUP2 PUSH2 0x767 JUMP JUMPDEST DUP5 MSTORE PUSH1 0x1 SWAP5 SWAP1 SWAP5 ADD SWAP4 SWAP3 DUP2 ADD SWAP3 DUP2 ADD PUSH2 0x48E JUMP JUMPDEST POP DUP2 SWAP7 POP PUSH2 0x4C5 DUP10 DUP3 DUP11 ADD PUSH2 0x2FA JUMP JUMPDEST SWAP6 POP POP POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4E5 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4FB JUMPI DUP3 DUP4 REVERT JUMPDEST DUP1 DUP5 ADD DUP6 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x50C JUMPI DUP4 DUP5 REVERT JUMPDEST DUP1 MLOAD SWAP2 POP PUSH2 0x51C PUSH2 0x39D DUP4 PUSH2 0x6E7 JUMP JUMPDEST DUP1 DUP4 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP3 POP DUP1 DUP5 ADD DUP10 DUP3 DUP4 DUP9 MUL DUP8 ADD ADD GT ISZERO PUSH2 0x53C JUMPI DUP8 DUP9 REVERT JUMPDEST DUP8 SWAP5 POP JUMPDEST DUP6 DUP6 LT ISZERO PUSH2 0x567 JUMPI DUP1 MLOAD PUSH2 0x553 DUP2 PUSH2 0x767 JUMP JUMPDEST DUP5 MSTORE PUSH1 0x1 SWAP5 SWAP1 SWAP5 ADD SWAP4 SWAP3 DUP2 ADD SWAP3 DUP2 ADD PUSH2 0x540 JUMP JUMPDEST POP DUP2 SWAP7 POP PUSH2 0x4C5 DUP10 DUP3 DUP11 ADD PUSH2 0x305 JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x20 DUP1 DUP6 ADD SWAP5 POP DUP1 DUP5 ADD DUP4 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x5AF JUMPI DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP8 MSTORE SWAP6 DUP3 ADD SWAP6 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x58A JUMP JUMPDEST POP SWAP5 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x5D2 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x737 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x5F8 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x737 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB DUP6 AND DUP3 MSTORE DUP4 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x60 PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x63D PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x5BA JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 MSTORE PUSH2 0x659 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x577 JUMP JUMPDEST SWAP1 POP DUP3 ISZERO ISZERO PUSH1 0x20 DUP4 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x67D PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x5BA JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP7 DUP3 MSTORE DUP6 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0xA0 PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x6A3 PUSH1 0xA0 DUP4 ADD DUP7 PUSH2 0x577 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP5 SWAP1 SWAP5 AND PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x6DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x6FD JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x71D JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x752 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x73A JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x761 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x77C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x77C JUMPI PUSH1 0x0 DUP1 REVERT INVALID PUSH20 0x7761704578616374546F6B656E73466F72546F6B PUSH6 0x6E732875696E PUSH21 0x3235362C75696E743235362C616464726573735B5D 0x2C PUSH2 0x6464 PUSH19 0x6573732C75696E743235362973776170546F6B PUSH6 0x6E73466F7245 PUSH25 0x616374546F6B656E732875696E743235362C75696E74323536 0x2C PUSH2 0x6464 PUSH19 0x6573735B5D2C616464726573732C75696E7432 CALLDATALOAD CALLDATASIZE 0x29 LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP3 0xD8 PUSH1 0x35 PUSH3 0xDA8A34 NOT 0xE 0x2A INVALID 0xB8 SLOAD 0xBA 0xCF 0xED PUSH26 0x780401B4A17108537504D4907A3864736F6C634300060A003300 ",
              "sourceMap": "1256:4357:0:-:0;;;2058:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2104:16;;-1:-1:-1;;;;;;2104:16:0;;;1256:4357;;146:263:-1;;261:2;249:9;240:7;236:23;232:32;229:2;;;-1:-1;;267:12;229:2;83:13;;-1:-1;;;;;576:54;;701:35;;691:2;;-1:-1;;740:12;691:2;319:74;223:186;-1:-1;;;223:186;;1256:4357:0;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {
                "5": [
                  {
                    "length": 32,
                    "start": 262
                  },
                  {
                    "length": 32,
                    "start": 672
                  },
                  {
                    "length": 32,
                    "start": 728
                  }
                ]
              },
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50600436106100575760003560e01c80632173867a1461005c578063334fc2891461008557806347e6fbc01461009a578063e171fcab146100ad578063f887ea40146100cf575b600080fd5b61006f61006a366004610421565b6100d7565b60405161007c919061066a565b60405180910390f35b61008d610104565b60405161007c9190610602565b61006f6100a83660046103d7565b610128565b6100c06100bb366004610310565b6101c9565b60405161007c93929190610616565b61008d6102d6565b606082826040516020016100ec929190610646565b60405160208183030381529060405290505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b604080516002808252606080830184529283929190602083019080368337019050509050848160008151811061015a57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050838160018151811061018857fe5b6001600160a01b039092166020928302919091018201526040516101b0918391869101610646565b6040516020818303038152906040529150509392505050565b6000806060806000858060200190518101906101e591906104d3565b9150915060608161020e576040518060800160405280604381526020016107d160439139610228565b60405180608001604052806043815260200161078e604391395b826102335788610235565b895b83610240578a610242565b895b858d42604051602401610259959493929190610684565b60408051601f198184030181529082905291610274916105e6565b6040519081900390206020820180516001600160e01b03166001600160e01b03199092169190911790527f0000000000000000000000000000000000000000000000000000000000000000965060009550935050505096509650969350505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b80356100fe8161077f565b80516100fe8161077f565b60008060008060008060c08789031215610328578182fd5b863561033381610767565b9550602087013561034381610767565b9450604087013561035381610767565b9350606087013592506080870135915060a087013567ffffffffffffffff81111561037c578182fd5b80880189601f82011261038d578283fd5b803591506103a261039d83610707565b6106c0565b8281528a60208484010111156103b6578384fd5b6103c783602083016020850161072b565b8093505050509295509295509295565b6000806000606084860312156103eb578283fd5b83356103f681610767565b9250602084013561040681610767565b915060408401356104168161077f565b809150509250925092565b60008060408385031215610433578182fd5b823567ffffffffffffffff811115610449578283fd5b80840185601f82011261045a578384fd5b8035915061046a61039d836106e7565b80838252602080830192508084018982838802870101111561048a578788fd5b8794505b858510156104b55780356104a181610767565b84526001949094019392810192810161048e565b508196506104c589828a016102fa565b955050505050509250929050565b600080604083850312156104e5578182fd5b825167ffffffffffffffff8111156104fb578283fd5b80840185601f82011261050c578384fd5b8051915061051c61039d836106e7565b80838252602080830192508084018982838802870101111561053c578788fd5b8794505b8585101561056757805161055381610767565b845260019490940193928101928101610540565b508196506104c589828a01610305565b6000815180845260208085019450808401835b838110156105af5781516001600160a01b03168752958201959082019060010161058a565b509495945050505050565b600081518084526105d2816020860160208601610737565b601f01601f19169290920160200192915050565b600082516105f8818460208701610737565b9190910192915050565b6001600160a01b0391909116815260200190565b600060018060a01b03851682528360208301526060604083015261063d60608301846105ba565b95945050505050565b6000604082526106596040830185610577565b905082151560208301529392505050565b60006020825261067d60208301846105ba565b9392505050565b600086825285602083015260a060408301526106a360a0830186610577565b6001600160a01b0394909416606083015250608001529392505050565b60405181810167ffffffffffffffff811182821017156106df57600080fd5b604052919050565b600067ffffffffffffffff8211156106fd578081fd5b5060209081020190565b600067ffffffffffffffff82111561071d578081fd5b50601f01601f191660200190565b82818337506000910152565b60005b8381101561075257818101518382015260200161073a565b83811115610761576000848401525b50505050565b6001600160a01b038116811461077c57600080fd5b50565b801515811461077c57600080fdfe737761704578616374546f6b656e73466f72546f6b656e732875696e743235362c75696e743235362c616464726573735b5d2c616464726573732c75696e743235362973776170546f6b656e73466f724578616374546f6b656e732875696e743235362c75696e743235362c616464726573735b5d2c616464726573732c75696e7432353629a264697066735822122082d8603562da8a34190e2afeb854bacfed79780401b4a17108537504d4907a3864736f6c634300060a0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x57 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x2173867A EQ PUSH2 0x5C JUMPI DUP1 PUSH4 0x334FC289 EQ PUSH2 0x85 JUMPI DUP1 PUSH4 0x47E6FBC0 EQ PUSH2 0x9A JUMPI DUP1 PUSH4 0xE171FCAB EQ PUSH2 0xAD JUMPI DUP1 PUSH4 0xF887EA40 EQ PUSH2 0xCF JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x6F PUSH2 0x6A CALLDATASIZE PUSH1 0x4 PUSH2 0x421 JUMP JUMPDEST PUSH2 0xD7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x7C SWAP2 SWAP1 PUSH2 0x66A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x8D PUSH2 0x104 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x7C SWAP2 SWAP1 PUSH2 0x602 JUMP JUMPDEST PUSH2 0x6F PUSH2 0xA8 CALLDATASIZE PUSH1 0x4 PUSH2 0x3D7 JUMP JUMPDEST PUSH2 0x128 JUMP JUMPDEST PUSH2 0xC0 PUSH2 0xBB CALLDATASIZE PUSH1 0x4 PUSH2 0x310 JUMP JUMPDEST PUSH2 0x1C9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x7C SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x616 JUMP JUMPDEST PUSH2 0x8D PUSH2 0x2D6 JUMP JUMPDEST PUSH1 0x60 DUP3 DUP3 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0xEC SWAP3 SWAP2 SWAP1 PUSH2 0x646 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 DUP1 DUP3 MSTORE PUSH1 0x60 DUP1 DUP4 ADD DUP5 MSTORE SWAP3 DUP4 SWAP3 SWAP2 SWAP1 PUSH1 0x20 DUP4 ADD SWAP1 DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP POP SWAP1 POP DUP5 DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x15A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE POP POP DUP4 DUP2 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0x188 JUMPI INVALID JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP2 SWAP1 SWAP2 ADD DUP3 ADD MSTORE PUSH1 0x40 MLOAD PUSH2 0x1B0 SWAP2 DUP4 SWAP2 DUP7 SWAP2 ADD PUSH2 0x646 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP2 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 DUP1 PUSH1 0x0 DUP6 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x1E5 SWAP2 SWAP1 PUSH2 0x4D3 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH1 0x60 DUP2 PUSH2 0x20E JUMPI PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x43 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x7D1 PUSH1 0x43 SWAP2 CODECOPY PUSH2 0x228 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x43 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x78E PUSH1 0x43 SWAP2 CODECOPY JUMPDEST DUP3 PUSH2 0x233 JUMPI DUP9 PUSH2 0x235 JUMP JUMPDEST DUP10 JUMPDEST DUP4 PUSH2 0x240 JUMPI DUP11 PUSH2 0x242 JUMP JUMPDEST DUP10 JUMPDEST DUP6 DUP14 TIMESTAMP PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x259 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x684 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP1 DUP3 SWAP1 MSTORE SWAP2 PUSH2 0x274 SWAP2 PUSH2 0x5E6 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 SWAP1 SUB SWAP1 KECCAK256 PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 MSTORE PUSH32 0x0 SWAP7 POP PUSH1 0x0 SWAP6 POP SWAP4 POP POP POP POP SWAP7 POP SWAP7 POP SWAP7 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH2 0xFE DUP2 PUSH2 0x77F JUMP JUMPDEST DUP1 MLOAD PUSH2 0xFE DUP2 PUSH2 0x77F JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x328 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x333 DUP2 PUSH2 0x767 JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH2 0x343 DUP2 PUSH2 0x767 JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH2 0x353 DUP2 PUSH2 0x767 JUMP JUMPDEST SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD SWAP2 POP PUSH1 0xA0 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x37C JUMPI DUP2 DUP3 REVERT JUMPDEST DUP1 DUP9 ADD DUP10 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x38D JUMPI DUP3 DUP4 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP2 POP PUSH2 0x3A2 PUSH2 0x39D DUP4 PUSH2 0x707 JUMP JUMPDEST PUSH2 0x6C0 JUMP JUMPDEST DUP3 DUP2 MSTORE DUP11 PUSH1 0x20 DUP5 DUP5 ADD ADD GT ISZERO PUSH2 0x3B6 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x3C7 DUP4 PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP6 ADD PUSH2 0x72B JUMP JUMPDEST DUP1 SWAP4 POP POP POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3EB JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x3F6 DUP2 PUSH2 0x767 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x406 DUP2 PUSH2 0x767 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x416 DUP2 PUSH2 0x77F JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x433 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x449 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP1 DUP5 ADD DUP6 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x45A JUMPI DUP4 DUP5 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP2 POP PUSH2 0x46A PUSH2 0x39D DUP4 PUSH2 0x6E7 JUMP JUMPDEST DUP1 DUP4 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP3 POP DUP1 DUP5 ADD DUP10 DUP3 DUP4 DUP9 MUL DUP8 ADD ADD GT ISZERO PUSH2 0x48A JUMPI DUP8 DUP9 REVERT JUMPDEST DUP8 SWAP5 POP JUMPDEST DUP6 DUP6 LT ISZERO PUSH2 0x4B5 JUMPI DUP1 CALLDATALOAD PUSH2 0x4A1 DUP2 PUSH2 0x767 JUMP JUMPDEST DUP5 MSTORE PUSH1 0x1 SWAP5 SWAP1 SWAP5 ADD SWAP4 SWAP3 DUP2 ADD SWAP3 DUP2 ADD PUSH2 0x48E JUMP JUMPDEST POP DUP2 SWAP7 POP PUSH2 0x4C5 DUP10 DUP3 DUP11 ADD PUSH2 0x2FA JUMP JUMPDEST SWAP6 POP POP POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4E5 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4FB JUMPI DUP3 DUP4 REVERT JUMPDEST DUP1 DUP5 ADD DUP6 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x50C JUMPI DUP4 DUP5 REVERT JUMPDEST DUP1 MLOAD SWAP2 POP PUSH2 0x51C PUSH2 0x39D DUP4 PUSH2 0x6E7 JUMP JUMPDEST DUP1 DUP4 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP3 POP DUP1 DUP5 ADD DUP10 DUP3 DUP4 DUP9 MUL DUP8 ADD ADD GT ISZERO PUSH2 0x53C JUMPI DUP8 DUP9 REVERT JUMPDEST DUP8 SWAP5 POP JUMPDEST DUP6 DUP6 LT ISZERO PUSH2 0x567 JUMPI DUP1 MLOAD PUSH2 0x553 DUP2 PUSH2 0x767 JUMP JUMPDEST DUP5 MSTORE PUSH1 0x1 SWAP5 SWAP1 SWAP5 ADD SWAP4 SWAP3 DUP2 ADD SWAP3 DUP2 ADD PUSH2 0x540 JUMP JUMPDEST POP DUP2 SWAP7 POP PUSH2 0x4C5 DUP10 DUP3 DUP11 ADD PUSH2 0x305 JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x20 DUP1 DUP6 ADD SWAP5 POP DUP1 DUP5 ADD DUP4 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x5AF JUMPI DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP8 MSTORE SWAP6 DUP3 ADD SWAP6 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x58A JUMP JUMPDEST POP SWAP5 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x5D2 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x737 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x5F8 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x737 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB DUP6 AND DUP3 MSTORE DUP4 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x60 PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x63D PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x5BA JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 MSTORE PUSH2 0x659 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x577 JUMP JUMPDEST SWAP1 POP DUP3 ISZERO ISZERO PUSH1 0x20 DUP4 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x67D PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x5BA JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP7 DUP3 MSTORE DUP6 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0xA0 PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x6A3 PUSH1 0xA0 DUP4 ADD DUP7 PUSH2 0x577 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP5 SWAP1 SWAP5 AND PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x6DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x6FD JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x71D JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x752 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x73A JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x761 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x77C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x77C JUMPI PUSH1 0x0 DUP1 REVERT INVALID PUSH20 0x7761704578616374546F6B656E73466F72546F6B PUSH6 0x6E732875696E PUSH21 0x3235362C75696E743235362C616464726573735B5D 0x2C PUSH2 0x6464 PUSH19 0x6573732C75696E743235362973776170546F6B PUSH6 0x6E73466F7245 PUSH25 0x616374546F6B656E732875696E743235362C75696E74323536 0x2C PUSH2 0x6464 PUSH19 0x6573735B5D2C616464726573732C75696E7432 CALLDATALOAD CALLDATASIZE 0x29 LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP3 0xD8 PUSH1 0x35 PUSH3 0xDA8A34 NOT 0xE 0x2A INVALID 0xB8 SLOAD 0xBA 0xCF 0xED PUSH26 0x780401B4A17108537504D4907A3864736F6C634300060A003300 ",
              "sourceMap": "1256:4357:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5406:205;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;5108:84;;;:::i;:::-;;;;;;;;4575:321;;;;;;;;;:::i;3144:939::-;;;;;;;;;:::i;:::-;;;;;;;;;;1399:31;;;:::i;5406:205::-;5523:12;5565:5;5572:31;5554:50;;;;;;;;;;;;;;;;;;;;;;;5547:57;;5406:205;;;;;:::o;5108:84::-;5179:6;5108:84;:::o;4575:321::-;4763:16;;;4777:1;4763:16;;;4711:12;4763:16;;;;;4711:12;;;4763:16;4777:1;4763:16;;;;;;;;;;-1:-1:-1;4763:16:0;4739:40;;4799:12;4789:4;4794:1;4789:7;;;;;;;;;;;;;:22;-1:-1:-1;;;;;4789:22:0;;;-1:-1:-1;;;;;4789:22:0;;;;;4831:17;4821:4;4826:1;4821:7;;;;;;;;-1:-1:-1;;;;;4821:27:0;;;:7;;;;;;;;;;:27;4865:24;;;;4876:4;;4882:6;;4865:24;;;;;;;;;;;;;;;;4858:31;;;4575:321;;;;;:::o;3144:939::-;3436:7;3445;3454:12;3496:21;3531:35;3590:5;3579:35;;;;;;;;;;;;;;3482:132;;;;3625:21;3686:30;:92;;3750:28;;;;;;;;;;;;;;;;;3686:92;;;3719:28;;;;;;;;;;;;;;;;;3686:92;3792:30;:71;;3843:20;3792:71;;;3825:15;3792:71;3877:30;:71;;3933:15;3877:71;;;3910:20;3877:71;3962:4;3980:19;4013:15;3649:389;;;;;;;;;;;;;;;;;-1:-1:-1;;3649:389:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3649:389:0;-1:-1:-1;;;;;;3649:389:0;;;;;;;;;4056:6;;-1:-1:-1;;;;3649:389:0;-1:-1:-1;;;;3144:939:0;;;;;;;;;;:::o;1399:31::-;;;:::o;1764:124:-1:-;1828:20;;1853:30;1828:20;1853:30;;1895:128;1970:13;;1988:30;1970:13;1988:30;;2616:973;;;;;;;2814:3;2802:9;2793:7;2789:23;2785:33;2782:2;;;-1:-1;;2821:12;2782:2;85:6;72:20;97:33;124:5;97:33;;;2873:63;-1:-1;2973:2;3012:22;;72:20;97:33;72:20;97:33;;;2981:63;-1:-1;3081:2;3120:22;;72:20;97:33;72:20;97:33;;;3089:63;-1:-1;3189:2;3228:22;;2546:20;;-1:-1;3297:3;3337:22;;2546:20;;-1:-1;3434:3;3419:19;;3406:33;3459:18;3448:30;;3445:2;;;-1:-1;;3481:12;3445:2;3556:6;3545:9;3541:22;2132:3;2125:4;2117:6;2113:17;2109:27;2099:2;;-1:-1;;2140:12;2099:2;2187:6;2174:20;2160:34;;2209:64;2224:48;2265:6;2224:48;;;2209:64;;;2293:6;2286:5;2279:21;2397:3;2973:2;2388:6;2321;2379:16;;2376:25;2373:2;;;-1:-1;;2404:12;2373:2;2424:41;2458:6;2973:2;2355:5;2351:16;2973:2;2321:6;2317:17;2424:41;;;3501:72;;;;;;2776:813;;;;;;;;;3596:485;;;;3731:2;3719:9;3710:7;3706:23;3702:32;3699:2;;;-1:-1;;3737:12;3699:2;85:6;72:20;97:33;124:5;97:33;;;3789:63;-1:-1;3889:2;3928:22;;72:20;97:33;72:20;97:33;;;3897:63;-1:-1;3997:2;4033:22;;1828:20;1853:30;1828:20;1853:30;;;4005:60;;;;3693:388;;;;;;4088:496;;;4231:2;4219:9;4210:7;4206:23;4202:32;4199:2;;;-1:-1;;4237:12;4199:2;4295:17;4282:31;4333:18;4325:6;4322:30;4319:2;;;-1:-1;;4355:12;4319:2;4446:6;4435:9;4431:22;418:3;411:4;403:6;399:17;395:27;385:2;;-1:-1;;426:12;385:2;473:6;460:20;446:34;;495:80;510:64;567:6;510:64;;495:80;581:16;617:6;610:5;603:21;647:4;;664:3;660:14;653:21;;647:4;639:6;635:17;769:3;647:4;;753:6;749:17;639:6;740:27;;737:36;734:2;;;-1:-1;;776:12;734:2;-1:-1;802:10;;796:206;821:6;818:1;815:13;796:206;;;85:6;72:20;97:33;124:5;97:33;;;889:50;;843:1;836:9;;;;;953:14;;;;981;;796:206;;;800:14;4375:88;;;4518:50;4560:7;647:4;4540:9;4536:22;4518:50;;;4508:60;;;;;;;4193:391;;;;;;4591:522;;;4745:2;4733:9;4724:7;4720:23;4716:32;4713:2;;;-1:-1;;4751:12;4713:2;4802:17;4796:24;4840:18;4832:6;4829:30;4826:2;;;-1:-1;;4862:12;4826:2;4964:6;4953:9;4949:22;1162:3;1155:4;1147:6;1143:17;1139:27;1129:2;;-1:-1;;1170:12;1129:2;1210:6;1204:13;1190:27;;1232:80;1247:64;1304:6;1247:64;;1232:80;1318:16;1354:6;1347:5;1340:21;1384:4;;1401:3;1397:14;1390:21;;1384:4;1376:6;1372:17;1506:3;1384:4;;1490:6;1486:17;1376:6;1477:27;;1474:36;1471:2;;;-1:-1;;1513:12;1471:2;-1:-1;1539:10;;1533:217;1558:6;1555:1;1552:13;1533:217;;;226:6;220:13;238:33;265:5;238:33;;;1626:61;;1580:1;1573:9;;;;;1701:14;;;;1729;;1533:217;;;1537:14;4882:99;;;5036:61;5089:7;1384:4;5069:9;5065:22;5036:61;;5563:690;;5756:5;11030:12;11574:6;11569:3;11562:19;11611:4;;11606:3;11602:14;5768:93;;11611:4;5932:5;10884:14;-1:-1;5971:260;5996:6;5993:1;5990:13;5971:260;;;6057:13;;-1:-1;;;;;12207:54;5363:37;;5274:14;;;;11417;;;;3459:18;6011:9;5971:260;;;-1:-1;6237:10;;5687:566;-1:-1;;;;;5687:566;6372:343;;6514:5;11030:12;11574:6;11569:3;11562:19;6607:52;6652:6;11611:4;11606:3;11602:14;11611:4;6633:5;6629:16;6607:52;;;12867:7;12851:14;-1:-1;;12847:28;6671:39;;;;11611:4;6671:39;;6462:253;-1:-1;;6462:253;7209:275;;6885:5;11030:12;6997:52;7042:6;7037:3;7030:4;7023:5;7019:16;6997:52;;;7061:16;;;;;7345:139;-1:-1;;7345:139;7491:222;-1:-1;;;;;12207:54;;;;5363:37;;7618:2;7603:18;;7589:124;7720:528;;3459:18;;12218:42;;;12211:5;12207:54;5370:3;5363:37;7190:5;8085:2;8074:9;8070:18;7160:37;7921:2;8122;8111:9;8107:18;8100:48;8162:76;7921:2;7910:9;7906:18;8224:6;8162:76;;;8154:84;7892:356;-1:-1;;;;;7892:356;8255:469;;8454:2;8475:17;8468:47;8529:108;8454:2;8443:9;8439:18;8623:6;8529:108;;;8521:116;;6353:5;12119:13;12112:21;8710:2;8699:9;8695:18;6326:34;8425:299;;;;;;8731:306;;8876:2;8897:17;8890:47;8951:76;8876:2;8865:9;8861:18;9013:6;8951:76;;;8943:84;8847:190;-1:-1;;;8847:190;9044:816;;7190:5;7167:3;7160:37;7190:5;9498:2;9487:9;9483:18;7160:37;9333:3;9535:2;9524:9;9520:18;9513:48;9575:108;9333:3;9322:9;9318:19;9669:6;9575:108;;;-1:-1;;;;;12207:54;;;;9762:2;9747:18;;5363:37;-1:-1;9845:3;9830:19;7160:37;9567:116;9304:556;-1:-1;;;9304:556;9867:256;9929:2;9923:9;9955:17;;;10030:18;10015:34;;10051:22;;;10012:62;10009:2;;;10087:1;;10077:12;10009:2;9929;10096:22;9907:216;;-1:-1;9907:216;10130:304;;10289:18;10281:6;10278:30;10275:2;;;-1:-1;;10311:12;10275:2;-1:-1;10356:4;10344:17;;;10409:15;;10212:222;10441:321;;10584:18;10576:6;10573:30;10570:2;;;-1:-1;;10606:12;10570:2;-1:-1;12867:7;10660:17;-1:-1;;10656:33;10747:4;10737:15;;10507:255;12353:145;12434:6;12429:3;12424;12411:30;-1:-1;12490:1;12472:16;;12465:27;12404:94;12507:268;12572:1;12579:101;12593:6;12590:1;12587:13;12579:101;;;12660:11;;;12654:18;12641:11;;;12634:39;12615:2;12608:10;12579:101;;;12695:6;12692:1;12689:13;12686:2;;;12572:1;12751:6;12746:3;12742:16;12735:27;12686:2;;12556:219;;;;12888:117;-1:-1;;;;;12207:54;;12947:35;;12937:2;;12996:1;;12986:12;12937:2;12931:74;;13012:111;13093:5;12119:13;12112:21;13071:5;13068:32;13058:2;;13114:1;;13104:12"
            },
            "methodIdentifiers": {
              "generateDataParam(address,address,bool)": "47e6fbc0",
              "getSpender()": "334fc289",
              "getTradeCalldata(address,address,address,uint256,uint256,bytes)": "e171fcab",
              "getUniswapExchangeData(address[],bool)": "2173867a",
              "router()": "f887ea40"
            }
          }
        }
      }
    },
    "sources": {
      "contracts/protocol/integration/exchange/UniswapV2ExchangeAdapterV2.sol": {
        "ast": {
          "absolutePath": "contracts/protocol/integration/exchange/UniswapV2ExchangeAdapterV2.sol",
          "exportedSymbols": {
            "UniswapV2ExchangeAdapterV2": [
              160
            ]
          },
          "id": 161,
          "license": "Apache License",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 1,
              "literals": [
                "solidity",
                "0.6",
                ".10"
              ],
              "nodeType": "PragmaDirective",
              "src": "655:23:0"
            },
            {
              "id": 2,
              "literals": [
                "experimental",
                "ABIEncoderV2"
              ],
              "nodeType": "PragmaDirective",
              "src": "679:35:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "contract",
              "documentation": {
                "id": 3,
                "nodeType": "StructuredDocumentation",
                "src": "716:539:0",
                "text": " @title UniswapV2ExchangeAdapterV2\n @author Set Protocol\n A Uniswap Router02 exchange adapter that returns calldata for trading. Includes option for 2 different trade types on Uniswap.\n CHANGE LOG:\n - Add helper that encodes path and boolean into bytes\n - Generalized ability to choose whether to swap an exact amount of source token for a min amount of receive token or swap a max amount of source token for\n an exact amount of receive token\n - Add helper to generate data parameter for `getTradeCallData`"
              },
              "fullyImplemented": true,
              "id": 160,
              "linearizedBaseContracts": [
                160
              ],
              "name": "UniswapV2ExchangeAdapterV2",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": false,
                  "functionSelector": "f887ea40",
                  "id": 5,
                  "mutability": "immutable",
                  "name": "router",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 160,
                  "src": "1399:31:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 4,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1399:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": true,
                  "id": 8,
                  "mutability": "constant",
                  "name": "SWAP_EXACT_TOKENS_FOR_TOKENS",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 160,
                  "src": "1532:125:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 6,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1532:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "737761704578616374546f6b656e73466f72546f6b656e732875696e743235362c75696e743235362c616464726573735b5d2c616464726573732c75696e7432353629",
                    "id": 7,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "string",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "1588:69:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_stringliteral_38ed1739ee07daf49933f1800d1a9bc8d39a6876ea11e643f9c4c39c66df0ee8",
                      "typeString": "literal_string \"swapExactTokensForTokens(uint256,uint256,address[],address,uint256)\""
                    },
                    "value": "swapExactTokensForTokens(uint256,uint256,address[],address,uint256)"
                  },
                  "visibility": "internal"
                },
                {
                  "constant": true,
                  "id": 11,
                  "mutability": "constant",
                  "name": "SWAP_TOKENS_FOR_EXACT_TOKENS",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 160,
                  "src": "1759:125:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 9,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1759:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "73776170546f6b656e73466f724578616374546f6b656e732875696e743235362c75696e743235362c616464726573735b5d2c616464726573732c75696e7432353629",
                    "id": 10,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "string",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "1815:69:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_stringliteral_8803dbeef1adfe1a9306daa835152093f0a5085700e080f4de0d56162dfadb09",
                      "typeString": "literal_string \"swapTokensForExactTokens(uint256,uint256,address[],address,uint256)\""
                    },
                    "value": "swapTokensForExactTokens(uint256,uint256,address[],address,uint256)"
                  },
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21,
                    "nodeType": "Block",
                    "src": "2094:33:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 19,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 17,
                            "name": "router",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5,
                            "src": "2104:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 18,
                            "name": "_router",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14,
                            "src": "2113:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "2104:16:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 20,
                        "nodeType": "ExpressionStatement",
                        "src": "2104:16:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 12,
                    "nodeType": "StructuredDocumentation",
                    "src": "1940:113:0",
                    "text": " Set state variables\n @param _router       Address of Uniswap V2 Router02 contract"
                  },
                  "id": 22,
                  "implemented": true,
                  "kind": "constructor",
                  "modifiers": [],
                  "name": "",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 15,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14,
                        "mutability": "mutable",
                        "name": "_router",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22,
                        "src": "2070:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 13,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2070:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2069:17:0"
                  },
                  "returnParameters": {
                    "id": 16,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2094:0:0"
                  },
                  "scope": 160,
                  "src": "2058:69:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 89,
                    "nodeType": "Block",
                    "src": "3472:611:0",
                    "statements": [
                      {
                        "assignments": [
                          48,
                          50
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 48,
                            "mutability": "mutable",
                            "name": "path",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 89,
                            "src": "3496:21:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                              "typeString": "address[]"
                            },
                            "typeName": {
                              "baseType": {
                                "id": 46,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "3496:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "id": 47,
                              "length": null,
                              "nodeType": "ArrayTypeName",
                              "src": "3496:9:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                                "typeString": "address[]"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          },
                          {
                            "constant": false,
                            "id": 50,
                            "mutability": "mutable",
                            "name": "shouldSwapExactTokensForTokens",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 89,
                            "src": "3531:35:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "typeName": {
                              "id": 49,
                              "name": "bool",
                              "nodeType": "ElementaryTypeName",
                              "src": "3531:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 61,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 53,
                              "name": "_data",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 35,
                              "src": "3590:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "components": [
                                {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 55,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "3598:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 54,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "3598:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 56,
                                  "indexExpression": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "IndexAccess",
                                  "src": "3598:9:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_array$_t_address_$dyn_memory_ptr_$",
                                    "typeString": "type(address[] memory)"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 58,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "3608:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_bool_$",
                                    "typeString": "type(bool)"
                                  },
                                  "typeName": {
                                    "id": 57,
                                    "name": "bool",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "3608:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                }
                              ],
                              "id": 59,
                              "isConstant": false,
                              "isInlineArray": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "TupleExpression",
                              "src": "3597:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_tuple$_t_type$_t_array$_t_address_$dyn_memory_ptr_$_$_t_type$_t_bool_$_$",
                                "typeString": "tuple(type(address[] memory),type(bool))"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              },
                              {
                                "typeIdentifier": "t_tuple$_t_type$_t_array$_t_address_$dyn_memory_ptr_$_$_t_type$_t_bool_$_$",
                                "typeString": "tuple(type(address[] memory),type(bool))"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 51,
                              "name": "abi",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -1,
                              "src": "3579:3:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_abi",
                                "typeString": "abi"
                              }
                            },
                            "id": 52,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "memberName": "decode",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "3579:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                              "typeString": "function () pure"
                            }
                          },
                          "id": 60,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3579:35:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_array$_t_address_$dyn_memory_ptr_$_t_bool_$",
                            "typeString": "tuple(address[] memory,bool)"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "3482:132:0"
                      },
                      {
                        "assignments": [
                          63
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 63,
                            "mutability": "mutable",
                            "name": "callData",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 89,
                            "src": "3625:21:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes"
                            },
                            "typeName": {
                              "id": 62,
                              "name": "bytes",
                              "nodeType": "ElementaryTypeName",
                              "src": "3625:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_storage_ptr",
                                "typeString": "bytes"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 83,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "condition": {
                                "argumentTypes": null,
                                "id": 66,
                                "name": "shouldSwapExactTokensForTokens",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 50,
                                "src": "3686:30:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseExpression": {
                                "argumentTypes": null,
                                "id": 68,
                                "name": "SWAP_TOKENS_FOR_EXACT_TOKENS",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 11,
                                "src": "3750:28:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_string_memory_ptr",
                                  "typeString": "string memory"
                                }
                              },
                              "id": 69,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "Conditional",
                              "src": "3686:92:0",
                              "trueExpression": {
                                "argumentTypes": null,
                                "id": 67,
                                "name": "SWAP_EXACT_TOKENS_FOR_TOKENS",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 8,
                                "src": "3719:28:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_string_memory_ptr",
                                  "typeString": "string memory"
                                }
                              },
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "condition": {
                                "argumentTypes": null,
                                "id": 70,
                                "name": "shouldSwapExactTokensForTokens",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 50,
                                "src": "3792:30:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseExpression": {
                                "argumentTypes": null,
                                "id": 72,
                                "name": "_destinationQuantity",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 33,
                                "src": "3843:20:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 73,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "Conditional",
                              "src": "3792:71:0",
                              "trueExpression": {
                                "argumentTypes": null,
                                "id": 71,
                                "name": "_sourceQuantity",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 31,
                                "src": "3825:15:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "condition": {
                                "argumentTypes": null,
                                "id": 74,
                                "name": "shouldSwapExactTokensForTokens",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 50,
                                "src": "3877:30:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseExpression": {
                                "argumentTypes": null,
                                "id": 76,
                                "name": "_sourceQuantity",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 31,
                                "src": "3933:15:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 77,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "Conditional",
                              "src": "3877:71:0",
                              "trueExpression": {
                                "argumentTypes": null,
                                "id": 75,
                                "name": "_destinationQuantity",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 33,
                                "src": "3910:20:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 78,
                              "name": "path",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 48,
                              "src": "3962:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                                "typeString": "address[] memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 79,
                              "name": "_destinationAddress",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 29,
                              "src": "3980:19:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 80,
                                "name": "block",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -4,
                                "src": "4013:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_block",
                                  "typeString": "block"
                                }
                              },
                              "id": 81,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "timestamp",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "4013:15:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                                "typeString": "address[] memory"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 64,
                              "name": "abi",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -1,
                              "src": "3649:3:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_abi",
                                "typeString": "abi"
                              }
                            },
                            "id": 65,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "memberName": "encodeWithSignature",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "3649:23:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                              "typeString": "function (string memory) pure returns (bytes memory)"
                            }
                          },
                          "id": 82,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3649:389:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "3625:413:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "id": 84,
                              "name": "router",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5,
                              "src": "4056:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 85,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "4064:1:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            },
                            {
                              "argumentTypes": null,
                              "id": 86,
                              "name": "callData",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 63,
                              "src": "4067:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "id": 87,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "4055:21:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_address_$_t_rational_0_by_1_$_t_bytes_memory_ptr_$",
                            "typeString": "tuple(address,int_const 0,bytes memory)"
                          }
                        },
                        "functionReturnParameters": 43,
                        "id": 88,
                        "nodeType": "Return",
                        "src": "4048:28:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 23,
                    "nodeType": "StructuredDocumentation",
                    "src": "2196:943:0",
                    "text": " Return calldata for Uniswap V2 Router02. Trade paths and bool to select trade function are encoded in the arbitrary data parameter.\n Note: When selecting the swap for exact tokens function, _sourceQuantity is defined as the max token quantity you are willing to trade, and\n _minDestinationQuantity is the exact quantity of token you are receiving.\n @param  _destinationAddress       Address that assets should be transferred to\n @param  _sourceQuantity           Fixed/Max amount of source token to sell\n @param  _destinationQuantity      Min/Fixed amount of destination token to buy\n @param  _data                     Arbitrary bytes containing trade path and bool to determine function string\n @return address                   Target contract address\n @return uint256                   Call value\n @return bytes                     Trade calldata"
                  },
                  "functionSelector": "e171fcab",
                  "id": 90,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "getTradeCalldata",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 36,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 25,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 90,
                        "src": "3179:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3179:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 27,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 90,
                        "src": "3215:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 26,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3215:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 29,
                        "mutability": "mutable",
                        "name": "_destinationAddress",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 90,
                        "src": "3256:27:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 28,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3256:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 31,
                        "mutability": "mutable",
                        "name": "_sourceQuantity",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 90,
                        "src": "3293:23:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 30,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3293:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 33,
                        "mutability": "mutable",
                        "name": "_destinationQuantity",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 90,
                        "src": "3326:28:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 32,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3326:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 35,
                        "mutability": "mutable",
                        "name": "_data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 90,
                        "src": "3364:18:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 34,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "3364:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3169:219:0"
                  },
                  "returnParameters": {
                    "id": 43,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 38,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 90,
                        "src": "3436:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 37,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3436:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 40,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 90,
                        "src": "3445:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 39,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3445:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 42,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 90,
                        "src": "3454:12:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 41,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "3454:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3435:32:0"
                  },
                  "scope": 160,
                  "src": "3144:939:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 131,
                    "nodeType": "Block",
                    "src": "4729:167:0",
                    "statements": [
                      {
                        "assignments": [
                          106
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 106,
                            "mutability": "mutable",
                            "name": "path",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 131,
                            "src": "4739:21:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                              "typeString": "address[]"
                            },
                            "typeName": {
                              "baseType": {
                                "id": 104,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "4739:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "id": 105,
                              "length": null,
                              "nodeType": "ArrayTypeName",
                              "src": "4739:9:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                                "typeString": "address[]"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 112,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "32",
                              "id": 110,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "4777:1:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_2_by_1",
                                "typeString": "int_const 2"
                              },
                              "value": "2"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_2_by_1",
                                "typeString": "int_const 2"
                              }
                            ],
                            "id": 109,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "NewExpression",
                            "src": "4763:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_address_$dyn_memory_ptr_$",
                              "typeString": "function (uint256) pure returns (address[] memory)"
                            },
                            "typeName": {
                              "baseType": {
                                "id": 107,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "4767:7:0",
                                "stateMutability": "nonpayable",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "id": 108,
                              "length": null,
                              "nodeType": "ArrayTypeName",
                              "src": "4767:9:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                                "typeString": "address[]"
                              }
                            }
                          },
                          "id": 111,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4763:16:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                            "typeString": "address[] memory"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "4739:40:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 117,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 113,
                              "name": "path",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 106,
                              "src": "4789:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                                "typeString": "address[] memory"
                              }
                            },
                            "id": 115,
                            "indexExpression": {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 114,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "4794:1:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "4789:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 116,
                            "name": "_sourceToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 93,
                            "src": "4799:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "4789:22:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 118,
                        "nodeType": "ExpressionStatement",
                        "src": "4789:22:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 123,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 119,
                              "name": "path",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 106,
                              "src": "4821:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                                "typeString": "address[] memory"
                              }
                            },
                            "id": 121,
                            "indexExpression": {
                              "argumentTypes": null,
                              "hexValue": "31",
                              "id": 120,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "4826:1:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_1_by_1",
                                "typeString": "int_const 1"
                              },
                              "value": "1"
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "4821:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 122,
                            "name": "_destinationToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 95,
                            "src": "4831:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "4821:27:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 124,
                        "nodeType": "ExpressionStatement",
                        "src": "4821:27:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 127,
                              "name": "path",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 106,
                              "src": "4876:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                                "typeString": "address[] memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 128,
                              "name": "_fixIn",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 97,
                              "src": "4882:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                                "typeString": "address[] memory"
                              },
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 125,
                              "name": "abi",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -1,
                              "src": "4865:3:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_abi",
                                "typeString": "abi"
                              }
                            },
                            "id": 126,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "memberName": "encode",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "4865:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$",
                              "typeString": "function () pure returns (bytes memory)"
                            }
                          },
                          "id": 129,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4865:24:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          }
                        },
                        "functionReturnParameters": 101,
                        "id": 130,
                        "nodeType": "Return",
                        "src": "4858:31:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 91,
                    "nodeType": "StructuredDocumentation",
                    "src": "4089:481:0",
                    "text": " Generate data parameter to be passed to `getTradeCallData`. Returns encoded trade paths and bool to select trade function.\n @param _sourceToken          Address of the source token to be sold\n @param _destinationToken     Address of the destination token to buy\n @param _fixIn                Boolean representing if input tokens amount is fixed\n @return bytes                Data parameter to be passed to `getTradeCallData`"
                  },
                  "functionSelector": "47e6fbc0",
                  "id": 132,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "generateDataParam",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 98,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 93,
                        "mutability": "mutable",
                        "name": "_sourceToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 132,
                        "src": "4602:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 92,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4602:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 95,
                        "mutability": "mutable",
                        "name": "_destinationToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 132,
                        "src": "4624:25:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 94,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4624:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 97,
                        "mutability": "mutable",
                        "name": "_fixIn",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 132,
                        "src": "4651:11:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 96,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "4651:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4601:62:0"
                  },
                  "returnParameters": {
                    "id": 101,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 100,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 132,
                        "src": "4711:12:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 99,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "4711:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4710:14:0"
                  },
                  "scope": 160,
                  "src": "4575:321:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 140,
                    "nodeType": "Block",
                    "src": "5162:30:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 138,
                          "name": "router",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5,
                          "src": "5179:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "functionReturnParameters": 137,
                        "id": 139,
                        "nodeType": "Return",
                        "src": "5172:13:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 133,
                    "nodeType": "StructuredDocumentation",
                    "src": "4902:201:0",
                    "text": " Returns the address to approve source tokens to for trading. This is the Uniswap router address\n @return address             Address of the contract to approve tokens to"
                  },
                  "functionSelector": "334fc289",
                  "id": 141,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "getSpender",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 134,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "5127:2:0"
                  },
                  "returnParameters": {
                    "id": 137,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 136,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 141,
                        "src": "5153:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 135,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "5153:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5152:9:0"
                  },
                  "scope": 160,
                  "src": "5108:84:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 158,
                    "nodeType": "Block",
                    "src": "5537:74:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 154,
                              "name": "_path",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 145,
                              "src": "5565:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                                "typeString": "address[] memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 155,
                              "name": "_shouldSwapExactTokensForTokens",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 147,
                              "src": "5572:31:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                                "typeString": "address[] memory"
                              },
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 152,
                              "name": "abi",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -1,
                              "src": "5554:3:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_abi",
                                "typeString": "abi"
                              }
                            },
                            "id": 153,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "memberName": "encode",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "5554:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$",
                              "typeString": "function () pure returns (bytes memory)"
                            }
                          },
                          "id": 156,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5554:50:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          }
                        },
                        "functionReturnParameters": 151,
                        "id": 157,
                        "nodeType": "Return",
                        "src": "5547:57:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 142,
                    "nodeType": "StructuredDocumentation",
                    "src": "5198:203:0",
                    "text": " Helper that returns the encoded data of trade path and boolean indicating the Uniswap function to use\n @return bytes               Encoded data used for trading on Uniswap"
                  },
                  "functionSelector": "2173867a",
                  "id": 159,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "getUniswapExchangeData",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 148,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 145,
                        "mutability": "mutable",
                        "name": "_path",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 159,
                        "src": "5438:22:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                          "typeString": "address[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 143,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "5438:7:0",
                            "stateMutability": "nonpayable",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "id": 144,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "5438:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                            "typeString": "address[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 147,
                        "mutability": "mutable",
                        "name": "_shouldSwapExactTokensForTokens",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 159,
                        "src": "5462:36:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 146,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "5462:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5437:62:0"
                  },
                  "returnParameters": {
                    "id": 151,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 150,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 159,
                        "src": "5523:12:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 149,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "5523:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5522:14:0"
                  },
                  "scope": 160,
                  "src": "5406:205:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 161,
              "src": "1256:4357:0"
            }
          ],
          "src": "655:4958:0"
        },
        "id": 0
      }
    }
  }
}
