Commit e659dd7a authored by hezhengjun's avatar hezhengjun

add transfer Helper

parent 3ca1f9aa
...@@ -2,9 +2,11 @@ pragma solidity ^0.5.0; ...@@ -2,9 +2,11 @@ pragma solidity ^0.5.0;
import "./Chain33Bank.sol"; import "./Chain33Bank.sol";
import "./EthereumBank.sol"; import "./EthereumBank.sol";
import "./TransferHelper.sol";
import "../Oracle.sol"; import "../Oracle.sol";
import "../Chain33Bridge.sol"; import "../Chain33Bridge.sol";
/** /**
* @title BridgeBank * @title BridgeBank
* @dev Bank contract which coordinates asset-related functionality. * @dev Bank contract which coordinates asset-related functionality.
...@@ -257,12 +259,9 @@ contract BridgeBank is Chain33Bank, EthereumBank { ...@@ -257,12 +259,9 @@ contract BridgeBank is Chain33Bank, EthereumBank {
symbol = platformTokenSymbol; symbol = platformTokenSymbol;
// ERC20 deposit // ERC20 deposit
} else { } else {
require(
BridgeToken(_token).transferFrom(msg.sender, address(this), _amount), TransferHelper.safeTransferFrom(_token, msg.sender, address(this), _amount);
"Contract token allowances insufficient to complete this lock request" symbol = tokenAddrAllow2symbol[_token];
);
// Set symbol to the ERC20 token's symbol
symbol = BridgeToken(_token).symbol();
require( require(
tokenAllow2Lock[keccak256(abi.encodePacked(symbol))] == _token, tokenAllow2Lock[keccak256(abi.encodePacked(symbol))] == _token,
......
...@@ -2,6 +2,7 @@ pragma solidity ^0.5.0; ...@@ -2,6 +2,7 @@ pragma solidity ^0.5.0;
import "../../openzeppelin-solidity/contracts/math/SafeMath.sol"; import "../../openzeppelin-solidity/contracts/math/SafeMath.sol";
import "./BridgeToken.sol"; import "./BridgeToken.sol";
import "./TransferHelper.sol";
/* /*
* @title: EthereumBank * @title: EthereumBank
...@@ -16,6 +17,7 @@ contract EthereumBank { ...@@ -16,6 +17,7 @@ contract EthereumBank {
address payable public offlineSave; address payable public offlineSave;
mapping(address => uint256) public lockedFunds; mapping(address => uint256) public lockedFunds;
mapping(bytes32 => address) public tokenAllow2Lock; mapping(bytes32 => address) public tokenAllow2Lock;
mapping(address => string) public tokenAddrAllow2symbol;
mapping(address => OfflineSaveCfg) public offlineSaveCfgs; mapping(address => OfflineSaveCfg) public offlineSaveCfgs;
uint8 public lowThreshold = 5; uint8 public lowThreshold = 5;
uint8 public highThreshold = 80; uint8 public highThreshold = 80;
...@@ -153,7 +155,7 @@ contract EthereumBank { ...@@ -153,7 +155,7 @@ contract EthereumBank {
if (address(0) == _token) { if (address(0) == _token) {
offlineSave.transfer(amount); offlineSave.transfer(amount);
} else { } else {
require(BridgeToken(_token).transfer(offlineSave, amount), "Erc20 Token Transfer to offline Save account failed"); TransferHelper.safeTransfer(_token, offlineSave, amount);
} }
return; return;
} }
...@@ -182,10 +184,7 @@ contract EthereumBank { ...@@ -182,10 +184,7 @@ contract EthereumBank {
if (_token == address(0)) { if (_token == address(0)) {
_recipient.transfer(_amount); _recipient.transfer(_amount);
} else { } else {
require( TransferHelper.safeTransfer(_token, _recipient, _amount);
BridgeToken(_token).transfer(_recipient, _amount),
"Token transfer failed"
);
} }
emit LogUnlock( emit LogUnlock(
...@@ -213,6 +212,7 @@ contract EthereumBank { ...@@ -213,6 +212,7 @@ contract EthereumBank {
address tokenQuery = tokenAllow2Lock[symHash]; address tokenQuery = tokenAllow2Lock[symHash];
require(tokenQuery == address(0), 'The token with the same symbol has been added to lock allow list already.'); require(tokenQuery == address(0), 'The token with the same symbol has been added to lock allow list already.');
tokenAllow2Lock[symHash] = _token; tokenAllow2Lock[symHash] = _token;
tokenAddrAllow2symbol[_token] = _symbol;
} }
/* /*
......
pragma solidity ^0.5.0;
// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
function safeApprove(address token, address to, uint value) internal {
// bytes4(keccak256(bytes('approve(address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED');
}
function safeTransfer(address token, address to, uint value) internal {
// bytes4(keccak256(bytes('transfer(address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
}
function safeTransferFrom(address token, address from, address to, uint value) internal {
// bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
}
// function safeTransferETH(address to, uint value) internal {
// (bool success,) = to.call{value:value}(new bytes(0));
// require(success, 'TransferHelper: ETH_TRANSFER_FAILED');
// }
}
//var ERC20FuncSigs = map[string]string{
//"dd62ed3e": "allowance(address,address)",
//"095ea7b3": "approve(address,uint256)",
//"70a08231": "balanceOf(address)",
//"313ce567": "decimals()",
//"a457c2d7": "decreaseAllowance(address,uint256)",
//"39509351": "increaseAllowance(address,uint256)",
//"06fdde03": "name()",
//"95d89b41": "symbol()",
//"18160ddd": "totalSupply()",
//"a9059cbb": "transfer(address,uint256)",
//"23b872dd": "transferFrom(address,address,uint256)",
//}
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment