{
  "contractName": "SafeERC20",
  "abi": [],
  "metadata": "{\"compiler\":{\"version\":\"0.4.24+commit.e67f0147\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"@aragon/os/contracts/common/SafeERC20.sol\":\"SafeERC20\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@aragon/os/contracts/common/SafeERC20.sol\":{\"keccak256\":\"0xd251a1207e1faa4c41500bf927310bb739b1fbc0bf880f236f8e0a9236d6a03a\",\"urls\":[\"bzzr://b2d0f5981950b4e90eaee65c85050ac4f86a79f579f4ef38e6b281c0de980b2b\"]},\"@aragon/os/contracts/lib/token/ERC20.sol\":{\"keccak256\":\"0xa2e319fde92f9e70912f09bf6e99bbf8b9b798961d54ffcba59d347d37bde1b7\",\"urls\":[\"bzzr://8c9a4aec8e185884f26ffb125975bd52c2363359b9adff481649c59cfe15660f\"]}},\"version\":1}",
  "bytecode": "0x604c602c600b82828239805160001a60731460008114601c57601e565bfe5b5030600052607381538281f30073000000000000000000000000000000000000000030146080604052600080fd00a165627a7a72305820b186b2a41e82721bf2d14c673b215e901a52478a78541d6a0f59a06a73352e030029",
  "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fd00a165627a7a72305820b186b2a41e82721bf2d14c673b215e901a52478a78541d6a0f59a06a73352e030029",
  "sourceMap": "376:5675:34:-;;132:2:-1;166:7;155:9;146:7;137:37;252:7;246:14;243:1;238:23;232:4;229:33;270:1;265:20;;;;222:63;;265:20;274:9;222:63;;298:9;295:1;288:20;328:4;319:7;311:22;352:7;343;336:24",
  "deployedSourceMap": "376:5675:34:-;;;;;;;;",
  "source": "// Inspired by AdEx (https://github.com/AdExNetwork/adex-protocol-eth/blob/b9df617829661a7518ee10f4cb6c4108659dd6d5/contracts/libs/SafeERC20.sol)\n// and 0x (https://github.com/0xProject/0x-monorepo/blob/737d1dc54d72872e24abce5a1dbe1b66d35fa21a/contracts/protocol/contracts/protocol/AssetProxy/ERC20Proxy.sol#L143)\n\npragma solidity ^0.4.24;\n\nimport \"../lib/token/ERC20.sol\";\n\n\nlibrary SafeERC20 {\n    // Before 0.5, solidity has a mismatch between `address.transfer()` and `token.transfer()`:\n    // https://github.com/ethereum/solidity/issues/3544\n    bytes4 private constant TRANSFER_SELECTOR = 0xa9059cbb;\n\n    string private constant ERROR_TOKEN_BALANCE_REVERTED = \"SAFE_ERC_20_BALANCE_REVERTED\";\n    string private constant ERROR_TOKEN_ALLOWANCE_REVERTED = \"SAFE_ERC_20_ALLOWANCE_REVERTED\";\n\n    function invokeAndCheckSuccess(address _addr, bytes memory _calldata)\n        private\n        returns (bool)\n    {\n        bool ret;\n        assembly {\n            let ptr := mload(0x40)    // free memory pointer\n\n            let success := call(\n                gas,                  // forward all gas\n                _addr,                // address\n                0,                    // no value\n                add(_calldata, 0x20), // calldata start\n                mload(_calldata),     // calldata length\n                ptr,                  // write output over free memory\n                0x20                  // uint256 return\n            )\n\n            if gt(success, 0) {\n                // Check number of bytes returned from last function call\n                switch returndatasize\n\n                // No bytes returned: assume success\n                case 0 {\n                    ret := 1\n                }\n\n                // 32 bytes returned: check if non-zero\n                case 0x20 {\n                    // Only return success if returned data was true\n                    // Already have output in ptr\n                    ret := eq(mload(ptr), 1)\n                }\n\n                // Not sure what was returned: don't mark as success\n                default { }\n            }\n        }\n        return ret;\n    }\n\n    function staticInvoke(address _addr, bytes memory _calldata)\n        private\n        view\n        returns (bool, uint256)\n    {\n        bool success;\n        uint256 ret;\n        assembly {\n            let ptr := mload(0x40)    // free memory pointer\n\n            success := staticcall(\n                gas,                  // forward all gas\n                _addr,                // address\n                add(_calldata, 0x20), // calldata start\n                mload(_calldata),     // calldata length\n                ptr,                  // write output over free memory\n                0x20                  // uint256 return\n            )\n\n            if gt(success, 0) {\n                ret := mload(ptr)\n            }\n        }\n        return (success, ret);\n    }\n\n    /**\n    * @dev Same as a standards-compliant ERC20.transfer() that never reverts (returns false).\n    *      Note that this makes an external call to the token.\n    */\n    function safeTransfer(ERC20 _token, address _to, uint256 _amount) internal returns (bool) {\n        bytes memory transferCallData = abi.encodeWithSelector(\n            TRANSFER_SELECTOR,\n            _to,\n            _amount\n        );\n        return invokeAndCheckSuccess(_token, transferCallData);\n    }\n\n    /**\n    * @dev Same as a standards-compliant ERC20.transferFrom() that never reverts (returns false).\n    *      Note that this makes an external call to the token.\n    */\n    function safeTransferFrom(ERC20 _token, address _from, address _to, uint256 _amount) internal returns (bool) {\n        bytes memory transferFromCallData = abi.encodeWithSelector(\n            _token.transferFrom.selector,\n            _from,\n            _to,\n            _amount\n        );\n        return invokeAndCheckSuccess(_token, transferFromCallData);\n    }\n\n    /**\n    * @dev Same as a standards-compliant ERC20.approve() that never reverts (returns false).\n    *      Note that this makes an external call to the token.\n    */\n    function safeApprove(ERC20 _token, address _spender, uint256 _amount) internal returns (bool) {\n        bytes memory approveCallData = abi.encodeWithSelector(\n            _token.approve.selector,\n            _spender,\n            _amount\n        );\n        return invokeAndCheckSuccess(_token, approveCallData);\n    }\n\n    /**\n    * @dev Static call into ERC20.balanceOf().\n    * Reverts if the call fails for some reason (should never fail).\n    */\n    function staticBalanceOf(ERC20 _token, address _owner) internal view returns (uint256) {\n        bytes memory balanceOfCallData = abi.encodeWithSelector(\n            _token.balanceOf.selector,\n            _owner\n        );\n\n        (bool success, uint256 tokenBalance) = staticInvoke(_token, balanceOfCallData);\n        require(success, ERROR_TOKEN_BALANCE_REVERTED);\n\n        return tokenBalance;\n    }\n\n    /**\n    * @dev Static call into ERC20.allowance().\n    * Reverts if the call fails for some reason (should never fail).\n    */\n    function staticAllowance(ERC20 _token, address _owner, address _spender) internal view returns (uint256) {\n        bytes memory allowanceCallData = abi.encodeWithSelector(\n            _token.allowance.selector,\n            _owner,\n            _spender\n        );\n\n        (bool success, uint256 allowance) = staticInvoke(_token, allowanceCallData);\n        require(success, ERROR_TOKEN_ALLOWANCE_REVERTED);\n\n        return allowance;\n    }\n\n    /**\n    * @dev Static call into ERC20.totalSupply().\n    * Reverts if the call fails for some reason (should never fail).\n    */\n    function staticTotalSupply(ERC20 _token) internal view returns (uint256) {\n        bytes memory totalSupplyCallData = abi.encodeWithSelector(_token.totalSupply.selector);\n\n        (bool success, uint256 totalSupply) = staticInvoke(_token, totalSupplyCallData);\n        require(success, ERROR_TOKEN_ALLOWANCE_REVERTED);\n\n        return totalSupply;\n    }\n}\n",
  "sourcePath": "@aragon/os/contracts/common/SafeERC20.sol",
  "ast": {
    "absolutePath": "@aragon/os/contracts/common/SafeERC20.sol",
    "exportedSymbols": {
      "SafeERC20": [
        6784
      ]
    },
    "id": 6785,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 6541,
        "literals": [
          "solidity",
          "^",
          "0.4",
          ".24"
        ],
        "nodeType": "PragmaDirective",
        "src": "315:24:34"
      },
      {
        "absolutePath": "@aragon/os/contracts/lib/token/ERC20.sol",
        "file": "../lib/token/ERC20.sol",
        "id": 6542,
        "nodeType": "ImportDirective",
        "scope": 6785,
        "sourceUnit": 9926,
        "src": "341:32:34",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "baseContracts": [],
        "contractDependencies": [],
        "contractKind": "library",
        "documentation": null,
        "fullyImplemented": true,
        "id": 6784,
        "linearizedBaseContracts": [
          6784
        ],
        "name": "SafeERC20",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": true,
            "id": 6545,
            "name": "TRANSFER_SELECTOR",
            "nodeType": "VariableDeclaration",
            "scope": 6784,
            "src": "552:54:34",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_bytes4",
              "typeString": "bytes4"
            },
            "typeName": {
              "id": 6543,
              "name": "bytes4",
              "nodeType": "ElementaryTypeName",
              "src": "552:6:34",
              "typeDescriptions": {
                "typeIdentifier": "t_bytes4",
                "typeString": "bytes4"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "30786139303539636262",
              "id": 6544,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "596:10:34",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_rational_2835717307_by_1",
                "typeString": "int_const 2835717307"
              },
              "value": "0xa9059cbb"
            },
            "visibility": "private"
          },
          {
            "constant": true,
            "id": 6548,
            "name": "ERROR_TOKEN_BALANCE_REVERTED",
            "nodeType": "VariableDeclaration",
            "scope": 6784,
            "src": "613:85:34",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_string_memory",
              "typeString": "string"
            },
            "typeName": {
              "id": 6546,
              "name": "string",
              "nodeType": "ElementaryTypeName",
              "src": "613:6:34",
              "typeDescriptions": {
                "typeIdentifier": "t_string_storage_ptr",
                "typeString": "string"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "534146455f4552435f32305f42414c414e43455f5245564552544544",
              "id": 6547,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "string",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "668:30:34",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_stringliteral_e0d6f1573408f815b546b777c74de94d1685d3d390fbf5b918b2e1339b2ed2e7",
                "typeString": "literal_string \"SAFE_ERC_20_BALANCE_REVERTED\""
              },
              "value": "SAFE_ERC_20_BALANCE_REVERTED"
            },
            "visibility": "private"
          },
          {
            "constant": true,
            "id": 6551,
            "name": "ERROR_TOKEN_ALLOWANCE_REVERTED",
            "nodeType": "VariableDeclaration",
            "scope": 6784,
            "src": "704:89:34",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_string_memory",
              "typeString": "string"
            },
            "typeName": {
              "id": 6549,
              "name": "string",
              "nodeType": "ElementaryTypeName",
              "src": "704:6:34",
              "typeDescriptions": {
                "typeIdentifier": "t_string_storage_ptr",
                "typeString": "string"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "534146455f4552435f32305f414c4c4f57414e43455f5245564552544544",
              "id": 6550,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "string",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "761:32:34",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_stringliteral_73432bcf14a5ead3ed39eed7e97b924b49d284054d4f8b41ba74ac90002bc239",
                "typeString": "literal_string \"SAFE_ERC_20_ALLOWANCE_REVERTED\""
              },
              "value": "SAFE_ERC_20_ALLOWANCE_REVERTED"
            },
            "visibility": "private"
          },
          {
            "body": {
              "id": 6566,
              "nodeType": "Block",
              "src": "913:1229:34",
              "statements": [
                {
                  "assignments": [],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 6561,
                      "name": "ret",
                      "nodeType": "VariableDeclaration",
                      "scope": 6567,
                      "src": "923:8:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "typeName": {
                        "id": 6560,
                        "name": "bool",
                        "nodeType": "ElementaryTypeName",
                        "src": "923:4:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 6562,
                  "initialValue": null,
                  "nodeType": "VariableDeclarationStatement",
                  "src": "923:8:34"
                },
                {
                  "externalReferences": [
                    {
                      "_calldata": {
                        "declaration": 6555,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "1281:9:34",
                        "valueSize": 1
                      }
                    },
                    {
                      "_calldata": {
                        "declaration": 6555,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "1223:9:34",
                        "valueSize": 1
                      }
                    },
                    {
                      "ret": {
                        "declaration": 6561,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "1701:3:34",
                        "valueSize": 1
                      }
                    },
                    {
                      "_addr": {
                        "declaration": 6553,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "1120:5:34",
                        "valueSize": 1
                      }
                    },
                    {
                      "ret": {
                        "declaration": 6561,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "1952:3:34",
                        "valueSize": 1
                      }
                    }
                  ],
                  "id": 6563,
                  "nodeType": "InlineAssembly",
                  "operations": "{\n    let ptr := mload(0x40)\n    let success := call(gas(), _addr, 0, add(_calldata, 0x20), mload(_calldata), ptr, 0x20)\n    if gt(success, 0)\n    {\n        switch returndatasize()\n        case 0 {\n            ret := 1\n        }\n        case 0x20 {\n            ret := eq(mload(ptr), 1)\n        }\n        default {\n        }\n    }\n}",
                  "src": "941:1190:34"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 6564,
                    "name": "ret",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 6561,
                    "src": "2132:3:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 6559,
                  "id": 6565,
                  "nodeType": "Return",
                  "src": "2125:10:34"
                }
              ]
            },
            "documentation": null,
            "id": 6567,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": false,
            "modifiers": [],
            "name": "invokeAndCheckSuccess",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 6556,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6553,
                  "name": "_addr",
                  "nodeType": "VariableDeclaration",
                  "scope": 6567,
                  "src": "831:13:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6552,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "831:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6555,
                  "name": "_calldata",
                  "nodeType": "VariableDeclaration",
                  "scope": 6567,
                  "src": "846:22:34",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 6554,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "846:5:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "830:39:34"
            },
            "payable": false,
            "returnParameters": {
              "id": 6559,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6558,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 6567,
                  "src": "903:4:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 6557,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "903:4:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "902:6:34"
            },
            "scope": 6784,
            "src": "800:1342:34",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "private"
          },
          {
            "body": {
              "id": 6589,
              "nodeType": "Block",
              "src": "2274:648:34",
              "statements": [
                {
                  "assignments": [],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 6579,
                      "name": "success",
                      "nodeType": "VariableDeclaration",
                      "scope": 6590,
                      "src": "2284:12:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "typeName": {
                        "id": 6578,
                        "name": "bool",
                        "nodeType": "ElementaryTypeName",
                        "src": "2284:4:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 6580,
                  "initialValue": null,
                  "nodeType": "VariableDeclarationStatement",
                  "src": "2284:12:34"
                },
                {
                  "assignments": [],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 6582,
                      "name": "ret",
                      "nodeType": "VariableDeclaration",
                      "scope": 6590,
                      "src": "2306:11:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 6581,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "2306:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 6583,
                  "initialValue": null,
                  "nodeType": "VariableDeclarationStatement",
                  "src": "2306:11:34"
                },
                {
                  "externalReferences": [
                    {
                      "ret": {
                        "declaration": 6582,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "2844:3:34",
                        "valueSize": 1
                      }
                    },
                    {
                      "_calldata": {
                        "declaration": 6571,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "2619:9:34",
                        "valueSize": 1
                      }
                    },
                    {
                      "_calldata": {
                        "declaration": 6571,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "2561:9:34",
                        "valueSize": 1
                      }
                    },
                    {
                      "success": {
                        "declaration": 6579,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "2412:7:34",
                        "valueSize": 1
                      }
                    },
                    {
                      "success": {
                        "declaration": 6579,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "2814:7:34",
                        "valueSize": 1
                      }
                    },
                    {
                      "_addr": {
                        "declaration": 6569,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "2508:5:34",
                        "valueSize": 1
                      }
                    }
                  ],
                  "id": 6584,
                  "nodeType": "InlineAssembly",
                  "operations": "{\n    let ptr := mload(0x40)\n    success := staticcall(gas(), _addr, add(_calldata, 0x20), mload(_calldata), ptr, 0x20)\n    if gt(success, 0)\n    {\n        ret := mload(ptr)\n    }\n}",
                  "src": "2327:573:34"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "components": [
                      {
                        "argumentTypes": null,
                        "id": 6585,
                        "name": "success",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6579,
                        "src": "2902:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6586,
                        "name": "ret",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6582,
                        "src": "2911:3:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "id": 6587,
                    "isConstant": false,
                    "isInlineArray": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "TupleExpression",
                    "src": "2901:14:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$",
                      "typeString": "tuple(bool,uint256)"
                    }
                  },
                  "functionReturnParameters": 6577,
                  "id": 6588,
                  "nodeType": "Return",
                  "src": "2894:21:34"
                }
              ]
            },
            "documentation": null,
            "id": 6590,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "staticInvoke",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 6572,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6569,
                  "name": "_addr",
                  "nodeType": "VariableDeclaration",
                  "scope": 6590,
                  "src": "2170:13:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6568,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2170:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6571,
                  "name": "_calldata",
                  "nodeType": "VariableDeclaration",
                  "scope": 6590,
                  "src": "2185:22:34",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 6570,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "2185:5:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2169:39:34"
            },
            "payable": false,
            "returnParameters": {
              "id": 6577,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6574,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 6590,
                  "src": "2255:4:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 6573,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "2255:4:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6576,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 6590,
                  "src": "2261:7:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6575,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2261:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2254:15:34"
            },
            "scope": 6784,
            "src": "2148:774:34",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "private"
          },
          {
            "body": {
              "id": 6615,
              "nodeType": "Block",
              "src": "3190:214:34",
              "statements": [
                {
                  "assignments": [
                    6602
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 6602,
                      "name": "transferCallData",
                      "nodeType": "VariableDeclaration",
                      "scope": 6616,
                      "src": "3200:29:34",
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes_memory_ptr",
                        "typeString": "bytes"
                      },
                      "typeName": {
                        "id": 6601,
                        "name": "bytes",
                        "nodeType": "ElementaryTypeName",
                        "src": "3200:5:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_storage_ptr",
                          "typeString": "bytes"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 6609,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 6605,
                        "name": "TRANSFER_SELECTOR",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6545,
                        "src": "3268:17:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6606,
                        "name": "_to",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6594,
                        "src": "3299:3:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6607,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6596,
                        "src": "3316:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 6603,
                        "name": "abi",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10391,
                        "src": "3232:3:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_abi",
                          "typeString": "abi"
                        }
                      },
                      "id": 6604,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "memberName": "encodeWithSelector",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "3232:22:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                        "typeString": "function (bytes4) pure returns (bytes memory)"
                      }
                    },
                    "id": 6608,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3232:101:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_memory_ptr",
                      "typeString": "bytes memory"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "3200:133:34"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 6611,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6592,
                        "src": "3372:6:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ERC20_$9925",
                          "typeString": "contract ERC20"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6612,
                        "name": "transferCallData",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6602,
                        "src": "3380:16:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_contract$_ERC20_$9925",
                          "typeString": "contract ERC20"
                        },
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "id": 6610,
                      "name": "invokeAndCheckSuccess",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 6567,
                      "src": "3350:21:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$_t_bool_$",
                        "typeString": "function (address,bytes memory) returns (bool)"
                      }
                    },
                    "id": 6613,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3350:47:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 6600,
                  "id": 6614,
                  "nodeType": "Return",
                  "src": "3343:54:34"
                }
              ]
            },
            "documentation": "@dev Same as a standards-compliant ERC20.transfer() that never reverts (returns false).\n     Note that this makes an external call to the token.",
            "id": 6616,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": false,
            "modifiers": [],
            "name": "safeTransfer",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 6597,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6592,
                  "name": "_token",
                  "nodeType": "VariableDeclaration",
                  "scope": 6616,
                  "src": "3122:12:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20_$9925",
                    "typeString": "contract ERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 6591,
                    "name": "ERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 9925,
                    "src": "3122:5:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20_$9925",
                      "typeString": "contract ERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6594,
                  "name": "_to",
                  "nodeType": "VariableDeclaration",
                  "scope": 6616,
                  "src": "3136:11:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6593,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3136:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6596,
                  "name": "_amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 6616,
                  "src": "3149:15:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6595,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3149:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3121:44:34"
            },
            "payable": false,
            "returnParameters": {
              "id": 6600,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6599,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 6616,
                  "src": "3184:4:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 6598,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "3184:4:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3183:6:34"
            },
            "scope": 6784,
            "src": "3100:304:34",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 6646,
              "nodeType": "Block",
              "src": "3695:252:34",
              "statements": [
                {
                  "assignments": [
                    6630
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 6630,
                      "name": "transferFromCallData",
                      "nodeType": "VariableDeclaration",
                      "scope": 6647,
                      "src": "3705:33:34",
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes_memory_ptr",
                        "typeString": "bytes"
                      },
                      "typeName": {
                        "id": 6629,
                        "name": "bytes",
                        "nodeType": "ElementaryTypeName",
                        "src": "3705:5:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_storage_ptr",
                          "typeString": "bytes"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 6640,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 6633,
                            "name": "_token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6618,
                            "src": "3777:6:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ERC20_$9925",
                              "typeString": "contract ERC20"
                            }
                          },
                          "id": 6634,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "transferFrom",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 9908,
                          "src": "3777:19:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$_t_bool_$",
                            "typeString": "function (address,address,uint256) external returns (bool)"
                          }
                        },
                        "id": 6635,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "selector",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "3777:28:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6636,
                        "name": "_from",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6620,
                        "src": "3819:5:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6637,
                        "name": "_to",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6622,
                        "src": "3838:3:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6638,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6624,
                        "src": "3855:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 6631,
                        "name": "abi",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10391,
                        "src": "3741:3:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_abi",
                          "typeString": "abi"
                        }
                      },
                      "id": 6632,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "memberName": "encodeWithSelector",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "3741:22:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                        "typeString": "function (bytes4) pure returns (bytes memory)"
                      }
                    },
                    "id": 6639,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3741:131:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_memory_ptr",
                      "typeString": "bytes memory"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "3705:167:34"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 6642,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6618,
                        "src": "3911:6:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ERC20_$9925",
                          "typeString": "contract ERC20"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6643,
                        "name": "transferFromCallData",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6630,
                        "src": "3919:20:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_contract$_ERC20_$9925",
                          "typeString": "contract ERC20"
                        },
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "id": 6641,
                      "name": "invokeAndCheckSuccess",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 6567,
                      "src": "3889:21:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$_t_bool_$",
                        "typeString": "function (address,bytes memory) returns (bool)"
                      }
                    },
                    "id": 6644,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3889:51:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 6628,
                  "id": 6645,
                  "nodeType": "Return",
                  "src": "3882:58:34"
                }
              ]
            },
            "documentation": "@dev Same as a standards-compliant ERC20.transferFrom() that never reverts (returns false).\n     Note that this makes an external call to the token.",
            "id": 6647,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": false,
            "modifiers": [],
            "name": "safeTransferFrom",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 6625,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6618,
                  "name": "_token",
                  "nodeType": "VariableDeclaration",
                  "scope": 6647,
                  "src": "3612:12:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20_$9925",
                    "typeString": "contract ERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 6617,
                    "name": "ERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 9925,
                    "src": "3612:5:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20_$9925",
                      "typeString": "contract ERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6620,
                  "name": "_from",
                  "nodeType": "VariableDeclaration",
                  "scope": 6647,
                  "src": "3626:13:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6619,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3626:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6622,
                  "name": "_to",
                  "nodeType": "VariableDeclaration",
                  "scope": 6647,
                  "src": "3641:11:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6621,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3641:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6624,
                  "name": "_amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 6647,
                  "src": "3654:15:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6623,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3654:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3611:59:34"
            },
            "payable": false,
            "returnParameters": {
              "id": 6628,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6627,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 6647,
                  "src": "3689:4:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 6626,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "3689:4:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3688:6:34"
            },
            "scope": 6784,
            "src": "3586:361:34",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 6674,
              "nodeType": "Block",
              "src": "4218:223:34",
              "statements": [
                {
                  "assignments": [
                    6659
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 6659,
                      "name": "approveCallData",
                      "nodeType": "VariableDeclaration",
                      "scope": 6675,
                      "src": "4228:28:34",
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes_memory_ptr",
                        "typeString": "bytes"
                      },
                      "typeName": {
                        "id": 6658,
                        "name": "bytes",
                        "nodeType": "ElementaryTypeName",
                        "src": "4228:5:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_storage_ptr",
                          "typeString": "bytes"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 6668,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 6662,
                            "name": "_token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6649,
                            "src": "4295:6:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ERC20_$9925",
                              "typeString": "contract ERC20"
                            }
                          },
                          "id": 6663,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "approve",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 9897,
                          "src": "4295:14:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                            "typeString": "function (address,uint256) external returns (bool)"
                          }
                        },
                        "id": 6664,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "selector",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "4295:23:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6665,
                        "name": "_spender",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6651,
                        "src": "4332:8:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6666,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6653,
                        "src": "4354:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 6660,
                        "name": "abi",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10391,
                        "src": "4259:3:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_abi",
                          "typeString": "abi"
                        }
                      },
                      "id": 6661,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "memberName": "encodeWithSelector",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "4259:22:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                        "typeString": "function (bytes4) pure returns (bytes memory)"
                      }
                    },
                    "id": 6667,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4259:112:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_memory_ptr",
                      "typeString": "bytes memory"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4228:143:34"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 6670,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6649,
                        "src": "4410:6:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ERC20_$9925",
                          "typeString": "contract ERC20"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6671,
                        "name": "approveCallData",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6659,
                        "src": "4418:15:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_contract$_ERC20_$9925",
                          "typeString": "contract ERC20"
                        },
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "id": 6669,
                      "name": "invokeAndCheckSuccess",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 6567,
                      "src": "4388:21:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$_t_bool_$",
                        "typeString": "function (address,bytes memory) returns (bool)"
                      }
                    },
                    "id": 6672,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4388:46:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 6657,
                  "id": 6673,
                  "nodeType": "Return",
                  "src": "4381:53:34"
                }
              ]
            },
            "documentation": "@dev Same as a standards-compliant ERC20.approve() that never reverts (returns false).\n     Note that this makes an external call to the token.",
            "id": 6675,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": false,
            "modifiers": [],
            "name": "safeApprove",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 6654,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6649,
                  "name": "_token",
                  "nodeType": "VariableDeclaration",
                  "scope": 6675,
                  "src": "4145:12:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20_$9925",
                    "typeString": "contract ERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 6648,
                    "name": "ERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 9925,
                    "src": "4145:5:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20_$9925",
                      "typeString": "contract ERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6651,
                  "name": "_spender",
                  "nodeType": "VariableDeclaration",
                  "scope": 6675,
                  "src": "4159:16:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6650,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4159:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6653,
                  "name": "_amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 6675,
                  "src": "4177:15:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6652,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "4177:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4144:49:34"
            },
            "payable": false,
            "returnParameters": {
              "id": 6657,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6656,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 6675,
                  "src": "4212:4:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 6655,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "4212:4:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4211:6:34"
            },
            "scope": 6784,
            "src": "4124:317:34",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 6710,
              "nodeType": "Block",
              "src": "4665:316:34",
              "statements": [
                {
                  "assignments": [
                    6685
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 6685,
                      "name": "balanceOfCallData",
                      "nodeType": "VariableDeclaration",
                      "scope": 6711,
                      "src": "4675:30:34",
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes_memory_ptr",
                        "typeString": "bytes"
                      },
                      "typeName": {
                        "id": 6684,
                        "name": "bytes",
                        "nodeType": "ElementaryTypeName",
                        "src": "4675:5:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_storage_ptr",
                          "typeString": "bytes"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 6693,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 6688,
                            "name": "_token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6677,
                            "src": "4744:6:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ERC20_$9925",
                              "typeString": "contract ERC20"
                            }
                          },
                          "id": 6689,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "balanceOf",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 9870,
                          "src": "4744:16:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                            "typeString": "function (address) view external returns (uint256)"
                          }
                        },
                        "id": 6690,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "selector",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "4744:25:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6691,
                        "name": "_owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6679,
                        "src": "4783:6:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 6686,
                        "name": "abi",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10391,
                        "src": "4708:3:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_abi",
                          "typeString": "abi"
                        }
                      },
                      "id": 6687,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "memberName": "encodeWithSelector",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "4708:22:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                        "typeString": "function (bytes4) pure returns (bytes memory)"
                      }
                    },
                    "id": 6692,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4708:91:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_memory_ptr",
                      "typeString": "bytes memory"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4675:124:34"
                },
                {
                  "assignments": [
                    6695,
                    6697
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 6695,
                      "name": "success",
                      "nodeType": "VariableDeclaration",
                      "scope": 6711,
                      "src": "4811:12:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "typeName": {
                        "id": 6694,
                        "name": "bool",
                        "nodeType": "ElementaryTypeName",
                        "src": "4811:4:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 6697,
                      "name": "tokenBalance",
                      "nodeType": "VariableDeclaration",
                      "scope": 6711,
                      "src": "4825:20:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 6696,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "4825:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 6702,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 6699,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6677,
                        "src": "4862:6:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ERC20_$9925",
                          "typeString": "contract ERC20"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6700,
                        "name": "balanceOfCallData",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6685,
                        "src": "4870:17:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_contract$_ERC20_$9925",
                          "typeString": "contract ERC20"
                        },
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "id": 6698,
                      "name": "staticInvoke",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 6590,
                      "src": "4849:12:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_address_$_t_bytes_memory_ptr_$returns$_t_bool_$_t_uint256_$",
                        "typeString": "function (address,bytes memory) view returns (bool,uint256)"
                      }
                    },
                    "id": 6701,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4849:39:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$",
                      "typeString": "tuple(bool,uint256)"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4810:78:34"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 6704,
                        "name": "success",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6695,
                        "src": "4906:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6705,
                        "name": "ERROR_TOKEN_BALANCE_REVERTED",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6548,
                        "src": "4915:28:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_string_memory",
                          "typeString": "string memory"
                        }
                      ],
                      "id": 6703,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        10407,
                        10408
                      ],
                      "referencedDeclaration": 10408,
                      "src": "4898:7:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 6706,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4898:46:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 6707,
                  "nodeType": "ExpressionStatement",
                  "src": "4898:46:34"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 6708,
                    "name": "tokenBalance",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 6697,
                    "src": "4962:12:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 6683,
                  "id": 6709,
                  "nodeType": "Return",
                  "src": "4955:19:34"
                }
              ]
            },
            "documentation": "@dev Static call into ERC20.balanceOf().\nReverts if the call fails for some reason (should never fail).",
            "id": 6711,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "staticBalanceOf",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 6680,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6677,
                  "name": "_token",
                  "nodeType": "VariableDeclaration",
                  "scope": 6711,
                  "src": "4603:12:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20_$9925",
                    "typeString": "contract ERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 6676,
                    "name": "ERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 9925,
                    "src": "4603:5:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20_$9925",
                      "typeString": "contract ERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6679,
                  "name": "_owner",
                  "nodeType": "VariableDeclaration",
                  "scope": 6711,
                  "src": "4617:14:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6678,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4617:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4602:30:34"
            },
            "payable": false,
            "returnParameters": {
              "id": 6683,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6682,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 6711,
                  "src": "4656:7:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6681,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "4656:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4655:9:34"
            },
            "scope": 6784,
            "src": "4578:403:34",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 6749,
              "nodeType": "Block",
              "src": "5223:334:34",
              "statements": [
                {
                  "assignments": [
                    6723
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 6723,
                      "name": "allowanceCallData",
                      "nodeType": "VariableDeclaration",
                      "scope": 6750,
                      "src": "5233:30:34",
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes_memory_ptr",
                        "typeString": "bytes"
                      },
                      "typeName": {
                        "id": 6722,
                        "name": "bytes",
                        "nodeType": "ElementaryTypeName",
                        "src": "5233:5:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_storage_ptr",
                          "typeString": "bytes"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 6732,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 6726,
                            "name": "_token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6713,
                            "src": "5302:6:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ERC20_$9925",
                              "typeString": "contract ERC20"
                            }
                          },
                          "id": 6727,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "allowance",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 9879,
                          "src": "5302:16:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_external_view$_t_address_$_t_address_$returns$_t_uint256_$",
                            "typeString": "function (address,address) view external returns (uint256)"
                          }
                        },
                        "id": 6728,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "selector",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "5302:25:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6729,
                        "name": "_owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6715,
                        "src": "5341:6:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6730,
                        "name": "_spender",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6717,
                        "src": "5361:8:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 6724,
                        "name": "abi",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10391,
                        "src": "5266:3:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_abi",
                          "typeString": "abi"
                        }
                      },
                      "id": 6725,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "memberName": "encodeWithSelector",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "5266:22:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                        "typeString": "function (bytes4) pure returns (bytes memory)"
                      }
                    },
                    "id": 6731,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5266:113:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_memory_ptr",
                      "typeString": "bytes memory"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "5233:146:34"
                },
                {
                  "assignments": [
                    6734,
                    6736
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 6734,
                      "name": "success",
                      "nodeType": "VariableDeclaration",
                      "scope": 6750,
                      "src": "5391:12:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "typeName": {
                        "id": 6733,
                        "name": "bool",
                        "nodeType": "ElementaryTypeName",
                        "src": "5391:4:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 6736,
                      "name": "allowance",
                      "nodeType": "VariableDeclaration",
                      "scope": 6750,
                      "src": "5405:17:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 6735,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "5405:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 6741,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 6738,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6713,
                        "src": "5439:6:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ERC20_$9925",
                          "typeString": "contract ERC20"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6739,
                        "name": "allowanceCallData",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6723,
                        "src": "5447:17:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_contract$_ERC20_$9925",
                          "typeString": "contract ERC20"
                        },
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "id": 6737,
                      "name": "staticInvoke",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 6590,
                      "src": "5426:12:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_address_$_t_bytes_memory_ptr_$returns$_t_bool_$_t_uint256_$",
                        "typeString": "function (address,bytes memory) view returns (bool,uint256)"
                      }
                    },
                    "id": 6740,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5426:39:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$",
                      "typeString": "tuple(bool,uint256)"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "5390:75:34"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 6743,
                        "name": "success",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6734,
                        "src": "5483:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6744,
                        "name": "ERROR_TOKEN_ALLOWANCE_REVERTED",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6551,
                        "src": "5492:30:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_string_memory",
                          "typeString": "string memory"
                        }
                      ],
                      "id": 6742,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        10407,
                        10408
                      ],
                      "referencedDeclaration": 10408,
                      "src": "5475:7:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 6745,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5475:48:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 6746,
                  "nodeType": "ExpressionStatement",
                  "src": "5475:48:34"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 6747,
                    "name": "allowance",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 6736,
                    "src": "5541:9:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 6721,
                  "id": 6748,
                  "nodeType": "Return",
                  "src": "5534:16:34"
                }
              ]
            },
            "documentation": "@dev Static call into ERC20.allowance().\nReverts if the call fails for some reason (should never fail).",
            "id": 6750,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "staticAllowance",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 6718,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6713,
                  "name": "_token",
                  "nodeType": "VariableDeclaration",
                  "scope": 6750,
                  "src": "5143:12:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20_$9925",
                    "typeString": "contract ERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 6712,
                    "name": "ERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 9925,
                    "src": "5143:5:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20_$9925",
                      "typeString": "contract ERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6715,
                  "name": "_owner",
                  "nodeType": "VariableDeclaration",
                  "scope": 6750,
                  "src": "5157:14:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6714,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5157:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6717,
                  "name": "_spender",
                  "nodeType": "VariableDeclaration",
                  "scope": 6750,
                  "src": "5173:16:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6716,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5173:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5142:48:34"
            },
            "payable": false,
            "returnParameters": {
              "id": 6721,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6720,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 6750,
                  "src": "5214:7:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6719,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "5214:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5213:9:34"
            },
            "scope": 6784,
            "src": "5118:439:34",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 6782,
              "nodeType": "Block",
              "src": "5769:280:34",
              "statements": [
                {
                  "assignments": [
                    6758
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 6758,
                      "name": "totalSupplyCallData",
                      "nodeType": "VariableDeclaration",
                      "scope": 6783,
                      "src": "5779:32:34",
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes_memory_ptr",
                        "typeString": "bytes"
                      },
                      "typeName": {
                        "id": 6757,
                        "name": "bytes",
                        "nodeType": "ElementaryTypeName",
                        "src": "5779:5:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_storage_ptr",
                          "typeString": "bytes"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 6765,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 6761,
                            "name": "_token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6752,
                            "src": "5837:6:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ERC20_$9925",
                              "typeString": "contract ERC20"
                            }
                          },
                          "id": 6762,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "totalSupply",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 9863,
                          "src": "5837:18:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$",
                            "typeString": "function () view external returns (uint256)"
                          }
                        },
                        "id": 6763,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "selector",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "5837:27:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 6759,
                        "name": "abi",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10391,
                        "src": "5814:3:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_abi",
                          "typeString": "abi"
                        }
                      },
                      "id": 6760,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "memberName": "encodeWithSelector",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "5814:22:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                        "typeString": "function (bytes4) pure returns (bytes memory)"
                      }
                    },
                    "id": 6764,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5814:51:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_memory_ptr",
                      "typeString": "bytes memory"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "5779:86:34"
                },
                {
                  "assignments": [
                    6767,
                    6769
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 6767,
                      "name": "success",
                      "nodeType": "VariableDeclaration",
                      "scope": 6783,
                      "src": "5877:12:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "typeName": {
                        "id": 6766,
                        "name": "bool",
                        "nodeType": "ElementaryTypeName",
                        "src": "5877:4:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 6769,
                      "name": "totalSupply",
                      "nodeType": "VariableDeclaration",
                      "scope": 6783,
                      "src": "5891:19:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 6768,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "5891:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 6774,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 6771,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6752,
                        "src": "5927:6:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ERC20_$9925",
                          "typeString": "contract ERC20"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6772,
                        "name": "totalSupplyCallData",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6758,
                        "src": "5935:19:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_contract$_ERC20_$9925",
                          "typeString": "contract ERC20"
                        },
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "id": 6770,
                      "name": "staticInvoke",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 6590,
                      "src": "5914:12:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_address_$_t_bytes_memory_ptr_$returns$_t_bool_$_t_uint256_$",
                        "typeString": "function (address,bytes memory) view returns (bool,uint256)"
                      }
                    },
                    "id": 6773,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5914:41:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$",
                      "typeString": "tuple(bool,uint256)"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "5876:79:34"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 6776,
                        "name": "success",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6767,
                        "src": "5973:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6777,
                        "name": "ERROR_TOKEN_ALLOWANCE_REVERTED",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6551,
                        "src": "5982:30:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_string_memory",
                          "typeString": "string memory"
                        }
                      ],
                      "id": 6775,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        10407,
                        10408
                      ],
                      "referencedDeclaration": 10408,
                      "src": "5965:7:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 6778,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5965:48:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 6779,
                  "nodeType": "ExpressionStatement",
                  "src": "5965:48:34"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 6780,
                    "name": "totalSupply",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 6769,
                    "src": "6031:11:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 6756,
                  "id": 6781,
                  "nodeType": "Return",
                  "src": "6024:18:34"
                }
              ]
            },
            "documentation": "@dev Static call into ERC20.totalSupply().\nReverts if the call fails for some reason (should never fail).",
            "id": 6783,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "staticTotalSupply",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 6753,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6752,
                  "name": "_token",
                  "nodeType": "VariableDeclaration",
                  "scope": 6783,
                  "src": "5723:12:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20_$9925",
                    "typeString": "contract ERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 6751,
                    "name": "ERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 9925,
                    "src": "5723:5:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20_$9925",
                      "typeString": "contract ERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5722:14:34"
            },
            "payable": false,
            "returnParameters": {
              "id": 6756,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6755,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 6783,
                  "src": "5760:7:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6754,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "5760:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5759:9:34"
            },
            "scope": 6784,
            "src": "5696:353:34",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "internal"
          }
        ],
        "scope": 6785,
        "src": "376:5675:34"
      }
    ],
    "src": "315:5737:34"
  },
  "legacyAST": {
    "absolutePath": "@aragon/os/contracts/common/SafeERC20.sol",
    "exportedSymbols": {
      "SafeERC20": [
        6784
      ]
    },
    "id": 6785,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 6541,
        "literals": [
          "solidity",
          "^",
          "0.4",
          ".24"
        ],
        "nodeType": "PragmaDirective",
        "src": "315:24:34"
      },
      {
        "absolutePath": "@aragon/os/contracts/lib/token/ERC20.sol",
        "file": "../lib/token/ERC20.sol",
        "id": 6542,
        "nodeType": "ImportDirective",
        "scope": 6785,
        "sourceUnit": 9926,
        "src": "341:32:34",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "baseContracts": [],
        "contractDependencies": [],
        "contractKind": "library",
        "documentation": null,
        "fullyImplemented": true,
        "id": 6784,
        "linearizedBaseContracts": [
          6784
        ],
        "name": "SafeERC20",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": true,
            "id": 6545,
            "name": "TRANSFER_SELECTOR",
            "nodeType": "VariableDeclaration",
            "scope": 6784,
            "src": "552:54:34",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_bytes4",
              "typeString": "bytes4"
            },
            "typeName": {
              "id": 6543,
              "name": "bytes4",
              "nodeType": "ElementaryTypeName",
              "src": "552:6:34",
              "typeDescriptions": {
                "typeIdentifier": "t_bytes4",
                "typeString": "bytes4"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "30786139303539636262",
              "id": 6544,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "596:10:34",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_rational_2835717307_by_1",
                "typeString": "int_const 2835717307"
              },
              "value": "0xa9059cbb"
            },
            "visibility": "private"
          },
          {
            "constant": true,
            "id": 6548,
            "name": "ERROR_TOKEN_BALANCE_REVERTED",
            "nodeType": "VariableDeclaration",
            "scope": 6784,
            "src": "613:85:34",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_string_memory",
              "typeString": "string"
            },
            "typeName": {
              "id": 6546,
              "name": "string",
              "nodeType": "ElementaryTypeName",
              "src": "613:6:34",
              "typeDescriptions": {
                "typeIdentifier": "t_string_storage_ptr",
                "typeString": "string"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "534146455f4552435f32305f42414c414e43455f5245564552544544",
              "id": 6547,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "string",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "668:30:34",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_stringliteral_e0d6f1573408f815b546b777c74de94d1685d3d390fbf5b918b2e1339b2ed2e7",
                "typeString": "literal_string \"SAFE_ERC_20_BALANCE_REVERTED\""
              },
              "value": "SAFE_ERC_20_BALANCE_REVERTED"
            },
            "visibility": "private"
          },
          {
            "constant": true,
            "id": 6551,
            "name": "ERROR_TOKEN_ALLOWANCE_REVERTED",
            "nodeType": "VariableDeclaration",
            "scope": 6784,
            "src": "704:89:34",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_string_memory",
              "typeString": "string"
            },
            "typeName": {
              "id": 6549,
              "name": "string",
              "nodeType": "ElementaryTypeName",
              "src": "704:6:34",
              "typeDescriptions": {
                "typeIdentifier": "t_string_storage_ptr",
                "typeString": "string"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "534146455f4552435f32305f414c4c4f57414e43455f5245564552544544",
              "id": 6550,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "string",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "761:32:34",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_stringliteral_73432bcf14a5ead3ed39eed7e97b924b49d284054d4f8b41ba74ac90002bc239",
                "typeString": "literal_string \"SAFE_ERC_20_ALLOWANCE_REVERTED\""
              },
              "value": "SAFE_ERC_20_ALLOWANCE_REVERTED"
            },
            "visibility": "private"
          },
          {
            "body": {
              "id": 6566,
              "nodeType": "Block",
              "src": "913:1229:34",
              "statements": [
                {
                  "assignments": [],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 6561,
                      "name": "ret",
                      "nodeType": "VariableDeclaration",
                      "scope": 6567,
                      "src": "923:8:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "typeName": {
                        "id": 6560,
                        "name": "bool",
                        "nodeType": "ElementaryTypeName",
                        "src": "923:4:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 6562,
                  "initialValue": null,
                  "nodeType": "VariableDeclarationStatement",
                  "src": "923:8:34"
                },
                {
                  "externalReferences": [
                    {
                      "_calldata": {
                        "declaration": 6555,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "1281:9:34",
                        "valueSize": 1
                      }
                    },
                    {
                      "_calldata": {
                        "declaration": 6555,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "1223:9:34",
                        "valueSize": 1
                      }
                    },
                    {
                      "ret": {
                        "declaration": 6561,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "1701:3:34",
                        "valueSize": 1
                      }
                    },
                    {
                      "_addr": {
                        "declaration": 6553,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "1120:5:34",
                        "valueSize": 1
                      }
                    },
                    {
                      "ret": {
                        "declaration": 6561,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "1952:3:34",
                        "valueSize": 1
                      }
                    }
                  ],
                  "id": 6563,
                  "nodeType": "InlineAssembly",
                  "operations": "{\n    let ptr := mload(0x40)\n    let success := call(gas(), _addr, 0, add(_calldata, 0x20), mload(_calldata), ptr, 0x20)\n    if gt(success, 0)\n    {\n        switch returndatasize()\n        case 0 {\n            ret := 1\n        }\n        case 0x20 {\n            ret := eq(mload(ptr), 1)\n        }\n        default {\n        }\n    }\n}",
                  "src": "941:1190:34"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 6564,
                    "name": "ret",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 6561,
                    "src": "2132:3:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 6559,
                  "id": 6565,
                  "nodeType": "Return",
                  "src": "2125:10:34"
                }
              ]
            },
            "documentation": null,
            "id": 6567,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": false,
            "modifiers": [],
            "name": "invokeAndCheckSuccess",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 6556,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6553,
                  "name": "_addr",
                  "nodeType": "VariableDeclaration",
                  "scope": 6567,
                  "src": "831:13:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6552,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "831:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6555,
                  "name": "_calldata",
                  "nodeType": "VariableDeclaration",
                  "scope": 6567,
                  "src": "846:22:34",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 6554,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "846:5:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "830:39:34"
            },
            "payable": false,
            "returnParameters": {
              "id": 6559,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6558,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 6567,
                  "src": "903:4:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 6557,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "903:4:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "902:6:34"
            },
            "scope": 6784,
            "src": "800:1342:34",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "private"
          },
          {
            "body": {
              "id": 6589,
              "nodeType": "Block",
              "src": "2274:648:34",
              "statements": [
                {
                  "assignments": [],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 6579,
                      "name": "success",
                      "nodeType": "VariableDeclaration",
                      "scope": 6590,
                      "src": "2284:12:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "typeName": {
                        "id": 6578,
                        "name": "bool",
                        "nodeType": "ElementaryTypeName",
                        "src": "2284:4:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 6580,
                  "initialValue": null,
                  "nodeType": "VariableDeclarationStatement",
                  "src": "2284:12:34"
                },
                {
                  "assignments": [],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 6582,
                      "name": "ret",
                      "nodeType": "VariableDeclaration",
                      "scope": 6590,
                      "src": "2306:11:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 6581,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "2306:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 6583,
                  "initialValue": null,
                  "nodeType": "VariableDeclarationStatement",
                  "src": "2306:11:34"
                },
                {
                  "externalReferences": [
                    {
                      "ret": {
                        "declaration": 6582,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "2844:3:34",
                        "valueSize": 1
                      }
                    },
                    {
                      "_calldata": {
                        "declaration": 6571,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "2619:9:34",
                        "valueSize": 1
                      }
                    },
                    {
                      "_calldata": {
                        "declaration": 6571,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "2561:9:34",
                        "valueSize": 1
                      }
                    },
                    {
                      "success": {
                        "declaration": 6579,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "2412:7:34",
                        "valueSize": 1
                      }
                    },
                    {
                      "success": {
                        "declaration": 6579,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "2814:7:34",
                        "valueSize": 1
                      }
                    },
                    {
                      "_addr": {
                        "declaration": 6569,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "2508:5:34",
                        "valueSize": 1
                      }
                    }
                  ],
                  "id": 6584,
                  "nodeType": "InlineAssembly",
                  "operations": "{\n    let ptr := mload(0x40)\n    success := staticcall(gas(), _addr, add(_calldata, 0x20), mload(_calldata), ptr, 0x20)\n    if gt(success, 0)\n    {\n        ret := mload(ptr)\n    }\n}",
                  "src": "2327:573:34"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "components": [
                      {
                        "argumentTypes": null,
                        "id": 6585,
                        "name": "success",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6579,
                        "src": "2902:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6586,
                        "name": "ret",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6582,
                        "src": "2911:3:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "id": 6587,
                    "isConstant": false,
                    "isInlineArray": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "TupleExpression",
                    "src": "2901:14:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$",
                      "typeString": "tuple(bool,uint256)"
                    }
                  },
                  "functionReturnParameters": 6577,
                  "id": 6588,
                  "nodeType": "Return",
                  "src": "2894:21:34"
                }
              ]
            },
            "documentation": null,
            "id": 6590,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "staticInvoke",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 6572,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6569,
                  "name": "_addr",
                  "nodeType": "VariableDeclaration",
                  "scope": 6590,
                  "src": "2170:13:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6568,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2170:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6571,
                  "name": "_calldata",
                  "nodeType": "VariableDeclaration",
                  "scope": 6590,
                  "src": "2185:22:34",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 6570,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "2185:5:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2169:39:34"
            },
            "payable": false,
            "returnParameters": {
              "id": 6577,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6574,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 6590,
                  "src": "2255:4:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 6573,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "2255:4:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6576,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 6590,
                  "src": "2261:7:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6575,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2261:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2254:15:34"
            },
            "scope": 6784,
            "src": "2148:774:34",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "private"
          },
          {
            "body": {
              "id": 6615,
              "nodeType": "Block",
              "src": "3190:214:34",
              "statements": [
                {
                  "assignments": [
                    6602
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 6602,
                      "name": "transferCallData",
                      "nodeType": "VariableDeclaration",
                      "scope": 6616,
                      "src": "3200:29:34",
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes_memory_ptr",
                        "typeString": "bytes"
                      },
                      "typeName": {
                        "id": 6601,
                        "name": "bytes",
                        "nodeType": "ElementaryTypeName",
                        "src": "3200:5:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_storage_ptr",
                          "typeString": "bytes"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 6609,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 6605,
                        "name": "TRANSFER_SELECTOR",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6545,
                        "src": "3268:17:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6606,
                        "name": "_to",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6594,
                        "src": "3299:3:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6607,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6596,
                        "src": "3316:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 6603,
                        "name": "abi",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10391,
                        "src": "3232:3:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_abi",
                          "typeString": "abi"
                        }
                      },
                      "id": 6604,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "memberName": "encodeWithSelector",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "3232:22:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                        "typeString": "function (bytes4) pure returns (bytes memory)"
                      }
                    },
                    "id": 6608,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3232:101:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_memory_ptr",
                      "typeString": "bytes memory"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "3200:133:34"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 6611,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6592,
                        "src": "3372:6:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ERC20_$9925",
                          "typeString": "contract ERC20"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6612,
                        "name": "transferCallData",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6602,
                        "src": "3380:16:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_contract$_ERC20_$9925",
                          "typeString": "contract ERC20"
                        },
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "id": 6610,
                      "name": "invokeAndCheckSuccess",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 6567,
                      "src": "3350:21:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$_t_bool_$",
                        "typeString": "function (address,bytes memory) returns (bool)"
                      }
                    },
                    "id": 6613,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3350:47:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 6600,
                  "id": 6614,
                  "nodeType": "Return",
                  "src": "3343:54:34"
                }
              ]
            },
            "documentation": "@dev Same as a standards-compliant ERC20.transfer() that never reverts (returns false).\n     Note that this makes an external call to the token.",
            "id": 6616,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": false,
            "modifiers": [],
            "name": "safeTransfer",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 6597,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6592,
                  "name": "_token",
                  "nodeType": "VariableDeclaration",
                  "scope": 6616,
                  "src": "3122:12:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20_$9925",
                    "typeString": "contract ERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 6591,
                    "name": "ERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 9925,
                    "src": "3122:5:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20_$9925",
                      "typeString": "contract ERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6594,
                  "name": "_to",
                  "nodeType": "VariableDeclaration",
                  "scope": 6616,
                  "src": "3136:11:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6593,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3136:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6596,
                  "name": "_amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 6616,
                  "src": "3149:15:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6595,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3149:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3121:44:34"
            },
            "payable": false,
            "returnParameters": {
              "id": 6600,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6599,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 6616,
                  "src": "3184:4:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 6598,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "3184:4:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3183:6:34"
            },
            "scope": 6784,
            "src": "3100:304:34",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 6646,
              "nodeType": "Block",
              "src": "3695:252:34",
              "statements": [
                {
                  "assignments": [
                    6630
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 6630,
                      "name": "transferFromCallData",
                      "nodeType": "VariableDeclaration",
                      "scope": 6647,
                      "src": "3705:33:34",
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes_memory_ptr",
                        "typeString": "bytes"
                      },
                      "typeName": {
                        "id": 6629,
                        "name": "bytes",
                        "nodeType": "ElementaryTypeName",
                        "src": "3705:5:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_storage_ptr",
                          "typeString": "bytes"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 6640,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 6633,
                            "name": "_token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6618,
                            "src": "3777:6:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ERC20_$9925",
                              "typeString": "contract ERC20"
                            }
                          },
                          "id": 6634,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "transferFrom",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 9908,
                          "src": "3777:19:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$_t_bool_$",
                            "typeString": "function (address,address,uint256) external returns (bool)"
                          }
                        },
                        "id": 6635,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "selector",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "3777:28:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6636,
                        "name": "_from",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6620,
                        "src": "3819:5:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6637,
                        "name": "_to",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6622,
                        "src": "3838:3:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6638,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6624,
                        "src": "3855:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 6631,
                        "name": "abi",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10391,
                        "src": "3741:3:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_abi",
                          "typeString": "abi"
                        }
                      },
                      "id": 6632,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "memberName": "encodeWithSelector",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "3741:22:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                        "typeString": "function (bytes4) pure returns (bytes memory)"
                      }
                    },
                    "id": 6639,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3741:131:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_memory_ptr",
                      "typeString": "bytes memory"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "3705:167:34"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 6642,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6618,
                        "src": "3911:6:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ERC20_$9925",
                          "typeString": "contract ERC20"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6643,
                        "name": "transferFromCallData",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6630,
                        "src": "3919:20:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_contract$_ERC20_$9925",
                          "typeString": "contract ERC20"
                        },
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "id": 6641,
                      "name": "invokeAndCheckSuccess",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 6567,
                      "src": "3889:21:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$_t_bool_$",
                        "typeString": "function (address,bytes memory) returns (bool)"
                      }
                    },
                    "id": 6644,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3889:51:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 6628,
                  "id": 6645,
                  "nodeType": "Return",
                  "src": "3882:58:34"
                }
              ]
            },
            "documentation": "@dev Same as a standards-compliant ERC20.transferFrom() that never reverts (returns false).\n     Note that this makes an external call to the token.",
            "id": 6647,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": false,
            "modifiers": [],
            "name": "safeTransferFrom",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 6625,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6618,
                  "name": "_token",
                  "nodeType": "VariableDeclaration",
                  "scope": 6647,
                  "src": "3612:12:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20_$9925",
                    "typeString": "contract ERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 6617,
                    "name": "ERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 9925,
                    "src": "3612:5:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20_$9925",
                      "typeString": "contract ERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6620,
                  "name": "_from",
                  "nodeType": "VariableDeclaration",
                  "scope": 6647,
                  "src": "3626:13:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6619,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3626:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6622,
                  "name": "_to",
                  "nodeType": "VariableDeclaration",
                  "scope": 6647,
                  "src": "3641:11:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6621,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3641:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6624,
                  "name": "_amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 6647,
                  "src": "3654:15:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6623,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3654:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3611:59:34"
            },
            "payable": false,
            "returnParameters": {
              "id": 6628,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6627,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 6647,
                  "src": "3689:4:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 6626,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "3689:4:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3688:6:34"
            },
            "scope": 6784,
            "src": "3586:361:34",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 6674,
              "nodeType": "Block",
              "src": "4218:223:34",
              "statements": [
                {
                  "assignments": [
                    6659
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 6659,
                      "name": "approveCallData",
                      "nodeType": "VariableDeclaration",
                      "scope": 6675,
                      "src": "4228:28:34",
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes_memory_ptr",
                        "typeString": "bytes"
                      },
                      "typeName": {
                        "id": 6658,
                        "name": "bytes",
                        "nodeType": "ElementaryTypeName",
                        "src": "4228:5:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_storage_ptr",
                          "typeString": "bytes"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 6668,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 6662,
                            "name": "_token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6649,
                            "src": "4295:6:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ERC20_$9925",
                              "typeString": "contract ERC20"
                            }
                          },
                          "id": 6663,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "approve",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 9897,
                          "src": "4295:14:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                            "typeString": "function (address,uint256) external returns (bool)"
                          }
                        },
                        "id": 6664,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "selector",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "4295:23:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6665,
                        "name": "_spender",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6651,
                        "src": "4332:8:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6666,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6653,
                        "src": "4354:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 6660,
                        "name": "abi",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10391,
                        "src": "4259:3:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_abi",
                          "typeString": "abi"
                        }
                      },
                      "id": 6661,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "memberName": "encodeWithSelector",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "4259:22:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                        "typeString": "function (bytes4) pure returns (bytes memory)"
                      }
                    },
                    "id": 6667,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4259:112:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_memory_ptr",
                      "typeString": "bytes memory"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4228:143:34"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 6670,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6649,
                        "src": "4410:6:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ERC20_$9925",
                          "typeString": "contract ERC20"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6671,
                        "name": "approveCallData",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6659,
                        "src": "4418:15:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_contract$_ERC20_$9925",
                          "typeString": "contract ERC20"
                        },
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "id": 6669,
                      "name": "invokeAndCheckSuccess",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 6567,
                      "src": "4388:21:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$_t_bool_$",
                        "typeString": "function (address,bytes memory) returns (bool)"
                      }
                    },
                    "id": 6672,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4388:46:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 6657,
                  "id": 6673,
                  "nodeType": "Return",
                  "src": "4381:53:34"
                }
              ]
            },
            "documentation": "@dev Same as a standards-compliant ERC20.approve() that never reverts (returns false).\n     Note that this makes an external call to the token.",
            "id": 6675,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": false,
            "modifiers": [],
            "name": "safeApprove",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 6654,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6649,
                  "name": "_token",
                  "nodeType": "VariableDeclaration",
                  "scope": 6675,
                  "src": "4145:12:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20_$9925",
                    "typeString": "contract ERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 6648,
                    "name": "ERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 9925,
                    "src": "4145:5:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20_$9925",
                      "typeString": "contract ERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6651,
                  "name": "_spender",
                  "nodeType": "VariableDeclaration",
                  "scope": 6675,
                  "src": "4159:16:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6650,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4159:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6653,
                  "name": "_amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 6675,
                  "src": "4177:15:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6652,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "4177:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4144:49:34"
            },
            "payable": false,
            "returnParameters": {
              "id": 6657,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6656,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 6675,
                  "src": "4212:4:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 6655,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "4212:4:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4211:6:34"
            },
            "scope": 6784,
            "src": "4124:317:34",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 6710,
              "nodeType": "Block",
              "src": "4665:316:34",
              "statements": [
                {
                  "assignments": [
                    6685
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 6685,
                      "name": "balanceOfCallData",
                      "nodeType": "VariableDeclaration",
                      "scope": 6711,
                      "src": "4675:30:34",
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes_memory_ptr",
                        "typeString": "bytes"
                      },
                      "typeName": {
                        "id": 6684,
                        "name": "bytes",
                        "nodeType": "ElementaryTypeName",
                        "src": "4675:5:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_storage_ptr",
                          "typeString": "bytes"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 6693,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 6688,
                            "name": "_token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6677,
                            "src": "4744:6:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ERC20_$9925",
                              "typeString": "contract ERC20"
                            }
                          },
                          "id": 6689,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "balanceOf",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 9870,
                          "src": "4744:16:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                            "typeString": "function (address) view external returns (uint256)"
                          }
                        },
                        "id": 6690,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "selector",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "4744:25:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6691,
                        "name": "_owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6679,
                        "src": "4783:6:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 6686,
                        "name": "abi",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10391,
                        "src": "4708:3:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_abi",
                          "typeString": "abi"
                        }
                      },
                      "id": 6687,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "memberName": "encodeWithSelector",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "4708:22:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                        "typeString": "function (bytes4) pure returns (bytes memory)"
                      }
                    },
                    "id": 6692,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4708:91:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_memory_ptr",
                      "typeString": "bytes memory"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4675:124:34"
                },
                {
                  "assignments": [
                    6695,
                    6697
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 6695,
                      "name": "success",
                      "nodeType": "VariableDeclaration",
                      "scope": 6711,
                      "src": "4811:12:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "typeName": {
                        "id": 6694,
                        "name": "bool",
                        "nodeType": "ElementaryTypeName",
                        "src": "4811:4:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 6697,
                      "name": "tokenBalance",
                      "nodeType": "VariableDeclaration",
                      "scope": 6711,
                      "src": "4825:20:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 6696,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "4825:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 6702,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 6699,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6677,
                        "src": "4862:6:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ERC20_$9925",
                          "typeString": "contract ERC20"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6700,
                        "name": "balanceOfCallData",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6685,
                        "src": "4870:17:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_contract$_ERC20_$9925",
                          "typeString": "contract ERC20"
                        },
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "id": 6698,
                      "name": "staticInvoke",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 6590,
                      "src": "4849:12:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_address_$_t_bytes_memory_ptr_$returns$_t_bool_$_t_uint256_$",
                        "typeString": "function (address,bytes memory) view returns (bool,uint256)"
                      }
                    },
                    "id": 6701,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4849:39:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$",
                      "typeString": "tuple(bool,uint256)"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4810:78:34"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 6704,
                        "name": "success",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6695,
                        "src": "4906:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6705,
                        "name": "ERROR_TOKEN_BALANCE_REVERTED",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6548,
                        "src": "4915:28:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_string_memory",
                          "typeString": "string memory"
                        }
                      ],
                      "id": 6703,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        10407,
                        10408
                      ],
                      "referencedDeclaration": 10408,
                      "src": "4898:7:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 6706,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4898:46:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 6707,
                  "nodeType": "ExpressionStatement",
                  "src": "4898:46:34"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 6708,
                    "name": "tokenBalance",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 6697,
                    "src": "4962:12:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 6683,
                  "id": 6709,
                  "nodeType": "Return",
                  "src": "4955:19:34"
                }
              ]
            },
            "documentation": "@dev Static call into ERC20.balanceOf().\nReverts if the call fails for some reason (should never fail).",
            "id": 6711,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "staticBalanceOf",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 6680,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6677,
                  "name": "_token",
                  "nodeType": "VariableDeclaration",
                  "scope": 6711,
                  "src": "4603:12:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20_$9925",
                    "typeString": "contract ERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 6676,
                    "name": "ERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 9925,
                    "src": "4603:5:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20_$9925",
                      "typeString": "contract ERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6679,
                  "name": "_owner",
                  "nodeType": "VariableDeclaration",
                  "scope": 6711,
                  "src": "4617:14:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6678,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4617:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4602:30:34"
            },
            "payable": false,
            "returnParameters": {
              "id": 6683,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6682,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 6711,
                  "src": "4656:7:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6681,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "4656:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4655:9:34"
            },
            "scope": 6784,
            "src": "4578:403:34",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 6749,
              "nodeType": "Block",
              "src": "5223:334:34",
              "statements": [
                {
                  "assignments": [
                    6723
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 6723,
                      "name": "allowanceCallData",
                      "nodeType": "VariableDeclaration",
                      "scope": 6750,
                      "src": "5233:30:34",
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes_memory_ptr",
                        "typeString": "bytes"
                      },
                      "typeName": {
                        "id": 6722,
                        "name": "bytes",
                        "nodeType": "ElementaryTypeName",
                        "src": "5233:5:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_storage_ptr",
                          "typeString": "bytes"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 6732,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 6726,
                            "name": "_token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6713,
                            "src": "5302:6:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ERC20_$9925",
                              "typeString": "contract ERC20"
                            }
                          },
                          "id": 6727,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "allowance",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 9879,
                          "src": "5302:16:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_external_view$_t_address_$_t_address_$returns$_t_uint256_$",
                            "typeString": "function (address,address) view external returns (uint256)"
                          }
                        },
                        "id": 6728,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "selector",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "5302:25:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6729,
                        "name": "_owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6715,
                        "src": "5341:6:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6730,
                        "name": "_spender",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6717,
                        "src": "5361:8:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 6724,
                        "name": "abi",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10391,
                        "src": "5266:3:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_abi",
                          "typeString": "abi"
                        }
                      },
                      "id": 6725,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "memberName": "encodeWithSelector",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "5266:22:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                        "typeString": "function (bytes4) pure returns (bytes memory)"
                      }
                    },
                    "id": 6731,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5266:113:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_memory_ptr",
                      "typeString": "bytes memory"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "5233:146:34"
                },
                {
                  "assignments": [
                    6734,
                    6736
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 6734,
                      "name": "success",
                      "nodeType": "VariableDeclaration",
                      "scope": 6750,
                      "src": "5391:12:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "typeName": {
                        "id": 6733,
                        "name": "bool",
                        "nodeType": "ElementaryTypeName",
                        "src": "5391:4:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 6736,
                      "name": "allowance",
                      "nodeType": "VariableDeclaration",
                      "scope": 6750,
                      "src": "5405:17:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 6735,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "5405:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 6741,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 6738,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6713,
                        "src": "5439:6:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ERC20_$9925",
                          "typeString": "contract ERC20"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6739,
                        "name": "allowanceCallData",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6723,
                        "src": "5447:17:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_contract$_ERC20_$9925",
                          "typeString": "contract ERC20"
                        },
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "id": 6737,
                      "name": "staticInvoke",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 6590,
                      "src": "5426:12:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_address_$_t_bytes_memory_ptr_$returns$_t_bool_$_t_uint256_$",
                        "typeString": "function (address,bytes memory) view returns (bool,uint256)"
                      }
                    },
                    "id": 6740,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5426:39:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$",
                      "typeString": "tuple(bool,uint256)"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "5390:75:34"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 6743,
                        "name": "success",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6734,
                        "src": "5483:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6744,
                        "name": "ERROR_TOKEN_ALLOWANCE_REVERTED",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6551,
                        "src": "5492:30:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_string_memory",
                          "typeString": "string memory"
                        }
                      ],
                      "id": 6742,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        10407,
                        10408
                      ],
                      "referencedDeclaration": 10408,
                      "src": "5475:7:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 6745,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5475:48:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 6746,
                  "nodeType": "ExpressionStatement",
                  "src": "5475:48:34"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 6747,
                    "name": "allowance",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 6736,
                    "src": "5541:9:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 6721,
                  "id": 6748,
                  "nodeType": "Return",
                  "src": "5534:16:34"
                }
              ]
            },
            "documentation": "@dev Static call into ERC20.allowance().\nReverts if the call fails for some reason (should never fail).",
            "id": 6750,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "staticAllowance",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 6718,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6713,
                  "name": "_token",
                  "nodeType": "VariableDeclaration",
                  "scope": 6750,
                  "src": "5143:12:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20_$9925",
                    "typeString": "contract ERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 6712,
                    "name": "ERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 9925,
                    "src": "5143:5:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20_$9925",
                      "typeString": "contract ERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6715,
                  "name": "_owner",
                  "nodeType": "VariableDeclaration",
                  "scope": 6750,
                  "src": "5157:14:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6714,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5157:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6717,
                  "name": "_spender",
                  "nodeType": "VariableDeclaration",
                  "scope": 6750,
                  "src": "5173:16:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6716,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5173:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5142:48:34"
            },
            "payable": false,
            "returnParameters": {
              "id": 6721,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6720,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 6750,
                  "src": "5214:7:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6719,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "5214:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5213:9:34"
            },
            "scope": 6784,
            "src": "5118:439:34",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 6782,
              "nodeType": "Block",
              "src": "5769:280:34",
              "statements": [
                {
                  "assignments": [
                    6758
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 6758,
                      "name": "totalSupplyCallData",
                      "nodeType": "VariableDeclaration",
                      "scope": 6783,
                      "src": "5779:32:34",
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes_memory_ptr",
                        "typeString": "bytes"
                      },
                      "typeName": {
                        "id": 6757,
                        "name": "bytes",
                        "nodeType": "ElementaryTypeName",
                        "src": "5779:5:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_storage_ptr",
                          "typeString": "bytes"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 6765,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 6761,
                            "name": "_token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6752,
                            "src": "5837:6:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ERC20_$9925",
                              "typeString": "contract ERC20"
                            }
                          },
                          "id": 6762,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "totalSupply",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 9863,
                          "src": "5837:18:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$",
                            "typeString": "function () view external returns (uint256)"
                          }
                        },
                        "id": 6763,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "selector",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "5837:27:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 6759,
                        "name": "abi",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10391,
                        "src": "5814:3:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_abi",
                          "typeString": "abi"
                        }
                      },
                      "id": 6760,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "memberName": "encodeWithSelector",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "5814:22:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                        "typeString": "function (bytes4) pure returns (bytes memory)"
                      }
                    },
                    "id": 6764,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5814:51:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_memory_ptr",
                      "typeString": "bytes memory"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "5779:86:34"
                },
                {
                  "assignments": [
                    6767,
                    6769
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 6767,
                      "name": "success",
                      "nodeType": "VariableDeclaration",
                      "scope": 6783,
                      "src": "5877:12:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "typeName": {
                        "id": 6766,
                        "name": "bool",
                        "nodeType": "ElementaryTypeName",
                        "src": "5877:4:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 6769,
                      "name": "totalSupply",
                      "nodeType": "VariableDeclaration",
                      "scope": 6783,
                      "src": "5891:19:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 6768,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "5891:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 6774,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 6771,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6752,
                        "src": "5927:6:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ERC20_$9925",
                          "typeString": "contract ERC20"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6772,
                        "name": "totalSupplyCallData",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6758,
                        "src": "5935:19:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_contract$_ERC20_$9925",
                          "typeString": "contract ERC20"
                        },
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "id": 6770,
                      "name": "staticInvoke",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 6590,
                      "src": "5914:12:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_address_$_t_bytes_memory_ptr_$returns$_t_bool_$_t_uint256_$",
                        "typeString": "function (address,bytes memory) view returns (bool,uint256)"
                      }
                    },
                    "id": 6773,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5914:41:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$",
                      "typeString": "tuple(bool,uint256)"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "5876:79:34"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 6776,
                        "name": "success",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6767,
                        "src": "5973:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6777,
                        "name": "ERROR_TOKEN_ALLOWANCE_REVERTED",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6551,
                        "src": "5982:30:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_string_memory",
                          "typeString": "string memory"
                        }
                      ],
                      "id": 6775,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        10407,
                        10408
                      ],
                      "referencedDeclaration": 10408,
                      "src": "5965:7:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 6778,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5965:48:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 6779,
                  "nodeType": "ExpressionStatement",
                  "src": "5965:48:34"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 6780,
                    "name": "totalSupply",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 6769,
                    "src": "6031:11:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 6756,
                  "id": 6781,
                  "nodeType": "Return",
                  "src": "6024:18:34"
                }
              ]
            },
            "documentation": "@dev Static call into ERC20.totalSupply().\nReverts if the call fails for some reason (should never fail).",
            "id": 6783,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "staticTotalSupply",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 6753,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6752,
                  "name": "_token",
                  "nodeType": "VariableDeclaration",
                  "scope": 6783,
                  "src": "5723:12:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20_$9925",
                    "typeString": "contract ERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 6751,
                    "name": "ERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 9925,
                    "src": "5723:5:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20_$9925",
                      "typeString": "contract ERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5722:14:34"
            },
            "payable": false,
            "returnParameters": {
              "id": 6756,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6755,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 6783,
                  "src": "5760:7:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6754,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "5760:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5759:9:34"
            },
            "scope": 6784,
            "src": "5696:353:34",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "internal"
          }
        ],
        "scope": 6785,
        "src": "376:5675:34"
      }
    ],
    "src": "315:5737:34"
  },
  "compiler": {
    "name": "solc",
    "version": "0.4.24+commit.e67f0147.Emscripten.clang"
  },
  "networks": {},
  "schemaVersion": "3.2.0",
  "updatedAt": "2020-06-07T23:27:00.577Z",
  "devdoc": {
    "methods": {}
  },
  "userdoc": {
    "methods": {}
  }
}