Source Code
Latest 18 from a total of 18 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Enable Message S... | 14566752 | 386 days ago | IN | 0 FRAX | 0.0000009 | ||||
| Enable Message S... | 3203558 | 649 days ago | IN | 0 FRAX | 0.00000169 | ||||
| Enable Message S... | 2584260 | 663 days ago | IN | 0 FRAX | 0.00000348 | ||||
| Enable Message S... | 2584252 | 663 days ago | IN | 0 FRAX | 0.00000366 | ||||
| Enable Message S... | 2584244 | 663 days ago | IN | 0 FRAX | 0.00000352 | ||||
| Enable Message S... | 1914443 | 679 days ago | IN | 0 FRAX | 0.00000384 | ||||
| Enable Message S... | 1914435 | 679 days ago | IN | 0 FRAX | 0.00000381 | ||||
| Enable Message S... | 1914427 | 679 days ago | IN | 0 FRAX | 0.0000036 | ||||
| Enable Message S... | 1914419 | 679 days ago | IN | 0 FRAX | 0.00000379 | ||||
| Enable Message S... | 1914411 | 679 days ago | IN | 0 FRAX | 0.00000386 | ||||
| Enable Message S... | 1914403 | 679 days ago | IN | 0 FRAX | 0.00000371 | ||||
| Enable Message S... | 1914395 | 679 days ago | IN | 0 FRAX | 0.00000383 | ||||
| Enable Message S... | 1914387 | 679 days ago | IN | 0 FRAX | 0.00000375 | ||||
| Enable Message S... | 1914379 | 679 days ago | IN | 0 FRAX | 0.00000411 | ||||
| Enable Message S... | 1914371 | 679 days ago | IN | 0 FRAX | 0.00000366 | ||||
| Enable Message S... | 1914363 | 679 days ago | IN | 0 FRAX | 0.00000354 | ||||
| Enable Message S... | 1914355 | 679 days ago | IN | 0 FRAX | 0.00000368 | ||||
| Enable Message S... | 1914341 | 679 days ago | IN | 0 FRAX | 0.00000367 |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
LayerZeroReceiver
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 10000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.19;
import {ArcBaseWithRainbowRoad} from "../bases/ArcBaseWithRainbowRoad.sol";
import {ILayerZeroReceiver} from "../interfaces/ILayerZeroReceiver.sol";
import {ILayerZeroEndpoint} from "../interfaces/ILayerZeroEndpoint.sol";
import {IRainbowRoad} from "../interfaces/IRainbowRoad.sol";
/**
* Receives messages from LayerZero endpoint
*/
contract LayerZeroReceiver is ArcBaseWithRainbowRoad, ILayerZeroReceiver
{
ILayerZeroEndpoint public endpoint;
mapping(uint16 => mapping(bytes => bool)) public messageSenders;
mapping(uint16 => bytes) public trustedRemoteLookup;
mapping(uint16 => mapping(bytes => mapping(uint64 => bytes32))) public failedMessages;
event MessageReceived(uint64 sourceChainSelector, bytes sourceAddress, uint64 nonce, string action, address actionRecipient);
event MessageFailed(uint16 sourceChainSelector, bytes sourceAddress, uint64 nonce, bytes payload);
event RetryMessageSuccess(uint16 sourceChainSelector, bytes sourceAddress, uint64 nonce, bytes32 payloadHash);
event RetryMessageAdded(uint16 sourceChainSelector, bytes sourceAddress, uint64 nonce, bytes payload);
event RetryMessageRemoved(uint16 sourceChainSelector, bytes sourceAddress, uint64 nonce, bytes payload);
constructor(address _rainbowRoad, address _endpoint) ArcBaseWithRainbowRoad(_rainbowRoad)
{
require(_endpoint != address(0), 'LayerZero endpoint cannot be zero address');
endpoint = ILayerZeroEndpoint(_endpoint);
}
function setEndpoint(address _endpoint) external onlyOwner
{
require(_endpoint != address(0), 'LayerZero endpoint cannot be zero address');
endpoint = ILayerZeroEndpoint(_endpoint);
}
function enableMessageSender(uint16 sourceChainSelector, address remoteAddress, address localAddress) external onlyOwner
{
require(remoteAddress != address(0), 'Remote address cannot be zero address');
require(localAddress != address(0), 'Local address cannot be zero address');
bytes memory trustedRemote = abi.encodePacked(remoteAddress, localAddress);
require(!messageSenders[sourceChainSelector][trustedRemote], 'Message sender for source chain is enabled');
messageSenders[sourceChainSelector][trustedRemote] = true;
trustedRemoteLookup[sourceChainSelector] = trustedRemote;
}
function disableMessageSender(uint16 sourceChainSelector, address remoteAddress, address localAddress) external onlyOwner
{
require(remoteAddress != address(0), 'Remote address cannot be zero address');
require(localAddress != address(0), 'Local address cannot be zero address');
bytes memory trustedRemote = abi.encodePacked(remoteAddress, localAddress);
require(messageSenders[sourceChainSelector][trustedRemote], 'Message sender for source chain is disabled');
messageSenders[sourceChainSelector][trustedRemote] = false;
delete trustedRemoteLookup[sourceChainSelector];
}
function lzReceive(uint16 sourceChainSelector, bytes calldata sourceAddress, uint64 nonce, bytes calldata message) public virtual override whenNotPaused
{
require(msg.sender == address(endpoint), "Invalid endpoint caller");
bytes memory trustedRemote = trustedRemoteLookup[sourceChainSelector];
require(
sourceAddress.length == trustedRemote.length && trustedRemote.length > 0 && keccak256(sourceAddress) == keccak256(trustedRemote) && messageSenders[sourceChainSelector][sourceAddress],
"Unsupported source chain/message sender"
);
try this.handleReceive(sourceChainSelector, sourceAddress, nonce, message) {
} catch {
failedMessages[sourceChainSelector][sourceAddress][nonce] = keccak256(message);
emit MessageFailed(sourceChainSelector, sourceAddress, nonce, message);
}
}
function handleReceive(uint16 sourceChainSelector, bytes calldata sourceAddress, uint64 nonce, bytes calldata message) public
{
require(msg.sender == address(this), "Invalid caller");
(string memory action, address actionRecipient, bytes memory payload) = abi.decode(message, (string, address, bytes));
rainbowRoad.receiveAction(action, actionRecipient, payload);
emit MessageReceived(sourceChainSelector, sourceAddress, nonce, action, actionRecipient);
}
function retryMessage(uint16 sourceChainSelector, bytes calldata sourceAddress, uint64 nonce, bytes calldata message) public virtual
{
// assert there is message to retry
bytes32 payloadHash = failedMessages[sourceChainSelector][sourceAddress][nonce];
require(payloadHash != bytes32(0), "Message not found");
require(keccak256(message) == payloadHash, "Invalid payload");
// clear the stored message
delete failedMessages[sourceChainSelector][sourceAddress][nonce];
// execute the message. revert if it fails again
this.handleReceive(sourceChainSelector, sourceAddress, nonce, message);
emit RetryMessageSuccess(sourceChainSelector, sourceAddress, nonce, payloadHash);
}
function addRetryMessage(uint16 sourceChainSelector, bytes calldata sourceAddress, uint64 nonce, bytes calldata message) public virtual onlyOwner
{
failedMessages[sourceChainSelector][sourceAddress][nonce] = keccak256(message);
emit RetryMessageAdded(sourceChainSelector, sourceAddress, nonce, message);
}
function removeRetryMessage(uint16 sourceChainSelector, bytes calldata sourceAddress, uint64 nonce, bytes calldata message) public virtual onlyOwner
{
delete failedMessages[sourceChainSelector][sourceAddress][nonce];
emit RetryMessageRemoved(sourceChainSelector, sourceAddress, nonce, message);
}
receive() external payable {}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)
pragma solidity ^0.8.0;
import "./Ownable.sol";
/**
* @dev Contract module which provides access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership} and {acceptOwnership}.
*
* This module is used through inheritance. It will make available all functions
* from parent (Ownable).
*/
abstract contract Ownable2Step is Ownable {
address private _pendingOwner;
event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);
/**
* @dev Returns the address of the pending owner.
*/
function pendingOwner() public view virtual returns (address) {
return _pendingOwner;
}
/**
* @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual override onlyOwner {
_pendingOwner = newOwner;
emit OwnershipTransferStarted(owner(), newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual override {
delete _pendingOwner;
super._transferOwnership(newOwner);
}
/**
* @dev The new owner accepts the ownership transfer.
*/
function acceptOwnership() public virtual {
address sender = _msgSender();
require(pendingOwner() == sender, "Ownable2Step: caller is not the new owner");
_transferOwnership(sender);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract Pausable is Context {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
constructor() {
_paused = false;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
_requireNotPaused();
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
_requirePaused();
_;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Throws if the contract is paused.
*/
function _requireNotPaused() internal view virtual {
require(!paused(), "Pausable: paused");
}
/**
* @dev Throws if the contract is not paused.
*/
function _requirePaused() internal view virtual {
require(paused(), "Pausable: not paused");
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be _NOT_ENTERED
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == _ENTERED;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.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 v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.19;
import {Ownable2Step} from "@openzeppelin/contracts/access/Ownable2Step.sol";
import {Pausable} from "@openzeppelin/contracts/security/Pausable.sol";
import {ReentrancyGuard} from "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
/**
* Provides set of properties, functions, and modifiers to help with
* security and access control of extending contracts
*/
contract ArcBase is Ownable2Step, Pausable, ReentrancyGuard
{
function pause() public onlyOwner
{
_pause();
}
function unpause() public onlyOwner
{
_unpause();
}
function withdrawNative(address beneficiary) public onlyOwner {
uint256 amount = address(this).balance;
(bool sent, ) = beneficiary.call{value: amount}("");
require(sent, 'Unable to withdraw');
}
function withdrawToken(address beneficiary, address token) public onlyOwner {
uint256 amount = IERC20(token).balanceOf(address(this));
IERC20(token).transfer(beneficiary, amount);
}
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.19;
import {ArcBase} from "./ArcBase.sol";
import {IRainbowRoad} from "../interfaces/IRainbowRoad.sol";
/**
* Extends the ArcBase contract to provide
* for interactions with the Rainbow Road
*/
contract ArcBaseWithRainbowRoad is ArcBase
{
IRainbowRoad public rainbowRoad;
constructor(address _rainbowRoad)
{
require(_rainbowRoad != address(0), 'Rainbow Road cannot be zero address');
rainbowRoad = IRainbowRoad(_rainbowRoad);
}
function setRainbowRoad(address _rainbowRoad) external onlyOwner
{
require(_rainbowRoad != address(0), 'Rainbow Road cannot be zero address');
rainbowRoad = IRainbowRoad(_rainbowRoad);
}
/// @dev Only calls from the Rainbow Road are accepted.
modifier onlyRainbowRoad()
{
require(msg.sender == address(rainbowRoad), 'Must be called by Rainbow Road');
_;
}
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.19;
interface IArc {
function approve(address _spender, uint _value) external returns (bool);
function burn(uint amount) external;
function mint(address account, uint amount) external;
function transfer(address, uint) external returns (bool);
function transferFrom(address _from, address _to, uint _value) external;
}// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0;
import "./ILayerZeroUserApplicationConfig.sol";
interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig {
// @notice send a LayerZero message to the specified address at a LayerZero endpoint.
// @param _dstChainId - the destination chain identifier
// @param _destination - the address on destination chain (in bytes). address length/format may vary by chains
// @param _payload - a custom bytes payload to send to the destination contract
// @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address
// @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction
// @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination
function send(
uint16 _dstChainId,
bytes calldata _destination,
bytes calldata _payload,
address payable _refundAddress,
address _zroPaymentAddress,
bytes calldata _adapterParams
) external payable;
// @notice used by the messaging library to publish verified payload
// @param _srcChainId - the source chain identifier
// @param _srcAddress - the source contract (as bytes) at the source chain
// @param _dstAddress - the address on destination chain
// @param _nonce - the unbound message ordering nonce
// @param _gasLimit - the gas limit for external contract execution
// @param _payload - verified payload to send to the destination contract
function receivePayload(
uint16 _srcChainId,
bytes calldata _srcAddress,
address _dstAddress,
uint64 _nonce,
uint _gasLimit,
bytes calldata _payload
) external;
// @notice get the inboundNonce of a lzApp from a source chain which could be EVM or non-EVM chain
// @param _srcChainId - the source chain identifier
// @param _srcAddress - the source chain contract address
function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64);
// @notice get the outboundNonce from this source chain which, consequently, is always an EVM
// @param _srcAddress - the source chain contract address
function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64);
// @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery
// @param _dstChainId - the destination chain identifier
// @param _userApplication - the user app address on this EVM chain
// @param _payload - the custom message to send over LayerZero
// @param _payInZRO - if false, user app pays the protocol fee in native token
// @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain
function estimateFees(
uint16 _dstChainId,
address _userApplication,
bytes calldata _payload,
bool _payInZRO,
bytes calldata _adapterParam
) external view returns (uint nativeFee, uint zroFee);
// @notice get this Endpoint's immutable source identifier
function getChainId() external view returns (uint16);
// @notice the interface to retry failed message on this Endpoint destination
// @param _srcChainId - the source chain identifier
// @param _srcAddress - the source chain contract address
// @param _payload - the payload to be retried
function retryPayload(
uint16 _srcChainId,
bytes calldata _srcAddress,
bytes calldata _payload
) external;
// @notice query if any STORED payload (message blocking) at the endpoint.
// @param _srcChainId - the source chain identifier
// @param _srcAddress - the source chain contract address
function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool);
// @notice query if the _libraryAddress is valid for sending msgs.
// @param _userApplication - the user app address on this EVM chain
function getSendLibraryAddress(address _userApplication) external view returns (address);
// @notice query if the _libraryAddress is valid for receiving msgs.
// @param _userApplication - the user app address on this EVM chain
function getReceiveLibraryAddress(address _userApplication) external view returns (address);
// @notice query if the non-reentrancy guard for send() is on
// @return true if the guard is on. false otherwise
function isSendingPayload() external view returns (bool);
// @notice query if the non-reentrancy guard for receive() is on
// @return true if the guard is on. false otherwise
function isReceivingPayload() external view returns (bool);
// @notice get the configuration of the LayerZero messaging library of the specified version
// @param _version - messaging library version
// @param _chainId - the chainId for the pending config change
// @param _userApplication - the contract address of the user application
// @param _configType - type of configuration. every messaging library has its own convention.
function getConfig(
uint16 _version,
uint16 _chainId,
address _userApplication,
uint _configType
) external view returns (bytes memory);
// @notice get the send() LayerZero messaging library version
// @param _userApplication - the contract address of the user application
function getSendVersion(address _userApplication) external view returns (uint16);
// @notice get the lzReceive() LayerZero messaging library version
// @param _userApplication - the contract address of the user application
function getReceiveVersion(address _userApplication) external view returns (uint16);
}// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0;
interface ILayerZeroReceiver {
// @notice LayerZero endpoint will invoke this function to deliver the message on the destination
// @param _srcChainId - the source endpoint identifier
// @param _srcAddress - the source sending contract address from the source chain
// @param _nonce - the ordered message nonce
// @param _payload - the signed payload is the UA bytes has encoded to be sent
function lzReceive(
uint16 _srcChainId,
bytes calldata _srcAddress,
uint64 _nonce,
bytes calldata _payload
) external;
}// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0;
interface ILayerZeroUserApplicationConfig {
// @notice set the configuration of the LayerZero messaging library of the specified version
// @param _version - messaging library version
// @param _chainId - the chainId for the pending config change
// @param _configType - type of configuration. every messaging library has its own convention.
// @param _config - configuration in the bytes. can encode arbitrary content.
function setConfig(
uint16 _version,
uint16 _chainId,
uint _configType,
bytes calldata _config
) external;
// @notice set the send() LayerZero messaging library version to _version
// @param _version - new messaging library version
function setSendVersion(uint16 _version) external;
// @notice set the lzReceive() LayerZero messaging library version to _version
// @param _version - new messaging library version
function setReceiveVersion(uint16 _version) external;
// @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload
// @param _srcChainId - the chainId of the source chain
// @param _srcAddress - the contract address of the source contract at the source chain
function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external;
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.19;
import {IArc} from "./IArc.sol";
interface IRainbowRoad {
function acceptTeam() external;
function actionHandlers(string calldata action) external view returns (address);
function arc() external view returns (IArc);
function blockToken(address tokenAddress) external;
function disableFeeManager(address feeManager) external;
function disableOpenTokenWhitelisting() external;
function disableReceiver(address receiver) external;
function disableSender(address sender) external;
function disableSendFeeBurn() external;
function disableSendFeeCharge() external;
function disableWhitelistingFeeBurn() external;
function disableWhitelistingFeeCharge() external;
function enableFeeManager(address feeManager) external;
function enableOpenTokenWhitelisting() external;
function enableReceiver(address receiver) external;
function enableSendFeeBurn() external;
function enableSender(address sender) external;
function enableSendFeeCharge() external;
function enableWhitelistingFeeBurn() external;
function enableWhitelistingFeeCharge() external;
function sendFee() external view returns (uint256);
function whitelistingFee() external view returns (uint256);
function chargeSendFee() external view returns (bool);
function chargeWhitelistingFee() external view returns (bool);
function burnSendFee() external view returns (bool);
function burnWhitelistingFee() external view returns (bool);
function openTokenWhitelisting() external view returns (bool);
function config(string calldata configName) external view returns (bytes memory);
function blockedTokens(address tokenAddress) external view returns (bool);
function feeManagers(address feeManager) external view returns (bool);
function receiveAction(string calldata action, address to, bytes calldata payload) external;
function sendAction(string calldata action, address from, bytes calldata payload) external;
function setActionHandler(string memory action, address handler) external;
function setArc(address _arc) external;
function setSendFee(uint256 _fee) external;
function setTeam(address _team) external;
function setTeamRate(uint256 _teamRate) external;
function setToken(string calldata tokenSymbol, address tokenAddress) external;
function setWhitelistingFee(uint256 _fee) external;
function team() external view returns (address);
function teamRate() external view returns (uint256);
function tokens(string calldata tokenSymbol) external view returns (address);
function MAX_TEAM_RATE() external view returns (uint256);
function receivers(address receiver) external view returns (bool);
function senders(address sender) external view returns (bool);
function unblockToken(address tokenAddress) external;
function whitelist(address tokenAddress) external;
}{
"optimizer": {
"enabled": true,
"runs": 10000
},
"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":"_rainbowRoad","type":"address"},{"internalType":"address","name":"_endpoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"sourceChainSelector","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"sourceAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"nonce","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"payload","type":"bytes"}],"name":"MessageFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"sourceChainSelector","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"sourceAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"nonce","type":"uint64"},{"indexed":false,"internalType":"string","name":"action","type":"string"},{"indexed":false,"internalType":"address","name":"actionRecipient","type":"address"}],"name":"MessageReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"sourceChainSelector","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"sourceAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"nonce","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"payload","type":"bytes"}],"name":"RetryMessageAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"sourceChainSelector","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"sourceAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"nonce","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"payload","type":"bytes"}],"name":"RetryMessageRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"sourceChainSelector","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"sourceAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"nonce","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"payloadHash","type":"bytes32"}],"name":"RetryMessageSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"sourceChainSelector","type":"uint16"},{"internalType":"bytes","name":"sourceAddress","type":"bytes"},{"internalType":"uint64","name":"nonce","type":"uint64"},{"internalType":"bytes","name":"message","type":"bytes"}],"name":"addRetryMessage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"sourceChainSelector","type":"uint16"},{"internalType":"address","name":"remoteAddress","type":"address"},{"internalType":"address","name":"localAddress","type":"address"}],"name":"disableMessageSender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"sourceChainSelector","type":"uint16"},{"internalType":"address","name":"remoteAddress","type":"address"},{"internalType":"address","name":"localAddress","type":"address"}],"name":"enableMessageSender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endpoint","outputs":[{"internalType":"contract ILayerZeroEndpoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"failedMessages","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"sourceChainSelector","type":"uint16"},{"internalType":"bytes","name":"sourceAddress","type":"bytes"},{"internalType":"uint64","name":"nonce","type":"uint64"},{"internalType":"bytes","name":"message","type":"bytes"}],"name":"handleReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"sourceChainSelector","type":"uint16"},{"internalType":"bytes","name":"sourceAddress","type":"bytes"},{"internalType":"uint64","name":"nonce","type":"uint64"},{"internalType":"bytes","name":"message","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"messageSenders","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rainbowRoad","outputs":[{"internalType":"contract IRainbowRoad","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"sourceChainSelector","type":"uint16"},{"internalType":"bytes","name":"sourceAddress","type":"bytes"},{"internalType":"uint64","name":"nonce","type":"uint64"},{"internalType":"bytes","name":"message","type":"bytes"}],"name":"removeRetryMessage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"sourceChainSelector","type":"uint16"},{"internalType":"bytes","name":"sourceAddress","type":"bytes"},{"internalType":"uint64","name":"nonce","type":"uint64"},{"internalType":"bytes","name":"message","type":"bytes"}],"name":"retryMessage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_endpoint","type":"address"}],"name":"setEndpoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rainbowRoad","type":"address"}],"name":"setRainbowRoad","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"trustedRemoteLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"}],"name":"withdrawNative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"address","name":"token","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60806040523480156200001157600080fd5b5060405162002514380380620025148339810160408190526200003491620001e8565b8162000040336200015d565b6001805460ff60a01b191681556002556001600160a01b038116620000b85760405162461bcd60e51b815260206004820152602360248201527f5261696e626f7720526f61642063616e6e6f74206265207a65726f206164647260448201526265737360e81b60648201526084015b60405180910390fd5b600380546001600160a01b0319166001600160a01b039283161790558116620001365760405162461bcd60e51b815260206004820152602960248201527f4c617965725a65726f20656e64706f696e742063616e6e6f74206265207a65726044820152686f206164647265737360b81b6064820152608401620000af565b600480546001600160a01b0319166001600160a01b03929092169190911790555062000220565b600180546001600160a01b031916905562000178816200017b565b50565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b0381168114620001e357600080fd5b919050565b60008060408385031215620001fc57600080fd5b6200020783620001cb565b91506200021760208401620001cb565b90509250929050565b6122e480620002306000396000f3fe60806040526004361061018e5760003560e01c80637533d788116100d6578063ca64e47b1161007f578063e30c397811610059578063e30c3978146104c5578063ef3bda9f146104f0578063f2fde38b1461053c57600080fd5b8063ca64e47b14610465578063d1deba1f14610485578063dbbb4155146104a557600080fd5b80638da5cb5b116100b05780638da5cb5b146103fa578063a164525e14610425578063bfb5944a1461044557600080fd5b80637533d788146103a357806379ba5097146103d05780638456cb59146103e557600080fd5b80635c975abb1161013857806366c10f751161011257806366c10f75146103415780636a93681714610361578063715018a61461038e57600080fd5b80635c975abb146102935780635e280f11146102cf57806361e74db01461032157600080fd5b80633aeac4e1116101695780633aeac4e1146101fc5780633f4ba83a1461021c5780635b8c41e61461023157600080fd5b80621d35671461019a57806314021145146101bc5780632f622e6b146101dc57600080fd5b3661019557005b600080fd5b3480156101a657600080fd5b506101ba6101b5366004611b66565b61055c565b005b3480156101c857600080fd5b506101ba6101d7366004611b66565b61087e565b3480156101e857600080fd5b506101ba6101f7366004611c1c565b610932565b34801561020857600080fd5b506101ba610217366004611c40565b6109ef565b34801561022857600080fd5b506101ba610b2b565b34801561023d57600080fd5b5061028061024c366004611d3e565b6007602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205481565b6040519081526020015b60405180910390f35b34801561029f57600080fd5b5060015474010000000000000000000000000000000000000000900460ff165b604051901515815260200161028a565b3480156102db57600080fd5b506004546102fc9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161028a565b34801561032d57600080fd5b506101ba61033c366004611d9c565b610b3d565b34801561034d57600080fd5b506101ba61035c366004611b66565b610dd3565b34801561036d57600080fd5b506003546102fc9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561039a57600080fd5b506101ba610f10565b3480156103af57600080fd5b506103c36103be366004611de5565b610f22565b60405161028a9190611e50565b3480156103dc57600080fd5b506101ba610fbc565b3480156103f157600080fd5b506101ba611057565b34801561040657600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166102fc565b34801561043157600080fd5b506101ba610440366004611b66565b611067565b34801561045157600080fd5b506101ba610460366004611c1c565b6110f2565b34801561047157600080fd5b506101ba610480366004611d9c565b6111ca565b34801561049157600080fd5b506101ba6104a0366004611b66565b611454565b3480156104b157600080fd5b506101ba6104c0366004611c1c565b61164a565b3480156104d157600080fd5b5060015473ffffffffffffffffffffffffffffffffffffffff166102fc565b3480156104fc57600080fd5b506102bf61050b366004611e63565b6005602090815260009283526040909220815180830184018051928152908401929093019190912091525460ff1681565b34801561054857600080fd5b506101ba610557366004611c1c565b611722565b6105646117d2565b60045473ffffffffffffffffffffffffffffffffffffffff1633146105d05760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420656e64706f696e742063616c6c657200000000000000000060448201526064015b60405180910390fd5b61ffff8616600090815260066020526040812080546105ee90611eb1565b80601f016020809104026020016040519081016040528092919081815260200182805461061a90611eb1565b80156106675780601f1061063c57610100808354040283529160200191610667565b820191906000526020600020905b81548152906001019060200180831161064a57829003601f168201915b50505050509050805186869050148015610682575060008151115b80156106aa5750805160208201206040516106a09088908890611f04565b6040518091039020145b80156106e9575061ffff87166000908152600560205260409081902090516106d59088908890611f04565b9081526040519081900360200190205460ff165b61075b5760405162461bcd60e51b815260206004820152602760248201527f556e737570706f7274656420736f7572636520636861696e2f6d65737361676560448201527f2073656e6465720000000000000000000000000000000000000000000000000060648201526084016105c7565b6040517f66c10f7500000000000000000000000000000000000000000000000000000000815230906366c10f75906107a1908a908a908a908a908a908a90600401611f3f565b600060405180830381600087803b1580156107bb57600080fd5b505af19250505080156107cc575060015b6108755782826040516107e0929190611f04565b6040805191829003822061ffff8a166000908152600760205291909120909161080c9089908990611f04565b90815260408051918290036020908101832067ffffffffffffffff89166000908152915220919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d9061086c90899089908990899089908990611f3f565b60405180910390a15b50505050505050565b61088661183d565b8181604051610896929190611f04565b6040805191829003822061ffff8916600090815260076020529190912090916108c29088908890611f04565b90815260408051918290036020908101832067ffffffffffffffff88166000908152915220919091557f401d8414d0ee25f60f68b6bc324307fcaf11ae4a9ce14b4e66c59b07fa90be779061092290889088908890889088908890611f3f565b60405180910390a1505050505050565b61093a61183d565b604051479060009073ffffffffffffffffffffffffffffffffffffffff84169083908381818185875af1925050503d8060008114610994576040519150601f19603f3d011682016040523d82523d6000602084013e610999565b606091505b50509050806109ea5760405162461bcd60e51b815260206004820152601260248201527f556e61626c6520746f207769746864726177000000000000000000000000000060448201526064016105c7565b505050565b6109f761183d565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610a64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a889190611f8d565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018390529192509083169063a9059cbb906044016020604051808303816000875af1158015610b01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b259190611fa6565b50505050565b610b3361183d565b610b3b6118a4565b565b610b4561183d565b73ffffffffffffffffffffffffffffffffffffffff8216610bce5760405162461bcd60e51b815260206004820152602560248201527f52656d6f746520616464726573732063616e6e6f74206265207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016105c7565b73ffffffffffffffffffffffffffffffffffffffff8116610c565760405162461bcd60e51b8152602060048201526024808201527f4c6f63616c20616464726573732063616e6e6f74206265207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016105c7565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b16603482015260009060480160408051601f1981840301815282825261ffff8716600090815260056020529190912090925090610cc7908390611fc8565b9081526040519081900360200190205460ff1615610d4d5760405162461bcd60e51b815260206004820152602a60248201527f4d6573736167652073656e64657220666f7220736f7572636520636861696e2060448201527f697320656e61626c65640000000000000000000000000000000000000000000060648201526084016105c7565b61ffff841660009081526005602052604090819020905160019190610d73908490611fc8565b908152604080516020928190038301902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169315159390931790925561ffff86166000908152600690915220610dcc8282612032565b5050505050565b333014610e225760405162461bcd60e51b815260206004820152600e60248201527f496e76616c69642063616c6c657200000000000000000000000000000000000060448201526064016105c7565b60008080610e328486018661212e565b6003546040517f9cdbf4c4000000000000000000000000000000000000000000000000000000008152939650919450925073ffffffffffffffffffffffffffffffffffffffff1690639cdbf4c490610e92908690869086906004016121bd565b600060405180830381600087803b158015610eac57600080fd5b505af1158015610ec0573d6000803e3d6000fd5b505050507fe2c98bc027982881015e1c22586be8f19b16ddc1ac3efb3b8bc09ea59b28b7a0898989898787604051610efd96959493929190612208565b60405180910390a1505050505050505050565b610f1861183d565b610b3b6000611921565b60066020526000908152604090208054610f3b90611eb1565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6790611eb1565b8015610fb45780601f10610f8957610100808354040283529160200191610fb4565b820191906000526020600020905b815481529060010190602001808311610f9757829003601f168201915b505050505081565b600154339073ffffffffffffffffffffffffffffffffffffffff16811461104b5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e6572000000000000000000000000000000000000000000000060648201526084016105c7565b61105481611921565b50565b61105f61183d565b610b3b611952565b61106f61183d565b61ffff86166000908152600760205260409081902090516110939087908790611f04565b90815260408051918290036020908101832067ffffffffffffffff871660009081529152908120557f42e8be5cd5ceb0fdca04a8ddfa4efeb6af0260fd0e6a19d4ec70310758654f7d9061092290889088908890889088908890611f3f565b6110fa61183d565b73ffffffffffffffffffffffffffffffffffffffff81166111835760405162461bcd60e51b815260206004820152602360248201527f5261696e626f7720526f61642063616e6e6f74206265207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016105c7565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6111d261183d565b73ffffffffffffffffffffffffffffffffffffffff821661125b5760405162461bcd60e51b815260206004820152602560248201527f52656d6f746520616464726573732063616e6e6f74206265207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016105c7565b73ffffffffffffffffffffffffffffffffffffffff81166112e35760405162461bcd60e51b8152602060048201526024808201527f4c6f63616c20616464726573732063616e6e6f74206265207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016105c7565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b16603482015260009060480160408051601f1981840301815282825261ffff8716600090815260056020529190912090925090611354908390611fc8565b9081526040519081900360200190205460ff166113d95760405162461bcd60e51b815260206004820152602b60248201527f4d6573736167652073656e64657220666f7220736f7572636520636861696e2060448201527f69732064697361626c656400000000000000000000000000000000000000000060648201526084016105c7565b61ffff841660009081526005602052604080822090516113fa908490611fc8565b908152604080516020928190038301902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169315159390931790925561ffff861660009081526006909152908120610b2591611aa0565b61ffff861660009081526007602052604080822090516114779088908890611f04565b908152604080516020928190038301902067ffffffffffffffff8716600090815292529020549050806114ec5760405162461bcd60e51b815260206004820152601160248201527f4d657373616765206e6f7420666f756e6400000000000000000000000000000060448201526064016105c7565b8083836040516114fd929190611f04565b6040518091039020146115525760405162461bcd60e51b815260206004820152600f60248201527f496e76616c6964207061796c6f6164000000000000000000000000000000000060448201526064016105c7565b61ffff87166000908152600760205260409081902090516115769088908890611f04565b90815260408051918290036020908101832067ffffffffffffffff881660009081529152908120557f66c10f7500000000000000000000000000000000000000000000000000000000815230906366c10f75906115e1908a908a908a908a908a908a90600401611f3f565b600060405180830381600087803b1580156115fb57600080fd5b505af115801561160f573d6000803e3d6000fd5b505050507fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e5878787878560405161086c959493929190612272565b61165261183d565b73ffffffffffffffffffffffffffffffffffffffff81166116db5760405162461bcd60e51b815260206004820152602960248201527f4c617965725a65726f20656e64706f696e742063616e6e6f74206265207a657260448201527f6f2061646472657373000000000000000000000000000000000000000000000060648201526084016105c7565b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b61172a61183d565b6001805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915561178d60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60015474010000000000000000000000000000000000000000900460ff1615610b3b5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016105c7565b60005473ffffffffffffffffffffffffffffffffffffffff163314610b3b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105c7565b6118ac6119c1565b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905561105481611a2b565b61195a6117d2565b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586118f73390565b60015474010000000000000000000000000000000000000000900460ff16610b3b5760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016105c7565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b508054611aac90611eb1565b6000825580601f10611abc575050565b601f01602090049060005260206000209081019061105491905b80821115611aea5760008155600101611ad6565b5090565b803561ffff81168114611b0057600080fd5b919050565b60008083601f840112611b1757600080fd5b50813567ffffffffffffffff811115611b2f57600080fd5b602083019150836020828501011115611b4757600080fd5b9250929050565b803567ffffffffffffffff81168114611b0057600080fd5b60008060008060008060808789031215611b7f57600080fd5b611b8887611aee565b9550602087013567ffffffffffffffff80821115611ba557600080fd5b611bb18a838b01611b05565b9097509550859150611bc560408a01611b4e565b94506060890135915080821115611bdb57600080fd5b50611be889828a01611b05565b979a9699509497509295939492505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461105457600080fd5b600060208284031215611c2e57600080fd5b8135611c3981611bfa565b9392505050565b60008060408385031215611c5357600080fd5b8235611c5e81611bfa565b91506020830135611c6e81611bfa565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff80841115611cc357611cc3611c79565b604051601f8501601f19908116603f01168101908282118183101715611ceb57611ceb611c79565b81604052809350858152868686011115611d0457600080fd5b858560208301376000602087830101525050509392505050565b600082601f830112611d2f57600080fd5b611c3983833560208501611ca8565b600080600060608486031215611d5357600080fd5b611d5c84611aee565b9250602084013567ffffffffffffffff811115611d7857600080fd5b611d8486828701611d1e565b925050611d9360408501611b4e565b90509250925092565b600080600060608486031215611db157600080fd5b611dba84611aee565b92506020840135611dca81611bfa565b91506040840135611dda81611bfa565b809150509250925092565b600060208284031215611df757600080fd5b611c3982611aee565b60005b83811015611e1b578181015183820152602001611e03565b50506000910152565b60008151808452611e3c816020860160208601611e00565b601f01601f19169290920160200192915050565b602081526000611c396020830184611e24565b60008060408385031215611e7657600080fd5b611e7f83611aee565b9150602083013567ffffffffffffffff811115611e9b57600080fd5b611ea785828601611d1e565b9150509250929050565b600181811c90821680611ec557607f821691505b602082108103611efe577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8183823760009101908152919050565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b61ffff87168152608060208201526000611f5d608083018789611f14565b67ffffffffffffffff861660408401528281036060840152611f80818587611f14565b9998505050505050505050565b600060208284031215611f9f57600080fd5b5051919050565b600060208284031215611fb857600080fd5b81518015158114611c3957600080fd5b60008251611fda818460208701611e00565b9190910192915050565b601f8211156109ea57600081815260208120601f850160051c8101602086101561200b5750805b601f850160051c820191505b8181101561202a57828155600101612017565b505050505050565b815167ffffffffffffffff81111561204c5761204c611c79565b6120608161205a8454611eb1565b84611fe4565b602080601f8311600181146120b3576000841561207d5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561202a565b600085815260208120601f198616915b828110156120e2578886015182559484019460019091019084016120c3565b508582101561211e57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60008060006060848603121561214357600080fd5b833567ffffffffffffffff8082111561215b57600080fd5b818601915086601f83011261216f57600080fd5b61217e87833560208501611ca8565b94506020860135915061219082611bfa565b909250604085013590808211156121a657600080fd5b506121b386828701611d1e565b9150509250925092565b6060815260006121d06060830186611e24565b73ffffffffffffffffffffffffffffffffffffffff8516602084015282810360408401526121fe8185611e24565b9695505050505050565b61ffff8716815260a06020820152600061222660a083018789611f14565b67ffffffffffffffff8616604084015282810360608401526122488186611e24565b91505073ffffffffffffffffffffffffffffffffffffffff83166080830152979650505050505050565b61ffff86168152608060208201526000612290608083018688611f14565b67ffffffffffffffff9490941660408301525060600152939250505056fea2646970667358221220d6c6346bf9760299dd92b1f27bea7f02a801bf8d5861097d6fb4de9fdde0453564736f6c634300081300330000000000000000000000009412316dc6c882ffc4fa1a01413b0c701b147b9e000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd7
Deployed Bytecode
0x60806040526004361061018e5760003560e01c80637533d788116100d6578063ca64e47b1161007f578063e30c397811610059578063e30c3978146104c5578063ef3bda9f146104f0578063f2fde38b1461053c57600080fd5b8063ca64e47b14610465578063d1deba1f14610485578063dbbb4155146104a557600080fd5b80638da5cb5b116100b05780638da5cb5b146103fa578063a164525e14610425578063bfb5944a1461044557600080fd5b80637533d788146103a357806379ba5097146103d05780638456cb59146103e557600080fd5b80635c975abb1161013857806366c10f751161011257806366c10f75146103415780636a93681714610361578063715018a61461038e57600080fd5b80635c975abb146102935780635e280f11146102cf57806361e74db01461032157600080fd5b80633aeac4e1116101695780633aeac4e1146101fc5780633f4ba83a1461021c5780635b8c41e61461023157600080fd5b80621d35671461019a57806314021145146101bc5780632f622e6b146101dc57600080fd5b3661019557005b600080fd5b3480156101a657600080fd5b506101ba6101b5366004611b66565b61055c565b005b3480156101c857600080fd5b506101ba6101d7366004611b66565b61087e565b3480156101e857600080fd5b506101ba6101f7366004611c1c565b610932565b34801561020857600080fd5b506101ba610217366004611c40565b6109ef565b34801561022857600080fd5b506101ba610b2b565b34801561023d57600080fd5b5061028061024c366004611d3e565b6007602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205481565b6040519081526020015b60405180910390f35b34801561029f57600080fd5b5060015474010000000000000000000000000000000000000000900460ff165b604051901515815260200161028a565b3480156102db57600080fd5b506004546102fc9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161028a565b34801561032d57600080fd5b506101ba61033c366004611d9c565b610b3d565b34801561034d57600080fd5b506101ba61035c366004611b66565b610dd3565b34801561036d57600080fd5b506003546102fc9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561039a57600080fd5b506101ba610f10565b3480156103af57600080fd5b506103c36103be366004611de5565b610f22565b60405161028a9190611e50565b3480156103dc57600080fd5b506101ba610fbc565b3480156103f157600080fd5b506101ba611057565b34801561040657600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166102fc565b34801561043157600080fd5b506101ba610440366004611b66565b611067565b34801561045157600080fd5b506101ba610460366004611c1c565b6110f2565b34801561047157600080fd5b506101ba610480366004611d9c565b6111ca565b34801561049157600080fd5b506101ba6104a0366004611b66565b611454565b3480156104b157600080fd5b506101ba6104c0366004611c1c565b61164a565b3480156104d157600080fd5b5060015473ffffffffffffffffffffffffffffffffffffffff166102fc565b3480156104fc57600080fd5b506102bf61050b366004611e63565b6005602090815260009283526040909220815180830184018051928152908401929093019190912091525460ff1681565b34801561054857600080fd5b506101ba610557366004611c1c565b611722565b6105646117d2565b60045473ffffffffffffffffffffffffffffffffffffffff1633146105d05760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420656e64706f696e742063616c6c657200000000000000000060448201526064015b60405180910390fd5b61ffff8616600090815260066020526040812080546105ee90611eb1565b80601f016020809104026020016040519081016040528092919081815260200182805461061a90611eb1565b80156106675780601f1061063c57610100808354040283529160200191610667565b820191906000526020600020905b81548152906001019060200180831161064a57829003601f168201915b50505050509050805186869050148015610682575060008151115b80156106aa5750805160208201206040516106a09088908890611f04565b6040518091039020145b80156106e9575061ffff87166000908152600560205260409081902090516106d59088908890611f04565b9081526040519081900360200190205460ff165b61075b5760405162461bcd60e51b815260206004820152602760248201527f556e737570706f7274656420736f7572636520636861696e2f6d65737361676560448201527f2073656e6465720000000000000000000000000000000000000000000000000060648201526084016105c7565b6040517f66c10f7500000000000000000000000000000000000000000000000000000000815230906366c10f75906107a1908a908a908a908a908a908a90600401611f3f565b600060405180830381600087803b1580156107bb57600080fd5b505af19250505080156107cc575060015b6108755782826040516107e0929190611f04565b6040805191829003822061ffff8a166000908152600760205291909120909161080c9089908990611f04565b90815260408051918290036020908101832067ffffffffffffffff89166000908152915220919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d9061086c90899089908990899089908990611f3f565b60405180910390a15b50505050505050565b61088661183d565b8181604051610896929190611f04565b6040805191829003822061ffff8916600090815260076020529190912090916108c29088908890611f04565b90815260408051918290036020908101832067ffffffffffffffff88166000908152915220919091557f401d8414d0ee25f60f68b6bc324307fcaf11ae4a9ce14b4e66c59b07fa90be779061092290889088908890889088908890611f3f565b60405180910390a1505050505050565b61093a61183d565b604051479060009073ffffffffffffffffffffffffffffffffffffffff84169083908381818185875af1925050503d8060008114610994576040519150601f19603f3d011682016040523d82523d6000602084013e610999565b606091505b50509050806109ea5760405162461bcd60e51b815260206004820152601260248201527f556e61626c6520746f207769746864726177000000000000000000000000000060448201526064016105c7565b505050565b6109f761183d565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610a64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a889190611f8d565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018390529192509083169063a9059cbb906044016020604051808303816000875af1158015610b01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b259190611fa6565b50505050565b610b3361183d565b610b3b6118a4565b565b610b4561183d565b73ffffffffffffffffffffffffffffffffffffffff8216610bce5760405162461bcd60e51b815260206004820152602560248201527f52656d6f746520616464726573732063616e6e6f74206265207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016105c7565b73ffffffffffffffffffffffffffffffffffffffff8116610c565760405162461bcd60e51b8152602060048201526024808201527f4c6f63616c20616464726573732063616e6e6f74206265207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016105c7565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b16603482015260009060480160408051601f1981840301815282825261ffff8716600090815260056020529190912090925090610cc7908390611fc8565b9081526040519081900360200190205460ff1615610d4d5760405162461bcd60e51b815260206004820152602a60248201527f4d6573736167652073656e64657220666f7220736f7572636520636861696e2060448201527f697320656e61626c65640000000000000000000000000000000000000000000060648201526084016105c7565b61ffff841660009081526005602052604090819020905160019190610d73908490611fc8565b908152604080516020928190038301902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169315159390931790925561ffff86166000908152600690915220610dcc8282612032565b5050505050565b333014610e225760405162461bcd60e51b815260206004820152600e60248201527f496e76616c69642063616c6c657200000000000000000000000000000000000060448201526064016105c7565b60008080610e328486018661212e565b6003546040517f9cdbf4c4000000000000000000000000000000000000000000000000000000008152939650919450925073ffffffffffffffffffffffffffffffffffffffff1690639cdbf4c490610e92908690869086906004016121bd565b600060405180830381600087803b158015610eac57600080fd5b505af1158015610ec0573d6000803e3d6000fd5b505050507fe2c98bc027982881015e1c22586be8f19b16ddc1ac3efb3b8bc09ea59b28b7a0898989898787604051610efd96959493929190612208565b60405180910390a1505050505050505050565b610f1861183d565b610b3b6000611921565b60066020526000908152604090208054610f3b90611eb1565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6790611eb1565b8015610fb45780601f10610f8957610100808354040283529160200191610fb4565b820191906000526020600020905b815481529060010190602001808311610f9757829003601f168201915b505050505081565b600154339073ffffffffffffffffffffffffffffffffffffffff16811461104b5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e6572000000000000000000000000000000000000000000000060648201526084016105c7565b61105481611921565b50565b61105f61183d565b610b3b611952565b61106f61183d565b61ffff86166000908152600760205260409081902090516110939087908790611f04565b90815260408051918290036020908101832067ffffffffffffffff871660009081529152908120557f42e8be5cd5ceb0fdca04a8ddfa4efeb6af0260fd0e6a19d4ec70310758654f7d9061092290889088908890889088908890611f3f565b6110fa61183d565b73ffffffffffffffffffffffffffffffffffffffff81166111835760405162461bcd60e51b815260206004820152602360248201527f5261696e626f7720526f61642063616e6e6f74206265207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016105c7565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6111d261183d565b73ffffffffffffffffffffffffffffffffffffffff821661125b5760405162461bcd60e51b815260206004820152602560248201527f52656d6f746520616464726573732063616e6e6f74206265207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016105c7565b73ffffffffffffffffffffffffffffffffffffffff81166112e35760405162461bcd60e51b8152602060048201526024808201527f4c6f63616c20616464726573732063616e6e6f74206265207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016105c7565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b16603482015260009060480160408051601f1981840301815282825261ffff8716600090815260056020529190912090925090611354908390611fc8565b9081526040519081900360200190205460ff166113d95760405162461bcd60e51b815260206004820152602b60248201527f4d6573736167652073656e64657220666f7220736f7572636520636861696e2060448201527f69732064697361626c656400000000000000000000000000000000000000000060648201526084016105c7565b61ffff841660009081526005602052604080822090516113fa908490611fc8565b908152604080516020928190038301902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169315159390931790925561ffff861660009081526006909152908120610b2591611aa0565b61ffff861660009081526007602052604080822090516114779088908890611f04565b908152604080516020928190038301902067ffffffffffffffff8716600090815292529020549050806114ec5760405162461bcd60e51b815260206004820152601160248201527f4d657373616765206e6f7420666f756e6400000000000000000000000000000060448201526064016105c7565b8083836040516114fd929190611f04565b6040518091039020146115525760405162461bcd60e51b815260206004820152600f60248201527f496e76616c6964207061796c6f6164000000000000000000000000000000000060448201526064016105c7565b61ffff87166000908152600760205260409081902090516115769088908890611f04565b90815260408051918290036020908101832067ffffffffffffffff881660009081529152908120557f66c10f7500000000000000000000000000000000000000000000000000000000815230906366c10f75906115e1908a908a908a908a908a908a90600401611f3f565b600060405180830381600087803b1580156115fb57600080fd5b505af115801561160f573d6000803e3d6000fd5b505050507fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e5878787878560405161086c959493929190612272565b61165261183d565b73ffffffffffffffffffffffffffffffffffffffff81166116db5760405162461bcd60e51b815260206004820152602960248201527f4c617965725a65726f20656e64706f696e742063616e6e6f74206265207a657260448201527f6f2061646472657373000000000000000000000000000000000000000000000060648201526084016105c7565b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b61172a61183d565b6001805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915561178d60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60015474010000000000000000000000000000000000000000900460ff1615610b3b5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016105c7565b60005473ffffffffffffffffffffffffffffffffffffffff163314610b3b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105c7565b6118ac6119c1565b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905561105481611a2b565b61195a6117d2565b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586118f73390565b60015474010000000000000000000000000000000000000000900460ff16610b3b5760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016105c7565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b508054611aac90611eb1565b6000825580601f10611abc575050565b601f01602090049060005260206000209081019061105491905b80821115611aea5760008155600101611ad6565b5090565b803561ffff81168114611b0057600080fd5b919050565b60008083601f840112611b1757600080fd5b50813567ffffffffffffffff811115611b2f57600080fd5b602083019150836020828501011115611b4757600080fd5b9250929050565b803567ffffffffffffffff81168114611b0057600080fd5b60008060008060008060808789031215611b7f57600080fd5b611b8887611aee565b9550602087013567ffffffffffffffff80821115611ba557600080fd5b611bb18a838b01611b05565b9097509550859150611bc560408a01611b4e565b94506060890135915080821115611bdb57600080fd5b50611be889828a01611b05565b979a9699509497509295939492505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461105457600080fd5b600060208284031215611c2e57600080fd5b8135611c3981611bfa565b9392505050565b60008060408385031215611c5357600080fd5b8235611c5e81611bfa565b91506020830135611c6e81611bfa565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff80841115611cc357611cc3611c79565b604051601f8501601f19908116603f01168101908282118183101715611ceb57611ceb611c79565b81604052809350858152868686011115611d0457600080fd5b858560208301376000602087830101525050509392505050565b600082601f830112611d2f57600080fd5b611c3983833560208501611ca8565b600080600060608486031215611d5357600080fd5b611d5c84611aee565b9250602084013567ffffffffffffffff811115611d7857600080fd5b611d8486828701611d1e565b925050611d9360408501611b4e565b90509250925092565b600080600060608486031215611db157600080fd5b611dba84611aee565b92506020840135611dca81611bfa565b91506040840135611dda81611bfa565b809150509250925092565b600060208284031215611df757600080fd5b611c3982611aee565b60005b83811015611e1b578181015183820152602001611e03565b50506000910152565b60008151808452611e3c816020860160208601611e00565b601f01601f19169290920160200192915050565b602081526000611c396020830184611e24565b60008060408385031215611e7657600080fd5b611e7f83611aee565b9150602083013567ffffffffffffffff811115611e9b57600080fd5b611ea785828601611d1e565b9150509250929050565b600181811c90821680611ec557607f821691505b602082108103611efe577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8183823760009101908152919050565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b61ffff87168152608060208201526000611f5d608083018789611f14565b67ffffffffffffffff861660408401528281036060840152611f80818587611f14565b9998505050505050505050565b600060208284031215611f9f57600080fd5b5051919050565b600060208284031215611fb857600080fd5b81518015158114611c3957600080fd5b60008251611fda818460208701611e00565b9190910192915050565b601f8211156109ea57600081815260208120601f850160051c8101602086101561200b5750805b601f850160051c820191505b8181101561202a57828155600101612017565b505050505050565b815167ffffffffffffffff81111561204c5761204c611c79565b6120608161205a8454611eb1565b84611fe4565b602080601f8311600181146120b3576000841561207d5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561202a565b600085815260208120601f198616915b828110156120e2578886015182559484019460019091019084016120c3565b508582101561211e57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60008060006060848603121561214357600080fd5b833567ffffffffffffffff8082111561215b57600080fd5b818601915086601f83011261216f57600080fd5b61217e87833560208501611ca8565b94506020860135915061219082611bfa565b909250604085013590808211156121a657600080fd5b506121b386828701611d1e565b9150509250925092565b6060815260006121d06060830186611e24565b73ffffffffffffffffffffffffffffffffffffffff8516602084015282810360408401526121fe8185611e24565b9695505050505050565b61ffff8716815260a06020820152600061222660a083018789611f14565b67ffffffffffffffff8616604084015282810360608401526122488186611e24565b91505073ffffffffffffffffffffffffffffffffffffffff83166080830152979650505050505050565b61ffff86168152608060208201526000612290608083018688611f14565b67ffffffffffffffff9490941660408301525060600152939250505056fea2646970667358221220d6c6346bf9760299dd92b1f27bea7f02a801bf8d5861097d6fb4de9fdde0453564736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000009412316dc6c882ffc4fa1a01413b0c701b147b9e000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd7
-----Decoded View---------------
Arg [0] : _rainbowRoad (address): 0x9412316DC6C882ffc4FA1A01413b0C701b147B9E
Arg [1] : _endpoint (address): 0xb6319cC6c8c27A8F5dAF0dD3DF91EA35C4720dd7
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000009412316dc6c882ffc4fa1a01413b0c701b147b9e
Arg [1] : 000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd7
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.