Adapt the sender contract to also receive messages
The sender contract has now two tasks:
Send a message to the receiver: Same as in the last example
Receive a message back from the receiver: Now our sender contract needs to be able to receive a message back from the receiver.
Therefore, we need to change the sender contract to be able to receive a message back. We will need to implement the same interface ITeleporterReceiver as the receiver contract and implement the receiveTeleporterMessage function.
// (c) 2023, Ava Labs, Inc. All rights reserved.// See the file LICENSE for licensing terms.// SPDX-License-Identifier: Ecosystempragma solidity ^0.8.18;import "@teleporter/ITeleporterMessenger.sol";import "@teleporter/ITeleporterReceiver.sol";contract SenderOnCChain is ITeleporterReceiver { ITeleporterMessenger public immutable messenger = ITeleporterMessenger(0x253b2784c75e510dD0fF1da844684a1aC0aa5fcf); string public rountripMessage; /** * @dev Sends a message to another chain. */ function sendMessage(address destinationAddress) external { messenger.sendCrossChainMessage( TeleporterMessageInput({ // Replace with blockchainID of your Avalanche L1 (see instructions in Readme) destinationBlockchainID: 0xb72b346fcc8c1ebb30087e2d2841eac9302dde8fc5969dcc84fad6db5ebd261d, destinationAddress: destinationAddress, feeInfo: TeleporterFeeInfo({feeTokenAddress: address(0), amount: 0}), requiredGasLimit: 100000, allowedRelayerAddresses: new address[](0), message: abi.encode("Hello") }) ); } function receiveTeleporterMessage(bytes32, address, bytes calldata message) external { // Only the Interchain Messaging receiver can deliver a message. require(msg.sender == address(messenger), "SenderOnCChain: unauthorized TeleporterMessenger"); // Store the message. rountripMessage = abi.decode(message, (string)); }}