Support fee-charging ERC20 tokens

This commit is contained in:
Hendrik Hofstadt 2020-08-06 16:26:25 +02:00
parent c23f8103de
commit 8f7b4917fa
1 changed files with 8 additions and 0 deletions

View File

@ -6,6 +6,7 @@ pragma experimental ABIEncoderV2;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol"; import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol";
import "@openzeppelin/contracts/math/SafeMath.sol";
import "./BytesLib.sol"; import "./BytesLib.sol";
import "./SchnorrSECP256K1.sol"; import "./SchnorrSECP256K1.sol";
import "./WrappedAsset.sol"; import "./WrappedAsset.sol";
@ -13,6 +14,7 @@ import "./WrappedAsset.sol";
contract Wormhole { contract Wormhole {
using SafeERC20 for IERC20; using SafeERC20 for IERC20;
using BytesLib for bytes; using BytesLib for bytes;
using SafeMath for uint256;
// Address of the Wrapped asset template // Address of the Wrapped asset template
address public wrappedAssetMaster; address public wrappedAssetMaster;
@ -214,7 +216,13 @@ contract Wormhole {
asset_chain = WrappedAsset(asset).assetChain(); asset_chain = WrappedAsset(asset).assetChain();
asset_address = WrappedAsset(asset).assetAddress(); asset_address = WrappedAsset(asset).assetAddress();
} else { } else {
uint256 balanceBefore = IERC20(asset).balanceOf(address(this));
IERC20(asset).safeTransferFrom(msg.sender, address(this), amount); IERC20(asset).safeTransferFrom(msg.sender, address(this), amount);
uint256 balanceAfter = IERC20(asset).balanceOf(address(this));
// The amount that was transferred in is the delta between balance before and after the transfer.
// This is to properly handle tokens that charge a fee on transfer.
amount = balanceAfter.sub(balanceBefore);
asset_address = bytes32(uint256(asset)); asset_address = bytes32(uint256(asset));
} }