From 0a8a49d53b901ba641d54690980b2756951c1f2e Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Sat, 20 Jul 2019 21:16:04 +0000 Subject: [PATCH 1/4] refactor(ERC165Checker) replaced assembly code with function --- contracts/introspection/ERC165Checker.sol | 26 ++++------------------- truffle-config.js | 2 +- 2 files changed, 5 insertions(+), 23 deletions(-) diff --git a/contracts/introspection/ERC165Checker.sol b/contracts/introspection/ERC165Checker.sol index c1d0fd027dc..ac776535d7d 100644 --- a/contracts/introspection/ERC165Checker.sol +++ b/contracts/introspection/ERC165Checker.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.0; +pragma solidity ^0.5.10; /** * @dev Library used to query support of an interface declared via {IERC165}. @@ -94,28 +94,10 @@ library ERC165Checker { function _callERC165SupportsInterface(address account, bytes4 interfaceId) private view - returns (bool success, bool result) + returns (bool, bool) { bytes memory encodedParams = abi.encodeWithSelector(_INTERFACE_ID_ERC165, interfaceId); - - // solhint-disable-next-line no-inline-assembly - assembly { - let encodedParams_data := add(0x20, encodedParams) - let encodedParams_size := mload(encodedParams) - - let output := mload(0x40) // Find empty storage location using "free memory pointer" - mstore(output, 0x0) - - success := staticcall( - 30000, // 30k gas - account, // To addr - encodedParams_data, - encodedParams_size, - output, - 0x20 // Outputs are 32 bytes long - ) - - result := mload(output) // Load the result - } + (bool success, bytes memory result) = account.staticcall.gas(30000)(encodedParams); + return (success, abi.decode(result, (bool))); } } diff --git a/truffle-config.js b/truffle-config.js index 3f7e50542fa..ad2aef01e3c 100644 --- a/truffle-config.js +++ b/truffle-config.js @@ -1,7 +1,7 @@ require('chai/register-should'); const solcStable = { - version: '0.5.7', + version: '0.5.10', }; const solcNightly = { From f9066ad5f5f55c266b2ed783422636d77f7015e2 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Mon, 29 Jul 2019 19:03:19 +0000 Subject: [PATCH 2/4] returned false if result.length==0 --- contracts/introspection/ERC165Checker.sol | 1 + package-lock.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/contracts/introspection/ERC165Checker.sol b/contracts/introspection/ERC165Checker.sol index ac776535d7d..77caeaed869 100644 --- a/contracts/introspection/ERC165Checker.sol +++ b/contracts/introspection/ERC165Checker.sol @@ -98,6 +98,7 @@ library ERC165Checker { { bytes memory encodedParams = abi.encodeWithSelector(_INTERFACE_ID_ERC165, interfaceId); (bool success, bytes memory result) = account.staticcall.gas(30000)(encodedParams); + if (result.length == 0) return (false, false); return (success, abi.decode(result, (bool))); } } diff --git a/package-lock.json b/package-lock.json index 33730d33627..e4ab50500cc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "@openzeppelin/contracts", + "name": "openzeppelin-solidity", "version": "2.3.0", "lockfileVersion": 1, "requires": true, From a0d733dbc5d5cf7004b001ebe381a29c178064b1 Mon Sep 17 00:00:00 2001 From: Francisco Giordano Date: Fri, 9 Aug 2019 15:18:19 -0300 Subject: [PATCH 3/4] trigger ci From cf065e7c1e4e6ded125a02c8d271d7795b1119f2 Mon Sep 17 00:00:00 2001 From: Yohann Pereira Date: Wed, 11 Sep 2019 12:54:58 -0400 Subject: [PATCH 4/4] updated ERC165Checker to return false if result.length < 32 --- contracts/introspection/ERC165Checker.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/introspection/ERC165Checker.sol b/contracts/introspection/ERC165Checker.sol index 77caeaed869..31acc60240b 100644 --- a/contracts/introspection/ERC165Checker.sol +++ b/contracts/introspection/ERC165Checker.sol @@ -98,7 +98,7 @@ library ERC165Checker { { bytes memory encodedParams = abi.encodeWithSelector(_INTERFACE_ID_ERC165, interfaceId); (bool success, bytes memory result) = account.staticcall.gas(30000)(encodedParams); - if (result.length == 0) return (false, false); + if (result.length < 32) return (false, false); return (success, abi.decode(result, (bool))); } }