Optimize Omnibridge gas usage (#553)
This commit is contained in:
parent
633870a2ac
commit
317d9060fe
|
@ -88,5 +88,6 @@ contract BasicMultiAMBErc20ToErc677 is
|
|||
function _relayTokens(ERC677 token, address _receiver, uint256 _value) internal;
|
||||
|
||||
/* solcov ignore next */
|
||||
function bridgeSpecificActionsOnTokenTransfer(ERC677 _token, address _from, uint256 _value, bytes _data) internal;
|
||||
function bridgeSpecificActionsOnTokenTransfer(ERC677 _token, address _from, address _receiver, uint256 _value)
|
||||
internal;
|
||||
}
|
||||
|
|
|
@ -70,7 +70,7 @@ contract ForeignMultiAMBErc20ToErc677 is BasicMultiAMBErc20ToErc677 {
|
|||
function onTokenTransfer(address _from, uint256 _value, bytes _data) public returns (bool) {
|
||||
if (!lock()) {
|
||||
ERC677 token = ERC677(msg.sender);
|
||||
bridgeSpecificActionsOnTokenTransfer(token, _from, _value, _data);
|
||||
bridgeSpecificActionsOnTokenTransfer(token, _from, chooseReceiver(_from, _data), _value);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -104,19 +104,19 @@ contract ForeignMultiAMBErc20ToErc677 is BasicMultiAMBErc20ToErc677 {
|
|||
setLock(true);
|
||||
token.safeTransferFrom(msg.sender, _value);
|
||||
setLock(false);
|
||||
bridgeSpecificActionsOnTokenTransfer(token, msg.sender, _value, abi.encodePacked(_receiver));
|
||||
bridgeSpecificActionsOnTokenTransfer(token, msg.sender, _receiver, _value);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Executes action on deposit of bridged tokens
|
||||
* @param _token address of the token contract
|
||||
* @param _from address of tokens sender
|
||||
* @param _value requsted amount of bridged tokens
|
||||
* @param _data alternative receiver, if specified
|
||||
* @param _receiver address of tokens receiver on the other side
|
||||
* @param _value requested amount of bridged tokens
|
||||
*/
|
||||
function bridgeSpecificActionsOnTokenTransfer(ERC677 _token, address _from, uint256 _value, bytes _data) internal {
|
||||
if (lock()) return;
|
||||
|
||||
function bridgeSpecificActionsOnTokenTransfer(ERC677 _token, address _from, address _receiver, uint256 _value)
|
||||
internal
|
||||
{
|
||||
bool isKnownToken = isTokenRegistered(_token);
|
||||
if (!isKnownToken) {
|
||||
string memory name = TokenReader.readName(_token);
|
||||
|
@ -132,10 +132,9 @@ contract ForeignMultiAMBErc20ToErc677 is BasicMultiAMBErc20ToErc677 {
|
|||
addTotalSpentPerDay(_token, getCurrentDay(), _value);
|
||||
|
||||
bytes memory data;
|
||||
address receiver = chooseReceiver(_from, _data);
|
||||
|
||||
if (isKnownToken) {
|
||||
data = abi.encodeWithSelector(this.handleBridgedTokens.selector, _token, receiver, _value);
|
||||
data = abi.encodeWithSelector(this.handleBridgedTokens.selector, _token, _receiver, _value);
|
||||
} else {
|
||||
data = abi.encodeWithSelector(
|
||||
HomeMultiAMBErc20ToErc677(this).deployAndHandleBridgedTokens.selector,
|
||||
|
@ -143,7 +142,7 @@ contract ForeignMultiAMBErc20ToErc677 is BasicMultiAMBErc20ToErc677 {
|
|||
name,
|
||||
symbol,
|
||||
decimals,
|
||||
receiver,
|
||||
_receiver,
|
||||
_value
|
||||
);
|
||||
}
|
||||
|
|
|
@ -148,7 +148,7 @@ contract HomeMultiAMBErc20ToErc677 is
|
|||
// require(isTokenRegistered(token));
|
||||
require(withinLimit(token, _value));
|
||||
addTotalSpentPerDay(token, getCurrentDay(), _value);
|
||||
bridgeSpecificActionsOnTokenTransfer(token, _from, _value, _data);
|
||||
bridgeSpecificActionsOnTokenTransfer(token, _from, chooseReceiver(_from, _data), _value);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -176,7 +176,7 @@ contract HomeMultiAMBErc20ToErc677 is
|
|||
setLock(true);
|
||||
token.transferFrom(msg.sender, to, _value);
|
||||
setLock(false);
|
||||
bridgeSpecificActionsOnTokenTransfer(token, msg.sender, _value, abi.encodePacked(_receiver));
|
||||
bridgeSpecificActionsOnTokenTransfer(token, msg.sender, _receiver, _value);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -247,26 +247,26 @@ contract HomeMultiAMBErc20ToErc677 is
|
|||
* @dev Executes action on withdrawal of bridged tokens
|
||||
* @param _token address of token contract
|
||||
* @param _from address of tokens sender
|
||||
* @param _receiver address of tokens receiver on the other side
|
||||
* @param _value requested amount of bridged tokens
|
||||
* @param _data alternative receiver, if specified
|
||||
*/
|
||||
function bridgeSpecificActionsOnTokenTransfer(ERC677 _token, address _from, uint256 _value, bytes _data) internal {
|
||||
if (!lock()) {
|
||||
uint256 valueToBridge = _value;
|
||||
uint256 fee = 0;
|
||||
// Next line disables fee collection in case sender is one of the reward addresses.
|
||||
// It is needed to allow a 100% withdrawal of tokens from the home side.
|
||||
// If fees are not disabled for reward receivers, small fraction of tokens will always
|
||||
// be redistributed between the same set of reward addresses, which is not the desired behaviour.
|
||||
if (!isRewardAddress(_from)) {
|
||||
fee = _distributeFee(HOME_TO_FOREIGN_FEE, _token, valueToBridge);
|
||||
valueToBridge = valueToBridge.sub(fee);
|
||||
}
|
||||
IBurnableMintableERC677Token(_token).burn(valueToBridge);
|
||||
bytes32 _messageId = passMessage(_token, _from, chooseReceiver(_from, _data), valueToBridge);
|
||||
if (fee > 0) {
|
||||
emit FeeDistributed(fee, _token, _messageId);
|
||||
}
|
||||
function bridgeSpecificActionsOnTokenTransfer(ERC677 _token, address _from, address _receiver, uint256 _value)
|
||||
internal
|
||||
{
|
||||
uint256 valueToBridge = _value;
|
||||
uint256 fee = 0;
|
||||
// Next line disables fee collection in case sender is one of the reward addresses.
|
||||
// It is needed to allow a 100% withdrawal of tokens from the home side.
|
||||
// If fees are not disabled for reward receivers, small fraction of tokens will always
|
||||
// be redistributed between the same set of reward addresses, which is not the desired behaviour.
|
||||
if (!isRewardAddress(_from)) {
|
||||
fee = _distributeFee(HOME_TO_FOREIGN_FEE, _token, valueToBridge);
|
||||
valueToBridge = valueToBridge.sub(fee);
|
||||
}
|
||||
IBurnableMintableERC677Token(_token).burn(valueToBridge);
|
||||
bytes32 _messageId = passMessage(_token, _from, _receiver, valueToBridge);
|
||||
if (fee > 0) {
|
||||
emit FeeDistributed(fee, _token, _messageId);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue