diff options
author | Remco Bloemen <remco@wicked.ventures> | 2018-06-14 16:54:54 +0800 |
---|---|---|
committer | Remco Bloemen <remco@wicked.ventures> | 2018-06-14 16:54:54 +0800 |
commit | 2c7d6a7711e44294e64858095971a2aebc6d1829 (patch) | |
tree | 13c5c2e969b24e05b8edf2a904eb055740648575 | |
parent | 0e354e5ea1f9951088331a310999bf87c8f8f4b3 (diff) | |
download | dexon-sol-tools-2c7d6a7711e44294e64858095971a2aebc6d1829.tar dexon-sol-tools-2c7d6a7711e44294e64858095971a2aebc6d1829.tar.gz dexon-sol-tools-2c7d6a7711e44294e64858095971a2aebc6d1829.tar.bz2 dexon-sol-tools-2c7d6a7711e44294e64858095971a2aebc6d1829.tar.lz dexon-sol-tools-2c7d6a7711e44294e64858095971a2aebc6d1829.tar.xz dexon-sol-tools-2c7d6a7711e44294e64858095971a2aebc6d1829.tar.zst dexon-sol-tools-2c7d6a7711e44294e64858095971a2aebc6d1829.zip |
Handle tokens that do not return bool
-rw-r--r-- | packages/contracts/src/contracts/current/protocol/AssetProxy/ERC20Proxy.sol | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/packages/contracts/src/contracts/current/protocol/AssetProxy/ERC20Proxy.sol b/packages/contracts/src/contracts/current/protocol/AssetProxy/ERC20Proxy.sol index ddcd78e93..eeddb9707 100644 --- a/packages/contracts/src/contracts/current/protocol/AssetProxy/ERC20Proxy.sol +++ b/packages/contracts/src/contracts/current/protocol/AssetProxy/ERC20Proxy.sol @@ -50,7 +50,35 @@ contract ERC20Proxy is address token = readAddress(assetData, 0); // Transfer tokens. - bool success = IERC20Token(token).transferFrom(from, to, amount); + // We do a raw call so we can check the success separate + // from the return data. + bool success = token.call(abi.encodeWithSelector( + IERC20Token(token).transferFrom.selector, + from, + to, + amount + )); + require( + success, + TRANSFER_FAILED + ); + + // Check return data. + // If there is no return data, we assume the token incorrectly + // does not return a bool. In this case we expect it to revert + // on failure, which was handled above. + // If the token does return data, we require that it is a single + // value that evaluates to true. + assembly { + if returndatasize { + success := 0 + if eq(returndatasize, 32) { + // First 64 bytes of memory are reserved scratch space + returndatacopy(0, 0, 32) + success := mload(0) + } + } + } require( success, TRANSFER_FAILED |