56 lines
2.1 KiB
Solidity
56 lines
2.1 KiB
Solidity
pragma solidity 0.4.24;
|
|
|
|
import "../upgradeability/EternalStorage.sol";
|
|
import "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol";
|
|
import "./Validatable.sol";
|
|
import "../libraries/Message.sol";
|
|
import "./MessageRelay.sol";
|
|
import "./BasicBridge.sol";
|
|
import "./BasicTokenBridge.sol";
|
|
import "./MessageRelay.sol";
|
|
|
|
contract BasicForeignBridge is EternalStorage, Validatable, BasicBridge, BasicTokenBridge, MessageRelay {
|
|
/// triggered when relay of deposit from HomeBridge is complete
|
|
event RelayedMessage(address recipient, uint256 value, bytes32 transactionHash);
|
|
event UserRequestForAffirmation(address recipient, uint256 value);
|
|
|
|
/**
|
|
* @dev Validates provided signatures and relays a given message
|
|
* @param message bytes to be relayed
|
|
* @param signatures bytes blob with signatures to be validated
|
|
*/
|
|
function executeSignatures(bytes message, bytes signatures) external {
|
|
Message.hasEnoughValidSignatures(message, signatures, validatorContract(), false);
|
|
|
|
address recipient;
|
|
uint256 amount;
|
|
bytes32 txHash;
|
|
address contractAddress;
|
|
(recipient, amount, txHash, contractAddress) = Message.parseMessage(message);
|
|
if (withinExecutionLimit(amount)) {
|
|
require(contractAddress == address(this));
|
|
require(!relayedMessages(txHash));
|
|
setRelayedMessages(txHash, true);
|
|
require(onExecuteMessage(recipient, amount, txHash));
|
|
emit RelayedMessage(recipient, amount, txHash);
|
|
} else {
|
|
onFailedMessage(recipient, amount, txHash);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @dev Internal function for updating fallback gas price value.
|
|
* @param _gasPrice new value for the gas price, zero gas price is not allowed.
|
|
*/
|
|
function _setGasPrice(uint256 _gasPrice) internal {
|
|
require(_gasPrice > 0);
|
|
super._setGasPrice(_gasPrice);
|
|
}
|
|
|
|
/* solcov ignore next */
|
|
function onExecuteMessage(address, uint256, bytes32) internal returns (bool);
|
|
|
|
/* solcov ignore next */
|
|
function onFailedMessage(address, uint256, bytes32) internal;
|
|
}
|