UNPKG

@marketprotocol/marketprotocol

Version:

Decentralized Derivatives Trading Protocol For The Ethereum Blockchain

1,025 lines 273 kB
{ "contractName": "SafeERC20", "abi": [], "metadata": "{\"compiler\":{\"version\":\"0.5.2+commit.1df8f40c\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Wrappers around ERC20 operations that throw on failure (when the token contract returns false). Tokens that return no value (and instead revert or throw on failure) are also supported, non-reverting calls are assumed to be successful. To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\",\"methods\":{},\"title\":\"SafeERC20\"},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol\":\"SafeERC20\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"openzeppelin-solidity/contracts/math/SafeMath.sol\":{\"keccak256\":\"0xc2a200a877c4a9b2475c246c54ffecc69ffde3e11af83319c63c2dc5458bac80\",\"urls\":[\"bzzr://c8876e2c39b60f155d748d71d715c8f3903fae5a405ac599adcb6ad2f9a583f9\"]},\"openzeppelin-solidity/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x59e7df16169a498cb8837963b2f5461d88e63bd1eb6c7d58b814d76b84ccbe61\",\"urls\":[\"bzzr://e572c9c4e02e37349702451bf3b5dcbbc86a19da5a51695b5b3e1bfe1e7825dc\"]},\"openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol\":{\"keccak256\":\"0x7230c14d692aff375e4931d60ef73ac8a79c28b9e54c200a377b7dc613c81a78\",\"urls\":[\"bzzr://3538d7da02640c67ac909e84d90e799439f3b3195cf0de39fd173dacd5a98311\"]},\"openzeppelin-solidity/contracts/utils/Address.sol\":{\"keccak256\":\"0xea16b9933153c647242ba50b3e494fb133063d49f1fa81823f35a8c28754142e\",\"urls\":[\"bzzr://aa2b2eb534149525e194341c01cadf666668a1b7d679a268d10e23570a7e26b1\"]}},\"version\":1}", "bytecode": "0x604c602c600b82828239805160001a60731460008114601c57601e565bfe5b5030600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea165627a7a72305820cd7c50f85eb9029a5d2f5c4189c0f197885a44c526ff6f6fe935acab441c9f150029", "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea165627a7a72305820cd7c50f85eb9029a5d2f5c4189c0f197885a44c526ff6f6fe935acab441c9f150029", "sourceMap": "574:2784:21:-;;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": "574:2784:21:-;;;;;;;;", "source": "pragma solidity ^0.5.2;\n\nimport \"./IERC20.sol\";\nimport \"../../math/SafeMath.sol\";\nimport \"../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n using SafeMath for uint256;\n using Address for address;\n\n function safeTransfer(IERC20 token, address to, uint256 value) internal {\n callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n function safeApprove(IERC20 token, address spender, uint256 value) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n require((value == 0) || (token.allowance(address(this), spender) == 0));\n callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n uint256 newAllowance = token.allowance(address(this), spender).add(value);\n callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n uint256 newAllowance = token.allowance(address(this), spender).sub(value);\n callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must equal true).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function callOptionalReturn(IERC20 token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves.\n\n // A Solidity high level call has three parts:\n // 1. The target address is checked to verify it contains contract code\n // 2. The call itself is made, and success asserted\n // 3. The return value is decoded, which in turn checks the size of the returned data.\n\n require(address(token).isContract());\n\n // solhint-disable-next-line avoid-low-level-calls\n (bool success, bytes memory returndata) = address(token).call(data);\n require(success);\n\n if (returndata.length > 0) { // Return data is optional\n require(abi.decode(returndata, (bool)));\n }\n }\n}\n", "sourcePath": "openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol", "ast": { "absolutePath": "openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol", "exportedSymbols": { "SafeERC20": [ 3152 ] }, "id": 3153, "nodeType": "SourceUnit", "nodes": [ { "id": 2939, "literals": [ "solidity", "^", "0.5", ".2" ], "nodeType": "PragmaDirective", "src": "0:23:21" }, { "absolutePath": "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol", "file": "./IERC20.sol", "id": 2940, "nodeType": "ImportDirective", "scope": 3153, "sourceUnit": 2938, "src": "25:22:21", "symbolAliases": [], "unitAlias": "" }, { "absolutePath": "openzeppelin-solidity/contracts/math/SafeMath.sol", "file": "../../math/SafeMath.sol", "id": 2941, "nodeType": "ImportDirective", "scope": 3153, "sourceUnit": 2346, "src": "48:33:21", "symbolAliases": [], "unitAlias": "" }, { "absolutePath": "openzeppelin-solidity/contracts/utils/Address.sol", "file": "../../utils/Address.sol", "id": 2942, "nodeType": "ImportDirective", "scope": 3153, "sourceUnit": 3172, "src": "82:33:21", "symbolAliases": [], "unitAlias": "" }, { "baseContracts": [], "contractDependencies": [], "contractKind": "library", "documentation": "@title SafeERC20\n@dev Wrappers around ERC20 operations that throw on failure (when the token\ncontract returns false). Tokens that return no value (and instead revert or\nthrow on failure) are also supported, non-reverting calls are assumed to be\nsuccessful.\nTo use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,\nwhich allows you to call the safe operations as `token.safeTransfer(...)`, etc.", "fullyImplemented": true, "id": 3152, "linearizedBaseContracts": [ 3152 ], "name": "SafeERC20", "nodeType": "ContractDefinition", "nodes": [ { "id": 2945, "libraryName": { "contractScope": null, "id": 2943, "name": "SafeMath", "nodeType": "UserDefinedTypeName", "referencedDeclaration": 2345, "src": "604:8:21", "typeDescriptions": { "typeIdentifier": "t_contract$_SafeMath_$2345", "typeString": "library SafeMath" } }, "nodeType": "UsingForDirective", "src": "598:27:21", "typeName": { "id": 2944, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "617:7:21", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } } }, { "id": 2948, "libraryName": { "contractScope": null, "id": 2946, "name": "Address", "nodeType": "UserDefinedTypeName", "referencedDeclaration": 3171, "src": "636:7:21", "typeDescriptions": { "typeIdentifier": "t_contract$_Address_$3171", "typeString": "library Address" } }, "nodeType": "UsingForDirective", "src": "630:26:21", "typeName": { "id": 2947, "name": "address", "nodeType": "ElementaryTypeName", "src": "648:7:21", "stateMutability": "nonpayable", "typeDescriptions": { "typeIdentifier": "t_address", "typeString": "address" } } }, { "body": { "id": 2969, "nodeType": "Block", "src": "734:102:21", "statements": [ { "expression": { "argumentTypes": null, "arguments": [ { "argumentTypes": null, "id": 2958, "name": "token", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2950, "src": "763:5:21", "typeDescriptions": { "typeIdentifier": "t_contract$_IERC20_$2937", "typeString": "contract IERC20" } }, { "argumentTypes": null, "arguments": [ { "argumentTypes": null, "expression": { "argumentTypes": null, "expression": { "argumentTypes": null, "id": 2961, "name": "token", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2950, "src": "793:5:21", "typeDescriptions": { "typeIdentifier": "t_contract$_IERC20_$2937", "typeString": "contract IERC20" } }, "id": 2962, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberName": "transfer", "nodeType": "MemberAccess", "referencedDeclaration": 2879, "src": "793:14:21", "typeDescriptions": { "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$", "typeString": "function (address,uint256) external returns (bool)" } }, "id": 2963, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberName": "selector", "nodeType": "MemberAccess", "referencedDeclaration": null, "src": "793:23:21", "typeDescriptions": { "typeIdentifier": "t_bytes4", "typeString": "bytes4" } }, { "argumentTypes": null, "id": 2964, "name": "to", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2952, "src": "818:2:21", "typeDescriptions": { "typeIdentifier": "t_address", "typeString": "address" } }, { "argumentTypes": null, "id": 2965, "name": "value", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2954, "src": "822:5:21", "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": 2959, "name": "abi", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3173, "src": "770:3:21", "typeDescriptions": { "typeIdentifier": "t_magic_abi", "typeString": "abi" } }, "id": 2960, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "memberName": "encodeWithSelector", "nodeType": "MemberAccess", "referencedDeclaration": null, "src": "770:22:21", "typeDescriptions": { "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$", "typeString": "function (bytes4) pure returns (bytes memory)" } }, "id": 2966, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "names": [], "nodeType": "FunctionCall", "src": "770:58:21", "typeDescriptions": { "typeIdentifier": "t_bytes_memory_ptr", "typeString": "bytes memory" } } ], "expression": { "argumentTypes": [ { "typeIdentifier": "t_contract$_IERC20_$2937", "typeString": "contract IERC20" }, { "typeIdentifier": "t_bytes_memory_ptr", "typeString": "bytes memory" } ], "id": 2957, "name": "callOptionalReturn", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3151, "src": "744:18:21", "typeDescriptions": { "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$2937_$_t_bytes_memory_ptr_$returns$__$", "typeString": "function (contract IERC20,bytes memory)" } }, "id": 2967, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "names": [], "nodeType": "FunctionCall", "src": "744:85:21", "typeDescriptions": { "typeIdentifier": "t_tuple$__$", "typeString": "tuple()" } }, "id": 2968, "nodeType": "ExpressionStatement", "src": "744:85:21" } ] }, "documentation": null, "id": 2970, "implemented": true, "kind": "function", "modifiers": [], "name": "safeTransfer", "nodeType": "FunctionDefinition", "parameters": { "id": 2955, "nodeType": "ParameterList", "parameters": [ { "constant": false, "id": 2950, "name": "token", "nodeType": "VariableDeclaration", "scope": 2970, "src": "684:12:21", "stateVariable": false, "storageLocation": "default", "typeDescriptions": { "typeIdentifier": "t_contract$_IERC20_$2937", "typeString": "contract IERC20" }, "typeName": { "contractScope": null, "id": 2949, "name": "IERC20", "nodeType": "UserDefinedTypeName", "referencedDeclaration": 2937, "src": "684:6:21", "typeDescriptions": { "typeIdentifier": "t_contract$_IERC20_$2937", "typeString": "contract IERC20" } }, "value": null, "visibility": "internal" }, { "constant": false, "id": 2952, "name": "to", "nodeType": "VariableDeclaration", "scope": 2970, "src": "698:10:21", "stateVariable": false, "storageLocation": "default", "typeDescriptions": { "typeIdentifier": "t_address", "typeString": "address" }, "typeName": { "id": 2951, "name": "address", "nodeType": "ElementaryTypeName", "src": "698:7:21", "stateMutability": "nonpayable", "typeDescriptions": { "typeIdentifier": "t_address", "typeString": "address" } }, "value": null, "visibility": "internal" }, { "constant": false, "id": 2954, "name": "value", "nodeType": "VariableDeclaration", "scope": 2970, "src": "710:13:21", "stateVariable": false, "storageLocation": "default", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" }, "typeName": { "id": 2953, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "710:7:21", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "value": null, "visibility": "internal" } ], "src": "683:41:21" }, "returnParameters": { "id": 2956, "nodeType": "ParameterList", "parameters": [], "src": "734:0:21" }, "scope": 3152, "src": "662:174:21", "stateMutability": "nonpayable", "superFunction": null, "visibility": "internal" }, { "body": { "id": 2994, "nodeType": "Block", "src": "932:112:21", "statements": [ { "expression": { "argumentTypes": null, "arguments": [ { "argumentTypes": null, "id": 2982, "name": "token", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2972, "src": "961:5:21", "typeDescriptions": { "typeIdentifier": "t_contract$_IERC20_$2937", "typeString": "contract IERC20" } }, { "argumentTypes": null, "arguments": [ { "argumentTypes": null, "expression": { "argumentTypes": null, "expression": { "argumentTypes": null, "id": 2985, "name": "token", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2972, "src": "991:5:21", "typeDescriptions": { "typeIdentifier": "t_contract$_IERC20_$2937", "typeString": "contract IERC20" } }, "id": 2986, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberName": "transferFrom", "nodeType": "MemberAccess", "referencedDeclaration": 2899, "src": "991:18:21", "typeDescriptions": { "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$_t_bool_$", "typeString": "function (address,address,uint256) external returns (bool)" } }, "id": 2987, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberName": "selector", "nodeType": "MemberAccess", "referencedDeclaration": null, "src": "991:27:21", "typeDescriptions": { "typeIdentifier": "t_bytes4", "typeString": "bytes4" } }, { "argumentTypes": null, "id": 2988, "name": "from", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2974, "src": "1020:4:21", "typeDescriptions": { "typeIdentifier": "t_address", "typeString": "address" } }, { "argumentTypes": null, "id": 2989, "name": "to", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2976, "src": "1026:2:21", "typeDescriptions": { "typeIdentifier": "t_address", "typeString": "address" } }, { "argumentTypes": null, "id": 2990, "name": "value", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2978, "src": "1030:5:21", "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": 2983, "name": "abi", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3173, "src": "968:3:21", "typeDescriptions": { "typeIdentifier": "t_magic_abi", "typeString": "abi" } }, "id": 2984, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "memberName": "encodeWithSelector", "nodeType": "MemberAccess", "referencedDeclaration": null, "src": "968:22:21", "typeDescriptions": { "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$", "typeString": "function (bytes4) pure returns (bytes memory)" } }, "id": 2991, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "names": [], "nodeType": "FunctionCall", "src": "968:68:21", "typeDescriptions": { "typeIdentifier": "t_bytes_memory_ptr", "typeString": "bytes memory" } } ], "expression": { "argumentTypes": [ { "typeIdentifier": "t_contract$_IERC20_$2937", "typeString": "contract IERC20" }, { "typeIdentifier": "t_bytes_memory_ptr", "typeString": "bytes memory" } ], "id": 2981, "name": "callOptionalReturn", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3151, "src": "942:18:21", "typeDescriptions": { "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$2937_$_t_bytes_memory_ptr_$returns$__$", "typeString": "function (contract IERC20,bytes memory)" } }, "id": 2992, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "names": [], "nodeType": "FunctionCall", "src": "942:95:21", "typeDescriptions": { "typeIdentifier": "t_tuple$__$", "typeString": "tuple()" } }, "id": 2993, "nodeType": "ExpressionStatement", "src": "942:95:21" } ] }, "documentation": null, "id": 2995, "implemented": true, "kind": "function", "modifiers": [], "name": "safeTransferFrom", "nodeType": "FunctionDefinition", "parameters": { "id": 2979, "nodeType": "ParameterList", "parameters": [ { "constant": false, "id": 2972, "name": "token", "nodeType": "VariableDeclaration", "scope": 2995, "src": "868:12:21", "stateVariable": false, "storageLocation": "default", "typeDescriptions": { "typeIdentifier": "t_contract$_IERC20_$2937", "typeString": "contract IERC20" }, "typeName": { "contractScope": null, "id": 2971, "name": "IERC20", "nodeType": "UserDefinedTypeName", "referencedDeclaration": 2937, "src": "868:6:21", "typeDescriptions": { "typeIdentifier": "t_contract$_IERC20_$2937", "typeString": "contract IERC20" } }, "value": null, "visibility": "internal" }, { "constant": false, "id": 2974, "name": "from", "nodeType": "VariableDeclaration", "scope": 2995, "src": "882:12:21", "stateVariable": false, "storageLocation": "default", "typeDescriptions": { "typeIdentifier": "t_address", "typeString": "address" }, "typeName": { "id": 2973, "name": "address", "nodeType": "ElementaryTypeName", "src": "882:7:21", "stateMutability": "nonpayable", "typeDescriptions": { "typeIdentifier": "t_address", "typeString": "address" } }, "value": null, "visibility": "internal" }, { "constant": false, "id": 2976, "name": "to", "nodeType": "VariableDeclaration", "scope": 2995, "src": "896:10:21", "stateVariable": false, "storageLocation": "default", "typeDescriptions": { "typeIdentifier": "t_address", "typeString": "address" }, "typeName": { "id": 2975, "name": "address", "nodeType": "ElementaryTypeName", "src": "896:7:21", "stateMutability": "nonpayable", "typeDescriptions": { "typeIdentifier": "t_address", "typeString": "address" } }, "value": null, "visibility": "internal" }, { "constant": false, "id": 2978, "name": "value", "nodeType": "VariableDeclaration", "scope": 2995, "src": "908:13:21", "stateVariable": false, "storageLocation": "default", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" }, "typeName": { "id": 2977, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "908:7:21", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "value": null, "visibility": "internal" } ], "src": "867:55:21" }, "returnParameters": { "id": 2980, "nodeType": "ParameterList", "parameters": [], "src": "932:0:21" }, "scope": 3152, "src": "842:202:21", "stateMutability": "nonpayable", "superFunction": null, "visibility": "internal" }, { "body": { "id": 3034, "nodeType": "Block", "src": "1126:404:21", "statements": [ { "expression": { "argumentTypes": null, "arguments": [ { "argumentTypes": null, "commonType": { "typeIdentifier": "t_bool", "typeString": "bool" }, "id": 3019, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": { "argumentTypes": null, "components": [ { "argumentTypes": null, "commonType": { "typeIdentifier": "t_uint256", "typeString": "uint256" }, "id": 3007, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": { "argumentTypes": null, "id": 3005, "name": "value", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3001, "src": "1362:5:21", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "nodeType": "BinaryOperation", "operator": "==", "rightExpression": { "argumentTypes": null, "hexValue": "30", "id": 3006, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "1371:1:21", "subdenomination": null, "typeDescriptions": { "typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0" }, "value": "0" }, "src": "1362:10:21", "typeDescriptions": { "typeIdentifier": "t_bool", "typeString": "bool" } } ], "id": 3008, "isConstant": false, "isInlineArray": false, "isLValue": false, "isPure": false, "lValueRequested": false, "nodeType": "TupleExpression", "src": "1361:12:21", "typeDescriptions": { "typeIdentifier": "t_bool", "typeString": "bool" } }, "nodeType": "BinaryOperation", "operator": "||", "rightExpression": { "argumentTypes": null, "components": [ { "argumentTypes": null, "commonType": { "typeIdentifier": "t_uint256", "typeString": "uint256" }, "id": 3017, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": { "argumentTypes": null, "arguments": [ { "argumentTypes": null, "arguments": [ { "argumentTypes": null, "id": 3012, "name": "this", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 3219, "src": "1402:4:21", "typeDescriptions": { "typeIdentifier": "t_contract$_SafeERC20_$3152", "typeString": "library SafeERC20" } } ], "expression": { "argumentTypes": [ { "typeIdentifier": "t_contract$_SafeERC20_$3152", "typeString": "library SafeERC20" } ], "id": 3011, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "1394:7:21", "typeDescriptions": { "typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)" }, "typeName": "address" }, "id": 3013, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "names": [], "nodeType": "FunctionCall", "src": "1394:13:21", "typeDescriptions": { "typeIdentifier": "t_address", "typeString": "address" } }, { "argumentTypes": null, "id": 3014, "name": "spender", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2999, "src": "1409:7:21", "typeDescriptions": { "typeIdentifier": "t_address", "typeString": "address" } } ], "expression": { "argumentTypes": [ { "typeIdentifier": "t_address", "typeString": "address" }, { "typeIdentifier": "t_address", "typeString": "address" } ], "expression": { "argumentTypes": null, "id": 3009, "name": "token", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2997, "src": "1378:5:21", "typeDescriptions": { "typeIdentifier": "t_contract$_IERC20_$2937", "typeString": "contract IERC20" } }, "id": 3010, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberName": "allowance", "nodeType": "MemberAccess", "referencedDeclaration": 2920, "src": "1378:15:21", "typeDescriptions": { "typeIdentifier": "t_function_external_view$_t_address_$_t_address_$returns$_t_uint256_$", "typeString": "function (address,address) view external returns (uint256)" } }, "id": 3015, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "names": [], "nodeType": "FunctionCall", "src": "1378:39:21", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "nodeType": "BinaryOperation", "operator": "==", "rightExpression": { "argumentTypes": null, "hexValue": "30", "id": 3016, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "1421:1:21", "subdenomination": null, "typeDescriptions": { "typeIdentifier": "t_rational_0_by_1", "typeString"