xdapp-book/projects/messenger/chains/evm/src/Messenger.sol

55 lines
1.9 KiB
Solidity

//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;
import "./Wormhole/IWormhole.sol";
contract Messenger {
string private current_msg;
IWormhole core_bridge;
uint32 nonce = 0;
mapping(uint16 => bytes32) _applicationContracts;
address owner;
mapping(bytes32 => bool) _completedMessages;
constructor(address _core_bridge_address){
owner = msg.sender;
core_bridge = IWormhole(_core_bridge_address);
}
function sendMsg(bytes memory str) public returns (uint64 sequence) {
sequence = core_bridge.publishMessage(nonce, str, 1);
nonce = nonce+1;
}
function receiveEncodedMsg(bytes memory encodedMsg) public {
(IWormhole.VM memory vm, bool valid, string memory reason) = core_bridge.parseAndVerifyVM(encodedMsg);
//1. Check Wormhole Guardian Signatures
// If the VM is NOT valid, will return the reason it's not valid
// If the VM IS valid, reason will be blank
require(valid, reason);
//2. Check if the Emitter Chain contract is registered
require(_applicationContracts[vm.emitterChainId] == vm.emitterAddress, "Invalid Emitter Address!");
//3. Check that the message hasn't already been processed
require(!_completedMessages[vm.hash], "Message already processed");
_completedMessages[vm.hash] = true;
//Do the thing
current_msg = string(vm.payload);
}
function getCurrentMsg() public view returns (string memory){
return current_msg;
}
/**
Registers it's sibling applications on other chains as the only ones that can send this instance messages
*/
function registerApplicationContracts(uint16 chainId, bytes32 applicationAddr) public {
require(msg.sender == owner, "Only owner can register new chains!");
_applicationContracts[chainId] = applicationAddr;
}
}