80 lines
2.6 KiB
Solidity
80 lines
2.6 KiB
Solidity
pragma solidity 0.4.24;
|
|
|
|
import "../libraries/Bytes.sol";
|
|
|
|
contract AMBMock {
|
|
event MockedEvent(bytes32 indexed messageId, bytes encodedData);
|
|
|
|
address public messageSender;
|
|
uint256 public maxGasPerTx;
|
|
bytes32 public transactionHash;
|
|
bytes32 public messageId;
|
|
uint64 public nonce;
|
|
uint256 public messageSourceChainId;
|
|
mapping(bytes32 => bool) public messageCallStatus;
|
|
mapping(bytes32 => address) public failedMessageSender;
|
|
mapping(bytes32 => address) public failedMessageReceiver;
|
|
mapping(bytes32 => bytes32) public failedMessageDataHash;
|
|
|
|
function setMaxGasPerTx(uint256 _value) public {
|
|
maxGasPerTx = _value;
|
|
}
|
|
|
|
function executeMessageCall(address _contract, address _sender, bytes _data, bytes32 _messageId, uint256 _gas)
|
|
public
|
|
{
|
|
messageSender = _sender;
|
|
messageId = _messageId;
|
|
transactionHash = _messageId;
|
|
messageSourceChainId = 1337;
|
|
bool status = _contract.call.gas(_gas)(_data);
|
|
messageSender = address(0);
|
|
messageId = bytes32(0);
|
|
transactionHash = bytes32(0);
|
|
messageSourceChainId = 0;
|
|
|
|
messageCallStatus[_messageId] = status;
|
|
if (!status) {
|
|
failedMessageDataHash[_messageId] = keccak256(_data);
|
|
failedMessageReceiver[_messageId] = _contract;
|
|
failedMessageSender[_messageId] = _sender;
|
|
}
|
|
}
|
|
|
|
function requireToPassMessage(address _contract, bytes _data, uint256 _gas) external returns (bytes32) {
|
|
return _sendMessage(_contract, _data, _gas, 0x00);
|
|
}
|
|
|
|
function requireToConfirmMessage(address _contract, bytes _data, uint256 _gas) external returns (bytes32) {
|
|
return _sendMessage(_contract, _data, _gas, 0x80);
|
|
}
|
|
|
|
function _sendMessage(address _contract, bytes _data, uint256 _gas, uint256 _dataType) internal returns (bytes32) {
|
|
require(messageId == bytes32(0));
|
|
bytes32 bridgeId = keccak256(abi.encodePacked(uint16(1337), address(this))) &
|
|
0x00000000ffffffffffffffffffffffffffffffffffffffff0000000000000000;
|
|
|
|
bytes32 _messageId = bytes32(0x11223344 << 224) | bridgeId | bytes32(nonce);
|
|
nonce += 1;
|
|
bytes memory eventData = abi.encodePacked(
|
|
_messageId,
|
|
msg.sender,
|
|
_contract,
|
|
uint32(_gas),
|
|
uint8(2),
|
|
uint8(2),
|
|
uint8(_dataType),
|
|
uint16(1337),
|
|
uint16(1338),
|
|
_data
|
|
);
|
|
|
|
emit MockedEvent(_messageId, eventData);
|
|
return _messageId;
|
|
}
|
|
|
|
function sourceChainId() external pure returns (uint256) {
|
|
return 1337;
|
|
}
|
|
}
|