Source Code
Overview
ETH Balance
0 ETH
ETH Value
$0.00Latest 8 from a total of 8 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Allowlist Sender | 33853942 | 125 days ago | IN | 0 ETH | 0.00000103 | ||||
| Allowlist Sender | 33853933 | 125 days ago | IN | 0 ETH | 0.00000054 | ||||
| Allowlist Sender | 33852652 | 125 days ago | IN | 0 ETH | 0.00000094 | ||||
| Allowlist Sender | 33852643 | 125 days ago | IN | 0 ETH | 0.00000074 | ||||
| Allowlist Sender | 33849656 | 125 days ago | IN | 0 ETH | 0.00000121 | ||||
| Allowlist Source... | 33849641 | 125 days ago | IN | 0 ETH | 0.00000107 | ||||
| Allowlist Sender | 32987902 | 145 days ago | IN | 0 ETH | 0.00000157 | ||||
| Allowlist Source... | 32987879 | 145 days ago | IN | 0 ETH | 0.0000014 |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
LuchamonBridge
Compiler Version
v0.8.22+commit.4fc1097e
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.22;
import {IRouterClient} from "@chainlink/contracts-ccip/contracts/interfaces/IRouterClient.sol";
import {OwnerIsCreator} from "@chainlink/contracts/src/v0.8/shared/access/OwnerIsCreator.sol";
import {Client} from "@chainlink/contracts-ccip/contracts/libraries/Client.sol";
import {CCIPReceiver} from "@chainlink/contracts-ccip/contracts/applications/CCIPReceiver.sol";
import {IERC20} from "@chainlink/contracts/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol";
import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol";
interface ILuchamon {
function mint(address user, uint256[] calldata tokenIds) external;
}
contract LuchamonBridge is CCIPReceiver, OwnerIsCreator {
error SourceChainNotAllowlisted(uint64 sourceChainSelector); // Used when the source chain has not been allowlisted by the contract owner.
error SenderNotAllowlisted(address sender); // Used when the sender has not been allowlisted by the contract owner.
error OnlySelf(); // Used when a function is called outside of the contract itself.
error MessageNotFailed(bytes32 messageId);
enum ErrorCode {
RESOLVED, // default
FAILED
}
struct Data {
address recipient;
uint256[] tokenIds;
}
// Event emitted when a message is received from another chain.
event MessageReceived(
bytes32 indexed messageId, // The unique ID of the CCIP message.
uint64 indexed sourceChainSelector, // The chain selector of the source chain.
address sender, // The address of the sender from the source chain.
Data data // The data that was received.
);
event MessageFailed(
bytes32 indexed messageId,
uint64 indexed sourceChainSelector,
address sender,
Data data,
bytes reason
);
event MessageRecovered(bytes32 indexed messageId);
// Mapping to keep track of allowlisted source chains.
mapping(uint64 => bool) public allowlistedSourceChains;
// Mapping to keep track of allowlisted senders.
mapping(address => bool) public allowlistedSenders;
ILuchamon private luchamon;
// Contains failed messages and their state.
mapping(bytes32 messageId => uint256 errorCode) internal s_failedMessages;
// The message data of failed messages are stored here.
mapping(bytes32 messageId => bytes messageData) public s_messageData;
/// @notice Constructor initializes the contract with the router address.
/// @param _router The address of the router contract.
constructor(address _router, address _luchamon) CCIPReceiver(_router) {
luchamon = ILuchamon(_luchamon);
}
/// @dev Modifier that checks if the chain with the given sourceChainSelector is allowlisted and if the sender is allowlisted.
/// @param _sourceChainSelector The selector of the destination chain.
/// @param _sender The address of the sender.
modifier onlyAllowlisted(uint64 _sourceChainSelector, address _sender) {
if (!allowlistedSourceChains[_sourceChainSelector])
revert SourceChainNotAllowlisted(_sourceChainSelector);
if (!allowlistedSenders[_sender]) revert SenderNotAllowlisted(_sender);
_;
}
/// @dev Modifier to allow only the contract itself to execute a function.
/// Throws an exception if called by any account other than the contract itself.
modifier onlySelf() {
if (msg.sender != address(this)) revert OnlySelf();
_;
}
/// @dev Updates the allowlist status of a source chain for transactions.
function allowlistSourceChain(
uint64 _sourceChainSelector,
bool allowed
) external onlyOwner {
allowlistedSourceChains[_sourceChainSelector] = allowed;
}
/// @dev Updates the allowlist status of a sender for transactions.
function allowlistSender(address _sender, bool allowed) external onlyOwner {
allowlistedSenders[_sender] = allowed;
}
/// @notice The entrypoint for the CCIP router to call. This function should
/// never revert, all errors should be handled internally in this contract.
/// @param any2EvmMessage The message to process.
/// @dev Extremely important to ensure only router calls this.
function ccipReceive(
Client.Any2EVMMessage calldata any2EvmMessage
)
external
override
onlyRouter
onlyAllowlisted(
any2EvmMessage.sourceChainSelector,
abi.decode(any2EvmMessage.sender, (address))
) // Make sure the source chain and sender are allowlisted
{
try this.processMessage(any2EvmMessage) {
// Intentionally empty; no action needed if processMessage succeeds
} catch (bytes memory err) {
s_failedMessages[any2EvmMessage.messageId] = uint256(ErrorCode.FAILED);
s_messageData[any2EvmMessage.messageId] = any2EvmMessage.data;
// Don't revert so CCIP doesn't revert. Emit event instead.
// The message can be retried later without having to do manual execution of CCIP.
emit MessageFailed(
any2EvmMessage.messageId,
any2EvmMessage.sourceChainSelector,
abi.decode(any2EvmMessage.sender, (address)),
abi.decode(any2EvmMessage.data, (Data)),
err
);
return;
}
}
/// @notice Serves as the entry point for this contract to process incoming messages.
/// @param any2EvmMessage Received CCIP message.
/// @dev Mints token to CCIP message recipient.
/// This function must be external because of the try/catch for error handling.
/// It uses the `onlySelf`: can only be called from the contract.
function processMessage(
Client.Any2EVMMessage calldata any2EvmMessage
)
external
onlySelf
onlyAllowlisted(
any2EvmMessage.sourceChainSelector,
abi.decode(any2EvmMessage.sender, (address))
) // Make sure the source chain and sender are allowlisted
{
_ccipReceive(any2EvmMessage); // process the message - may revert as well
}
/// @notice Allows the owner to retry a failed message in order to unblock the associated tokens.
/// @param messageId The unique identifier of the failed message.
/// @dev This function changes the status of the message
/// from 'failed' to 'resolved' to prevent reentry and multiple retries of the same message.
function retryFailedMessage(bytes32 messageId) external {
// Check if the message has failed; if not, revert the transaction.
if (s_failedMessages[messageId] != uint256(ErrorCode.FAILED)) revert MessageNotFailed(messageId);
// Set the error code to RESOLVED to disallow reentry and multiple retries of the same failed message.
s_failedMessages[messageId] = uint256(ErrorCode.RESOLVED);
// Retrieve the data of the failed message and decode.
Data memory data = abi.decode(s_messageData[messageId], (Data));
// Mint tokens to recipient
luchamon.mint(data.recipient, data.tokenIds);
// Emit an event indicating that the message has been recovered.
emit MessageRecovered(messageId);
}
/// handle a received message
function _ccipReceive(
Client.Any2EVMMessage memory any2EvmMessage
)
internal
override
onlyAllowlisted(
any2EvmMessage.sourceChainSelector,
abi.decode(any2EvmMessage.sender, (address))
) // Make sure source chain and sender are allowlisted
{
Data memory data = abi.decode(any2EvmMessage.data, (Data));
luchamon.mint(data.recipient, data.tokenIds);
emit MessageReceived(
any2EvmMessage.messageId,
any2EvmMessage.sourceChainSelector, // fetch the source chain identifier (aka selector)
abi.decode(any2EvmMessage.sender, (address)), // abi-decoding of the sender address,
data // abi-decoding token amount
);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
import {IAny2EVMMessageReceiver} from "../interfaces/IAny2EVMMessageReceiver.sol";
import {Client} from "../libraries/Client.sol";
import {IERC165} from
"@chainlink/contracts/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/utils/introspection/IERC165.sol";
/// @title CCIPReceiver - Base contract for CCIP applications that can receive messages.
abstract contract CCIPReceiver is IAny2EVMMessageReceiver, IERC165 {
address internal immutable i_ccipRouter;
constructor(
address router
) {
if (router == address(0)) revert InvalidRouter(address(0));
i_ccipRouter = router;
}
/// @notice IERC165 supports an interfaceId.
/// @param interfaceId The interfaceId to check.
/// @return true if the interfaceId is supported.
/// @dev Should indicate whether the contract implements IAny2EVMMessageReceiver.
/// e.g. return interfaceId == type(IAny2EVMMessageReceiver).interfaceId || interfaceId == type(IERC165).interfaceId
/// This allows CCIP to check if ccipReceive is available before calling it.
/// - If this returns false or reverts, only tokens are transferred to the receiver.
/// - If this returns true, tokens are transferred and ccipReceive is called atomically.
/// Additionally, if the receiver address does not have code associated with it at the time of
/// execution (EXTCODESIZE returns 0), only tokens will be transferred.
function supportsInterface(
bytes4 interfaceId
) public view virtual override returns (bool) {
return interfaceId == type(IAny2EVMMessageReceiver).interfaceId || interfaceId == type(IERC165).interfaceId;
}
/// @inheritdoc IAny2EVMMessageReceiver
function ccipReceive(
Client.Any2EVMMessage calldata message
) external virtual override onlyRouter {
_ccipReceive(message);
}
/// @notice Override this function in your implementation.
/// @param message Any2EVMMessage.
function _ccipReceive(
Client.Any2EVMMessage memory message
) internal virtual;
/// @notice Return the current router
/// @return CCIP router address
function getRouter() public view virtual returns (address) {
return address(i_ccipRouter);
}
error InvalidRouter(address router);
/// @dev only calls from the set router are accepted.
modifier onlyRouter() {
if (msg.sender != getRouter()) revert InvalidRouter(msg.sender);
_;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {Client} from "../libraries/Client.sol";
/// @notice Application contracts that intend to receive messages from the router should implement this interface.
interface IAny2EVMMessageReceiver {
/// @notice Called by the Router to deliver a message. If this reverts, any token transfers also revert.
/// The message will move to a FAILED state and become available for manual execution.
/// @param message CCIP Message.
/// @dev Note ensure you check the msg.sender is the OffRampRouter.
function ccipReceive(
Client.Any2EVMMessage calldata message
) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
import {Client} from "../libraries/Client.sol";
interface IRouterClient {
error UnsupportedDestinationChain(uint64 destChainSelector);
error InsufficientFeeTokenAmount();
error InvalidMsgValue();
/// @notice Checks if the given chain ID is supported for sending/receiving.
/// @param destChainSelector The chain to check.
/// @return supported is true if it is supported, false if not.
function isChainSupported(
uint64 destChainSelector
) external view returns (bool supported);
/// @param destinationChainSelector The destination chainSelector.
/// @param message The cross-chain CCIP message including data and/or tokens.
/// @return fee returns execution fee for the message.
/// delivery to destination chain, denominated in the feeToken specified in the message.
/// @dev Reverts with appropriate reason upon invalid message.
function getFee(
uint64 destinationChainSelector,
Client.EVM2AnyMessage memory message
) external view returns (uint256 fee);
/// @notice Request a message to be sent to the destination chain.
/// @param destinationChainSelector The destination chain ID.
/// @param message The cross-chain CCIP message including data and/or tokens.
/// @return messageId The message ID.
/// @dev Note if msg.value is larger than the required fee (from getFee) we accept.
/// the overpayment with no refund.
/// @dev Reverts with appropriate reason upon invalid message.
function ccipSend(
uint64 destinationChainSelector,
Client.EVM2AnyMessage calldata message
) external payable returns (bytes32);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
// End consumer library.
library Client {
/// @dev RMN depends on this struct, if changing, please notify the RMN maintainers.
struct EVMTokenAmount {
address token; // token address on the local chain.
uint256 amount; // Amount of tokens.
}
struct Any2EVMMessage {
bytes32 messageId; // MessageId corresponding to ccipSend on source.
uint64 sourceChainSelector; // Source chain selector.
bytes sender; // abi.decode(sender) if coming from an EVM chain.
bytes data; // payload sent in original message.
EVMTokenAmount[] destTokenAmounts; // Tokens and their amounts in their destination chain representation.
}
// If extraArgs is empty bytes, the default is 200k gas limit.
struct EVM2AnyMessage {
bytes receiver; // abi.encode(receiver address) for dest EVM chains.
bytes data; // Data payload.
EVMTokenAmount[] tokenAmounts; // Token transfers.
address feeToken; // Address of feeToken. address(0) means you will send msg.value.
bytes extraArgs; // Populate this with _argsToBytes(EVMExtraArgsV2).
}
// Tag to indicate only a gas limit. Only usable for EVM as destination chain.
bytes4 public constant EVM_EXTRA_ARGS_V1_TAG = 0x97a657c9;
struct EVMExtraArgsV1 {
uint256 gasLimit;
}
function _argsToBytes(
EVMExtraArgsV1 memory extraArgs
) internal pure returns (bytes memory bts) {
return abi.encodeWithSelector(EVM_EXTRA_ARGS_V1_TAG, extraArgs);
}
// Tag to indicate a gas limit (or dest chain equivalent processing units) and Out Of Order Execution. This tag is
// available for multiple chain families. If there is no chain family specific tag, this is the default available
// for a chain.
// Note: not available for Solana VM based chains.
bytes4 public constant GENERIC_EXTRA_ARGS_V2_TAG = 0x181dcf10;
/// @param gasLimit: gas limit for the callback on the destination chain.
/// @param allowOutOfOrderExecution: if true, it indicates that the message can be executed in any order relative to
/// other messages from the same sender. This value's default varies by chain. On some chains, a particular value is
/// enforced, meaning if the expected value is not set, the message request will revert.
/// @dev Fully compatible with the previously existing EVMExtraArgsV2.
struct GenericExtraArgsV2 {
uint256 gasLimit;
bool allowOutOfOrderExecution;
}
// Extra args tag for chains that use the Solana VM.
bytes4 public constant SVM_EXTRA_ARGS_V1_TAG = 0x1f3b3aba;
struct SVMExtraArgsV1 {
uint32 computeUnits;
uint64 accountIsWritableBitmap;
bool allowOutOfOrderExecution;
bytes32 tokenReceiver;
// Additional accounts needed for execution of CCIP receiver. Must be empty if message.receiver is zero.
// Token transfer related accounts are specified in the token pool lookup table on SVM.
bytes32[] accounts;
}
/// @dev The maximum number of accounts that can be passed in SVMExtraArgs.
uint256 public constant SVM_EXTRA_ARGS_MAX_ACCOUNTS = 64;
/// @dev The expected static payload size of a token transfer when Borsh encoded and submitted to SVM.
/// TokenPool extra data and offchain data sizes are dynamic, and should be accounted for separately.
uint256 public constant SVM_TOKEN_TRANSFER_DATA_OVERHEAD = (4 + 32) // source_pool
+ 32 // token_address
+ 4 // gas_amount
+ 4 // extra_data overhead
+ 32 // amount
+ 32 // size of the token lookup table account
+ 32 // token-related accounts in the lookup table, over-estimated to 32, typically between 11 - 13
+ 32 // token account belonging to the token receiver, e.g ATA, not included in the token lookup table
+ 32 // per-chain token pool config, not included in the token lookup table
+ 32 // per-chain token billing config, not always included in the token lookup table
+ 32; // OffRamp pool signer PDA, not included in the token lookup table
/// @dev Number of overhead accounts needed for message execution on SVM.
/// @dev These are message.receiver, and the OffRamp Signer PDA specific to the receiver.
uint256 public constant SVM_MESSAGING_ACCOUNTS_OVERHEAD = 2;
/// @dev The size of each SVM account address in bytes.
uint256 public constant SVM_ACCOUNT_BYTE_SIZE = 32;
function _argsToBytes(
GenericExtraArgsV2 memory extraArgs
) internal pure returns (bytes memory bts) {
return abi.encodeWithSelector(GENERIC_EXTRA_ARGS_V2_TAG, extraArgs);
}
function _svmArgsToBytes(
SVMExtraArgsV1 memory extraArgs
) internal pure returns (bytes memory bts) {
return abi.encodeWithSelector(SVM_EXTRA_ARGS_V1_TAG, extraArgs);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {ConfirmedOwnerWithProposal} from "./ConfirmedOwnerWithProposal.sol";
/// @title The ConfirmedOwner contract
/// @notice A contract with helpers for basic contract ownership.
contract ConfirmedOwner is ConfirmedOwnerWithProposal {
constructor(address newOwner) ConfirmedOwnerWithProposal(newOwner, address(0)) {}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {IOwnable} from "../interfaces/IOwnable.sol";
/// @title The ConfirmedOwner contract
/// @notice A contract with helpers for basic contract ownership.
contract ConfirmedOwnerWithProposal is IOwnable {
address private s_owner;
address private s_pendingOwner;
event OwnershipTransferRequested(address indexed from, address indexed to);
event OwnershipTransferred(address indexed from, address indexed to);
constructor(address newOwner, address pendingOwner) {
// solhint-disable-next-line gas-custom-errors
require(newOwner != address(0), "Cannot set owner to zero");
s_owner = newOwner;
if (pendingOwner != address(0)) {
_transferOwnership(pendingOwner);
}
}
/// @notice Allows an owner to begin transferring ownership to a new address.
function transferOwnership(address to) public override onlyOwner {
_transferOwnership(to);
}
/// @notice Allows an ownership transfer to be completed by the recipient.
function acceptOwnership() external override {
// solhint-disable-next-line gas-custom-errors
require(msg.sender == s_pendingOwner, "Must be proposed owner");
address oldOwner = s_owner;
s_owner = msg.sender;
s_pendingOwner = address(0);
emit OwnershipTransferred(oldOwner, msg.sender);
}
/// @notice Get the current owner
function owner() public view override returns (address) {
return s_owner;
}
/// @notice validate, transfer ownership, and emit relevant events
function _transferOwnership(address to) private {
// solhint-disable-next-line gas-custom-errors
require(to != msg.sender, "Cannot transfer to self");
s_pendingOwner = to;
emit OwnershipTransferRequested(s_owner, to);
}
/// @notice validate access
function _validateOwnership() internal view {
// solhint-disable-next-line gas-custom-errors
require(msg.sender == s_owner, "Only callable by owner");
}
/// @notice Reverts if called by anyone other than the contract owner.
modifier onlyOwner() {
_validateOwnership();
_;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {ConfirmedOwner} from "./ConfirmedOwner.sol";
/// @title The OwnerIsCreator contract
/// @notice A contract with helpers for basic contract ownership.
contract OwnerIsCreator is ConfirmedOwner {
constructor() ConfirmedOwner(msg.sender) {}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IOwnable {
function owner() external returns (address);
function transferOwnership(address recipient) external;
function acceptOwnership() external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
* or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
* understand this adds an external call which potentially creates a reentrancy vulnerability.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}{
"optimizer": {
"enabled": true,
"runs": 200,
"details": {
"yul": false
}
},
"evmVersion": "paris",
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_luchamon","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"router","type":"address"}],"name":"InvalidRouter","type":"error"},{"inputs":[{"internalType":"bytes32","name":"messageId","type":"bytes32"}],"name":"MessageNotFailed","type":"error"},{"inputs":[],"name":"OnlySelf","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"SenderNotAllowlisted","type":"error"},{"inputs":[{"internalType":"uint64","name":"sourceChainSelector","type":"uint64"}],"name":"SourceChainNotAllowlisted","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":true,"internalType":"uint64","name":"sourceChainSelector","type":"uint64"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"components":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"indexed":false,"internalType":"struct LuchamonBridge.Data","name":"data","type":"tuple"},{"indexed":false,"internalType":"bytes","name":"reason","type":"bytes"}],"name":"MessageFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":true,"internalType":"uint64","name":"sourceChainSelector","type":"uint64"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"components":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"indexed":false,"internalType":"struct LuchamonBridge.Data","name":"data","type":"tuple"}],"name":"MessageReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"}],"name":"MessageRecovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"allowlistSender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_sourceChainSelector","type":"uint64"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"allowlistSourceChain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowlistedSenders","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"}],"name":"allowlistedSourceChains","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"uint64","name":"sourceChainSelector","type":"uint64"},{"internalType":"bytes","name":"sender","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct Client.EVMTokenAmount[]","name":"destTokenAmounts","type":"tuple[]"}],"internalType":"struct Client.Any2EVMMessage","name":"any2EvmMessage","type":"tuple"}],"name":"ccipReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"uint64","name":"sourceChainSelector","type":"uint64"},{"internalType":"bytes","name":"sender","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct Client.EVMTokenAmount[]","name":"destTokenAmounts","type":"tuple[]"}],"internalType":"struct Client.Any2EVMMessage","name":"any2EvmMessage","type":"tuple"}],"name":"processMessage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"messageId","type":"bytes32"}],"name":"retryFailedMessage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"messageId","type":"bytes32"}],"name":"s_messageData","outputs":[{"internalType":"bytes","name":"messageData","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60a06040523480156200001157600080fd5b5060405162001b8538038062001b858339810160408190526200003491620001b3565b33806000846001600160a01b0381166200006f5760006040516335fdcccd60e21b815260040162000066919062000207565b60405180910390fd5b6001600160a01b0390811660805282166200009e5760405162461bcd60e51b815260040162000066906200024e565b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000d157620000d181620000fd565b5050600480546001600160a01b0319166001600160a01b03939093169290921790915550620002a79050565b336001600160a01b03821603620001285760405162461bcd60e51b8152600401620000669062000295565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006001600160a01b0382165b92915050565b620001978162000179565b8114620001a357600080fd5b50565b805162000186816200018c565b60008060408385031215620001cb57620001cb600080fd5b6000620001d98585620001a6565b9250506020620001ec85828601620001a6565b9150509250929050565b620002018162000179565b82525050565b60208101620001868284620001f6565b601881526000602082017f43616e6e6f7420736574206f776e657220746f207a65726f0000000000000000815291505b5060200190565b60208082528101620001868162000217565b601781526000602082017f43616e6e6f74207472616e7366657220746f2073656c660000000000000000008152915062000247565b60208082528101620001868162000260565b6080516118bb620002ca6000396000818161017c01526102eb01526118bb6000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063b0f479a11161008c578063de3c9b2f11610066578063de3c9b2f146101c6578063e4ca8754146101e6578063eab5b02c146101f9578063f2fde38b1461020c57600080fd5b8063b0f479a11461017a578063cf6730f8146101a0578063db04fa49146101b357600080fd5b806301ffc9a7146100d45780634030d521146100fd5780636159ada11461012057806379ba50971461014357806385572ffb1461014d5780638da5cb5b14610160575b600080fd5b6100e76100e2366004610ab8565b61021f565b6040516100f49190610aeb565b60405180910390f35b6100e761010b366004610b13565b60026020526000908152604090205460ff1681565b6100e761012e366004610b59565b60036020526000908152604090205460ff1681565b61014b610256565b005b61014b61015b366004610b95565b6102e0565b6000546001600160a01b03165b6040516100f49190610bd8565b7f000000000000000000000000000000000000000000000000000000000000000061016d565b61014b6101ae366004610b95565b610519565b61014b6101c1366004610bf9565b6105ea565b6101d96101d4366004610c47565b61061d565b6040516100f49190610cc0565b61014b6101f4366004610c47565b6106b7565b61014b610207366004610cd8565b610838565b61014b61021a366004610b59565b61086b565b60006001600160e01b031982166385572ffb60e01b148061025057506001600160e01b031982166301ffc9a760e01b145b92915050565b6001546001600160a01b031633146102895760405162461bcd60e51b815260040161028090610d2a565b60405180910390fd5b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461032b57336040516335fdcccd60e21b81526004016102809190610bd8565b61033b6040820160208301610b13565b6103486040830183610d3a565b8101906103559190610b59565b6001600160401b03821660009081526002602052604090205460ff1661039057816040516326bfad9160e21b81526004016102809190610da7565b6001600160a01b03811660009081526003602052604090205460ff166103cb57806040516338c08ef960e11b81526004016102809190610bd8565b6040516319ece61f60e31b8152309063cf6730f8906103ee908690600401610fef565b600060405180830381600087803b15801561040857600080fd5b505af1925050508015610419575060015b610514573d808015610447576040519150601f19603f3d011682016040523d82523d6000602084013e61044c565b606091505b506001843560009081526005602052604090205561046d6060850185610d3a565b85356000908152600660205260409020916104899190836110f1565b5061049a6040850160208601610b13565b6001600160401b031684357f4fe27440dba7bf4b875f6e4ea999fcb7c6d64a71e81ed675302a1f434418345c6104d36040880188610d3a565b8101906104e09190610b59565b6104ed6060890189610d3a565b8101906104fa9190611307565b8560405161050a939291906113e7565b60405180910390a3505b505050565b3330146105395760405163029a949d60e31b815260040160405180910390fd5b6105496040820160208301610b13565b6105566040830183610d3a565b8101906105639190610b59565b6001600160401b03821660009081526002602052604090205460ff1661059e57816040516326bfad9160e21b81526004016102809190610da7565b6001600160a01b03811660009081526003602052604090205460ff166105d957806040516338c08ef960e11b81526004016102809190610bd8565b6105146105e58461162e565b61087f565b6105f26109f1565b6001600160401b03919091166000908152600260205260409020805460ff1916911515919091179055565b600660205260009081526040902080546106369061102c565b80601f01602080910402602001604051908101604052809291908181526020018280546106629061102c565b80156106af5780601f10610684576101008083540402835291602001916106af565b820191906000526020600020905b81548152906001019060200180831161069257829003601f168201915b505050505081565b6001600082815260056020526040902054146106e857806040516305b73c1360e51b8152600401610280919061163a565b600081815260056020908152604080832083905560069091528120805461070e9061102c565b80601f016020809104026020016040519081016040528092919081815260200182805461073a9061102c565b80156107875780601f1061075c57610100808354040283529160200191610787565b820191906000526020600020905b81548152906001019060200180831161076a57829003601f168201915b505050505080602001905181019061079f919061172b565b600480548251602084015160405163de836ebd60e01b81529495506001600160a01b039092169363de836ebd936107d79391016117a3565b600060405180830381600087803b1580156107f157600080fd5b505af1158015610805573d6000803e3d6000fd5b50506040518492507fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad9150600090a25050565b6108406109f1565b6001600160a01b03919091166000908152600360205260409020805460ff1916911515919091179055565b6108736109f1565b61087c81610a1d565b50565b8060200151816040015180602001905181019061089c91906117c3565b6001600160401b03821660009081526002602052604090205460ff166108d757816040516326bfad9160e21b81526004016102809190610da7565b6001600160a01b03811660009081526003602052604090205460ff1661091257806040516338c08ef960e11b81526004016102809190610bd8565b6000836060015180602001905181019061092c919061172b565b600480548251602084015160405163de836ebd60e01b81529495506001600160a01b039092169363de836ebd936109649391016117a3565b600060405180830381600087803b15801561097e57600080fd5b505af1158015610992573d6000803e3d6000fd5b5050505083602001516001600160401b031684600001517f69330622248a01981ec06aaa2616054c632f76ecee68cda7350a5cfc8a8887b486604001518060200190518101906109e291906117c3565b8460405161050a9291906117e4565b6000546001600160a01b03163314610a1b5760405162461bcd60e51b815260040161028090611831565b565b336001600160a01b03821603610a455760405162461bcd60e51b815260040161028090611875565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6001600160e01b031981165b811461087c57600080fd5b803561025081610a96565b600060208284031215610acd57610acd600080fd5b6000610ad98484610aad565b949350505050565b8015155b82525050565b602081016102508284610ae1565b6001600160401b038116610aa2565b803561025081610af9565b600060208284031215610b2857610b28600080fd5b6000610ad98484610b08565b60006001600160a01b038216610250565b610aa281610b34565b803561025081610b45565b600060208284031215610b6e57610b6e600080fd5b6000610ad98484610b4e565b600060a08284031215610b8f57610b8f600080fd5b50919050565b600060208284031215610baa57610baa600080fd5b81356001600160401b03811115610bc357610bc3600080fd5b610ad984828501610b7a565b610ae581610b34565b602081016102508284610bcf565b801515610aa2565b803561025081610be6565b60008060408385031215610c0f57610c0f600080fd5b6000610c1b8585610b08565b9250506020610c2c85828601610bee565b9150509250929050565b80610aa2565b803561025081610c36565b600060208284031215610c5c57610c5c600080fd5b6000610ad98484610c3c565b60005b83811015610c83578181015183820152602001610c6b565b50506000910152565b6000610c96825190565b808452602084019350610cad818560208601610c68565b601f19601f8201165b9093019392505050565b60208082528101610cd18184610c8c565b9392505050565b60008060408385031215610cee57610cee600080fd5b6000610c1b8585610b4e565b601681526000602082017526bab9ba10313290383937b837b9b2b21037bbb732b960511b815291505b5060200190565b6020808252810161025081610cfa565b6000808335601e1936859003018112610d5557610d55600080fd5b8084019250823591506001600160401b03821115610d7557610d75600080fd5b602083019250600182023603831315610d9057610d90600080fd5b509250929050565b6001600160401b038116610ae5565b602081016102508284610d98565b6000610cd16020840184610c3c565b80610ae5565b6000610cd16020840184610b08565b6000808335601e1936859003018112610df457610df4600080fd5b8381016020810193503591506001600160401b03821115610e1757610e17600080fd5b36829003831315610d9057610d90600080fd5b82818337506000910152565b8183526000602084019350610e4c838584610e2a565b601f19601f840116610cb6565b6000808335601e1936859003018112610e7457610e74600080fd5b8381016020810193503591506001600160401b03821115610e9757610e97600080fd5b604082023603831315610d9057610d90600080fd5b6000610cd16020840184610b4e565b60408201610ec98280610eac565b610ed38482610bcf565b50610ee16020830183610db5565b610eee6020850182610dc4565b50505050565b6000610f008383610ebb565b505060400190565b8183526000602084019350818060005b85811015610f3c5781610f2b8882610ef4565b975060408301925050600101610f18565b509495945050505050565b600060a08301610f578380610db5565b610f618582610dc4565b50610f6f6020840184610dca565b610f7c6020860182610d98565b50610f8a6040840184610dd9565b8583036040870152610f9d838284610e36565b92505050610fae6060840184610dd9565b8583036060870152610fc1838284610e36565b92505050610fd26080840184610e59565b8583036080870152610fe5838284610f08565b9695505050505050565b60208082528101610cd18184610f47565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052602260045260246000fd5b60028104600182168061104057607f821691505b602082108103610b8f57610b8f611016565b600061025061105e8381565b90565b61106a83611052565b815460001960089490940293841b1916921b91909117905550565b6000610514818484611061565b818110156110ad576110a5600082611085565b600101611092565b5050565b601f821115610514576000818152602090206020601f850104810160208510156110d85750805b6110ea6020601f860104830182611092565b5050505050565b826001600160401b0381111561110957611109611000565b611113825461102c565b61111e8282856110b1565b6000601f831160018114611152576000841561113a5750858201355b600019600886021c19811660028602178655506111ab565b600085815260208120601f198616915b828110156111825788850135825560209485019460019092019101611162565b8683101561119e57600019601f88166008021c19858a01351682555b6001600288020188555050505b50505050505050565b601f19601f83011681018181106001600160401b03821117156111d9576111d9611000565b6040525050565b60006111eb60405190565b90506111f782826111b4565b919050565b60006001600160401b0382111561121557611215611000565b5060209081020190565b600061123261122d846111fc565b6111e0565b8381529050602080820190840283018581111561125157611251600080fd5b835b8181101561127557806112668882610c3c565b84525060209283019201611253565b5050509392505050565b600082601f83011261129357611293600080fd5b8135610ad984826020860161121f565b6000604082840312156112b8576112b8600080fd5b6112c260406111e0565b905060006112d08484610b4e565b82525060208201356001600160401b038111156112ef576112ef600080fd5b6112fb8482850161127f565b60208301525092915050565b60006020828403121561131c5761131c600080fd5b81356001600160401b0381111561133557611335600080fd5b610ad9848285016112a3565b600061025082610b34565b600061025082611341565b610ae58161134c565b600061136c8383610dc4565b505060200190565b600061137e825190565b80845260209384019383018060005b83811015610f3c5781516113a18882611360565b97506020830192505060010161138d565b805160009060408401906113c68582610bcf565b50602083015184820360208601526113de8282611374565b95945050505050565b606081016113f58286611357565b818103602083015261140781856113b2565b905081810360408301526113de8184610c8c565b60006001600160401b0382111561143457611434611000565b601f19601f83011660200192915050565b600061145361122d8461141b565b90508281526020810184848401111561146e5761146e600080fd5b611479848285610e2a565b509392505050565b600082601f83011261149557611495600080fd5b8135610ad9848260208601611445565b6000604082840312156114ba576114ba600080fd5b6114c460406111e0565b905060006114d28484610b4e565b82525060206112fb84848301610c3c565b60006114f161122d846111fc565b8381529050602081016040840283018581111561151057611510600080fd5b835b81811015611275578061152588826114a5565b845250602090920191604001611512565b600082601f83011261154a5761154a600080fd5b8135610ad98482602086016114e3565b600060a0828403121561156f5761156f600080fd5b61157960a06111e0565b905060006115878484610c3c565b825250602061159884848301610b08565b60208301525060408201356001600160401b038111156115ba576115ba600080fd5b6115c684828501611481565b60408301525060608201356001600160401b038111156115e8576115e8600080fd5b6115f484828501611481565b60608301525060808201356001600160401b0381111561161657611616600080fd5b61162284828501611536565b60808301525092915050565b6000610250368361155a565b602081016102508284610dc4565b805161025081610b45565b805161025081610c36565b600061166c61122d846111fc565b8381529050602080820190840283018581111561168b5761168b600080fd5b835b8181101561127557806116a08882611653565b8452506020928301920161168d565b600082601f8301126116c3576116c3600080fd5b8151610ad984826020860161165e565b6000604082840312156116e8576116e8600080fd5b6116f260406111e0565b905060006117008484611648565b82525060208201516001600160401b0381111561171f5761171f600080fd5b6112fb848285016116af565b60006020828403121561174057611740600080fd5b81516001600160401b0381111561175957611759600080fd5b610ad9848285016116d3565b600061176f825190565b80845260209384019383018060005b83811015610f3c5781516117928882611360565b97506020830192505060010161177e565b604081016117b18285610bcf565b8181036020830152610ad98184611765565b6000602082840312156117d8576117d8600080fd5b6000610ad98484611648565b604081016117f28285611357565b8181036020830152610ad981846113b2565b601681526000602082017527b7363c9031b0b63630b1363290313c9037bbb732b960511b81529150610d23565b6020808252810161025081611804565b601781526000602082017f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000081529150610d23565b602080825281016102508161184156fea2646970667358221220f3acd5ef09b712dfeb1dfe49d444c71940c3f0bba58283dc5dfa622464697de464736f6c63430008160033000000000000000000000000881e3a65b4d4a04dd529061dd0071cf975f58bcd00000000000000000000000013dbb48eeefa1eebea7ad326205d175ff62e71d4
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063b0f479a11161008c578063de3c9b2f11610066578063de3c9b2f146101c6578063e4ca8754146101e6578063eab5b02c146101f9578063f2fde38b1461020c57600080fd5b8063b0f479a11461017a578063cf6730f8146101a0578063db04fa49146101b357600080fd5b806301ffc9a7146100d45780634030d521146100fd5780636159ada11461012057806379ba50971461014357806385572ffb1461014d5780638da5cb5b14610160575b600080fd5b6100e76100e2366004610ab8565b61021f565b6040516100f49190610aeb565b60405180910390f35b6100e761010b366004610b13565b60026020526000908152604090205460ff1681565b6100e761012e366004610b59565b60036020526000908152604090205460ff1681565b61014b610256565b005b61014b61015b366004610b95565b6102e0565b6000546001600160a01b03165b6040516100f49190610bd8565b7f000000000000000000000000881e3a65b4d4a04dd529061dd0071cf975f58bcd61016d565b61014b6101ae366004610b95565b610519565b61014b6101c1366004610bf9565b6105ea565b6101d96101d4366004610c47565b61061d565b6040516100f49190610cc0565b61014b6101f4366004610c47565b6106b7565b61014b610207366004610cd8565b610838565b61014b61021a366004610b59565b61086b565b60006001600160e01b031982166385572ffb60e01b148061025057506001600160e01b031982166301ffc9a760e01b145b92915050565b6001546001600160a01b031633146102895760405162461bcd60e51b815260040161028090610d2a565b60405180910390fd5b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b336001600160a01b037f000000000000000000000000881e3a65b4d4a04dd529061dd0071cf975f58bcd161461032b57336040516335fdcccd60e21b81526004016102809190610bd8565b61033b6040820160208301610b13565b6103486040830183610d3a565b8101906103559190610b59565b6001600160401b03821660009081526002602052604090205460ff1661039057816040516326bfad9160e21b81526004016102809190610da7565b6001600160a01b03811660009081526003602052604090205460ff166103cb57806040516338c08ef960e11b81526004016102809190610bd8565b6040516319ece61f60e31b8152309063cf6730f8906103ee908690600401610fef565b600060405180830381600087803b15801561040857600080fd5b505af1925050508015610419575060015b610514573d808015610447576040519150601f19603f3d011682016040523d82523d6000602084013e61044c565b606091505b506001843560009081526005602052604090205561046d6060850185610d3a565b85356000908152600660205260409020916104899190836110f1565b5061049a6040850160208601610b13565b6001600160401b031684357f4fe27440dba7bf4b875f6e4ea999fcb7c6d64a71e81ed675302a1f434418345c6104d36040880188610d3a565b8101906104e09190610b59565b6104ed6060890189610d3a565b8101906104fa9190611307565b8560405161050a939291906113e7565b60405180910390a3505b505050565b3330146105395760405163029a949d60e31b815260040160405180910390fd5b6105496040820160208301610b13565b6105566040830183610d3a565b8101906105639190610b59565b6001600160401b03821660009081526002602052604090205460ff1661059e57816040516326bfad9160e21b81526004016102809190610da7565b6001600160a01b03811660009081526003602052604090205460ff166105d957806040516338c08ef960e11b81526004016102809190610bd8565b6105146105e58461162e565b61087f565b6105f26109f1565b6001600160401b03919091166000908152600260205260409020805460ff1916911515919091179055565b600660205260009081526040902080546106369061102c565b80601f01602080910402602001604051908101604052809291908181526020018280546106629061102c565b80156106af5780601f10610684576101008083540402835291602001916106af565b820191906000526020600020905b81548152906001019060200180831161069257829003601f168201915b505050505081565b6001600082815260056020526040902054146106e857806040516305b73c1360e51b8152600401610280919061163a565b600081815260056020908152604080832083905560069091528120805461070e9061102c565b80601f016020809104026020016040519081016040528092919081815260200182805461073a9061102c565b80156107875780601f1061075c57610100808354040283529160200191610787565b820191906000526020600020905b81548152906001019060200180831161076a57829003601f168201915b505050505080602001905181019061079f919061172b565b600480548251602084015160405163de836ebd60e01b81529495506001600160a01b039092169363de836ebd936107d79391016117a3565b600060405180830381600087803b1580156107f157600080fd5b505af1158015610805573d6000803e3d6000fd5b50506040518492507fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad9150600090a25050565b6108406109f1565b6001600160a01b03919091166000908152600360205260409020805460ff1916911515919091179055565b6108736109f1565b61087c81610a1d565b50565b8060200151816040015180602001905181019061089c91906117c3565b6001600160401b03821660009081526002602052604090205460ff166108d757816040516326bfad9160e21b81526004016102809190610da7565b6001600160a01b03811660009081526003602052604090205460ff1661091257806040516338c08ef960e11b81526004016102809190610bd8565b6000836060015180602001905181019061092c919061172b565b600480548251602084015160405163de836ebd60e01b81529495506001600160a01b039092169363de836ebd936109649391016117a3565b600060405180830381600087803b15801561097e57600080fd5b505af1158015610992573d6000803e3d6000fd5b5050505083602001516001600160401b031684600001517f69330622248a01981ec06aaa2616054c632f76ecee68cda7350a5cfc8a8887b486604001518060200190518101906109e291906117c3565b8460405161050a9291906117e4565b6000546001600160a01b03163314610a1b5760405162461bcd60e51b815260040161028090611831565b565b336001600160a01b03821603610a455760405162461bcd60e51b815260040161028090611875565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6001600160e01b031981165b811461087c57600080fd5b803561025081610a96565b600060208284031215610acd57610acd600080fd5b6000610ad98484610aad565b949350505050565b8015155b82525050565b602081016102508284610ae1565b6001600160401b038116610aa2565b803561025081610af9565b600060208284031215610b2857610b28600080fd5b6000610ad98484610b08565b60006001600160a01b038216610250565b610aa281610b34565b803561025081610b45565b600060208284031215610b6e57610b6e600080fd5b6000610ad98484610b4e565b600060a08284031215610b8f57610b8f600080fd5b50919050565b600060208284031215610baa57610baa600080fd5b81356001600160401b03811115610bc357610bc3600080fd5b610ad984828501610b7a565b610ae581610b34565b602081016102508284610bcf565b801515610aa2565b803561025081610be6565b60008060408385031215610c0f57610c0f600080fd5b6000610c1b8585610b08565b9250506020610c2c85828601610bee565b9150509250929050565b80610aa2565b803561025081610c36565b600060208284031215610c5c57610c5c600080fd5b6000610ad98484610c3c565b60005b83811015610c83578181015183820152602001610c6b565b50506000910152565b6000610c96825190565b808452602084019350610cad818560208601610c68565b601f19601f8201165b9093019392505050565b60208082528101610cd18184610c8c565b9392505050565b60008060408385031215610cee57610cee600080fd5b6000610c1b8585610b4e565b601681526000602082017526bab9ba10313290383937b837b9b2b21037bbb732b960511b815291505b5060200190565b6020808252810161025081610cfa565b6000808335601e1936859003018112610d5557610d55600080fd5b8084019250823591506001600160401b03821115610d7557610d75600080fd5b602083019250600182023603831315610d9057610d90600080fd5b509250929050565b6001600160401b038116610ae5565b602081016102508284610d98565b6000610cd16020840184610c3c565b80610ae5565b6000610cd16020840184610b08565b6000808335601e1936859003018112610df457610df4600080fd5b8381016020810193503591506001600160401b03821115610e1757610e17600080fd5b36829003831315610d9057610d90600080fd5b82818337506000910152565b8183526000602084019350610e4c838584610e2a565b601f19601f840116610cb6565b6000808335601e1936859003018112610e7457610e74600080fd5b8381016020810193503591506001600160401b03821115610e9757610e97600080fd5b604082023603831315610d9057610d90600080fd5b6000610cd16020840184610b4e565b60408201610ec98280610eac565b610ed38482610bcf565b50610ee16020830183610db5565b610eee6020850182610dc4565b50505050565b6000610f008383610ebb565b505060400190565b8183526000602084019350818060005b85811015610f3c5781610f2b8882610ef4565b975060408301925050600101610f18565b509495945050505050565b600060a08301610f578380610db5565b610f618582610dc4565b50610f6f6020840184610dca565b610f7c6020860182610d98565b50610f8a6040840184610dd9565b8583036040870152610f9d838284610e36565b92505050610fae6060840184610dd9565b8583036060870152610fc1838284610e36565b92505050610fd26080840184610e59565b8583036080870152610fe5838284610f08565b9695505050505050565b60208082528101610cd18184610f47565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052602260045260246000fd5b60028104600182168061104057607f821691505b602082108103610b8f57610b8f611016565b600061025061105e8381565b90565b61106a83611052565b815460001960089490940293841b1916921b91909117905550565b6000610514818484611061565b818110156110ad576110a5600082611085565b600101611092565b5050565b601f821115610514576000818152602090206020601f850104810160208510156110d85750805b6110ea6020601f860104830182611092565b5050505050565b826001600160401b0381111561110957611109611000565b611113825461102c565b61111e8282856110b1565b6000601f831160018114611152576000841561113a5750858201355b600019600886021c19811660028602178655506111ab565b600085815260208120601f198616915b828110156111825788850135825560209485019460019092019101611162565b8683101561119e57600019601f88166008021c19858a01351682555b6001600288020188555050505b50505050505050565b601f19601f83011681018181106001600160401b03821117156111d9576111d9611000565b6040525050565b60006111eb60405190565b90506111f782826111b4565b919050565b60006001600160401b0382111561121557611215611000565b5060209081020190565b600061123261122d846111fc565b6111e0565b8381529050602080820190840283018581111561125157611251600080fd5b835b8181101561127557806112668882610c3c565b84525060209283019201611253565b5050509392505050565b600082601f83011261129357611293600080fd5b8135610ad984826020860161121f565b6000604082840312156112b8576112b8600080fd5b6112c260406111e0565b905060006112d08484610b4e565b82525060208201356001600160401b038111156112ef576112ef600080fd5b6112fb8482850161127f565b60208301525092915050565b60006020828403121561131c5761131c600080fd5b81356001600160401b0381111561133557611335600080fd5b610ad9848285016112a3565b600061025082610b34565b600061025082611341565b610ae58161134c565b600061136c8383610dc4565b505060200190565b600061137e825190565b80845260209384019383018060005b83811015610f3c5781516113a18882611360565b97506020830192505060010161138d565b805160009060408401906113c68582610bcf565b50602083015184820360208601526113de8282611374565b95945050505050565b606081016113f58286611357565b818103602083015261140781856113b2565b905081810360408301526113de8184610c8c565b60006001600160401b0382111561143457611434611000565b601f19601f83011660200192915050565b600061145361122d8461141b565b90508281526020810184848401111561146e5761146e600080fd5b611479848285610e2a565b509392505050565b600082601f83011261149557611495600080fd5b8135610ad9848260208601611445565b6000604082840312156114ba576114ba600080fd5b6114c460406111e0565b905060006114d28484610b4e565b82525060206112fb84848301610c3c565b60006114f161122d846111fc565b8381529050602081016040840283018581111561151057611510600080fd5b835b81811015611275578061152588826114a5565b845250602090920191604001611512565b600082601f83011261154a5761154a600080fd5b8135610ad98482602086016114e3565b600060a0828403121561156f5761156f600080fd5b61157960a06111e0565b905060006115878484610c3c565b825250602061159884848301610b08565b60208301525060408201356001600160401b038111156115ba576115ba600080fd5b6115c684828501611481565b60408301525060608201356001600160401b038111156115e8576115e8600080fd5b6115f484828501611481565b60608301525060808201356001600160401b0381111561161657611616600080fd5b61162284828501611536565b60808301525092915050565b6000610250368361155a565b602081016102508284610dc4565b805161025081610b45565b805161025081610c36565b600061166c61122d846111fc565b8381529050602080820190840283018581111561168b5761168b600080fd5b835b8181101561127557806116a08882611653565b8452506020928301920161168d565b600082601f8301126116c3576116c3600080fd5b8151610ad984826020860161165e565b6000604082840312156116e8576116e8600080fd5b6116f260406111e0565b905060006117008484611648565b82525060208201516001600160401b0381111561171f5761171f600080fd5b6112fb848285016116af565b60006020828403121561174057611740600080fd5b81516001600160401b0381111561175957611759600080fd5b610ad9848285016116d3565b600061176f825190565b80845260209384019383018060005b83811015610f3c5781516117928882611360565b97506020830192505060010161177e565b604081016117b18285610bcf565b8181036020830152610ad98184611765565b6000602082840312156117d8576117d8600080fd5b6000610ad98484611648565b604081016117f28285611357565b8181036020830152610ad981846113b2565b601681526000602082017527b7363c9031b0b63630b1363290313c9037bbb732b960511b81529150610d23565b6020808252810161025081611804565b601781526000602082017f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000081529150610d23565b602080825281016102508161184156fea2646970667358221220f3acd5ef09b712dfeb1dfe49d444c71940c3f0bba58283dc5dfa622464697de464736f6c63430008160033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000881e3a65b4d4a04dd529061dd0071cf975f58bcd00000000000000000000000013dbb48eeefa1eebea7ad326205d175ff62e71d4
-----Decoded View---------------
Arg [0] : _router (address): 0x881e3A65B4d4a04dD529061dd0071cf975F58bCD
Arg [1] : _luchamon (address): 0x13dBB48eeefa1EEBEA7AD326205D175FF62e71D4
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000881e3a65b4d4a04dd529061dd0071cf975f58bcd
Arg [1] : 00000000000000000000000013dbb48eeefa1eebea7ad326205d175ff62e71d4
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.