Source Code
Overview
S Balance
S Value
$0.00Latest 1 from a total of 1 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Initialize | 449929 | 407 days ago | IN | 0 S | 0.00173126 |
Latest 25 internal transactions (View All)
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ERC20hTokenBranchFactory
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 1000000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {Ownable} from "lib/solady/src/auth/Ownable.sol";
import {ERC20} from "../token/ERC20hToken.sol";
import {IERC20hTokenBranchFactory, ERC20hToken} from "../interfaces/IERC20hTokenBranchFactory.sol";
/// @title ERC20hToken Branch Factory Contract
/// @author MaiaDAO
contract ERC20hTokenBranchFactory is Ownable, IERC20hTokenBranchFactory {
/// @notice Local Port Address
address public immutable localPortAddress;
/// @notice Local Branch Core Router Address responsible for the addition of new tokens to the system.
address public localCoreRouterAddress;
/// @notice Local hTokens deployed in the current chain.
ERC20hToken[] public hTokens;
/// @notice Name of the chain for token name prefix.
string public chainName;
/// @notice Symbol of the chain for token symbol prefix.
string public chainSymbol;
/*///////////////////////////////////////////////////////////////
CONSTRUCTOR
///////////////////////////////////////////////////////////////*/
/**
* @notice Constructor for ERC20 hToken Branch Factory Contract
* @param _localPortAddress Local Chain Port Address.
* @param _chainName Name of the chain for token name prefix.
* @param _chainSymbol Symbol of the chain for token symbol prefix.
* @param _owner Owner of the contract.
*/
constructor(address _localPortAddress, string memory _chainName, string memory _chainSymbol, address _owner) {
require(_localPortAddress != address(0), "Port address cannot be 0");
chainName = _chainName;
chainSymbol = _chainSymbol;
localPortAddress = _localPortAddress;
_initializeOwner(_owner);
}
/*///////////////////////////////////////////////////////////////
INITIALIZER
///////////////////////////////////////////////////////////////*/
/**
* @notice Function to initialize the contract.
* @param _wrappedNativeTokenAddress Address of the Local Chain's wrapped native token.
* @param _coreRouter Address of the Local Chain's Core Router.
*/
function initialize(address _wrappedNativeTokenAddress, address _coreRouter) external onlyOwner {
require(_coreRouter != address(0), "CoreRouter address cannot be 0");
renounceOwnership();
ERC20hToken newToken = new ERC20hToken(
localPortAddress,
ERC20(_wrappedNativeTokenAddress).name(),
ERC20(_wrappedNativeTokenAddress).symbol(),
ERC20(_wrappedNativeTokenAddress).decimals()
);
hTokens.push(newToken);
localCoreRouterAddress = _coreRouter;
}
/*///////////////////////////////////////////////////////////////
VIEW FUNCTIONS
///////////////////////////////////////////////////////////////*/
/**
* @notice Function to get the array of hTokens.
* @return Array of hTokens.
*/
function getHTokens() external view returns (ERC20hToken[] memory) {
return hTokens;
}
/*///////////////////////////////////////////////////////////////
hTOKEN FACTORY EXTERNAL FUNCTIONS
///////////////////////////////////////////////////////////////*/
/// @inheritdoc IERC20hTokenBranchFactory
function createToken(string memory _name, string memory _symbol, uint8 _decimals)
external
requiresCoreRouter
returns (ERC20hToken newToken)
{
newToken = new ERC20hToken(localPortAddress, _name, _symbol, _decimals);
hTokens.push(newToken);
}
/*///////////////////////////////////////////////////////////////
MODIFIERS
///////////////////////////////////////////////////////////////*/
/// @notice Modifier that verifies msg sender is the RootInterface Contract from Root Chain.
modifier requiresCoreRouter() {
if (msg.sender != localCoreRouterAddress) revert UnrecognizedCoreRouter();
_;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
/// @notice Simple single owner authorization mixin.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/auth/Ownable.sol)
///
/// @dev Note:
/// This implementation does NOT auto-initialize the owner to `msg.sender`.
/// You MUST call the `_initializeOwner` in the constructor / initializer.
///
/// While the ownable portion follows
/// [EIP-173](https://eips.ethereum.org/EIPS/eip-173) for compatibility,
/// the nomenclature for the 2-step ownership handover may be unique to this codebase.
abstract contract Ownable {
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* CUSTOM ERRORS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev The caller is not authorized to call the function.
error Unauthorized();
/// @dev The `newOwner` cannot be the zero address.
error NewOwnerIsZeroAddress();
/// @dev The `pendingOwner` does not have a valid handover request.
error NoHandoverRequest();
/// @dev Cannot double-initialize.
error AlreadyInitialized();
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* EVENTS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev The ownership is transferred from `oldOwner` to `newOwner`.
/// This event is intentionally kept the same as OpenZeppelin's Ownable to be
/// compatible with indexers and [EIP-173](https://eips.ethereum.org/EIPS/eip-173),
/// despite it not being as lightweight as a single argument event.
event OwnershipTransferred(address indexed oldOwner, address indexed newOwner);
/// @dev An ownership handover to `pendingOwner` has been requested.
event OwnershipHandoverRequested(address indexed pendingOwner);
/// @dev The ownership handover to `pendingOwner` has been canceled.
event OwnershipHandoverCanceled(address indexed pendingOwner);
/// @dev `keccak256(bytes("OwnershipTransferred(address,address)"))`.
uint256 private constant _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE =
0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0;
/// @dev `keccak256(bytes("OwnershipHandoverRequested(address)"))`.
uint256 private constant _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE =
0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d;
/// @dev `keccak256(bytes("OwnershipHandoverCanceled(address)"))`.
uint256 private constant _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE =
0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92;
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* STORAGE */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev The owner slot is given by:
/// `bytes32(~uint256(uint32(bytes4(keccak256("_OWNER_SLOT_NOT")))))`.
/// It is intentionally chosen to be a high value
/// to avoid collision with lower slots.
/// The choice of manual storage layout is to enable compatibility
/// with both regular and upgradeable contracts.
bytes32 internal constant _OWNER_SLOT =
0xffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927;
/// The ownership handover slot of `newOwner` is given by:
/// ```
/// mstore(0x00, or(shl(96, user), _HANDOVER_SLOT_SEED))
/// let handoverSlot := keccak256(0x00, 0x20)
/// ```
/// It stores the expiry timestamp of the two-step ownership handover.
uint256 private constant _HANDOVER_SLOT_SEED = 0x389a75e1;
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* INTERNAL FUNCTIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Override to return true to make `_initializeOwner` prevent double-initialization.
function _guardInitializeOwner() internal pure virtual returns (bool guard) {}
/// @dev Initializes the owner directly without authorization guard.
/// This function must be called upon initialization,
/// regardless of whether the contract is upgradeable or not.
/// This is to enable generalization to both regular and upgradeable contracts,
/// and to save gas in case the initial owner is not the caller.
/// For performance reasons, this function will not check if there
/// is an existing owner.
function _initializeOwner(address newOwner) internal virtual {
if (_guardInitializeOwner()) {
/// @solidity memory-safe-assembly
assembly {
let ownerSlot := _OWNER_SLOT
if sload(ownerSlot) {
mstore(0x00, 0x0dc149f0) // `AlreadyInitialized()`.
revert(0x1c, 0x04)
}
// Clean the upper 96 bits.
newOwner := shr(96, shl(96, newOwner))
// Store the new value.
sstore(ownerSlot, or(newOwner, shl(255, iszero(newOwner))))
// Emit the {OwnershipTransferred} event.
log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, 0, newOwner)
}
} else {
/// @solidity memory-safe-assembly
assembly {
// Clean the upper 96 bits.
newOwner := shr(96, shl(96, newOwner))
// Store the new value.
sstore(_OWNER_SLOT, newOwner)
// Emit the {OwnershipTransferred} event.
log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, 0, newOwner)
}
}
}
/// @dev Sets the owner directly without authorization guard.
function _setOwner(address newOwner) internal virtual {
if (_guardInitializeOwner()) {
/// @solidity memory-safe-assembly
assembly {
let ownerSlot := _OWNER_SLOT
// Clean the upper 96 bits.
newOwner := shr(96, shl(96, newOwner))
// Emit the {OwnershipTransferred} event.
log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, sload(ownerSlot), newOwner)
// Store the new value.
sstore(ownerSlot, or(newOwner, shl(255, iszero(newOwner))))
}
} else {
/// @solidity memory-safe-assembly
assembly {
let ownerSlot := _OWNER_SLOT
// Clean the upper 96 bits.
newOwner := shr(96, shl(96, newOwner))
// Emit the {OwnershipTransferred} event.
log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, sload(ownerSlot), newOwner)
// Store the new value.
sstore(ownerSlot, newOwner)
}
}
}
/// @dev Throws if the sender is not the owner.
function _checkOwner() internal view virtual {
/// @solidity memory-safe-assembly
assembly {
// If the caller is not the stored owner, revert.
if iszero(eq(caller(), sload(_OWNER_SLOT))) {
mstore(0x00, 0x82b42900) // `Unauthorized()`.
revert(0x1c, 0x04)
}
}
}
/// @dev Returns how long a two-step ownership handover is valid for in seconds.
/// Override to return a different value if needed.
/// Made internal to conserve bytecode. Wrap it in a public function if needed.
function _ownershipHandoverValidFor() internal view virtual returns (uint64) {
return 48 * 3600;
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* PUBLIC UPDATE FUNCTIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Allows the owner to transfer the ownership to `newOwner`.
function transferOwnership(address newOwner) public payable virtual onlyOwner {
/// @solidity memory-safe-assembly
assembly {
if iszero(shl(96, newOwner)) {
mstore(0x00, 0x7448fbae) // `NewOwnerIsZeroAddress()`.
revert(0x1c, 0x04)
}
}
_setOwner(newOwner);
}
/// @dev Allows the owner to renounce their ownership.
function renounceOwnership() public payable virtual onlyOwner {
_setOwner(address(0));
}
/// @dev Request a two-step ownership handover to the caller.
/// The request will automatically expire in 48 hours (172800 seconds) by default.
function requestOwnershipHandover() public payable virtual {
unchecked {
uint256 expires = block.timestamp + _ownershipHandoverValidFor();
/// @solidity memory-safe-assembly
assembly {
// Compute and set the handover slot to `expires`.
mstore(0x0c, _HANDOVER_SLOT_SEED)
mstore(0x00, caller())
sstore(keccak256(0x0c, 0x20), expires)
// Emit the {OwnershipHandoverRequested} event.
log2(0, 0, _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE, caller())
}
}
}
/// @dev Cancels the two-step ownership handover to the caller, if any.
function cancelOwnershipHandover() public payable virtual {
/// @solidity memory-safe-assembly
assembly {
// Compute and set the handover slot to 0.
mstore(0x0c, _HANDOVER_SLOT_SEED)
mstore(0x00, caller())
sstore(keccak256(0x0c, 0x20), 0)
// Emit the {OwnershipHandoverCanceled} event.
log2(0, 0, _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE, caller())
}
}
/// @dev Allows the owner to complete the two-step ownership handover to `pendingOwner`.
/// Reverts if there is no existing ownership handover requested by `pendingOwner`.
function completeOwnershipHandover(address pendingOwner) public payable virtual onlyOwner {
/// @solidity memory-safe-assembly
assembly {
// Compute and set the handover slot to 0.
mstore(0x0c, _HANDOVER_SLOT_SEED)
mstore(0x00, pendingOwner)
let handoverSlot := keccak256(0x0c, 0x20)
// If the handover does not exist, or has expired.
if gt(timestamp(), sload(handoverSlot)) {
mstore(0x00, 0x6f5e8818) // `NoHandoverRequest()`.
revert(0x1c, 0x04)
}
// Set the handover slot to 0.
sstore(handoverSlot, 0)
}
_setOwner(pendingOwner);
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* PUBLIC READ FUNCTIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Returns the owner of the contract.
function owner() public view virtual returns (address result) {
/// @solidity memory-safe-assembly
assembly {
result := sload(_OWNER_SLOT)
}
}
/// @dev Returns the expiry timestamp for the two-step ownership handover to `pendingOwner`.
function ownershipHandoverExpiresAt(address pendingOwner)
public
view
virtual
returns (uint256 result)
{
/// @solidity memory-safe-assembly
assembly {
// Compute the handover slot.
mstore(0x0c, _HANDOVER_SLOT_SEED)
mstore(0x00, pendingOwner)
// Load the handover slot.
result := sload(keccak256(0x0c, 0x20))
}
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* MODIFIERS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Marks a function as only callable by the owner.
modifier onlyOwner() virtual {
_checkOwner();
_;
}
}// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;
/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
/*//////////////////////////////////////////////////////////////
EVENTS
//////////////////////////////////////////////////////////////*/
event Transfer(address indexed from, address indexed to, uint256 amount);
event Approval(address indexed owner, address indexed spender, uint256 amount);
/*//////////////////////////////////////////////////////////////
METADATA STORAGE
//////////////////////////////////////////////////////////////*/
string public name;
string public symbol;
uint8 public immutable decimals;
/*//////////////////////////////////////////////////////////////
ERC20 STORAGE
//////////////////////////////////////////////////////////////*/
uint256 public totalSupply;
mapping(address => uint256) public balanceOf;
mapping(address => mapping(address => uint256)) public allowance;
/*//////////////////////////////////////////////////////////////
EIP-2612 STORAGE
//////////////////////////////////////////////////////////////*/
uint256 internal immutable INITIAL_CHAIN_ID;
bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;
mapping(address => uint256) public nonces;
/*//////////////////////////////////////////////////////////////
CONSTRUCTOR
//////////////////////////////////////////////////////////////*/
constructor(
string memory _name,
string memory _symbol,
uint8 _decimals
) {
name = _name;
symbol = _symbol;
decimals = _decimals;
INITIAL_CHAIN_ID = block.chainid;
INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
}
/*//////////////////////////////////////////////////////////////
ERC20 LOGIC
//////////////////////////////////////////////////////////////*/
function approve(address spender, uint256 amount) public virtual returns (bool) {
allowance[msg.sender][spender] = amount;
emit Approval(msg.sender, spender, amount);
return true;
}
function transfer(address to, uint256 amount) public virtual returns (bool) {
balanceOf[msg.sender] -= amount;
// Cannot overflow because the sum of all user
// balances can't exceed the max uint256 value.
unchecked {
balanceOf[to] += amount;
}
emit Transfer(msg.sender, to, amount);
return true;
}
function transferFrom(
address from,
address to,
uint256 amount
) public virtual returns (bool) {
uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.
if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;
balanceOf[from] -= amount;
// Cannot overflow because the sum of all user
// balances can't exceed the max uint256 value.
unchecked {
balanceOf[to] += amount;
}
emit Transfer(from, to, amount);
return true;
}
/*//////////////////////////////////////////////////////////////
EIP-2612 LOGIC
//////////////////////////////////////////////////////////////*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) public virtual {
require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");
// Unchecked because the only math done is incrementing
// the owner's nonce which cannot realistically overflow.
unchecked {
address recoveredAddress = ecrecover(
keccak256(
abi.encodePacked(
"\x19\x01",
DOMAIN_SEPARATOR(),
keccak256(
abi.encode(
keccak256(
"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
),
owner,
spender,
value,
nonces[owner]++,
deadline
)
)
)
),
v,
r,
s
);
require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");
allowance[recoveredAddress][spender] = value;
}
emit Approval(owner, spender, value);
}
function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
}
function computeDomainSeparator() internal view virtual returns (bytes32) {
return
keccak256(
abi.encode(
keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
keccak256(bytes(name)),
keccak256("1"),
block.chainid,
address(this)
)
);
}
/*//////////////////////////////////////////////////////////////
INTERNAL MINT/BURN LOGIC
//////////////////////////////////////////////////////////////*/
function _mint(address to, uint256 amount) internal virtual {
totalSupply += amount;
// Cannot overflow because the sum of all user
// balances can't exceed the max uint256 value.
unchecked {
balanceOf[to] += amount;
}
emit Transfer(address(0), to, amount);
}
function _burn(address from, uint256 amount) internal virtual {
balanceOf[from] -= amount;
// Cannot underflow because a user's balance
// will never be larger than the total supply.
unchecked {
totalSupply -= amount;
}
emit Transfer(from, address(0), amount);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @title ERC20 hToken Branch Contract
* @author MaiaDAO.
* @notice ERC20 hToken contract deployed with the Ulysses Omnichain Liquidity System.
* ERC20 representation of a token deposited in a Branch Chain's Port.
* @dev If this is a root hToken, this asset is minted / burned in reflection of it's origin Branch Port balance.
* Should not be burned being stored in Root Port instead if Branch hToken mint is requested.
*/
interface IERC20hToken {
/*///////////////////////////////////////////////////////////////
ERC20 LOGIC
///////////////////////////////////////////////////////////////*/
/**
* @notice Function to mint tokens.
* @param account Address of the account to receive the tokens.
* @param amount Amount of tokens to be minted.
*/
function mint(address account, uint256 amount) external;
/**
* @notice Function to burn tokens.
* @param account Address of the account to burn the tokens from.
* @param amount Amount of tokens to be burned.
*/
function burn(address account, uint256 amount) external;
/*///////////////////////////////////////////////////////////////
ERRORS
///////////////////////////////////////////////////////////////*/
/// @notice Error thrown when the Port Address is the zero address.
error InvalidPortAddress();
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {ERC20hToken} from "../token/ERC20hToken.sol";
/**
* @title ERC20hTokenBranchFactory Contract
* @author MaiaDAO
* @notice Factory contract allowing for permissionless deployment of new Branch hTokens in Branch
* Chains of Ulysses Omnichain Liquidity Protocol.
* @dev This contract is called by the chain's Core Branch Router.
*/
interface IERC20hTokenBranchFactory {
/*///////////////////////////////////////////////////////////////
hTOKEN FUNCTIONS
///////////////////////////////////////////////////////////////*/
/**
* @notice Function to create a new Branch hToken.
* @param _name Name of the Token.
* @param _symbol Symbol of the Token.
* @param _decimals Decimals of the Token.
*/
function createToken(string memory _name, string memory _symbol, uint8 _decimals)
external
returns (ERC20hToken newToken);
/*///////////////////////////////////////////////////////////////
ERRORS
///////////////////////////////////////////////////////////////*/
/// @notice Error emitted when caller is not the Core Branch Router.
error UnrecognizedCoreRouter();
/// @notice Error emitted when the Port Address is the zero address.
error UnrecognizedPort();
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {Ownable} from "lib/solady/src/auth/Ownable.sol";
import {ERC20} from "lib/solmate/src/tokens/ERC20.sol";
import {IERC20hToken} from "../interfaces/IERC20hToken.sol";
/// @title ERC20 hToken Contract
/// @author MaiaDAO
contract ERC20hToken is ERC20, Ownable, IERC20hToken {
/**
* @notice Constructor for the ERC20hToken branch or root Contract.
* @param _localPortAddress Address of the local Branch or Root Port Contract.
* @param _name Name of the Token.
* @param _symbol Symbol of the Token.
* @param _decimals Decimals of the Token.
*/
constructor(address _localPortAddress, string memory _name, string memory _symbol, uint8 _decimals)
ERC20(_name, _symbol, _decimals)
{
if (_localPortAddress == address(0)) revert InvalidPortAddress();
_initializeOwner(_localPortAddress);
}
/*///////////////////////////////////////////////////////////////
ERC20 LOGIC
///////////////////////////////////////////////////////////////*/
/// @inheritdoc IERC20hToken
function mint(address account, uint256 amount) external override onlyOwner {
_mint(account, amount);
}
/// @inheritdoc IERC20hToken
function burn(address account, uint256 amount) public override onlyOwner {
_burn(account, amount);
}
}{
"viaIR": true,
"optimizer": {
"enabled": true,
"runs": 1000000
},
"metadata": {
"bytecodeHash": "none"
},
"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":"_localPortAddress","type":"address"},{"internalType":"string","name":"_chainName","type":"string"},{"internalType":"string","name":"_chainSymbol","type":"string"},{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyInitialized","type":"error"},{"inputs":[],"name":"NewOwnerIsZeroAddress","type":"error"},{"inputs":[],"name":"NoHandoverRequest","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"UnrecognizedCoreRouter","type":"error"},{"inputs":[],"name":"UnrecognizedPort","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"cancelOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"chainName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chainSymbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"completeOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"}],"name":"createToken","outputs":[{"internalType":"contract ERC20hToken","name":"newToken","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getHTokens","outputs":[{"internalType":"contract ERC20hToken[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"hTokens","outputs":[{"internalType":"contract ERC20hToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wrappedNativeTokenAddress","type":"address"},{"internalType":"address","name":"_coreRouter","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"localCoreRouterAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"localPortAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"result","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"ownershipHandoverExpiresAt","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"requestOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"payable","type":"function"}]Contract Creation Code
60a060405234620003cc5762002e6e803803806200001d81620003d1565b9283398101608082820312620003cc576200003882620003f7565b6020838101516001600160401b039390848111620003cc57816200005e9187016200040c565b90604086015190858211620003cc5762000081606091620000899389016200040c565b9601620003f7565b6001600160a01b03959094908487161562000387578251908282116200029957600254916001948584811c941680156200037c575b8785101462000278578190601f9485811162000325575b508790858311600114620002bb57600092620002af575b5050600019600383901b1c191690851b176002555b8051928311620002995760039485548581811c911680156200028e575b8282101462000278578381116200022d575b5080928411600114620001c35750928293918392600094620001b7575b50501b9160001990841b1c19161790555b6080521680638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a36040516129ef90816200047f82396080518181816103850152818161084e0152610a910152f35b0151925038806200014d565b919083601f1981168760005284600020946000905b88838310620002125750505010620001f9575b505050811b0190556200015e565b015160001983861b60f8161c19169055388080620001eb565b858701518855909601959485019487935090810190620001d8565b86600052816000208480870160051c8201928488106200026e575b0160051c019086905b8281106200026157505062000130565b6000815501869062000251565b9250819262000248565b634e487b7160e01b600052602260045260246000fd5b90607f16906200011e565b634e487b7160e01b600052604160045260246000fd5b015190503880620000ec565b90879350601f198316916002600052896000209260005b8b8282106200030e5750508411620002f4575b505050811b0160025562000101565b015160001960f88460031b161c19169055388080620002e5565b8385015186558b97909501949384019301620002d2565b9091506002600052876000208580850160051c8201928a861062000372575b918991869594930160051c01915b82811062000362575050620000d5565b6000815585945089910162000352565b9250819262000344565b93607f1693620000be565b60405162461bcd60e51b815260048101859052601860248201527f506f727420616464726573732063616e6e6f74206265203000000000000000006044820152606490fd5b600080fd5b6040519190601f01601f191682016001600160401b038111838210176200029957604052565b51906001600160a01b0382168203620003cc57565b919080601f84011215620003cc5782516001600160401b038111620002995760209062000442601f8201601f19168301620003d1565b92818452828287010111620003cc5760005b8181106200046a57508260009394955001015290565b85810183015184820184015282016200045456fe60806040818152600491823610156200001757600080fd5b600092833560e01c9182631c93b03a1462000cf457508163256929621462000c8a578163450994c01462000c04578163485cc95514620008d757816354d1f13d14620008725781635abfaf6c14620008015781635ca2f696146200067e578163715018a614620005fc5781638da5cb5b1462000588578163c75b6a34146200048d578163d0ec47d5146200043a578163e8a0aed314620002bb578163f04e283e14620001ec578163f2fde38b1462000132575063fee81cf414620000da57600080fd5b346200012e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200012e576020916200011862000ec6565b9063389a75e1600c525281600c20549051908152f35b5080fd5b839060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200012e576200016962000ec6565b906200017462000f77565b8160601b15620001e1575073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b8360207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620002b8576200022262000ec6565b6200022c62000f77565b63389a75e1600c528082526020600c209283544211620002ad57508173ffffffffffffffffffffffffffffffffffffffff929355167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188352601cfd5b80fd5b905034620004365760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620004365767ffffffffffffffff908035828111620004325762000311903690830162000f2a565b6024358381116200042e576200032b903690840162000f2a565b6044359160ff831683036200042a5773ffffffffffffffffffffffffffffffffffffffff9485885416330362000402578651946118b7908187019287841090841117620003d6575091620003ab93918695936200112c87397f0000000000000000000000000000000000000000000000000000000000000000906200101c565b039084f0918215620003cd5760209350620003c6836200106f565b5191168152f35b513d84823e3d90fd5b8960416024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8487517f4aa0152c000000000000000000000000000000000000000000000000000000008152fd5b8680fd5b8580fd5b8480fd5b8280fd5b5050346200012e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200012e5773ffffffffffffffffffffffffffffffffffffffff60209254169051908152f35b5050346200012e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200012e5780516001805480835281855260208084019592939186907fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf690855b8181106200055e57505050826200051391038362000deb565b8451948186019282875251809352850195925b828110620005345785870386f35b835173ffffffffffffffffffffffffffffffffffffffff1687529581019592810192840162000526565b825473ffffffffffffffffffffffffffffffffffffffff16845292840192918701918701620004fa565b5050346200012e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200012e5760209073ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754915191168152f35b83807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620002b8576200063162000f77565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b828434620002b857807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620002b8578151918160035492600184811c91818616958615620007f6575b6020968785108114620007ca578899509688969785829a5291826000146200078257505060011462000721575b5050506200071d92916200070d91038562000deb565b5192828493845283019062000e81565b0390f35b9190869350600383527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b8284106200076957505050820101816200070d6200071d620006f7565b8054848a0186015288955087949093019281016200074c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168782015293151560051b860190930193508492506200070d91506200071d9050620006f7565b60248360228c7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b92607f1692620006ca565b5050346200012e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200012e576020905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b83807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620002b85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b919050346200043657807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011262000436576200091462000ec6565b906024359173ffffffffffffffffffffffffffffffffffffffff908184168094036200042e576200094462000f77565b831562000ba7576200095562000f77565b857fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35516928151937f06fdde0300000000000000000000000000000000000000000000000000000000855285858381845afa94851562000b9d57869562000b7d575b508251947f95d89b4100000000000000000000000000000000000000000000000000000000865286868481855afa91821562000b735783949596889362000b47575b506020908651948580927f313ce5670000000000000000000000000000000000000000000000000000000082525afa92831562000b3d57879362000af9575b508451936118b78086019186831067ffffffffffffffff841117620003d657509162000ab793918695936200112c87397f0000000000000000000000000000000000000000000000000000000000000000906200101c565b039084f0908115620003cd575062000acf906200106f565b7fffffffffffffffffffffffff000000000000000000000000000000000000000082541617815580f35b9092506020813d821162000b34575b8162000b176020938362000deb565b810103126200042a575160ff811681036200042a57913862000a5f565b3d915062000b08565b85513d89823e3d90fd5b602091935062000b6b903d808b833e62000b62818362000deb565b81019062000fb0565b929062000a20565b84513d89823e3d90fd5b62000b959195503d8088833e62000b62818362000deb565b9338620009de565b83513d88823e3d90fd5b60648560208551917f08c379a0000000000000000000000000000000000000000000000000000000008352820152601e60248201527f436f7265526f7574657220616464726573732063616e6e6f74206265203000006044820152fd5b905034620004365760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620004365735600154811015620004365773ffffffffffffffffffffffffffffffffffffffff906001602094527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60154169051908152f35b83807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620002b85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b8484346200012e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200012e578160025492600184811c9181861695861562000de0575b6020968785108114620007ca578899509688969785829a5291826000146200078257505060011462000d7f575050506200071d92916200070d91038562000deb565b9190869350600283527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace5b82841062000dc757505050820101816200070d6200071d620006f7565b8054848a01860152889550879490930192810162000daa565b92607f169262000d3d565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111762000e2d57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60005b83811062000e705750506000910152565b818101518382015260200162000e5f565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209362000ebf8151809281875287808801910162000e5c565b0116010190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820362000eea57565b600080fd5b67ffffffffffffffff811162000e2d57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b81601f8201121562000eea5780359062000f448262000eef565b9262000f54604051948562000deb565b8284526020838301011162000eea57816000926020809301838601378301015290565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754330362000fa257565b6382b429006000526004601cfd5b60208183031262000eea5780519067ffffffffffffffff821162000eea570181601f8201121562000eea57805162000fe88162000eef565b9262000ff8604051948562000deb565b8184526020828401011162000eea5762001019916020808501910162000e5c565b90565b9262001068906200105960609473ffffffffffffffffffffffffffffffffffffffff60ff9599989916875260806020880152608087019062000e81565b90858203604087015262000e81565b9416910152565b6001546801000000000000000081101562000e2d576001810180600155811015620010fc5773ffffffffffffffffffffffffffffffffffffffff9060016000527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60191167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfe60e0604090808252346200049757620018b780380380916200002282856200049c565b83398101608082820312620004975781516001600160a01b038116929083900362000497576020818101516001600160401b0392908381116200049757846200006d918301620004c0565b938682015184811162000497576060916200008a918401620004c0565b91015160ff811681036200049757845194848611620004815760009580620000b3885462000537565b92601f9384811162000430575b508690848311600114620003c8578992620003bc575b50508160011b916000199060031b1c19161786555b825190858211620003a857819060019462000107865462000537565b82811162000353575b5086918311600114620002ef578892620002e3575b5050600019600383901b1c191690831b1782555b6080524660a05285518454918186620001528562000537565b9283835286830195878282169182600014620002c357505060011462000283575b5062000182925003826200049c565b519020908551908101917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8352868201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a0815260c0810192818410908411176200026f5782865251902060c052821562000260575081638b78c6d819557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a351611342908162000575823960805181610c2d015260a0518161115d015260c051816111840152f35b63f0e68b9d60e01b8152600490fd5b634e487b7160e01b84526041600452602484fd5b8691508880528189209089915b858310620002aa5750506200018293508201013862000173565b8054838801850152869450889390920191810162000290565b60ff191688526200018295151560051b8501019250389150620001739050565b01519050388062000125565b8589528689208694509190601f1984168a5b898282106200033c575050841162000322575b505050811b01825562000139565b015160001960f88460031b161c1916905538808062000314565b838501518655899790950194938401930162000301565b909192508589528689208380860160051c8201928987106200039e575b91869589929594930160051c01915b8281106200038f57505062000110565b8b81558695508891016200037f565b9250819262000370565b634e487b7160e01b87526041600452602487fd5b015190503880620000d6565b898052878a209250601f1984168a5b8982821062000419575050908460019594939210620003ff575b505050811b018655620000eb565b015160001960f88460031b161c19169055388080620003f1565b6001859682939686015181550195019301620003d7565b9091508880528689208480850160051c82019289861062000477575b9085949392910160051c01905b818110620004685750620000c0565b8a815584935060010162000459565b925081926200044c565b634e487b7160e01b600052604160045260246000fd5b600080fd5b601f909101601f19168101906001600160401b038211908210176200048157604052565b919080601f8401121562000497578251906001600160401b038211620004815760405191602091620004fc601f8301601f19168401856200049c565b818452828287010111620004975760005b8181106200052357508260009394955001015290565b85810183015184820184015282016200050d565b90600182811c9216801562000569575b60208310146200055357565b634e487b7160e01b600052602260045260246000fd5b91607f16916200054756fe608060408181526004918236101561001657600080fd5b600092833560e01c91826306fdde0314610eac57508163095ea7b314610e1157816318160ddd14610dd457816323b872dd14610cba5781632569296214610c51578163313ce56714610bf55781633644e51514610bb357816340c10f1914610adb57816354d1f13d14610a7757816370a0823114610a15578163715018a6146109965781637ecebe00146109345781638da5cb5b146108c257816395d89b41146107a7578382639dc29fac146106ff57508163a9059cbb14610652578163d505accf14610357578163dd62ed3e146102df578163f04e283e14610216578163f2fde38b14610162575063fee81cf41461010e57600080fd5b3461015e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e57602091610148611099565b9063389a75e1600c525281600c20549051908152f35b5080fd5b839060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e57610196611099565b9061019f6110e4565b8160601b1561020b575073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b8360207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102dc57610249611099565b6102516110e4565b63389a75e1600c528082526020600c2092835442116102d157508173ffffffffffffffffffffffffffffffffffffffff929355167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188352601cfd5b80fd5b90503461035357817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035357602092829161031c611099565b6103246110c1565b9173ffffffffffffffffffffffffffffffffffffffff8092168452865283832091168252845220549051908152f35b8280fd5b83833461015e5760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e57610390611099565b906103996110c1565b91604435606435926084359260ff841680940361064e574285106105f1576103bf611158565b9573ffffffffffffffffffffffffffffffffffffffff8092169586895260209560058752848a209889549960018b01905585519285898501957f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c987528b89870152169a8b606086015288608086015260a085015260c084015260c0835260e0830167ffffffffffffffff94848210868311176105c457818852845190206101008501927f19010000000000000000000000000000000000000000000000000000000000008452610102860152610122850152604281526101608401948186109086111761059857848752519020835261018082015260a4356101a082015260c4356101c0909101528780528490889060809060015afa1561058e578651169687151580610585575b1561052a5786977f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259596975283528087208688528352818188205551908152a380f35b8360649251917f08c379a0000000000000000000000000000000000000000000000000000000008352820152600e60248201527f494e56414c49445f5349474e45520000000000000000000000000000000000006044820152fd5b508488146104e7565b81513d88823e3d90fd5b60248c60418f7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b5060248c60418f7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b60648860208451917f08c379a0000000000000000000000000000000000000000000000000000000008352820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152fd5b8680fd5b50503461015e57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e5760209161068d611099565b8273ffffffffffffffffffffffffffffffffffffffff60243592338552600387528285206106bc85825461111c565b90551692838152600386522081815401905582519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef843392a35160018152f35b8084346107a457807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126107a4577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602061075a611099565b73ffffffffffffffffffffffffffffffffffffffff6024359161077b6110e4565b16938486526003835280862061079283825461111c565b9055816002540360025551908152a380f35b50fd5b50503461015e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e578051908260018054916107e983610f70565b8086529282811690811561087c5750600114610820575b5050506108128261081c940383610fc3565b5191829182611033565b0390f35b94508085527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b8286106108645750505061081282602061081c9582010194610800565b80546020878701810191909152909501948101610847565b61081c9750869350602092506108129491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001682840152151560051b82010194610800565b50503461015e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e5760209073ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754915191168152f35b50503461015e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e578060209273ffffffffffffffffffffffffffffffffffffffff610986611099565b1681526005845220549051908152f35b83807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102dc576109c86110e4565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b50503461015e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e578060209273ffffffffffffffffffffffffffffffffffffffff610a67611099565b1681526003845220549051908152f35b83807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102dc5763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b90503461035357817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035357610b13611099565b60243591610b1f6110e4565b60025490838201809211610b875750849273ffffffffffffffffffffffffffffffffffffffff7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9360209360025516948585526003835280852082815401905551908152a380f35b8560116024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b50503461015e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e57602090610bee611158565b9051908152f35b50503461015e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e576020905160ff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b83807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102dc5763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b8284346102dc5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102dc57610cf3611099565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef610d1c6110c1565b946044358573ffffffffffffffffffffffffffffffffffffffff80951694858752602098848a958652838920338a52865283892054857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610db1575b50505086885260038552828820610d9285825461111c565b9055169586815260038452208181540190558551908152a35160018152f35b610dba9161111c565b90888a528652838920338a528652838920558a8085610d7a565b50503461015e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e576020906002549051908152f35b90503461035357817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035357602092610e4c611099565b9183602435928392338252875273ffffffffffffffffffffffffffffffffffffffff8282209516948582528752205582519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925843392a35160018152f35b8490843461035357827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035357828054610ee981610f70565b8085529160019180831690811561087c5750600114610f14575050506108128261081c940383610fc3565b80809650527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5635b828610610f585750505061081282602061081c9582010194610800565b80546020878701810191909152909501948101610f3b565b90600182811c92168015610fb9575b6020831014610f8a57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691610f7f565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761100457604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60208082528251818301819052939260005b858110611085575050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006040809697860101520116010190565b818101830151848201604001528201611045565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036110bc57565b600080fd5b6024359073ffffffffffffffffffffffffffffffffffffffff821682036110bc57565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754330361110e57565b6382b429006000526004601cfd5b9190820391821161112957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000467f0000000000000000000000000000000000000000000000000000000000000000036111a657507f000000000000000000000000000000000000000000000000000000000000000090565b604051815482916111b682610f70565b80825281602094858201946001908782821691826000146112f95750506001146112a0575b506111e892500382610fc3565b51902091604051918201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f845260408301527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a083015260a0825260c082019082821067ffffffffffffffff831117611273575060405251902090565b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526041600452fd5b87805286915087907f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5635b8583106112e15750506111e89350820101386111db565b805483880185015286945088939092019181016112ca565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001688526111e895151560051b85010192503891506111db905056fea164736f6c6343000813000aa164736f6c6343000813000a0000000000000000000000000000151d008235a6cc00004f00fa2bdf9df95400000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000009f1a52db8b0465cf189206b3a36303cd415a199a0000000000000000000000000000000000000000000000000000000000000005536f6e696300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015300000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040818152600491823610156200001757600080fd5b600092833560e01c9182631c93b03a1462000cf457508163256929621462000c8a578163450994c01462000c04578163485cc95514620008d757816354d1f13d14620008725781635abfaf6c14620008015781635ca2f696146200067e578163715018a614620005fc5781638da5cb5b1462000588578163c75b6a34146200048d578163d0ec47d5146200043a578163e8a0aed314620002bb578163f04e283e14620001ec578163f2fde38b1462000132575063fee81cf414620000da57600080fd5b346200012e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200012e576020916200011862000ec6565b9063389a75e1600c525281600c20549051908152f35b5080fd5b839060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200012e576200016962000ec6565b906200017462000f77565b8160601b15620001e1575073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b8360207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620002b8576200022262000ec6565b6200022c62000f77565b63389a75e1600c528082526020600c209283544211620002ad57508173ffffffffffffffffffffffffffffffffffffffff929355167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188352601cfd5b80fd5b905034620004365760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620004365767ffffffffffffffff908035828111620004325762000311903690830162000f2a565b6024358381116200042e576200032b903690840162000f2a565b6044359160ff831683036200042a5773ffffffffffffffffffffffffffffffffffffffff9485885416330362000402578651946118b7908187019287841090841117620003d6575091620003ab93918695936200112c87397f0000000000000000000000000000151d008235a6cc00004f00fa2bdf9df95400906200101c565b039084f0918215620003cd5760209350620003c6836200106f565b5191168152f35b513d84823e3d90fd5b8960416024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8487517f4aa0152c000000000000000000000000000000000000000000000000000000008152fd5b8680fd5b8580fd5b8480fd5b8280fd5b5050346200012e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200012e5773ffffffffffffffffffffffffffffffffffffffff60209254169051908152f35b5050346200012e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200012e5780516001805480835281855260208084019592939186907fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf690855b8181106200055e57505050826200051391038362000deb565b8451948186019282875251809352850195925b828110620005345785870386f35b835173ffffffffffffffffffffffffffffffffffffffff1687529581019592810192840162000526565b825473ffffffffffffffffffffffffffffffffffffffff16845292840192918701918701620004fa565b5050346200012e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200012e5760209073ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754915191168152f35b83807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620002b8576200063162000f77565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b828434620002b857807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620002b8578151918160035492600184811c91818616958615620007f6575b6020968785108114620007ca578899509688969785829a5291826000146200078257505060011462000721575b5050506200071d92916200070d91038562000deb565b5192828493845283019062000e81565b0390f35b9190869350600383527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b8284106200076957505050820101816200070d6200071d620006f7565b8054848a0186015288955087949093019281016200074c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168782015293151560051b860190930193508492506200070d91506200071d9050620006f7565b60248360228c7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b92607f1692620006ca565b5050346200012e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200012e576020905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000151d008235a6cc00004f00fa2bdf9df95400168152f35b83807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620002b85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b919050346200043657807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011262000436576200091462000ec6565b906024359173ffffffffffffffffffffffffffffffffffffffff908184168094036200042e576200094462000f77565b831562000ba7576200095562000f77565b857fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35516928151937f06fdde0300000000000000000000000000000000000000000000000000000000855285858381845afa94851562000b9d57869562000b7d575b508251947f95d89b4100000000000000000000000000000000000000000000000000000000865286868481855afa91821562000b735783949596889362000b47575b506020908651948580927f313ce5670000000000000000000000000000000000000000000000000000000082525afa92831562000b3d57879362000af9575b508451936118b78086019186831067ffffffffffffffff841117620003d657509162000ab793918695936200112c87397f0000000000000000000000000000151d008235a6cc00004f00fa2bdf9df95400906200101c565b039084f0908115620003cd575062000acf906200106f565b7fffffffffffffffffffffffff000000000000000000000000000000000000000082541617815580f35b9092506020813d821162000b34575b8162000b176020938362000deb565b810103126200042a575160ff811681036200042a57913862000a5f565b3d915062000b08565b85513d89823e3d90fd5b602091935062000b6b903d808b833e62000b62818362000deb565b81019062000fb0565b929062000a20565b84513d89823e3d90fd5b62000b959195503d8088833e62000b62818362000deb565b9338620009de565b83513d88823e3d90fd5b60648560208551917f08c379a0000000000000000000000000000000000000000000000000000000008352820152601e60248201527f436f7265526f7574657220616464726573732063616e6e6f74206265203000006044820152fd5b905034620004365760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620004365735600154811015620004365773ffffffffffffffffffffffffffffffffffffffff906001602094527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60154169051908152f35b83807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620002b85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b8484346200012e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200012e578160025492600184811c9181861695861562000de0575b6020968785108114620007ca578899509688969785829a5291826000146200078257505060011462000d7f575050506200071d92916200070d91038562000deb565b9190869350600283527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace5b82841062000dc757505050820101816200070d6200071d620006f7565b8054848a01860152889550879490930192810162000daa565b92607f169262000d3d565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111762000e2d57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60005b83811062000e705750506000910152565b818101518382015260200162000e5f565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209362000ebf8151809281875287808801910162000e5c565b0116010190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820362000eea57565b600080fd5b67ffffffffffffffff811162000e2d57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b81601f8201121562000eea5780359062000f448262000eef565b9262000f54604051948562000deb565b8284526020838301011162000eea57816000926020809301838601378301015290565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754330362000fa257565b6382b429006000526004601cfd5b60208183031262000eea5780519067ffffffffffffffff821162000eea570181601f8201121562000eea57805162000fe88162000eef565b9262000ff8604051948562000deb565b8184526020828401011162000eea5762001019916020808501910162000e5c565b90565b9262001068906200105960609473ffffffffffffffffffffffffffffffffffffffff60ff9599989916875260806020880152608087019062000e81565b90858203604087015262000e81565b9416910152565b6001546801000000000000000081101562000e2d576001810180600155811015620010fc5773ffffffffffffffffffffffffffffffffffffffff9060016000527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60191167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfe60e0604090808252346200049757620018b780380380916200002282856200049c565b83398101608082820312620004975781516001600160a01b038116929083900362000497576020818101516001600160401b0392908381116200049757846200006d918301620004c0565b938682015184811162000497576060916200008a918401620004c0565b91015160ff811681036200049757845194848611620004815760009580620000b3885462000537565b92601f9384811162000430575b508690848311600114620003c8578992620003bc575b50508160011b916000199060031b1c19161786555b825190858211620003a857819060019462000107865462000537565b82811162000353575b5086918311600114620002ef578892620002e3575b5050600019600383901b1c191690831b1782555b6080524660a05285518454918186620001528562000537565b9283835286830195878282169182600014620002c357505060011462000283575b5062000182925003826200049c565b519020908551908101917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8352868201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a0815260c0810192818410908411176200026f5782865251902060c052821562000260575081638b78c6d819557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a351611342908162000575823960805181610c2d015260a0518161115d015260c051816111840152f35b63f0e68b9d60e01b8152600490fd5b634e487b7160e01b84526041600452602484fd5b8691508880528189209089915b858310620002aa5750506200018293508201013862000173565b8054838801850152869450889390920191810162000290565b60ff191688526200018295151560051b8501019250389150620001739050565b01519050388062000125565b8589528689208694509190601f1984168a5b898282106200033c575050841162000322575b505050811b01825562000139565b015160001960f88460031b161c1916905538808062000314565b838501518655899790950194938401930162000301565b909192508589528689208380860160051c8201928987106200039e575b91869589929594930160051c01915b8281106200038f57505062000110565b8b81558695508891016200037f565b9250819262000370565b634e487b7160e01b87526041600452602487fd5b015190503880620000d6565b898052878a209250601f1984168a5b8982821062000419575050908460019594939210620003ff575b505050811b018655620000eb565b015160001960f88460031b161c19169055388080620003f1565b6001859682939686015181550195019301620003d7565b9091508880528689208480850160051c82019289861062000477575b9085949392910160051c01905b818110620004685750620000c0565b8a815584935060010162000459565b925081926200044c565b634e487b7160e01b600052604160045260246000fd5b600080fd5b601f909101601f19168101906001600160401b038211908210176200048157604052565b919080601f8401121562000497578251906001600160401b038211620004815760405191602091620004fc601f8301601f19168401856200049c565b818452828287010111620004975760005b8181106200052357508260009394955001015290565b85810183015184820184015282016200050d565b90600182811c9216801562000569575b60208310146200055357565b634e487b7160e01b600052602260045260246000fd5b91607f16916200054756fe608060408181526004918236101561001657600080fd5b600092833560e01c91826306fdde0314610eac57508163095ea7b314610e1157816318160ddd14610dd457816323b872dd14610cba5781632569296214610c51578163313ce56714610bf55781633644e51514610bb357816340c10f1914610adb57816354d1f13d14610a7757816370a0823114610a15578163715018a6146109965781637ecebe00146109345781638da5cb5b146108c257816395d89b41146107a7578382639dc29fac146106ff57508163a9059cbb14610652578163d505accf14610357578163dd62ed3e146102df578163f04e283e14610216578163f2fde38b14610162575063fee81cf41461010e57600080fd5b3461015e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e57602091610148611099565b9063389a75e1600c525281600c20549051908152f35b5080fd5b839060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e57610196611099565b9061019f6110e4565b8160601b1561020b575073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b8360207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102dc57610249611099565b6102516110e4565b63389a75e1600c528082526020600c2092835442116102d157508173ffffffffffffffffffffffffffffffffffffffff929355167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188352601cfd5b80fd5b90503461035357817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035357602092829161031c611099565b6103246110c1565b9173ffffffffffffffffffffffffffffffffffffffff8092168452865283832091168252845220549051908152f35b8280fd5b83833461015e5760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e57610390611099565b906103996110c1565b91604435606435926084359260ff841680940361064e574285106105f1576103bf611158565b9573ffffffffffffffffffffffffffffffffffffffff8092169586895260209560058752848a209889549960018b01905585519285898501957f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c987528b89870152169a8b606086015288608086015260a085015260c084015260c0835260e0830167ffffffffffffffff94848210868311176105c457818852845190206101008501927f19010000000000000000000000000000000000000000000000000000000000008452610102860152610122850152604281526101608401948186109086111761059857848752519020835261018082015260a4356101a082015260c4356101c0909101528780528490889060809060015afa1561058e578651169687151580610585575b1561052a5786977f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259596975283528087208688528352818188205551908152a380f35b8360649251917f08c379a0000000000000000000000000000000000000000000000000000000008352820152600e60248201527f494e56414c49445f5349474e45520000000000000000000000000000000000006044820152fd5b508488146104e7565b81513d88823e3d90fd5b60248c60418f7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b5060248c60418f7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b60648860208451917f08c379a0000000000000000000000000000000000000000000000000000000008352820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152fd5b8680fd5b50503461015e57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e5760209161068d611099565b8273ffffffffffffffffffffffffffffffffffffffff60243592338552600387528285206106bc85825461111c565b90551692838152600386522081815401905582519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef843392a35160018152f35b8084346107a457807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126107a4577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602061075a611099565b73ffffffffffffffffffffffffffffffffffffffff6024359161077b6110e4565b16938486526003835280862061079283825461111c565b9055816002540360025551908152a380f35b50fd5b50503461015e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e578051908260018054916107e983610f70565b8086529282811690811561087c5750600114610820575b5050506108128261081c940383610fc3565b5191829182611033565b0390f35b94508085527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b8286106108645750505061081282602061081c9582010194610800565b80546020878701810191909152909501948101610847565b61081c9750869350602092506108129491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001682840152151560051b82010194610800565b50503461015e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e5760209073ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754915191168152f35b50503461015e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e578060209273ffffffffffffffffffffffffffffffffffffffff610986611099565b1681526005845220549051908152f35b83807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102dc576109c86110e4565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b50503461015e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e578060209273ffffffffffffffffffffffffffffffffffffffff610a67611099565b1681526003845220549051908152f35b83807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102dc5763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b90503461035357817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035357610b13611099565b60243591610b1f6110e4565b60025490838201809211610b875750849273ffffffffffffffffffffffffffffffffffffffff7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9360209360025516948585526003835280852082815401905551908152a380f35b8560116024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b50503461015e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e57602090610bee611158565b9051908152f35b50503461015e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e576020905160ff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b83807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102dc5763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b8284346102dc5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102dc57610cf3611099565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef610d1c6110c1565b946044358573ffffffffffffffffffffffffffffffffffffffff80951694858752602098848a958652838920338a52865283892054857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610db1575b50505086885260038552828820610d9285825461111c565b9055169586815260038452208181540190558551908152a35160018152f35b610dba9161111c565b90888a528652838920338a528652838920558a8085610d7a565b50503461015e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e576020906002549051908152f35b90503461035357817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035357602092610e4c611099565b9183602435928392338252875273ffffffffffffffffffffffffffffffffffffffff8282209516948582528752205582519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925843392a35160018152f35b8490843461035357827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035357828054610ee981610f70565b8085529160019180831690811561087c5750600114610f14575050506108128261081c940383610fc3565b80809650527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5635b828610610f585750505061081282602061081c9582010194610800565b80546020878701810191909152909501948101610f3b565b90600182811c92168015610fb9575b6020831014610f8a57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691610f7f565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761100457604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60208082528251818301819052939260005b858110611085575050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006040809697860101520116010190565b818101830151848201604001528201611045565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036110bc57565b600080fd5b6024359073ffffffffffffffffffffffffffffffffffffffff821682036110bc57565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754330361110e57565b6382b429006000526004601cfd5b9190820391821161112957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000467f0000000000000000000000000000000000000000000000000000000000000000036111a657507f000000000000000000000000000000000000000000000000000000000000000090565b604051815482916111b682610f70565b80825281602094858201946001908782821691826000146112f95750506001146112a0575b506111e892500382610fc3565b51902091604051918201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f845260408301527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a083015260a0825260c082019082821067ffffffffffffffff831117611273575060405251902090565b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526041600452fd5b87805286915087907f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5635b8583106112e15750506111e89350820101386111db565b805483880185015286945088939092019181016112ca565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001688526111e895151560051b85010192503891506111db905056fea164736f6c6343000813000aa164736f6c6343000813000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000151d008235a6cc00004f00fa2bdf9df95400000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000009f1a52db8b0465cf189206b3a36303cd415a199a0000000000000000000000000000000000000000000000000000000000000005536f6e696300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015300000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _localPortAddress (address): 0x0000151d008235A6cC00004F00FA2bDF9dF95400
Arg [1] : _chainName (string): Sonic
Arg [2] : _chainSymbol (string): S
Arg [3] : _owner (address): 0x9f1A52dB8b0465cf189206B3A36303cd415A199a
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000151d008235a6cc00004f00fa2bdf9df95400
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [3] : 0000000000000000000000009f1a52db8b0465cf189206b3a36303cd415a199a
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [5] : 536f6e6963000000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [7] : 5300000000000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in S
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.