{ "contractName": "SecuredTokenTransfer", "abi": [], "bytecode": "0x6080604052348015600f57600080fd5b50603580601d6000396000f3006080604052600080fd00a165627a7a72305820ba27992b3b19c83b563b2634ef4e6e4b21311676e3d2a13b83cfd34834dfb8510029", "deployedBytecode": "0x6080604052600080fd00a165627a7a72305820ba27992b3b19c83b563b2634ef4e6e4b21311676e3d2a13b83cfd34834dfb8510029", "sourceMap": "133:1051:10:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;133:1051:10;;;;;;;", "deployedSourceMap": "133:1051:10:-;;;;;", "source": "pragma solidity 0.4.24;\n\n\n/// @title SecuredTokenTransfer - Secure token transfer\n/// @author Richard Meissner - \ncontract SecuredTokenTransfer {\n\n /// @dev Transfers a token and returns if it was a success\n /// @param token Token that should be transferred\n /// @param receiver Receiver to whom the token should be transferred\n /// @param amount The amount of tokens that should be transferred\n function transferToken (\n address token, \n address receiver,\n uint256 amount\n )\n internal\n returns (bool transferred)\n {\n bytes memory data = abi.encodeWithSignature(\"transfer(address,uint256)\", receiver, amount);\n // solium-disable-next-line security/no-inline-assembly\n assembly {\n let success := call(sub(gas, 10000), token, 0, add(data, 0x20), mload(data), 0, 0)\n let ptr := mload(0x40)\n returndatacopy(ptr, 0, returndatasize)\n switch returndatasize \n case 0 { transferred := success }\n case 0x20 { transferred := iszero(or(iszero(success), iszero(mload(ptr)))) }\n default { transferred := 0 }\n }\n }\n}\n", "sourcePath": "/Users/apanizo/git/gnosis/safe-contracts/contracts/common/SecuredTokenTransfer.sol", "ast": { "absolutePath": "/Users/apanizo/git/gnosis/safe-contracts/contracts/common/SecuredTokenTransfer.sol", "exportedSymbols": { "SecuredTokenTransfer": [ 1718 ] }, "id": 1719, "nodeType": "SourceUnit", "nodes": [ { "id": 1695, "literals": [ "solidity", "0.4", ".24" ], "nodeType": "PragmaDirective", "src": "0:23:10" }, { "baseContracts": [], "contractDependencies": [], "contractKind": "contract", "documentation": "@title SecuredTokenTransfer - Secure token transfer\n @author Richard Meissner - ", "fullyImplemented": true, "id": 1718, "linearizedBaseContracts": [ 1718 ], "name": "SecuredTokenTransfer", "nodeType": "ContractDefinition", "nodes": [ { "body": { "id": 1716, "nodeType": "Block", "src": "590:592:10", "statements": [ { "assignments": [ 1707 ], "declarations": [ { "constant": false, "id": 1707, "name": "data", "nodeType": "VariableDeclaration", "scope": 1717, "src": "600:17:10", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": { "typeIdentifier": "t_bytes_memory_ptr", "typeString": "bytes" }, "typeName": { "id": 1706, "name": "bytes", "nodeType": "ElementaryTypeName", "src": "600:5:10", "typeDescriptions": { "typeIdentifier": "t_bytes_storage_ptr", "typeString": "bytes" } }, "value": null, "visibility": "internal" } ], "id": 1714, "initialValue": { "argumentTypes": null, "arguments": [ { "argumentTypes": null, "hexValue": "7472616e7366657228616464726573732c75696e7432353629", "id": 1710, "isConstant": false, "isLValue": false, "isPure": true, "kind": "string", "lValueRequested": false, "nodeType": "Literal", "src": "644:27:10", "subdenomination": null, "typeDescriptions": { "typeIdentifier": "t_stringliteral_a9059cbb2ab09eb219583f4a59a5d0623ade346d962bcd4e46b11da047c9049b", "typeString": "literal_string \"transfer(address,uint256)\"" }, "value": "transfer(address,uint256)" }, { "argumentTypes": null, "id": 1711, "name": "receiver", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1699, "src": "673:8:10", "typeDescriptions": { "typeIdentifier": "t_address", "typeString": "address" } }, { "argumentTypes": null, "id": 1712, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1701, "src": "683:6:10", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } } ], "expression": { "argumentTypes": [ { "typeIdentifier": "t_stringliteral_a9059cbb2ab09eb219583f4a59a5d0623ade346d962bcd4e46b11da047c9049b", "typeString": "literal_string \"transfer(address,uint256)\"" }, { "typeIdentifier": "t_address", "typeString": "address" }, { "typeIdentifier": "t_uint256", "typeString": "uint256" } ], "expression": { "argumentTypes": null, "id": 1708, "name": "abi", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4002, "src": "620:3:10", "typeDescriptions": { "typeIdentifier": "t_magic_abi", "typeString": "abi" } }, "id": 1709, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "memberName": "encodeWithSignature", "nodeType": "MemberAccess", "referencedDeclaration": null, "src": "620:23:10", "typeDescriptions": { "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$", "typeString": "function (string memory) pure returns (bytes memory)" } }, "id": 1713, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "names": [], "nodeType": "FunctionCall", "src": "620:70:10", "typeDescriptions": { "typeIdentifier": "t_bytes_memory_ptr", "typeString": "bytes memory" } }, "nodeType": "VariableDeclarationStatement", "src": "600:90:10" }, { "externalReferences": [ { "transferred": { "declaration": 1704, "isOffset": false, "isSlot": false, "src": "1061:11:10", "valueSize": 1 } }, { "data": { "declaration": 1707, "isOffset": false, "isSlot": false, "src": "857:4:10", "valueSize": 1 } }, { "token": { "declaration": 1697, "isOffset": false, "isSlot": false, "src": "824:5:10", "valueSize": 1 } }, { "data": { "declaration": 1707, "isOffset": false, "isSlot": false, "src": "838:4:10", "valueSize": 1 } }, { "transferred": { "declaration": 1704, "isOffset": false, "isSlot": false, "src": "1012:11:10", "valueSize": 1 } }, { "transferred": { "declaration": 1704, "isOffset": false, "isSlot": false, "src": "1148:11:10", "valueSize": 1 } } ], "id": 1715, "nodeType": "InlineAssembly", "operations": "{\n let success := call(sub(gas(), 10000), token, 0, add(data, 0x20), mload(data), 0, 0)\n let ptr := mload(0x40)\n returndatacopy(ptr, 0, returndatasize())\n switch returndatasize()\n case 0 {\n transferred := success\n }\n case 0x20 {\n transferred := iszero(or(iszero(success), iszero(mload(ptr))))\n }\n default {\n transferred := 0\n }\n}", "src": "764:418:10" } ] }, "documentation": "@dev Transfers a token and returns if it was a success\n @param token Token that should be transferred\n @param receiver Receiver to whom the token should be transferred\n @param amount The amount of tokens that should be transferred", "id": 1717, "implemented": true, "isConstructor": false, "isDeclaredConst": false, "modifiers": [], "name": "transferToken", "nodeType": "FunctionDefinition", "parameters": { "id": 1702, "nodeType": "ParameterList", "parameters": [ { "constant": false, "id": 1697, "name": "token", "nodeType": "VariableDeclaration", "scope": 1717, "src": "463:13:10", "stateVariable": false, "storageLocation": "default", "typeDescriptions": { "typeIdentifier": "t_address", "typeString": "address" }, "typeName": { "id": 1696, "name": "address", "nodeType": "ElementaryTypeName", "src": "463:7:10", "typeDescriptions": { "typeIdentifier": "t_address", "typeString": "address" } }, "value": null, "visibility": "internal" }, { "constant": false, "id": 1699, "name": "receiver", "nodeType": "VariableDeclaration", "scope": 1717, "src": "487:16:10", "stateVariable": false, "storageLocation": "default", "typeDescriptions": { "typeIdentifier": "t_address", "typeString": "address" }, "typeName": { "id": 1698, "name": "address", "nodeType": "ElementaryTypeName", "src": "487:7:10", "typeDescriptions": { "typeIdentifier": "t_address", "typeString": "address" } }, "value": null, "visibility": "internal" }, { "constant": false, "id": 1701, "name": "amount", "nodeType": "VariableDeclaration", "scope": 1717, "src": "513:14:10", "stateVariable": false, "storageLocation": "default", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" }, "typeName": { "id": 1700, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "513:7:10", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "value": null, "visibility": "internal" } ], "src": "453:80:10" }, "payable": false, "returnParameters": { "id": 1705, "nodeType": "ParameterList", "parameters": [ { "constant": false, "id": 1704, "name": "transferred", "nodeType": "VariableDeclaration", "scope": 1717, "src": "568:16:10", "stateVariable": false, "storageLocation": "default", "typeDescriptions": { "typeIdentifier": "t_bool", "typeString": "bool" }, "typeName": { "id": 1703, "name": "bool", "nodeType": "ElementaryTypeName", "src": "568:4:10", "typeDescriptions": { "typeIdentifier": "t_bool", "typeString": "bool" } }, "value": null, "visibility": "internal" } ], "src": "567:18:10" }, "scope": 1718, "src": "430:752:10", "stateMutability": "nonpayable", "superFunction": null, "visibility": "internal" } ], "scope": 1719, "src": "133:1051:10" } ], "src": "0:1185:10" }, "legacyAST": { "absolutePath": "/Users/apanizo/git/gnosis/safe-contracts/contracts/common/SecuredTokenTransfer.sol", "exportedSymbols": { "SecuredTokenTransfer": [ 1718 ] }, "id": 1719, "nodeType": "SourceUnit", "nodes": [ { "id": 1695, "literals": [ "solidity", "0.4", ".24" ], "nodeType": "PragmaDirective", "src": "0:23:10" }, { "baseContracts": [], "contractDependencies": [], "contractKind": "contract", "documentation": "@title SecuredTokenTransfer - Secure token transfer\n @author Richard Meissner - ", "fullyImplemented": true, "id": 1718, "linearizedBaseContracts": [ 1718 ], "name": "SecuredTokenTransfer", "nodeType": "ContractDefinition", "nodes": [ { "body": { "id": 1716, "nodeType": "Block", "src": "590:592:10", "statements": [ { "assignments": [ 1707 ], "declarations": [ { "constant": false, "id": 1707, "name": "data", "nodeType": "VariableDeclaration", "scope": 1717, "src": "600:17:10", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": { "typeIdentifier": "t_bytes_memory_ptr", "typeString": "bytes" }, "typeName": { "id": 1706, "name": "bytes", "nodeType": "ElementaryTypeName", "src": "600:5:10", "typeDescriptions": { "typeIdentifier": "t_bytes_storage_ptr", "typeString": "bytes" } }, "value": null, "visibility": "internal" } ], "id": 1714, "initialValue": { "argumentTypes": null, "arguments": [ { "argumentTypes": null, "hexValue": "7472616e7366657228616464726573732c75696e7432353629", "id": 1710, "isConstant": false, "isLValue": false, "isPure": true, "kind": "string", "lValueRequested": false, "nodeType": "Literal", "src": "644:27:10", "subdenomination": null, "typeDescriptions": { "typeIdentifier": "t_stringliteral_a9059cbb2ab09eb219583f4a59a5d0623ade346d962bcd4e46b11da047c9049b", "typeString": "literal_string \"transfer(address,uint256)\"" }, "value": "transfer(address,uint256)" }, { "argumentTypes": null, "id": 1711, "name": "receiver", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1699, "src": "673:8:10", "typeDescriptions": { "typeIdentifier": "t_address", "typeString": "address" } }, { "argumentTypes": null, "id": 1712, "name": "amount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1701, "src": "683:6:10", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } } ], "expression": { "argumentTypes": [ { "typeIdentifier": "t_stringliteral_a9059cbb2ab09eb219583f4a59a5d0623ade346d962bcd4e46b11da047c9049b", "typeString": "literal_string \"transfer(address,uint256)\"" }, { "typeIdentifier": "t_address", "typeString": "address" }, { "typeIdentifier": "t_uint256", "typeString": "uint256" } ], "expression": { "argumentTypes": null, "id": 1708, "name": "abi", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 4002, "src": "620:3:10", "typeDescriptions": { "typeIdentifier": "t_magic_abi", "typeString": "abi" } }, "id": 1709, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "memberName": "encodeWithSignature", "nodeType": "MemberAccess", "referencedDeclaration": null, "src": "620:23:10", "typeDescriptions": { "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$", "typeString": "function (string memory) pure returns (bytes memory)" } }, "id": 1713, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "names": [], "nodeType": "FunctionCall", "src": "620:70:10", "typeDescriptions": { "typeIdentifier": "t_bytes_memory_ptr", "typeString": "bytes memory" } }, "nodeType": "VariableDeclarationStatement", "src": "600:90:10" }, { "externalReferences": [ { "transferred": { "declaration": 1704, "isOffset": false, "isSlot": false, "src": "1061:11:10", "valueSize": 1 } }, { "data": { "declaration": 1707, "isOffset": false, "isSlot": false, "src": "857:4:10", "valueSize": 1 } }, { "token": { "declaration": 1697, "isOffset": false, "isSlot": false, "src": "824:5:10", "valueSize": 1 } }, { "data": { "declaration": 1707, "isOffset": false, "isSlot": false, "src": "838:4:10", "valueSize": 1 } }, { "transferred": { "declaration": 1704, "isOffset": false, "isSlot": false, "src": "1012:11:10", "valueSize": 1 } }, { "transferred": { "declaration": 1704, "isOffset": false, "isSlot": false, "src": "1148:11:10", "valueSize": 1 } } ], "id": 1715, "nodeType": "InlineAssembly", "operations": "{\n let success := call(sub(gas(), 10000), token, 0, add(data, 0x20), mload(data), 0, 0)\n let ptr := mload(0x40)\n returndatacopy(ptr, 0, returndatasize())\n switch returndatasize()\n case 0 {\n transferred := success\n }\n case 0x20 {\n transferred := iszero(or(iszero(success), iszero(mload(ptr))))\n }\n default {\n transferred := 0\n }\n}", "src": "764:418:10" } ] }, "documentation": "@dev Transfers a token and returns if it was a success\n @param token Token that should be transferred\n @param receiver Receiver to whom the token should be transferred\n @param amount The amount of tokens that should be transferred", "id": 1717, "implemented": true, "isConstructor": false, "isDeclaredConst": false, "modifiers": [], "name": "transferToken", "nodeType": "FunctionDefinition", "parameters": { "id": 1702, "nodeType": "ParameterList", "parameters": [ { "constant": false, "id": 1697, "name": "token", "nodeType": "VariableDeclaration", "scope": 1717, "src": "463:13:10", "stateVariable": false, "storageLocation": "default", "typeDescriptions": { "typeIdentifier": "t_address", "typeString": "address" }, "typeName": { "id": 1696, "name": "address", "nodeType": "ElementaryTypeName", "src": "463:7:10", "typeDescriptions": { "typeIdentifier": "t_address", "typeString": "address" } }, "value": null, "visibility": "internal" }, { "constant": false, "id": 1699, "name": "receiver", "nodeType": "VariableDeclaration", "scope": 1717, "src": "487:16:10", "stateVariable": false, "storageLocation": "default", "typeDescriptions": { "typeIdentifier": "t_address", "typeString": "address" }, "typeName": { "id": 1698, "name": "address", "nodeType": "ElementaryTypeName", "src": "487:7:10", "typeDescriptions": { "typeIdentifier": "t_address", "typeString": "address" } }, "value": null, "visibility": "internal" }, { "constant": false, "id": 1701, "name": "amount", "nodeType": "VariableDeclaration", "scope": 1717, "src": "513:14:10", "stateVariable": false, "storageLocation": "default", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" }, "typeName": { "id": 1700, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "513:7:10", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "value": null, "visibility": "internal" } ], "src": "453:80:10" }, "payable": false, "returnParameters": { "id": 1705, "nodeType": "ParameterList", "parameters": [ { "constant": false, "id": 1704, "name": "transferred", "nodeType": "VariableDeclaration", "scope": 1717, "src": "568:16:10", "stateVariable": false, "storageLocation": "default", "typeDescriptions": { "typeIdentifier": "t_bool", "typeString": "bool" }, "typeName": { "id": 1703, "name": "bool", "nodeType": "ElementaryTypeName", "src": "568:4:10", "typeDescriptions": { "typeIdentifier": "t_bool", "typeString": "bool" } }, "value": null, "visibility": "internal" } ], "src": "567:18:10" }, "scope": 1718, "src": "430:752:10", "stateMutability": "nonpayable", "superFunction": null, "visibility": "internal" } ], "scope": 1719, "src": "133:1051:10" } ], "src": "0:1185:10" }, "compiler": { "name": "solc", "version": "0.4.24+commit.e67f0147.Emscripten.clang" }, "networks": {}, "schemaVersion": "2.0.0", "updatedAt": "2018-10-05T14:25:58.937Z" }