Created
May 10, 2024 02:12
-
-
Save QingyangKong/012f1a3f3a69833bbb654f62abd1c560 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity 0.8.19; | |
import {IRouterClient} from "@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IRouterClient.sol"; | |
import {OwnerIsCreator} from "@chainlink/contracts-ccip/src/v0.8/shared/access/OwnerIsCreator.sol"; | |
import {Client} from "@chainlink/contracts-ccip/src/v0.8/ccip/libraries/Client.sol"; | |
import {CCIPReceiver} from "@chainlink/contracts-ccip/src/v0.8/ccip/applications/CCIPReceiver.sol"; | |
import {IERC20} from "@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; | |
import {SafeERC20} from "@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/utils/SafeERC20.sol"; | |
/** | |
* THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. | |
* THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. | |
* DO NOT USE THIS CODE IN PRODUCTION. | |
*/ | |
/// @title - A simple messenger contract for transferring/receiving tokens and data across chains. | |
contract DestChainReceiver is CCIPReceiver, OwnerIsCreator { | |
using SafeERC20 for IERC20; | |
address public routerEthSepolia = 0x0BF3dE8c5D3e8A2B34D2BEeB17ABfCeBaf363A59; | |
address public BnMToken = 0xFd57b4ddBf88a4e07fF4e34C487b99af2Fe82a05; | |
// Custom errors to provide more descriptive revert messages. | |
error NotEnoughBalance(uint256 currentBalance, uint256 calculatedFees); // Used to make sure contract has enough balance to cover the fees. | |
error NothingToWithdraw(); // Used when trying to withdraw Ether but there's nothing to withdraw. | |
error FailedToWithdrawEth(address owner, address target, uint256 value); // Used when the withdrawal of Ether fails. | |
bytes32 private s_lastReceivedMessageId; // Store the last received messageId. | |
address private s_lastReceivedTokenAddress; // Store the last received token address. | |
uint256 private s_lastReceivedTokenAmount; // Store the last received amount. | |
string private s_lastReceivedText; // Store the last received text. | |
/// @notice Constructor initializes the contract with the router address. | |
constructor() CCIPReceiver(routerEthSepolia) {} | |
/** | |
* @notice Returns the details of the last CCIP received message. | |
* @dev This function retrieves the ID, text, token address, and token amount of the last received CCIP message. | |
* @return messageId The ID of the last received CCIP message. | |
* @return text The text of the last received CCIP message. | |
* @return tokenAddress The address of the token in the last CCIP received message. | |
* @return tokenAmount The amount of the token in the last CCIP received message. | |
*/ | |
function getLastReceivedMessageDetails() | |
public | |
view | |
returns ( | |
bytes32 messageId, | |
string memory text, | |
address tokenAddress, | |
uint256 tokenAmount | |
) | |
{ | |
return ( | |
s_lastReceivedMessageId, | |
s_lastReceivedText, | |
s_lastReceivedTokenAddress, | |
s_lastReceivedTokenAmount | |
); | |
} | |
/// handle a received message | |
function _ccipReceive( | |
Client.Any2EVMMessage memory any2EvmMessage | |
) | |
internal | |
override | |
{ | |
s_lastReceivedMessageId = any2EvmMessage.messageId; // fetch the messageId | |
s_lastReceivedText = abi.decode(any2EvmMessage.data, (string)); // abi-decoding of the sent text | |
// Expect one token to be transferred at once, but you can transfer several tokens. | |
s_lastReceivedTokenAddress = any2EvmMessage.destTokenAmounts[0].token; | |
s_lastReceivedTokenAmount = any2EvmMessage.destTokenAmounts[0].amount; | |
} | |
function currentBalance() public view returns (uint256 balance){ | |
balance = IERC20(BnMToken).balanceOf(address(this)); | |
} | |
/// @notice Allows the owner of the contract to withdraw all tokens of a specific ERC20 token. | |
/// @dev This function reverts with a 'NothingToWithdraw' error if there are no tokens to withdraw. | |
/// @param _beneficiary The address to which the tokens will be sent. | |
/// @param _token The contract address of the ERC20 token to be withdrawn. | |
function withdrawToken( | |
address _beneficiary, | |
address _token | |
) public onlyOwner { | |
uint256 amount = IERC20(_token).balanceOf(address(this)); | |
if (amount == 0) revert NothingToWithdraw(); | |
IERC20(_token).safeTransfer(_beneficiary, amount); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment