Skip to content

Instantly share code, notes, and snippets.

@SpiralOutDotEu
Last active June 25, 2024 20:42
Show Gist options
  • Save SpiralOutDotEu/9bcb2445e96f119967dc6c74ebe8291d to your computer and use it in GitHub Desktop.
Save SpiralOutDotEu/9bcb2445e96f119967dc6c74ebe8291d to your computer and use it in GitHub Desktop.
Basic Wormhole interaction
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;
import "wormhole-solidity-sdk/interfaces/IWormholeRelayer.sol";
import "wormhole-solidity-sdk/interfaces/IWormholeReceiver.sol";
contract HelloWormhole is IWormholeReceiver {
event GreetingReceived(string greeting, uint16 senderChain, address sender, address senderContract);
uint256 constant GAS_LIMIT = 50_000;
IWormholeRelayer public immutable wormholeRelayer;
string public latestGreeting;
constructor(address _wormholeRelayer) {
wormholeRelayer = IWormholeRelayer(_wormholeRelayer);
}
function quoteCrossChainGreeting(
uint16 targetChain
) public view returns (uint256 cost) {
(cost, ) = wormholeRelayer.quoteEVMDeliveryPrice(
targetChain,
0,
GAS_LIMIT
);
}
function sendCrossChainGreeting(
uint16 targetChain,
address targetAddress,
string memory greeting
) public payable {
uint256 cost = quoteCrossChainGreeting(targetChain);
require(msg.value == cost);
wormholeRelayer.sendPayloadToEvm{value: cost}(
targetChain,
targetAddress,
abi.encode(greeting, msg.sender), // payload
0, // no receiver value needed since we're just passing a message
GAS_LIMIT
);
}
function receiveWormholeMessages(
bytes memory payload,
bytes[] memory, // additionalVaas
bytes32 senderContractBytes, // address that called 'sendPayloadToEvm' (HelloWormhole contract address)
uint16 sourceChain,
bytes32 // unique identifier of delivery
) public payable override {
require(msg.sender == address(wormholeRelayer), "Only relayer allowed");
// Parse the payload and do the corresponding actions!
(string memory greeting, address sender) = abi.decode(
payload,
(string, address)
);
latestGreeting = greeting;
address senderContract = address(uint160(uint256(senderContractBytes)));
emit GreetingReceived(latestGreeting, sourceChain, sender, senderContract);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment