aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRemco Bloemen <remco@wicked.ventures>2018-06-14 16:54:54 +0800
committerRemco Bloemen <remco@wicked.ventures>2018-06-14 16:54:54 +0800
commit2c7d6a7711e44294e64858095971a2aebc6d1829 (patch)
tree13c5c2e969b24e05b8edf2a904eb055740648575
parent0e354e5ea1f9951088331a310999bf87c8f8f4b3 (diff)
downloaddexon-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.sol30
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