//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; } }