diff --git a/contracts/upgradeable_contracts/ERC20Bridge.sol b/contracts/upgradeable_contracts/ERC20Bridge.sol index e69b8377f..bf2005a18 100644 --- a/contracts/upgradeable_contracts/ERC20Bridge.sol +++ b/contracts/upgradeable_contracts/ERC20Bridge.sol @@ -16,23 +16,14 @@ contract ERC20Bridge is BasicForeignBridge { addressStorage[ERC20_TOKEN] = _token; } - function _relayTokens(address _sender, address _receiver, uint256 _amount) internal { + function relayTokens(address _receiver, uint256 _amount) external { require(_receiver != address(0)); require(_receiver != address(this)); require(_amount > 0); require(withinLimit(_amount)); addTotalSpentPerDay(getCurrentDay(), _amount); - erc20token().transferFrom(_sender, address(this), _amount); + erc20token().transferFrom(msg.sender, address(this), _amount); emit UserRequestForAffirmation(_receiver, _amount); } - - function relayTokens(address _from, address _receiver, uint256 _amount) external { - require(_from == msg.sender || _from == _receiver); - _relayTokens(_from, _receiver, _amount); - } - - function relayTokens(address _receiver, uint256 _amount) external { - _relayTokens(msg.sender, _receiver, _amount); - } } diff --git a/contracts/upgradeable_contracts/VersionableBridge.sol b/contracts/upgradeable_contracts/VersionableBridge.sol index f0dc60483..75f61937b 100644 --- a/contracts/upgradeable_contracts/VersionableBridge.sol +++ b/contracts/upgradeable_contracts/VersionableBridge.sol @@ -2,7 +2,7 @@ pragma solidity 0.4.24; contract VersionableBridge { function getBridgeInterfacesVersion() external pure returns (uint64 major, uint64 minor, uint64 patch) { - return (5, 0, 0); + return (5, 1, 0); } /* solcov ignore next */ diff --git a/contracts/upgradeable_contracts/amb_erc20_to_native/BasicAMBErc20ToNative.sol b/contracts/upgradeable_contracts/amb_erc20_to_native/BasicAMBErc20ToNative.sol index f581d3305..b256d30e1 100644 --- a/contracts/upgradeable_contracts/amb_erc20_to_native/BasicAMBErc20ToNative.sol +++ b/contracts/upgradeable_contracts/amb_erc20_to_native/BasicAMBErc20ToNative.sol @@ -51,7 +51,7 @@ contract BasicAMBErc20ToNative is Initializable, Upgradeable, Claimable, Version * @return patch value of the version */ function getBridgeInterfacesVersion() external pure returns (uint64 major, uint64 minor, uint64 patch) { - return (1, 0, 0); + return (1, 1, 0); } /** diff --git a/contracts/upgradeable_contracts/amb_erc20_to_native/ForeignAMBErc20ToNative.sol b/contracts/upgradeable_contracts/amb_erc20_to_native/ForeignAMBErc20ToNative.sol index 5293335c8..152914f83 100644 --- a/contracts/upgradeable_contracts/amb_erc20_to_native/ForeignAMBErc20ToNative.sol +++ b/contracts/upgradeable_contracts/amb_erc20_to_native/ForeignAMBErc20ToNative.sol @@ -58,18 +58,6 @@ contract ForeignAMBErc20ToNative is BasicAMBErc20ToNative, ReentrancyGuard, Base return _erc677token(); } - /** - * @dev It will initiate the bridge operation that will lock the amount of tokens transferred and mint the native tokens on - * the other network. The user should first call Approve method of the ERC677 token. - * @param _from address that will transfer the tokens to be locked. - * @param _receiver address that will receive the native tokens on the other network. - * @param _value amount of tokens to be transferred to the other network. - */ - function relayTokens(address _from, address _receiver, uint256 _value) external { - require(_from == msg.sender || _from == _receiver); - _relayTokens(_from, _receiver, _value); - } - /** * @dev It will initiate the bridge operation that will lock the amount of tokens transferred and mint the native tokens on * the other network. The user should first call Approve method of the ERC677 token. @@ -77,7 +65,20 @@ contract ForeignAMBErc20ToNative is BasicAMBErc20ToNative, ReentrancyGuard, Base * @param _value amount of tokens to be transferred to the other network. */ function relayTokens(address _receiver, uint256 _value) external { - _relayTokens(msg.sender, _receiver, _value); + // This lock is to prevent calling passMessage twice. + // When transferFrom is called, after the transfer, the ERC677 token will call onTokenTransfer from this contract + // which will call passMessage. + require(!lock()); + ERC677 token = _erc677token(); + address to = address(this); + require(withinLimit(_value)); + addTotalSpentPerDay(getCurrentDay(), _value); + _setMediatorBalance(mediatorBalance().add(_value)); + + setLock(true); + token.transferFrom(msg.sender, to, _value); + setLock(false); + bridgeSpecificActionsOnTokenTransfer(token, msg.sender, _value, abi.encodePacked(_receiver)); } /** @@ -181,31 +182,6 @@ contract ForeignAMBErc20ToNative is BasicAMBErc20ToNative, ReentrancyGuard, Base } } - /** - * @dev Validates that the token amount is inside the limits, calls transferFrom to transfer the tokens to the contract - * and invokes the method to lock the tokens and mint the native tokens on the other network. - * The user should first call Approve method of the ERC677 token. - * @param _from address that will transfer the tokens to be locked. - * @param _receiver address that will receive the native tokens on the other network. - * @param _value amount of tokens to be transferred to the other network. - */ - function _relayTokens(address _from, address _receiver, uint256 _value) internal { - // This lock is to prevent calling passMessage twice. - // When transferFrom is called, after the transfer, the ERC677 token will call onTokenTransfer from this contract - // which will call passMessage. - require(!lock()); - ERC677 token = _erc677token(); - address to = address(this); - require(withinLimit(_value)); - addTotalSpentPerDay(getCurrentDay(), _value); - _setMediatorBalance(mediatorBalance().add(_value)); - - setLock(true); - token.transferFrom(_from, to, _value); - setLock(false); - bridgeSpecificActionsOnTokenTransfer(token, _from, _value, abi.encodePacked(_receiver)); - } - /** * @dev Tells the address of the mediator contract on the other side, used by chooseReceiver method * to avoid sending the native tokens to that address. diff --git a/contracts/upgradeable_contracts/amb_erc677_to_erc677/BasicAMBErc677ToErc677.sol b/contracts/upgradeable_contracts/amb_erc677_to_erc677/BasicAMBErc677ToErc677.sol index c1b5ed0a6..9b657fc7d 100644 --- a/contracts/upgradeable_contracts/amb_erc677_to_erc677/BasicAMBErc677ToErc677.sol +++ b/contracts/upgradeable_contracts/amb_erc677_to_erc677/BasicAMBErc677ToErc677.sol @@ -62,12 +62,7 @@ contract BasicAMBErc677ToErc677 is return mediatorContractOnOtherSide(); } - function relayTokens(address _from, address _receiver, uint256 _value) external { - require(_from == msg.sender || _from == _receiver); - _relayTokens(_from, _receiver, _value); - } - - function _relayTokens(address _from, address _receiver, uint256 _value) internal { + function relayTokens(address _receiver, uint256 _value) external { // This lock is to prevent calling passMessage twice if a ERC677 token is used. // When transferFrom is called, after the transfer, the ERC677 token will call onTokenTransfer from this contract // which will call passMessage. @@ -78,13 +73,9 @@ contract BasicAMBErc677ToErc677 is addTotalSpentPerDay(getCurrentDay(), _value); setLock(true); - token.transferFrom(_from, to, _value); + token.transferFrom(msg.sender, to, _value); setLock(false); - bridgeSpecificActionsOnTokenTransfer(token, _from, _value, abi.encodePacked(_receiver)); - } - - function relayTokens(address _receiver, uint256 _value) external { - _relayTokens(msg.sender, _receiver, _value); + bridgeSpecificActionsOnTokenTransfer(token, msg.sender, _value, abi.encodePacked(_receiver)); } function onTokenTransfer(address _from, uint256 _value, bytes _data) external returns (bool) { @@ -99,7 +90,7 @@ contract BasicAMBErc677ToErc677 is } function getBridgeInterfacesVersion() external pure returns (uint64 major, uint64 minor, uint64 patch) { - return (1, 1, 0); + return (1, 2, 0); } function getBridgeMode() external pure returns (bytes4 _data) { diff --git a/contracts/upgradeable_contracts/amb_erc677_to_erc677/BasicStakeTokenMediator.sol b/contracts/upgradeable_contracts/amb_erc677_to_erc677/BasicStakeTokenMediator.sol index 926f22921..d069a95a0 100644 --- a/contracts/upgradeable_contracts/amb_erc677_to_erc677/BasicStakeTokenMediator.sol +++ b/contracts/upgradeable_contracts/amb_erc677_to_erc677/BasicStakeTokenMediator.sol @@ -4,7 +4,7 @@ import "./BasicAMBErc677ToErc677.sol"; contract BasicStakeTokenMediator is BasicAMBErc677ToErc677 { function getBridgeInterfacesVersion() external pure returns (uint64 major, uint64 minor, uint64 patch) { - return (1, 0, 0); + return (1, 1, 0); } function getBridgeMode() external pure returns (bytes4 _data) { diff --git a/contracts/upgradeable_contracts/amb_erc677_to_erc677/callflows.md b/contracts/upgradeable_contracts/amb_erc677_to_erc677/callflows.md index a772d3520..cd3903b49 100644 --- a/contracts/upgradeable_contracts/amb_erc677_to_erc677/callflows.md +++ b/contracts/upgradeable_contracts/amb_erc677_to_erc677/callflows.md @@ -321,25 +321,24 @@ This will allow to the mediator contract to call the `transferFrom` method from ```= >>Mediator BasicAMBErc677ToErc677::relayTokens -..BasicAMBErc677ToErc677::_relayTokens >>Token -....ERC677BridgeToken::transferFrom -......ERC677BridgeToken::_superTransferFrom -........ERC20Permittable::transferFrom -..........ERC20::_transfer -............emit Transfer -......ERC677BridgeToken::_callAfterTransfer -........ERC677BridgeToken::_contractFallback +..ERC677BridgeToken::transferFrom +....ERC677BridgeToken::_superTransferFrom +......ERC20Permittable::transferFrom +........ERC20::_transfer +..........emit Transfer +....ERC677BridgeToken::_callAfterTransfer +......ERC677BridgeToken::_contractFallback >>Mediator -..........BasicAMBErc677ToErc677::onTokenTransfer -............ForeignStakeTokenMediator::bridgeSpecificActionsOnTokenTransfer -..............TokenBridgeMediator::passMessage -................TokenBridgeMediator::setMessageHashValue -................TokenBridgeMediator::setMessageHashRecipient +........BasicAMBErc677ToErc677::onTokenTransfer +..........ForeignStakeTokenMediator::bridgeSpecificActionsOnTokenTransfer +............TokenBridgeMediator::passMessage +..............TokenBridgeMediator::setMessageHashValue +..............TokenBridgeMediator::setMessageHashRecipient >>Bridge -................MessageDelivery::requireToPassMessage -..................ForeignAMB::emitEventOnMessageRequest -....................emit UserRequestForAffirmation +..............MessageDelivery::requireToPassMessage +................ForeignAMB::emitEventOnMessageRequest +..................emit UserRequestForAffirmation ``` #### Execution @@ -355,30 +354,29 @@ The mediator on the Home side also provides the `relayTokens` method. Prior to i ```= >>Mediator BasicAMBErc677ToErc677::relayTokens -..BasicAMBErc677ToErc677::_relayTokens >>Token -....ERC677BridgeTokenRewardable::transferFrom -......PermittableToken::transferFrom -........emit Transfer -........ERC677BridgeToken::callAfterTransfer -..........ERC677BridgeToken::contractFallback +..ERC677BridgeTokenRewardable::transferFrom +....PermittableToken::transferFrom +......emit Transfer +......ERC677BridgeToken::callAfterTransfer +........ERC677BridgeToken::contractFallback >>Mediator -............BasicAMBErc677ToErc677::onTokenTransfer -..............HomeStakeTokenMediator::bridgeSpecificActionsOnTokenTransfer +..........BasicAMBErc677ToErc677::onTokenTransfer +............HomeStakeTokenMediator::bridgeSpecificActionsOnTokenTransfer >>Token -................BurnableToken::burn -..................BurnableToken::_burn +..............BurnableToken::burn +................BurnableToken::_burn >>Mediator -................TokenBridgeMediator::passMessage -..................TokenBridgeMediator::setMessageHashValue -..................TokenBridgeMediator::setMessageHashRecipient +..............TokenBridgeMediator::passMessage +................TokenBridgeMediator::setMessageHashValue +................TokenBridgeMediator::setMessageHashRecipient >>Bridge -..................MessageDelivery::requireToPassMessage -....................ForeignAMB::emitEventOnMessageRequest -......................emit UserRequestForSignature +................MessageDelivery::requireToPassMessage +..................ForeignAMB::emitEventOnMessageRequest +....................emit UserRequestForSignature >>BlockReward -................HomeStakeTokenFeeManager::_distributeFee -..................BlockRewardAuRaTokens::addBridgeTokenRewardReceivers +..............HomeStakeTokenFeeManager::_distributeFee +................BlockRewardAuRaTokens::addBridgeTokenRewardReceivers ``` #### Execution diff --git a/contracts/upgradeable_contracts/amb_native_to_erc20/ForeignAMBNativeToErc20.sol b/contracts/upgradeable_contracts/amb_native_to_erc20/ForeignAMBNativeToErc20.sol index 7620d6166..63a64b5fc 100644 --- a/contracts/upgradeable_contracts/amb_native_to_erc20/ForeignAMBNativeToErc20.sol +++ b/contracts/upgradeable_contracts/amb_native_to_erc20/ForeignAMBNativeToErc20.sol @@ -94,24 +94,10 @@ contract ForeignAMBNativeToErc20 is BasicAMBNativeToErc20, ReentrancyGuard, Base /** * @dev It will initiate the bridge operation that will burn the amount of tokens transferred and unlock the native tokens on * the other network. The user should first call Approve method of the ERC677 token. - * @param _from address that will transfer the tokens to be burned. * @param _receiver address that will receive the native tokens on the other network. * @param _value amount of tokens to be transferred to the other network. */ - function relayTokens(address _from, address _receiver, uint256 _value) external { - require(_from == msg.sender || _from == _receiver); - _relayTokens(_from, _receiver, _value); - } - - /** - * @dev Validates that the token amount is inside the limits, calls transferFrom to transfer the tokens to the contract - * and invokes the method to burn the tokens and unlock the native tokens on the other network. - * The user should first call Approve method of the ERC677 token. - * @param _from address that will transfer the tokens to be burned. - * @param _receiver address that will receive the native tokens on the other network. - * @param _value amount of tokens to be transferred to the other network. - */ - function _relayTokens(address _from, address _receiver, uint256 _value) internal { + function relayTokens(address _receiver, uint256 _value) external { // This lock is to prevent calling passMessage twice. // When transferFrom is called, after the transfer, the ERC677 token will call onTokenTransfer from this contract // which will call passMessage. @@ -122,19 +108,9 @@ contract ForeignAMBNativeToErc20 is BasicAMBNativeToErc20, ReentrancyGuard, Base addTotalSpentPerDay(getCurrentDay(), _value); setLock(true); - token.transferFrom(_from, to, _value); + token.transferFrom(msg.sender, to, _value); setLock(false); - bridgeSpecificActionsOnTokenTransfer(token, _from, _value, abi.encodePacked(_receiver)); - } - - /** - * @dev It will initiate the bridge operation that will burn the amount of tokens transferred and unlock the native tokens on - * the other network. The user should first call Approve method of the ERC677 token. - * @param _receiver address that will receive the native tokens on the other network. - * @param _value amount of tokens to be transferred to the other network. - */ - function relayTokens(address _receiver, uint256 _value) external { - _relayTokens(msg.sender, _receiver, _value); + bridgeSpecificActionsOnTokenTransfer(token, msg.sender, _value, abi.encodePacked(_receiver)); } /** diff --git a/contracts/upgradeable_contracts/amb_native_to_erc20/callflows.md b/contracts/upgradeable_contracts/amb_native_to_erc20/callflows.md index d77d1e821..7d4b07537 100644 --- a/contracts/upgradeable_contracts/amb_native_to_erc20/callflows.md +++ b/contracts/upgradeable_contracts/amb_native_to_erc20/callflows.md @@ -334,27 +334,26 @@ This will allow to the mediator contract to call the `transferFrom` method from ```= >>Mediator ForeignAMBNativeToErc20::relayTokens -..ForeignAMBNativeToErc20::_relayTokens >>Token -....ERC677BridgeToken::transferFrom -......StandardToken::transferFrom -........emit Transfer -......ERC677BridgeToken::callAfterTransfer -........ERC677BridgeToken::contractFallback +..ERC677BridgeToken::transferFrom +....StandardToken::transferFrom +......emit Transfer +....ERC677BridgeToken::callAfterTransfer +......ERC677BridgeToken::contractFallback >>Mediator -..........ForeignAMBNativeToErc20::onTokenTransfer -............ForeignAMBNativeToErc20::bridgeSpecificActionsOnTokenTransfer +........ForeignAMBNativeToErc20::onTokenTransfer +..........ForeignAMBNativeToErc20::bridgeSpecificActionsOnTokenTransfer >>Token -..............BurnableToken::burn -................BurnableToken::_burn +............BurnableToken::burn +..............BurnableToken::_burn >>Mediator -..............TokenBridgeMediator::passMessage -................TokenBridgeMediator::setMessageHashValue -................TokenBridgeMediator::setMessageHashRecipient +............TokenBridgeMediator::passMessage +..............TokenBridgeMediator::setMessageHashValue +..............TokenBridgeMediator::setMessageHashRecipient >>Bridge -................MessageDelivery::requireToPassMessage -..................ForeignAMB::emitEventOnMessageRequest -....................emit UserRequestForAffirmation +..............MessageDelivery::requireToPassMessage +................ForeignAMB::emitEventOnMessageRequest +..................emit UserRequestForAffirmation ``` #### Execution diff --git a/contracts/upgradeable_contracts/erc20_to_native/ForeignBridgeErcToNative.sol b/contracts/upgradeable_contracts/erc20_to_native/ForeignBridgeErcToNative.sol index 0143c678f..9a8262111 100644 --- a/contracts/upgradeable_contracts/erc20_to_native/ForeignBridgeErcToNative.sol +++ b/contracts/upgradeable_contracts/erc20_to_native/ForeignBridgeErcToNative.sol @@ -80,41 +80,15 @@ contract ForeignBridgeErcToNative is BasicForeignBridge, ERC20Bridge, OtherSideB } function relayTokens(address _receiver, uint256 _amount) external { - _relayTokens(msg.sender, _receiver, _amount, erc20token()); - } - - function relayTokens(address _sender, address _receiver, uint256 _amount) external { - relayTokens(_sender, _receiver, _amount, erc20token()); - } - - function relayTokens(address _from, address _receiver, uint256 _amount, address _token) public { - require(_from == msg.sender || _from == _receiver); - _relayTokens(_from, _receiver, _amount, _token); - } - - function relayTokens(address _receiver, uint256 _amount, address _token) external { - _relayTokens(msg.sender, _receiver, _amount, _token); - } - - function _relayTokens(address _sender, address _receiver, uint256 _amount, address _token) internal { require(_receiver != bridgeContractOnOtherSide()); require(_receiver != address(0)); require(_receiver != address(this)); require(_amount > 0); require(withinLimit(_amount)); - ERC20 tokenToOperate = ERC20(_token); - ERC20 fdToken = erc20token(); - - if (tokenToOperate == ERC20(0x0)) { - tokenToOperate = fdToken; - } - - require(tokenToOperate == fdToken); - addTotalSpentPerDay(getCurrentDay(), _amount); - tokenToOperate.transferFrom(_sender, address(this), _amount); + erc20token().transferFrom(msg.sender, address(this), _amount); emit UserRequestForAffirmation(_receiver, _amount); if (isDaiNeedsToBeInvested()) { diff --git a/contracts/upgradeable_contracts/multi_amb_erc20_to_erc677/BasicMultiAMBErc20ToErc677.sol b/contracts/upgradeable_contracts/multi_amb_erc20_to_erc677/BasicMultiAMBErc20ToErc677.sol index 014031be2..7783e3afd 100644 --- a/contracts/upgradeable_contracts/multi_amb_erc20_to_erc677/BasicMultiAMBErc20ToErc677.sol +++ b/contracts/upgradeable_contracts/multi_amb_erc20_to_erc677/BasicMultiAMBErc20ToErc677.sol @@ -30,19 +30,6 @@ contract BasicMultiAMBErc20ToErc677 is return mediatorContractOnOtherSide(); } - /** - * @dev Initiate the bridge operation for some amount of tokens. - * The user should first call Approve method of the ERC677 token. - * @param token bridged token contract address. - * @param _from address that will transfer the tokens to be locked. - * @param _receiver address that will receive the native tokens on the other network. - * @param _value amount of tokens to be transferred to the other network. - */ - function relayTokens(ERC677 token, address _from, address _receiver, uint256 _value) external { - require(_from == msg.sender || _from == _receiver); - _relayTokens(token, _from, _receiver, _value); - } - /** * @dev Initiate the bridge operation for some amount of tokens from msg.sender. * The user should first call Approve method of the ERC677 token. @@ -51,7 +38,7 @@ contract BasicMultiAMBErc20ToErc677 is * @param _value amount of tokens to be transferred to the other network. */ function relayTokens(ERC677 token, address _receiver, uint256 _value) external { - _relayTokens(token, msg.sender, _receiver, _value); + _relayTokens(token, _receiver, _value); } /** @@ -61,7 +48,7 @@ contract BasicMultiAMBErc20ToErc677 is * @param _value amount of tokens to be transferred to the other network. */ function relayTokens(ERC677 token, uint256 _value) external { - _relayTokens(token, msg.sender, msg.sender, _value); + _relayTokens(token, msg.sender, _value); } /** @@ -71,7 +58,7 @@ contract BasicMultiAMBErc20ToErc677 is * @return patch value of the version */ function getBridgeInterfacesVersion() external pure returns (uint64 major, uint64 minor, uint64 patch) { - return (1, 0, 2); + return (1, 1, 0); } /** @@ -97,7 +84,7 @@ contract BasicMultiAMBErc20ToErc677 is function onTokenTransfer(address _from, uint256 _value, bytes _data) public returns (bool); /* solcov ignore next */ - function _relayTokens(ERC677 token, address _from, address _receiver, uint256 _value) internal; + function _relayTokens(ERC677 token, address _receiver, uint256 _value) internal; /* solcov ignore next */ function bridgeSpecificActionsOnTokenTransfer(ERC677 _token, address _from, uint256 _value, bytes _data) internal; diff --git a/contracts/upgradeable_contracts/multi_amb_erc20_to_erc677/ForeignMultiAMBErc20ToErc677.sol b/contracts/upgradeable_contracts/multi_amb_erc20_to_erc677/ForeignMultiAMBErc20ToErc677.sol index d75845e5a..3e7830d21 100644 --- a/contracts/upgradeable_contracts/multi_amb_erc20_to_erc677/ForeignMultiAMBErc20ToErc677.sol +++ b/contracts/upgradeable_contracts/multi_amb_erc20_to_erc677/ForeignMultiAMBErc20ToErc677.sol @@ -89,11 +89,10 @@ contract ForeignMultiAMBErc20ToErc677 is BasicMultiAMBErc20ToErc677 { * and invokes the method to burn/lock the tokens and unlock/mint the tokens on the other network. * The user should first call Approve method of the ERC677 token. * @param token bridge token contract address. - * @param _from address that will transfer the tokens to be locked. * @param _receiver address that will receive the native tokens on the other network. * @param _value amount of tokens to be transferred to the other network. */ - function _relayTokens(ERC677 token, address _from, address _receiver, uint256 _value) internal { + function _relayTokens(ERC677 token, address _receiver, uint256 _value) internal { // This lock is to prevent calling passMessage twice if a ERC677 token is used. // When transferFrom is called, after the transfer, the ERC677 token will call onTokenTransfer from this contract // which will call passMessage. @@ -101,9 +100,9 @@ contract ForeignMultiAMBErc20ToErc677 is BasicMultiAMBErc20ToErc677 { address to = address(this); setLock(true); - LegacyERC20(token).transferFrom(_from, to, _value); + LegacyERC20(token).transferFrom(msg.sender, to, _value); setLock(false); - bridgeSpecificActionsOnTokenTransfer(token, _from, _value, abi.encodePacked(_receiver)); + bridgeSpecificActionsOnTokenTransfer(token, msg.sender, _value, abi.encodePacked(_receiver)); } /** diff --git a/contracts/upgradeable_contracts/multi_amb_erc20_to_erc677/HomeMultiAMBErc20ToErc677.sol b/contracts/upgradeable_contracts/multi_amb_erc20_to_erc677/HomeMultiAMBErc20ToErc677.sol index d6a462374..163c745bb 100644 --- a/contracts/upgradeable_contracts/multi_amb_erc20_to_erc677/HomeMultiAMBErc20ToErc677.sol +++ b/contracts/upgradeable_contracts/multi_amb_erc20_to_erc677/HomeMultiAMBErc20ToErc677.sol @@ -153,11 +153,10 @@ contract HomeMultiAMBErc20ToErc677 is BasicMultiAMBErc20ToErc677, HomeFeeManager * and invokes the method to burn/lock the tokens and unlock/mint the tokens on the other network. * The user should first call Approve method of the ERC677 token. * @param token bridge token contract address. - * @param _from address that will transfer the tokens to be locked. * @param _receiver address that will receive the native tokens on the other network. * @param _value amount of tokens to be transferred to the other network. */ - function _relayTokens(ERC677 token, address _from, address _receiver, uint256 _value) internal { + function _relayTokens(ERC677 token, address _receiver, uint256 _value) internal { // This lock is to prevent calling passMessage twice if a ERC677 token is used. // When transferFrom is called, after the transfer, the ERC677 token will call onTokenTransfer from this contract // which will call passMessage. @@ -170,9 +169,9 @@ contract HomeMultiAMBErc20ToErc677 is BasicMultiAMBErc20ToErc677, HomeFeeManager addTotalSpentPerDay(token, getCurrentDay(), _value); setLock(true); - token.transferFrom(_from, to, _value); + token.transferFrom(msg.sender, to, _value); setLock(false); - bridgeSpecificActionsOnTokenTransfer(token, _from, _value, abi.encodePacked(_receiver)); + bridgeSpecificActionsOnTokenTransfer(token, msg.sender, _value, abi.encodePacked(_receiver)); } /** diff --git a/test/amb_erc20_to_native/foreign_mediator.test.js b/test/amb_erc20_to_native/foreign_mediator.test.js index e66c3ca2b..4ce57f500 100644 --- a/test/amb_erc20_to_native/foreign_mediator.test.js +++ b/test/amb_erc20_to_native/foreign_mediator.test.js @@ -336,7 +336,7 @@ contract('ForeignAMBErc20ToNative', async accounts => { expect(await token.allowance(user, contract.address)).to.be.bignumber.equal(value) // When - await contract.methods['relayTokens(address,uint256)'](user, value, { from: user }).should.be.fulfilled + await contract.relayTokens(user, value, { from: user }).should.be.fulfilled // Then const events = await getEvents(ambBridgeContract, { event: 'MockedEvent' }) @@ -344,45 +344,13 @@ contract('ForeignAMBErc20ToNative', async accounts => { expect(await contract.totalSpentPerDay(currentDay)).to.be.bignumber.equal(value) }) - it('should allow user to specify a itself as receiver', async () => { - // Given - await token.approve(contract.address, value, { from: user }).should.be.fulfilled - expect(await token.allowance(user, contract.address)).to.be.bignumber.equal(value) - - // When - await contract.methods['relayTokens(address,address,uint256)'](user, user, value, { from: user }).should.be - .fulfilled - - // Then - const events = await getEvents(ambBridgeContract, { event: 'MockedEvent' }) - expect(events.length).to.be.equal(1) - expect(events[0].returnValues.encodedData.includes(strip0x(user).toLowerCase())).to.be.equal(true) - expect(await contract.totalSpentPerDay(currentDay)).to.be.bignumber.equal(value) - }) - - it('should allow to specify a different receiver', async () => { - // Given - await token.approve(contract.address, value, { from: user }).should.be.fulfilled - expect(await token.allowance(user, contract.address)).to.be.bignumber.equal(value) - - // When - await contract.methods['relayTokens(address,address,uint256)'](user, user2, value, { from: user }).should.be - .fulfilled - - // Then - const events = await getEvents(ambBridgeContract, { event: 'MockedEvent' }) - expect(events.length).to.be.equal(1) - expect(events[0].returnValues.encodedData.includes(strip0x(user2).toLowerCase())).to.be.equal(true) - expect(await contract.totalSpentPerDay(currentDay)).to.be.bignumber.equal(value) - }) - it('should allow to specify a different receiver without specifying sender', async () => { // Given await token.approve(contract.address, value, { from: user }).should.be.fulfilled expect(await token.allowance(user, contract.address)).to.be.bignumber.equal(value) // When - await contract.methods['relayTokens(address,uint256)'](user2, value, { from: user }).should.be.fulfilled + await contract.relayTokens(user2, value, { from: user }).should.be.fulfilled // Then const events = await getEvents(ambBridgeContract, { event: 'MockedEvent' }) @@ -391,34 +359,15 @@ contract('ForeignAMBErc20ToNative', async accounts => { expect(await contract.totalSpentPerDay(currentDay)).to.be.bignumber.equal(value) }) - it('should allow to complete a transfer approved by other user', async () => { - // Given - await token.approve(contract.address, value, { from: user }).should.be.fulfilled - expect(await token.allowance(user, contract.address)).to.be.bignumber.equal(value) - - // When - await contract.methods['relayTokens(address,address,uint256)'](user, user2, value, { - from: user2 - }).should.be.rejected - await contract.methods['relayTokens(address,address,uint256)'](user, user, value, { from: user2 }).should.be - .fulfilled - - // Then - const events = await getEvents(ambBridgeContract, { event: 'MockedEvent' }) - expect(events.length).to.be.equal(1) - expect(events[0].returnValues.encodedData.includes(strip0x(user).toLowerCase())).to.be.equal(true) - expect(await contract.totalSpentPerDay(currentDay)).to.be.bignumber.equal(value) - }) - it('should fail if user did not approve the transfer', async () => { - await contract.methods['relayTokens(address,uint256)'](user, value, { from: user }).should.be.rejected + await contract.relayTokens(user, value, { from: user }).should.be.rejected }) it('should fail if value is not within limits', async () => { await token.approve(contract.address, twoEthers, { from: user }).should.be.fulfilled expect(await token.allowance(user, contract.address)).to.be.bignumber.equal(twoEthers) - await contract.methods['relayTokens(address,uint256)'](user, twoEthers, { from: user }).should.be.rejected + await contract.relayTokens(user, twoEthers, { from: user }).should.be.rejected }) }) diff --git a/test/amb_erc677_to_erc677/AMBErc677ToErc677Behavior.test.js b/test/amb_erc677_to_erc677/AMBErc677ToErc677Behavior.test.js index c3c6a1397..b92290e98 100644 --- a/test/amb_erc677_to_erc677/AMBErc677ToErc677Behavior.test.js +++ b/test/amb_erc677_to_erc677/AMBErc677ToErc677Behavior.test.js @@ -548,66 +548,6 @@ function shouldBehaveLikeBasicAMBErc677ToErc677(otherSideMediatorContract, accou expect(events.length).to.be.equal(1) expect(await contract.totalSpentPerDay(currentDay)).to.be.bignumber.equal(value) }) - it('should allow user to specify a itself as receiver', async () => { - // Given - await contract.initialize( - bridgeContract.address, - mediatorContract.address, - erc20Token.address, - [dailyLimit, maxPerTx, minPerTx], - [executionDailyLimit, executionMaxPerTx], - maxGasPerTx, - decimalShiftZero, - owner - ).should.be.fulfilled - - const currentDay = await contract.getCurrentDay() - expect(await contract.totalSpentPerDay(currentDay)).to.be.bignumber.equal(ZERO) - - const value = oneEther - await erc20Token.approve(contract.address, value, { from: user }).should.be.fulfilled - expect(await erc20Token.allowance(user, contract.address)).to.be.bignumber.equal(value) - - // When - await contract.methods['relayTokens(address,address,uint256)'](user, user, value, { from: user }).should.be - .fulfilled - - // Then - const events = await getEvents(bridgeContract, { event: 'MockedEvent' }) - expect(events.length).to.be.equal(1) - expect(events[0].returnValues.encodedData.includes(strip0x(user).toLowerCase())).to.be.equal(true) - expect(await contract.totalSpentPerDay(currentDay)).to.be.bignumber.equal(value) - }) - it('should allow to specify a different receiver', async () => { - // Given - await contract.initialize( - bridgeContract.address, - mediatorContract.address, - erc20Token.address, - [dailyLimit, maxPerTx, minPerTx], - [executionDailyLimit, executionMaxPerTx], - maxGasPerTx, - decimalShiftZero, - owner - ).should.be.fulfilled - - const currentDay = await contract.getCurrentDay() - expect(await contract.totalSpentPerDay(currentDay)).to.be.bignumber.equal(ZERO) - - const value = oneEther - await erc20Token.approve(contract.address, value, { from: user }).should.be.fulfilled - expect(await erc20Token.allowance(user, contract.address)).to.be.bignumber.equal(value) - - // When - await contract.methods['relayTokens(address,address,uint256)'](user, user2, value, { from: user }).should.be - .fulfilled - - // Then - const events = await getEvents(bridgeContract, { event: 'MockedEvent' }) - expect(events.length).to.be.equal(1) - expect(events[0].returnValues.encodedData.includes(strip0x(user2).toLowerCase())).to.be.equal(true) - expect(await contract.totalSpentPerDay(currentDay)).to.be.bignumber.equal(value) - }) it('should allow to specify a different receiver without specifying sender', async () => { // Given await contract.initialize( @@ -637,39 +577,6 @@ function shouldBehaveLikeBasicAMBErc677ToErc677(otherSideMediatorContract, accou expect(events[0].returnValues.encodedData.includes(strip0x(user2).toLowerCase())).to.be.equal(true) expect(await contract.totalSpentPerDay(currentDay)).to.be.bignumber.equal(value) }) - it('should allow to complete a transfer approved by other user', async () => { - // Given - await contract.initialize( - bridgeContract.address, - mediatorContract.address, - erc20Token.address, - [dailyLimit, maxPerTx, minPerTx], - [executionDailyLimit, executionMaxPerTx], - maxGasPerTx, - decimalShiftZero, - owner - ).should.be.fulfilled - - const currentDay = await contract.getCurrentDay() - expect(await contract.totalSpentPerDay(currentDay)).to.be.bignumber.equal(ZERO) - - const value = oneEther - await erc20Token.approve(contract.address, value, { from: user }).should.be.fulfilled - expect(await erc20Token.allowance(user, contract.address)).to.be.bignumber.equal(value) - - // When - await contract.methods['relayTokens(address,address,uint256)'](user, user2, value, { - from: user2 - }).should.be.rejectedWith(ERROR_MSG) - await contract.methods['relayTokens(address,address,uint256)'](user, user, value, { from: user2 }).should.be - .fulfilled - - // Then - const events = await getEvents(bridgeContract, { event: 'MockedEvent' }) - expect(events.length).to.be.equal(1) - expect(events[0].returnValues.encodedData.includes(strip0x(user).toLowerCase())).to.be.equal(true) - expect(await contract.totalSpentPerDay(currentDay)).to.be.bignumber.equal(value) - }) it('should fail if user did not approve the transfer', async () => { await contract.initialize( bridgeContract.address, diff --git a/test/amb_native_to_erc20/foreign_mediator.test.js b/test/amb_native_to_erc20/foreign_mediator.test.js index d85ebaa30..0641373d8 100644 --- a/test/amb_native_to_erc20/foreign_mediator.test.js +++ b/test/amb_native_to_erc20/foreign_mediator.test.js @@ -855,50 +855,6 @@ contract('ForeignAMBNativeToErc20', async accounts => { // Tokens were burnt expect(await token.totalSupply()).to.be.bignumber.equal(oneEther) }) - it('should allow user to specify a itself as receiver', async () => { - // Given - const currentDay = await contract.getCurrentDay() - expect(await contract.totalSpentPerDay(currentDay)).to.be.bignumber.equal(ZERO) - expect(await token.totalSupply()).to.be.bignumber.equal(twoEthers) - - const value = oneEther - await token.approve(contract.address, value, { from: user }).should.be.fulfilled - expect(await token.allowance(user, contract.address)).to.be.bignumber.equal(value) - - // When - await contract.methods['relayTokens(address,address,uint256)'](user, user, value, { from: user }).should.be - .fulfilled - - // Then - const events = await getEvents(ambBridgeContract, { event: 'MockedEvent' }) - expect(events.length).to.be.equal(1) - expect(events[0].returnValues.encodedData.includes(strip0x(user).toLowerCase())).to.be.equal(true) - expect(await contract.totalSpentPerDay(currentDay)).to.be.bignumber.equal(value) - // Tokens were burnt - expect(await token.totalSupply()).to.be.bignumber.equal(oneEther) - }) - it('should allow to specify a different receiver', async () => { - // Given - const currentDay = await contract.getCurrentDay() - expect(await contract.totalSpentPerDay(currentDay)).to.be.bignumber.equal(ZERO) - expect(await token.totalSupply()).to.be.bignumber.equal(twoEthers) - - const value = oneEther - await token.approve(contract.address, value, { from: user }).should.be.fulfilled - expect(await token.allowance(user, contract.address)).to.be.bignumber.equal(value) - - // When - await contract.methods['relayTokens(address,address,uint256)'](user, user2, value, { from: user }).should.be - .fulfilled - - // Then - const events = await getEvents(ambBridgeContract, { event: 'MockedEvent' }) - expect(events.length).to.be.equal(1) - expect(events[0].returnValues.encodedData.includes(strip0x(user2).toLowerCase())).to.be.equal(true) - expect(await contract.totalSpentPerDay(currentDay)).to.be.bignumber.equal(value) - // Tokens were burnt - expect(await token.totalSupply()).to.be.bignumber.equal(oneEther) - }) it('should allow to specify a different receiver without specifying sender', async () => { // Given const currentDay = await contract.getCurrentDay() @@ -920,31 +876,6 @@ contract('ForeignAMBNativeToErc20', async accounts => { // Tokens were burnt expect(await token.totalSupply()).to.be.bignumber.equal(oneEther) }) - it('should allow to complete a transfer approved by other user', async () => { - // Given - const currentDay = await contract.getCurrentDay() - expect(await contract.totalSpentPerDay(currentDay)).to.be.bignumber.equal(ZERO) - expect(await token.totalSupply()).to.be.bignumber.equal(twoEthers) - - const value = oneEther - await token.approve(contract.address, value, { from: user }).should.be.fulfilled - expect(await token.allowance(user, contract.address)).to.be.bignumber.equal(value) - - // When - await contract.methods['relayTokens(address,address,uint256)'](user, user2, value, { - from: user2 - }).should.be.rejectedWith(ERROR_MSG) - await contract.methods['relayTokens(address,address,uint256)'](user, user, value, { from: user2 }).should.be - .fulfilled - - // Then - const events = await getEvents(ambBridgeContract, { event: 'MockedEvent' }) - expect(events.length).to.be.equal(1) - expect(events[0].returnValues.encodedData.includes(strip0x(user).toLowerCase())).to.be.equal(true) - expect(await contract.totalSpentPerDay(currentDay)).to.be.bignumber.equal(value) - // Tokens were burnt - expect(await token.totalSupply()).to.be.bignumber.equal(oneEther) - }) it('should fail if user did not approve the transfer', async () => { await contract.relayTokens(user, oneEther, { from: user }).should.be.rejectedWith(ERROR_MSG) }) diff --git a/test/erc_to_erc/foreign_bridge.test.js b/test/erc_to_erc/foreign_bridge.test.js index 56651a4bc..487a77c3d 100644 --- a/test/erc_to_erc/foreign_bridge.test.js +++ b/test/erc_to_erc/foreign_bridge.test.js @@ -934,25 +934,15 @@ contract('ForeignBridge_ERC20_to_ERC20', async accounts => { // Given const currentDay = await foreignBridge.getCurrentDay() expect(await foreignBridge.totalSpentPerDay(currentDay)).to.be.bignumber.equal(ZERO) - await foreignBridge.methods['relayTokens(address,address,uint256)'](user, recipient, value, { - from: user - }).should.be.rejectedWith(ERROR_MSG) + await foreignBridge.relayTokens(recipient, value, { from: user }).should.be.rejectedWith(ERROR_MSG) await token.approve(foreignBridge.address, value, { from: user }).should.be.fulfilled // When - await foreignBridge.methods['relayTokens(address,address,uint256)'](user, ZERO_ADDRESS, value, { - from: user - }).should.be.rejectedWith(ERROR_MSG) - await foreignBridge.methods['relayTokens(address,address,uint256)'](user, foreignBridge.address, value, { - from: user - }).should.be.rejectedWith(ERROR_MSG) - await foreignBridge.methods['relayTokens(address,address,uint256)'](user, recipient, 0, { - from: user - }).should.be.rejectedWith(ERROR_MSG) - const { logs } = await foreignBridge.methods['relayTokens(address,address,uint256)'](user, recipient, value, { - from: user - }).should.be.fulfilled + await foreignBridge.relayTokens(ZERO_ADDRESS, value, { from: user }).should.be.rejectedWith(ERROR_MSG) + await foreignBridge.relayTokens(foreignBridge.address, value, { from: user }).should.be.rejectedWith(ERROR_MSG) + await foreignBridge.relayTokens(recipient, 0, { from: user }).should.be.rejectedWith(ERROR_MSG) + const { logs } = await foreignBridge.relayTokens(recipient, value, { from: user }).should.be.fulfilled // Then expect(await foreignBridge.totalSpentPerDay(currentDay)).to.be.bignumber.equal(value) @@ -961,33 +951,6 @@ contract('ForeignBridge_ERC20_to_ERC20', async accounts => { value }) }) - it('should allow to call relayTokens without specifying the sender', async () => { - // Given - await foreignBridge.methods['relayTokens(address,uint256)'](recipient, value, { - from: user - }).should.be.rejectedWith(ERROR_MSG) - - await token.approve(foreignBridge.address, value, { from: user }).should.be.fulfilled - - // When - await foreignBridge.methods['relayTokens(address,uint256)'](ZERO_ADDRESS, value, { - from: user - }).should.be.rejectedWith(ERROR_MSG) - await foreignBridge.methods['relayTokens(address,uint256)'](foreignBridge.address, value, { - from: user - }).should.be.rejectedWith(ERROR_MSG) - await foreignBridge.methods['relayTokens(address,uint256)'](recipient, 0, { from: user }).should.be.rejectedWith( - ERROR_MSG - ) - const { logs } = await foreignBridge.methods['relayTokens(address,uint256)'](recipient, value, { from: user }) - .should.be.fulfilled - - // Then - expectEventInLogs(logs, 'UserRequestForAffirmation', { - recipient, - value - }) - }) it('should not be able to transfer more than limit', async () => { // Given const userSupply = ether('2') @@ -1000,71 +963,17 @@ contract('ForeignBridge_ERC20_to_ERC20', async accounts => { // When // value < minPerTx - await foreignBridge.methods['relayTokens(address,address,uint256)'](user, recipient, smallValue, { - from: user - }).should.be.rejectedWith(ERROR_MSG) + await foreignBridge.relayTokens(recipient, smallValue, { from: user }).should.be.rejectedWith(ERROR_MSG) // value > maxPerTx - await foreignBridge.methods['relayTokens(address,address,uint256)'](user, recipient, bigValue, { - from: user - }).should.be.rejectedWith(ERROR_MSG) - - await foreignBridge.methods['relayTokens(address,address,uint256)'](user, recipient, halfEther, { from: user }) - .should.be.fulfilled - await foreignBridge.methods['relayTokens(address,address,uint256)'](user, recipient, halfEther, { from: user }) - .should.be.fulfilled + await foreignBridge.relayTokens(recipient, bigValue, { from: user }).should.be.rejectedWith(ERROR_MSG) + + await foreignBridge.relayTokens(recipient, halfEther, { from: user }).should.be.fulfilled + await foreignBridge.relayTokens(recipient, halfEther, { from: user }).should.be.fulfilled // totalSpentPerDay > dailyLimit - await foreignBridge.methods['relayTokens(address,address,uint256)'](user, recipient, halfEther, { - from: user - }).should.be.rejectedWith(ERROR_MSG) + await foreignBridge.relayTokens(recipient, halfEther, { from: user }).should.be.rejectedWith(ERROR_MSG) // Then expect(await foreignBridge.totalSpentPerDay(currentDay)).to.be.bignumber.equal(oneEther) }) - it('should allow only sender to specify a different receiver', async () => { - // Given - const currentDay = await foreignBridge.getCurrentDay() - expect(await foreignBridge.totalSpentPerDay(currentDay)).to.be.bignumber.equal(ZERO) - - await foreignBridge.methods['relayTokens(address,address,uint256)'](user, recipient, value, { - from: user - }).should.be.rejectedWith(ERROR_MSG) - - await token.approve(foreignBridge.address, oneEther, { from: user }).should.be.fulfilled - - // When - await foreignBridge.methods['relayTokens(address,address,uint256)'](user, ZERO_ADDRESS, value, { - from: user - }).should.be.rejectedWith(ERROR_MSG) - await foreignBridge.methods['relayTokens(address,address,uint256)'](user, foreignBridge.address, value, { - from: user - }).should.be.rejectedWith(ERROR_MSG) - await foreignBridge.methods['relayTokens(address,address,uint256)'](user, recipient, 0, { - from: user - }).should.be.rejectedWith(ERROR_MSG) - await foreignBridge.methods['relayTokens(address,address,uint256)'](user, recipient, value, { - from: recipient - }).should.be.rejectedWith(ERROR_MSG) - await foreignBridge.methods['relayTokens(address,address,uint256)'](user, user, value, { from: user }).should.be - .fulfilled - const { logs } = await foreignBridge.methods['relayTokens(address,address,uint256)'](user, recipient, value, { - from: user - }).should.be.fulfilled - const { logs: logsSecondTx } = await foreignBridge.methods['relayTokens(address,address,uint256)']( - user, - user, - value, - { from: recipient } - ).should.be.fulfilled - - // Then - expectEventInLogs(logs, 'UserRequestForAffirmation', { - recipient, - value - }) - expectEventInLogs(logsSecondTx, 'UserRequestForAffirmation', { - recipient: user, - value - }) - }) }) }) diff --git a/test/erc_to_native/foreign_bridge.test.js b/test/erc_to_native/foreign_bridge.test.js index 84e2962ad..a5b4f4dfd 100644 --- a/test/erc_to_native/foreign_bridge.test.js +++ b/test/erc_to_native/foreign_bridge.test.js @@ -31,7 +31,6 @@ const minDaiLimit = ether('100') const requireBlockConfirmations = 8 const gasPrice = web3.utils.toWei('1', 'gwei') const oneEther = ether('1') -const twoEthers = ether('2') const homeDailyLimit = oneEther const homeMaxPerTx = halfEther const dailyLimit = oneEther @@ -68,7 +67,6 @@ contract('ForeignBridge_ERC20_to_Native', async accounts => { let owner let token let otherSideBridge - let sai let dai const user = accounts[7] before(async () => { @@ -78,11 +76,7 @@ contract('ForeignBridge_ERC20_to_Native', async accounts => { await validatorContract.initialize(1, authorities, owner) otherSideBridge = await ForeignBridge.new() - // Used account 11 to deploy contracts. The contract addresses will be hardcoded in ForeignBridgeErcToNativeMock - const deployAccount = accounts[10] - sai = await ERC20Mock.new('sai', 'SAI', 18, { from: deployAccount }) dai = await ERC20Mock.new('dai', 'DAI', 18) - await sai.transferOwnership(accounts[0], { from: deployAccount }) await dai.mint(user, ether('100000')) }) @@ -907,23 +901,31 @@ contract('ForeignBridge_ERC20_to_Native', async accounts => { const currentDay = await foreignBridge.getCurrentDay() expect(await foreignBridge.totalSpentPerDay(currentDay)).to.be.bignumber.equal(ZERO) - await foreignBridge.methods['relayTokens(address,address,uint256)'](user, recipient, value, { - from: user - }).should.be.rejectedWith(ERROR_MSG) + await foreignBridge + .relayTokens(recipient, value, { + from: user + }) + .should.be.rejectedWith(ERROR_MSG) await token.approve(foreignBridge.address, value, { from: user }).should.be.fulfilled // When - await foreignBridge.methods['relayTokens(address,address,uint256)'](user, ZERO_ADDRESS, value, { - from: user - }).should.be.rejectedWith(ERROR_MSG) - await foreignBridge.methods['relayTokens(address,address,uint256)'](user, foreignBridge.address, value, { - from: user - }).should.be.rejectedWith(ERROR_MSG) - await foreignBridge.methods['relayTokens(address,address,uint256)'](user, user, 0, { - from: user - }).should.be.rejectedWith(ERROR_MSG) - const { logs } = await foreignBridge.methods['relayTokens(address,address,uint256)'](user, user, value, { + await foreignBridge + .relayTokens(ZERO_ADDRESS, value, { + from: user + }) + .should.be.rejectedWith(ERROR_MSG) + await foreignBridge + .relayTokens(foreignBridge.address, value, { + from: user + }) + .should.be.rejectedWith(ERROR_MSG) + await foreignBridge + .relayTokens(user, 0, { + from: user + }) + .should.be.rejectedWith(ERROR_MSG) + const { logs } = await foreignBridge.relayTokens(user, value, { from: user }).should.be.fulfilled @@ -939,23 +941,20 @@ contract('ForeignBridge_ERC20_to_Native', async accounts => { const currentDay = await foreignBridge.getCurrentDay() expect(await foreignBridge.totalSpentPerDay(currentDay)).to.be.bignumber.equal(ZERO) - await foreignBridge.methods['relayTokens(address,address,uint256)'](user, recipient, value, { - from: user - }).should.be.rejectedWith(ERROR_MSG) + await foreignBridge + .relayTokens(recipient, value, { + from: user + }) + .should.be.rejectedWith(ERROR_MSG) await token.approve(foreignBridge.address, value, { from: user }).should.be.fulfilled - // When - await foreignBridge.methods['relayTokens(address,address,uint256)'](user, ZERO_ADDRESS, value, { - from: user - }).should.be.rejectedWith(ERROR_MSG) - await foreignBridge.methods['relayTokens(address,address,uint256)'](user, foreignBridge.address, value, { - from: user - }).should.be.rejectedWith(ERROR_MSG) - await foreignBridge.methods['relayTokens(address,address,uint256)'](user, recipient, 0, { - from: user - }).should.be.rejectedWith(ERROR_MSG) - const { logs } = await foreignBridge.methods['relayTokens(address,address,uint256)'](user, recipient, value, { + await foreignBridge + .relayTokens(recipient, 0, { + from: user + }) + .should.be.rejectedWith(ERROR_MSG) + const { logs } = await foreignBridge.relayTokens(recipient, value, { from: user }).should.be.fulfilled @@ -966,50 +965,6 @@ contract('ForeignBridge_ERC20_to_Native', async accounts => { value }) }) - it('should allow only sender to specify a different receiver', async () => { - // Given - const currentDay = await foreignBridge.getCurrentDay() - expect(await foreignBridge.totalSpentPerDay(currentDay)).to.be.bignumber.equal(ZERO) - - await foreignBridge.methods['relayTokens(address,address,uint256)'](user, recipient, value, { - from: user - }).should.be.rejectedWith(ERROR_MSG) - - await token.approve(foreignBridge.address, oneEther, { from: user }).should.be.fulfilled - - // When - await foreignBridge.methods['relayTokens(address,address,uint256)'](user, ZERO_ADDRESS, value, { - from: user - }).should.be.rejectedWith(ERROR_MSG) - await foreignBridge.methods['relayTokens(address,address,uint256)'](user, foreignBridge.address, value, { - from: user - }).should.be.rejectedWith(ERROR_MSG) - await foreignBridge.methods['relayTokens(address,address,uint256)'](user, recipient, 0, { - from: user - }).should.be.rejectedWith(ERROR_MSG) - await foreignBridge.methods['relayTokens(address,address,uint256)'](user, recipient, value, { - from: recipient - }).should.be.rejectedWith(ERROR_MSG) - const { logs } = await foreignBridge.methods['relayTokens(address,address,uint256)'](user, recipient, value, { - from: user - }).should.be.fulfilled - const { logs: logsSecondTx } = await foreignBridge.methods['relayTokens(address,address,uint256)']( - user, - user, - value, - { from: recipient } - ).should.be.fulfilled - - // Then - expectEventInLogs(logs, 'UserRequestForAffirmation', { - recipient, - value - }) - expectEventInLogs(logsSecondTx, 'UserRequestForAffirmation', { - recipient: user, - value - }) - }) it('should not be able to transfer more than limit', async () => { // Given const userSupply = ether('2') @@ -1022,53 +977,30 @@ contract('ForeignBridge_ERC20_to_Native', async accounts => { // When // value < minPerTx - await foreignBridge.methods['relayTokens(address,address,uint256)'](user, recipient, smallValue, { - from: user - }).should.be.rejectedWith(ERROR_MSG) + await foreignBridge + .relayTokens(recipient, smallValue, { + from: user + }) + .should.be.rejectedWith(ERROR_MSG) // value > maxPerTx - await foreignBridge.methods['relayTokens(address,address,uint256)'](user, recipient, bigValue, { - from: user - }).should.be.rejectedWith(ERROR_MSG) + await foreignBridge + .relayTokens(recipient, bigValue, { + from: user + }) + .should.be.rejectedWith(ERROR_MSG) - await foreignBridge.methods['relayTokens(address,address,uint256)'](user, recipient, halfEther, { from: user }) - .should.be.fulfilled - await foreignBridge.methods['relayTokens(address,address,uint256)'](user, recipient, halfEther, { from: user }) - .should.be.fulfilled + await foreignBridge.relayTokens(recipient, halfEther, { from: user }).should.be.fulfilled + await foreignBridge.relayTokens(recipient, halfEther, { from: user }).should.be.fulfilled // totalSpentPerDay > dailyLimit - await foreignBridge.methods['relayTokens(address,address,uint256)'](user, recipient, halfEther, { - from: user - }).should.be.rejectedWith(ERROR_MSG) + await foreignBridge + .relayTokens(recipient, halfEther, { + from: user + }) + .should.be.rejectedWith(ERROR_MSG) // Then expect(await foreignBridge.totalSpentPerDay(currentDay)).to.be.bignumber.equal(oneEther) }) - it('should allow to call relayTokens without specifying the sender', async () => { - // Given - await foreignBridge.methods['relayTokens(address,uint256)'](recipient, value, { - from: user - }).should.be.rejectedWith(ERROR_MSG) - - await token.approve(foreignBridge.address, value, { from: user }).should.be.fulfilled - - // When - await foreignBridge.methods['relayTokens(address,uint256)'](ZERO_ADDRESS, value, { - from: user - }).should.be.rejectedWith(ERROR_MSG) - await foreignBridge.methods['relayTokens(address,uint256)'](foreignBridge.address, value, { - from: user - }).should.be.rejectedWith(ERROR_MSG) - await foreignBridge.methods['relayTokens(address,uint256)'](recipient, 0, { from: user }).should.be.rejectedWith( - ERROR_MSG - ) - const { logs } = await foreignBridge.methods['relayTokens(address,uint256)'](recipient, value, { from: user }) - .should.be.fulfilled - - // Then - expectEventInLogs(logs, 'UserRequestForAffirmation', { - recipient, - value - }) - }) }) describe('#relayTokens with chai', async () => { const user = accounts[7] @@ -1101,22 +1033,30 @@ contract('ForeignBridge_ERC20_to_Native', async accounts => { const currentDay = await foreignBridge.getCurrentDay() expect(await foreignBridge.totalSpentPerDay(currentDay)).to.be.bignumber.equal(ZERO) - await foreignBridge.methods['relayTokens(address,address,uint256)'](user, recipient, value, { - from: user - }).should.be.rejectedWith(ERROR_MSG) + await foreignBridge + .relayTokens(recipient, value, { + from: user + }) + .should.be.rejectedWith(ERROR_MSG) await token.approve(foreignBridge.address, value, { from: user }).should.be.fulfilled - await foreignBridge.methods['relayTokens(address,address,uint256)'](user, ZERO_ADDRESS, value, { - from: user - }).should.be.rejectedWith(ERROR_MSG) - await foreignBridge.methods['relayTokens(address,address,uint256)'](user, foreignBridge.address, value, { - from: user - }).should.be.rejectedWith(ERROR_MSG) - await foreignBridge.methods['relayTokens(address,address,uint256)'](user, user, 0, { - from: user - }).should.be.rejectedWith(ERROR_MSG) - const { logs } = await foreignBridge.methods['relayTokens(address,address,uint256)'](user, user, value, { + await foreignBridge + .relayTokens(ZERO_ADDRESS, value, { + from: user + }) + .should.be.rejectedWith(ERROR_MSG) + await foreignBridge + .relayTokens(foreignBridge.address, value, { + from: user + }) + .should.be.rejectedWith(ERROR_MSG) + await foreignBridge + .relayTokens(user, 0, { + from: user + }) + .should.be.rejectedWith(ERROR_MSG) + const { logs } = await foreignBridge.relayTokens(user, value, { from: user }).should.be.fulfilled @@ -1137,7 +1077,7 @@ contract('ForeignBridge_ERC20_to_Native', async accounts => { await token.approve(foreignBridge.address, value, { from: user }).should.be.fulfilled - const { logs } = await foreignBridge.methods['relayTokens(address,address,uint256)'](user, user, value, { + const { logs } = await foreignBridge.relayTokens(user, value, { from: user }).should.be.fulfilled @@ -1150,241 +1090,6 @@ contract('ForeignBridge_ERC20_to_Native', async accounts => { expect(await token.balanceOf(foreignBridge.address)).to.be.bignumber.equal(minDaiLimit) }) }) - describe('support two tokens', () => { - let foreignBridge - const recipient = accounts[8] - beforeEach(async () => { - foreignBridge = await ForeignBridgeErcToNativeMock.new() - - await foreignBridge.initialize( - validatorContract.address, - dai.address, - requireBlockConfirmations, - gasPrice, - [dailyLimit, maxPerTx, minPerTx], - [homeDailyLimit, homeMaxPerTx], - owner, - decimalShiftZero, - otherSideBridge.address - ) - - // Mint sai tokens to a user - await sai.mint(user, twoEthers) - }) - describe('relayTokens', () => { - const value = ether('0.25') - it('should allow to bridge tokens specifying the token address', async () => { - // Given - const balance = await dai.balanceOf(user) - const relayTokens = foreignBridge.methods['relayTokens(address,uint256,address)'] - - const currentDay = await foreignBridge.getCurrentDay() - expect(await foreignBridge.totalSpentPerDay(currentDay)).to.be.bignumber.equal(ZERO) - - await relayTokens(recipient, value, dai.address, { from: user }).should.be.rejectedWith(ERROR_MSG) - - await dai.approve(foreignBridge.address, value, { from: user }).should.be.fulfilled - - // When - await relayTokens(ZERO_ADDRESS, value, dai.address, { from: user }).should.be.rejectedWith(ERROR_MSG) - await relayTokens(foreignBridge.address, value, dai.address, { from: user }).should.be.rejectedWith(ERROR_MSG) - await relayTokens(otherSideBridge.address, value, dai.address, { from: user }).should.be.rejectedWith(ERROR_MSG) - await relayTokens(recipient, 0, dai.address, { from: user }).should.be.rejectedWith(ERROR_MSG) - const { logs } = await relayTokens(recipient, value, dai.address, { from: user }).should.be.fulfilled - - // Then - expect(await foreignBridge.totalSpentPerDay(currentDay)).to.be.bignumber.equal(value) - expectEventInLogs(logs, 'UserRequestForAffirmation', { - recipient, - value - }) - expect(await dai.balanceOf(user)).to.be.bignumber.equal(balance.sub(value)) - }) - it('should use erc20Token if token address is zero', async () => { - // Given - const balance = await dai.balanceOf(user) - const relayTokens = foreignBridge.methods['relayTokens(address,uint256,address)'] - - const currentDay = await foreignBridge.getCurrentDay() - expect(await foreignBridge.totalSpentPerDay(currentDay)).to.be.bignumber.equal(ZERO) - - await dai.approve(foreignBridge.address, value, { from: user }).should.be.fulfilled - - // When - const { logs } = await relayTokens(recipient, value, ZERO_ADDRESS, { from: user }).should.be.fulfilled - - // Then - expect(await foreignBridge.totalSpentPerDay(currentDay)).to.be.bignumber.equal(value) - expectEventInLogs(logs, 'UserRequestForAffirmation', { - recipient, - value - }) - expect(await dai.balanceOf(user)).to.be.bignumber.equal(balance.sub(value)) - }) - it('should fail if token address is unknown', async () => { - const otherToken = await ERC20Mock.new('token', 'TOK', 18) - await otherToken.mint(user, twoEthers) - - const relayTokens = foreignBridge.methods['relayTokens(address,uint256,address)'] - - await otherToken.approve(foreignBridge.address, value, { from: user }).should.be.fulfilled - - await relayTokens(recipient, value, otherToken.address, { from: user }).should.be.rejectedWith(ERROR_MSG) - }) - it('should allow specify the sender and a different receiver', async () => { - // Given - const currentDay = await foreignBridge.getCurrentDay() - expect(await foreignBridge.totalSpentPerDay(currentDay)).to.be.bignumber.equal(ZERO) - const userBalance = await dai.balanceOf(user) - - const relayTokens = foreignBridge.methods['relayTokens(address,address,uint256,address)'] - - await relayTokens(user, recipient, value, dai.address, { from: user }).should.be.rejectedWith(ERROR_MSG) - - await dai.approve(foreignBridge.address, halfEther, { from: user }).should.be.fulfilled - - // When - await relayTokens(user, ZERO_ADDRESS, value, dai.address, { from: user }).should.be.rejectedWith(ERROR_MSG) - await relayTokens(user, foreignBridge.address, value, dai.address, { from: user }).should.be.rejectedWith( - ERROR_MSG - ) - await relayTokens(user, recipient, 0, dai.address, { from: user }).should.be.rejectedWith(ERROR_MSG) - await relayTokens(user, recipient, value, dai.address, { from: recipient }).should.be.rejectedWith(ERROR_MSG) - const { logs } = await relayTokens(user, recipient, value, dai.address, { from: user }).should.be.fulfilled - const { logs: logsSecondTx } = await relayTokens(user, user, value, dai.address, { from: recipient }).should.be - .fulfilled - - // Then - expectEventInLogs(logs, 'UserRequestForAffirmation', { - recipient, - value - }) - expectEventInLogs(logsSecondTx, 'UserRequestForAffirmation', { - recipient: user, - value - }) - expect(await foreignBridge.totalSpentPerDay(currentDay)).to.be.bignumber.equal(halfEther) - expect(await dai.balanceOf(user)).to.be.bignumber.equal(userBalance.sub(halfEther)) - expect(await dai.balanceOf(foreignBridge.address)).to.be.bignumber.equal(halfEther) - }) - it('should not be able to transfer more than limit', async () => { - // Given - const userSupply = ether('2') - const bigValue = oneEther - const smallValue = ether('0.001') - const currentDay = await foreignBridge.getCurrentDay() - expect(await foreignBridge.totalSpentPerDay(currentDay)).to.be.bignumber.equal(ZERO) - - const relayTokens = foreignBridge.methods['relayTokens(address,uint256,address)'] - - await dai.approve(foreignBridge.address, userSupply, { from: user }).should.be.fulfilled - - // When - // value < minPerTx - await relayTokens(recipient, smallValue, dai.address, { from: user }).should.be.rejectedWith(ERROR_MSG) - // value > maxPerTx - await relayTokens(recipient, bigValue, dai.address, { from: user }).should.be.rejectedWith(ERROR_MSG) - - await relayTokens(recipient, halfEther, dai.address, { from: user }).should.be.fulfilled - await relayTokens(recipient, halfEther, dai.address, { from: user }).should.be.fulfilled - // totalSpentPerDay > dailyLimit - await relayTokens(recipient, halfEther, dai.address, { from: user }).should.be.rejectedWith(ERROR_MSG) - - // Then - expect(await foreignBridge.totalSpentPerDay(currentDay)).to.be.bignumber.equal(oneEther) - }) - }) - describe('relayTokens with chai token', async () => { - let foreignBridge - let dai - const value = ether('0.25') - const recipient = accounts[8] - beforeEach(async () => { - dai = await DaiMock.new({ from: owner }) - foreignBridge = await ForeignBridgeErcToNativeMock.new() - - await foreignBridge.initialize( - validatorContract.address, - dai.address, - requireBlockConfirmations, - gasPrice, - [dailyLimit, maxPerTx, minPerTx], - [homeDailyLimit, homeMaxPerTx], - owner, - decimalShiftZero, - otherSideBridge.address - ) - - await dai.mint(user, twoEthers) - }) - - it('should allow to bridge tokens specifying the token address with chai token enabled', async () => { - // Given - const { chaiToken } = await createChaiToken(dai, foreignBridge, owner) - await foreignBridge.methods['initializeChaiToken()']() - expect(await chaiToken.balanceOf(foreignBridge.address)).to.be.bignumber.equal(ZERO) - - const balance = await dai.balanceOf(user) - const relayTokens = foreignBridge.methods['relayTokens(address,uint256,address)'] - - const currentDay = await foreignBridge.getCurrentDay() - expect(await foreignBridge.totalSpentPerDay(currentDay)).to.be.bignumber.equal(ZERO) - - await relayTokens(recipient, value, dai.address, { from: user }).should.be.rejectedWith(ERROR_MSG) - - await dai.approve(foreignBridge.address, value, { from: user }).should.be.fulfilled - - // When - await relayTokens(ZERO_ADDRESS, value, dai.address, { from: user }).should.be.rejectedWith(ERROR_MSG) - await relayTokens(foreignBridge.address, value, dai.address, { from: user }).should.be.rejectedWith(ERROR_MSG) - await relayTokens(otherSideBridge.address, value, dai.address, { from: user }).should.be.rejectedWith(ERROR_MSG) - await relayTokens(recipient, 0, dai.address, { from: user }).should.be.rejectedWith(ERROR_MSG) - const { logs } = await relayTokens(recipient, value, dai.address, { from: user }).should.be.fulfilled - - // Then - expect(await foreignBridge.totalSpentPerDay(currentDay)).to.be.bignumber.equal(value) - expectEventInLogs(logs, 'UserRequestForAffirmation', { - recipient, - value - }) - expect(await dai.balanceOf(user)).to.be.bignumber.equal(balance.sub(value)) - expect(await chaiToken.balanceOf(foreignBridge.address)).to.be.bignumber.equal(ZERO) - }) - }) - describe('claimTokens', async () => { - it('can send erc20', async () => { - const foreignBridgeImpl = await ForeignBridgeErcToNativeMock.new() - const storageProxy = await EternalStorageProxy.new().should.be.fulfilled - await storageProxy.upgradeTo('1', foreignBridgeImpl.address).should.be.fulfilled - const foreignBridge = await ForeignBridgeErcToNativeMock.at(storageProxy.address) - - await foreignBridge.initialize( - validatorContract.address, - dai.address, - requireBlockConfirmations, - gasPrice, - [dailyLimit, maxPerTx, minPerTx], - [homeDailyLimit, homeMaxPerTx], - owner, - decimalShiftZero, - otherSideBridge.address - ) - - // Mint sai tokens to the bridge - await sai.mint(foreignBridge.address, halfEther) - - expect(await sai.balanceOf(foreignBridge.address)).to.be.bignumber.equal(halfEther) - expect(await sai.balanceOf(accounts[3])).to.be.bignumber.equal(ZERO) - - await foreignBridge - .claimTokens(sai.address, accounts[3], { from: accounts[3] }) - .should.be.rejectedWith(ERROR_MSG) - await foreignBridge.claimTokens(sai.address, accounts[3], { from: owner }) - expect(await sai.balanceOf(foreignBridge.address)).to.be.bignumber.equal(ZERO) - expect(await sai.balanceOf(accounts[3])).to.be.bignumber.equal(halfEther) - }) - }) - }) describe('chai token', async () => { let token diff --git a/test/multi_amb_erc20_to_erc677/foreign_mediator.test.js b/test/multi_amb_erc20_to_erc677/foreign_mediator.test.js index 09ff21a9b..585b2a470 100644 --- a/test/multi_amb_erc20_to_erc677/foreign_mediator.test.js +++ b/test/multi_amb_erc20_to_erc677/foreign_mediator.test.js @@ -76,20 +76,6 @@ contract('ForeignMultiAMBErc20ToErc677', async accounts => { await contract.methods['relayTokens(address,address,uint256)'](token.address, user2, value, { from: user }).should .be.fulfilled return user2 - }, - async function relayTokensWithAlternativeReceiver2() { - await token.approve(contract.address, value, { from: user }).should.be.fulfilled - await contract.methods['relayTokens(address,address,address,uint256)'](token.address, user, user2, value, { - from: user - }).should.be.fulfilled - return user2 - }, - async function relayTokensForOtherUser() { - await token.approve(contract.address, value, { from: user }).should.be.fulfilled - await contract.methods['relayTokens(address,address,address,uint256)'](token.address, user, user, value, { - from: user2 - }).should.be.fulfilled - return user } ] @@ -436,42 +422,6 @@ contract('ForeignMultiAMBErc20ToErc677', async accounts => { expect(await token.balanceOf(contract.address)).to.be.bignumber.equal(value) }) - it('should allow user to specify a itself as receiver', async () => { - // Given - await token.approve(contract.address, value, { from: user }).should.be.fulfilled - expect(await token.allowance(user, contract.address)).to.be.bignumber.equal(value) - - // When - await contract.methods['relayTokens(address,address,address,uint256)'](token.address, user, user, value, { - from: user - }).should.be.fulfilled - - // Then - const events = await getEvents(ambBridgeContract, { event: 'MockedEvent' }) - expect(events.length).to.be.equal(1) - expect(events[0].returnValues.encodedData.includes(strip0x(user).toLowerCase())).to.be.equal(true) - expect(await contract.totalSpentPerDay(token.address, currentDay)).to.be.bignumber.equal(value) - expect(await token.balanceOf(contract.address)).to.be.bignumber.equal(value) - }) - - it('should allow to specify a different receiver', async () => { - // Given - await token.approve(contract.address, value, { from: user }).should.be.fulfilled - expect(await token.allowance(user, contract.address)).to.be.bignumber.equal(value) - - // When - await contract.methods['relayTokens(address,address,address,uint256)'](token.address, user, user2, value, { - from: user - }).should.be.fulfilled - - // Then - const events = await getEvents(ambBridgeContract, { event: 'MockedEvent' }) - expect(events.length).to.be.equal(1) - expect(events[0].returnValues.encodedData.includes(strip0x(user2).toLowerCase())).to.be.equal(true) - expect(await contract.totalSpentPerDay(token.address, currentDay)).to.be.bignumber.equal(value) - expect(await token.balanceOf(contract.address)).to.be.bignumber.equal(value) - }) - it('should allow to specify a different receiver without specifying sender', async () => { // Given await token.approve(contract.address, value, { from: user }).should.be.fulfilled @@ -505,27 +455,6 @@ contract('ForeignMultiAMBErc20ToErc677', async accounts => { expect(await token.balanceOf(contract.address)).to.be.bignumber.equal(value) }) - it('should allow to complete a transfer approved by other user', async () => { - // Given - await token.approve(contract.address, value, { from: user }).should.be.fulfilled - expect(await token.allowance(user, contract.address)).to.be.bignumber.equal(value) - - // When - await contract.methods['relayTokens(address,address,address,uint256)'](token.address, user, user2, value, { - from: user2 - }).should.be.rejected - await contract.methods['relayTokens(address,address,address,uint256)'](token.address, user, user, value, { - from: user2 - }).should.be.fulfilled - - // Then - const events = await getEvents(ambBridgeContract, { event: 'MockedEvent' }) - expect(events.length).to.be.equal(1) - expect(events[0].returnValues.encodedData.includes(strip0x(user).toLowerCase())).to.be.equal(true) - expect(await contract.totalSpentPerDay(token.address, currentDay)).to.be.bignumber.equal(value) - expect(await token.balanceOf(contract.address)).to.be.bignumber.equal(value) - }) - it('should fail if user did not approve the transfer', async () => { await contract.methods['relayTokens(address,address,uint256)'](token.address, user, value, { from: user }) .should.be.rejected diff --git a/test/multi_amb_erc20_to_erc677/home_mediator.test.js b/test/multi_amb_erc20_to_erc677/home_mediator.test.js index 0246ee7a6..2e7d4e950 100644 --- a/test/multi_amb_erc20_to_erc677/home_mediator.test.js +++ b/test/multi_amb_erc20_to_erc677/home_mediator.test.js @@ -92,20 +92,6 @@ contract('HomeMultiAMBErc20ToErc677', async accounts => { await contract.methods['relayTokens(address,address,uint256)'](homeToken.address, user2, value, { from: user }) .should.be.fulfilled return user2 - }, - async function relayTokensWithAlternativeReceiver2() { - await homeToken.approve(contract.address, value, { from: user }).should.be.fulfilled - await contract.methods['relayTokens(address,address,address,uint256)'](homeToken.address, user, user2, value, { - from: user - }).should.be.fulfilled - return user2 - }, - async function relayTokensForOtherUser() { - await homeToken.approve(contract.address, value, { from: user }).should.be.fulfilled - await contract.methods['relayTokens(address,address,address,uint256)'](homeToken.address, user, user, value, { - from: user2 - }).should.be.fulfilled - return user } ] @@ -643,44 +629,6 @@ contract('HomeMultiAMBErc20ToErc677', async accounts => { expect(await homeToken.balanceOf(contract.address)).to.be.bignumber.equal(ZERO) }) - it('should allow user to specify a itself as receiver', async () => { - // Given - await homeToken.approve(contract.address, value, { from: user }).should.be.fulfilled - expect(await homeToken.allowance(user, contract.address)).to.be.bignumber.equal(value) - - // When - await contract.methods['relayTokens(address,address,address,uint256)'](homeToken.address, user, user, value, { - from: user - }).should.be.fulfilled - - // Then - const events = await getEvents(ambBridgeContract, { event: 'MockedEvent' }) - expect(events.length).to.be.equal(1) - expect(events[0].returnValues.encodedData.includes(strip0x(token.address).toLowerCase())).to.be.equal(true) - expect(events[0].returnValues.encodedData.includes(strip0x(user).toLowerCase())).to.be.equal(true) - expect(await contract.totalSpentPerDay(homeToken.address, currentDay)).to.be.bignumber.equal(value) - expect(await homeToken.balanceOf(contract.address)).to.be.bignumber.equal(ZERO) - }) - - it('should allow to specify a different receiver', async () => { - // Given - await homeToken.approve(contract.address, value, { from: user }).should.be.fulfilled - expect(await homeToken.allowance(user, contract.address)).to.be.bignumber.equal(value) - - // When - await contract.methods['relayTokens(address,address,address,uint256)'](homeToken.address, user, user2, value, { - from: user - }).should.be.fulfilled - - // Then - const events = await getEvents(ambBridgeContract, { event: 'MockedEvent' }) - expect(events.length).to.be.equal(1) - expect(events[0].returnValues.encodedData.includes(strip0x(token.address).toLowerCase())).to.be.equal(true) - expect(events[0].returnValues.encodedData.includes(strip0x(user2).toLowerCase())).to.be.equal(true) - expect(await contract.totalSpentPerDay(homeToken.address, currentDay)).to.be.bignumber.equal(value) - expect(await homeToken.balanceOf(contract.address)).to.be.bignumber.equal(ZERO) - }) - it('should allow to specify a different receiver without specifying sender', async () => { // Given await homeToken.approve(contract.address, value, { from: user }).should.be.fulfilled @@ -717,28 +665,6 @@ contract('HomeMultiAMBErc20ToErc677', async accounts => { expect(await homeToken.balanceOf(contract.address)).to.be.bignumber.equal(ZERO) }) - it('should allow to complete a transfer approved by other user', async () => { - // Given - await homeToken.approve(contract.address, value, { from: user }).should.be.fulfilled - expect(await homeToken.allowance(user, contract.address)).to.be.bignumber.equal(value) - - // When - await contract.methods['relayTokens(address,address,address,uint256)'](homeToken.address, user, user2, value, { - from: user2 - }).should.be.rejected - await contract.methods['relayTokens(address,address,address,uint256)'](homeToken.address, user, user, value, { - from: user2 - }).should.be.fulfilled - - // Then - const events = await getEvents(ambBridgeContract, { event: 'MockedEvent' }) - expect(events.length).to.be.equal(1) - expect(events[0].returnValues.encodedData.includes(strip0x(token.address).toLowerCase())).to.be.equal(true) - expect(events[0].returnValues.encodedData.includes(strip0x(user).toLowerCase())).to.be.equal(true) - expect(await contract.totalSpentPerDay(homeToken.address, currentDay)).to.be.bignumber.equal(value) - expect(await homeToken.balanceOf(contract.address)).to.be.bignumber.equal(ZERO) - }) - it('should fail if user did not approve the transfer', async () => { await contract.methods['relayTokens(address,address,uint256)'](homeToken.address, user, value, { from: user }) .should.be.rejected diff --git a/test/poa20_test.js b/test/poa20_test.js index 3f8ec2fdb..c59fcb88d 100644 --- a/test/poa20_test.js +++ b/test/poa20_test.js @@ -27,7 +27,7 @@ const executionMaxPerTx = halfEther const ZERO = new BN(0) const decimalShiftZero = 0 -async function testERC677BridgeToken(accounts, rewardable, permittable, createToken) { +function testERC677BridgeToken(accounts, rewardable, permittable, createToken) { let token const owner = accounts[0] const user = accounts[1] @@ -910,22 +910,22 @@ async function testERC677BridgeToken(accounts, rewardable, permittable, createTo } } -contract('ERC677BridgeToken', async accounts => { - await testERC677BridgeToken(accounts, false, false, args => POA20.new(...args)) +contract('ERC677BridgeToken', accounts => { + testERC677BridgeToken(accounts, false, false, args => POA20.new(...args)) }) -contract('ERC677BridgeTokenRewardable', async accounts => { - await testERC677BridgeToken(accounts, true, true, args => POA20RewardableMock.new(...args)) +contract('ERC677BridgeTokenRewardable', accounts => { + testERC677BridgeToken(accounts, true, true, args => POA20RewardableMock.new(...args)) }) -contract('TokenProxy', async accounts => { +contract('TokenProxy', accounts => { const createToken = async args => { const impl = await PermittableTokenMock.new(...args) const proxy = await TokenProxy.new(impl.address, ...args) return PermittableTokenMock.at(proxy.address) } - await testERC677BridgeToken(accounts, false, true, createToken) + testERC677BridgeToken(accounts, false, true, createToken) describe('constants', () => { let token