Overview
FRAX Balance | FXTL Balance
FRAX Value
$0.00Latest 2 from a total of 2 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Initialize | 16593180 | 347 days ago | IN | 0 FRAX | 0.00000124 | ||||
| 0x60a06040 | 16593104 | 347 days ago | IN | 0 FRAX | 0.00000563 |
Latest 8 internal transactions
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 20262350 | 263 days ago | Contract Creation | 0 FRAX | |||
| 20261785 | 263 days ago | Contract Creation | 0 FRAX | |||
| 20261752 | 263 days ago | Contract Creation | 0 FRAX | |||
| 20261696 | 263 days ago | Contract Creation | 0 FRAX | |||
| 20261656 | 263 days ago | Contract Creation | 0 FRAX | |||
| 20261635 | 263 days ago | Contract Creation | 0 FRAX | |||
| 17743465 | 321 days ago | Contract Creation | 0 FRAX | |||
| 16593180 | 347 days ago | Contract Creation | 0 FRAX |
Cross-Chain Transactions
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;
/*///////////////////////////////////////////////////////////////
CONSTANTS
///////////////////////////////////////////////////////////////*/
/// Fraxtal Incentives
address public constant DELEGATION_REGISTRY = 0x098c837FeF2e146e96ceAF58A10F68Fc6326DC4C;
address public constant DELEGATEE = 0x88E07a0457aA113AB910103d9a01217315DA1C98;
/*///////////////////////////////////////////////////////////////
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);
/// Fraxtal Incentives
DELEGATION_REGISTRY.call(abi.encodeWithSignature("setDelegationForSelf(address)", DELEGATEE));
DELEGATION_REGISTRY.call(abi.encodeWithSignature("disableSelfManagingDelegations()"));
DELEGATION_REGISTRY.call(abi.encodeWithSignature("disableDelegationManagement()"));
}
/*///////////////////////////////////////////////////////////////
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":"DELEGATEE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DELEGATION_REGISTRY","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"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
60a060409080825234620004a2576200305f8038038091620000228285620004c3565b83398101608082820312620004a2576200003c82620004e7565b60208381015190936001600160401b0393929091848111620004a257836200006691840162000518565b928683015190858211620004a257620000886060916200009093860162000518565b9301620004e7565b6001600160a01b0393909290828516156200045e5780518681116200028f57600254906001928383811c9316801562000453575b8a84101462000363578190601f93848111620003fc575b508a90848311600114620003905760009262000384575b5050600019600383901b1c191690831b176002555b8251908782116200028f5760039384548481811c9116801562000379575b8b821014620003635782811162000318575b5089918311600114620002b157928293918392600094620002a5575b50501b9160001990841b1c19161790555b6080521680638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3825191808301906302b8a21d60e01b82527388e07a0457aa113ab910103d9a01217315da1c986024850152602484526060840192848410908411176200028f576000808095819588525173098c837fef2e146e96ceaf58a10f68fc6326dc4c9482865af1506200020562000582565b5082808651838101906325ce9a3760e01b8252600481526200022781620004a7565b519082865af1506200023862000582565b5084516353f340a360e11b9181019182526004815283906200025a81620004a7565b51925af1506200026962000582565b5051612aa79081620005b8823960805181818161039d015281816108660152610af80152f35b634e487b7160e01b600052604160045260246000fd5b01519250388062000153565b90601f1983169185600052838b6000209360005b8d88838310620003005750505010620002e7575b505050811b01905562000164565b015160001983861b60f8161c19169055388080620002d9565b868601518855909601959485019487935001620002c5565b856000528a6000208380860160051c8201928d871062000359575b0160051c019085905b8281106200034c57505062000137565b600081550185906200033c565b9250819262000333565b634e487b7160e01b600052602260045260246000fd5b90607f169062000125565b015190503880620000f2565b90859350601f1983169160026000528c600020928d6000905b828210620003e45750508411620003ca575b505050811b0160025562000107565b015160001960f88460031b161c19169055388080620003bb565b83850151865589979095019493840193018e620003a9565b90915060026000528a6000208480850160051c8201928d861062000449575b918791869594930160051c01915b82811062000439575050620000db565b6000815585945087910162000429565b925081926200041b565b92607f1692620000c4565b875162461bcd60e51b815260048101889052601860248201527f506f727420616464726573732063616e6e6f74206265203000000000000000006044820152606490fd5b600080fd5b604081019081106001600160401b038211176200028f57604052565b601f909101601f19168101906001600160401b038211908210176200028f57604052565b51906001600160a01b0382168203620004a257565b6001600160401b0381116200028f57601f01601f191660200190565b919080601f84011215620004a2578251906200053482620004fc565b91620005446040519384620004c3565b808352602091828287010111620004a25760005b8181106200056e57508260009394955001015290565b858101830151848201840152820162000558565b3d15620005b2573d906200059682620004fc565b91620005a66040519384620004c3565b82523d6000602084013e565b60609056fe60806040818152600491823610156200001757600080fd5b600092833560e01c91826310099f1f1462000e55575081631c93b03a1462000d5b578163256929621462000cf1578163450994c01462000c6b578163485cc955146200093e5781634daadff714620008ef57816354d1f13d146200088a5781635abfaf6c14620008195781635ca2f6961462000696578163715018a614620006145781638da5cb5b14620005a0578163c75b6a3414620004a5578163d0ec47d51462000452578163e8a0aed314620002d3578163f04e283e1462000204578163f2fde38b146200014a575063fee81cf414620000f257600080fd5b34620001465760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011262000146576020916200013062000f7e565b9063389a75e1600c525281600c20549051908152f35b5080fd5b839060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011262000146576200018162000f7e565b906200018c6200102f565b8160601b15620001f9575073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b8360207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620002d0576200023a62000f7e565b620002446200102f565b63389a75e1600c528082526020600c209283544211620002c557508173ffffffffffffffffffffffffffffffffffffffff929355167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188352601cfd5b80fd5b9050346200044e5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200044e5767ffffffffffffffff9080358281116200044a5762000329903690830162000fe2565b602435838111620004465762000343903690840162000fe2565b6044359160ff83168303620004425773ffffffffffffffffffffffffffffffffffffffff948588541633036200041a578651946118b7908187019287841090841117620003ee575091620003c39391869593620011e487397f000000000000000000000000000000000000000000000000000000000000000090620010d4565b039084f0918215620003e55760209350620003de8362001127565b5191168152f35b513d84823e3d90fd5b8960416024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8487517f4aa0152c000000000000000000000000000000000000000000000000000000008152fd5b8680fd5b8580fd5b8480fd5b8280fd5b5050346200014657817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620001465773ffffffffffffffffffffffffffffffffffffffff60209254169051908152f35b5050346200014657817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620001465780516001805480835281855260208084019592939186907fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf690855b8181106200057657505050826200052b91038362000ea3565b8451948186019282875251809352850195925b8281106200054c5785870386f35b835173ffffffffffffffffffffffffffffffffffffffff168752958101959281019284016200053e565b825473ffffffffffffffffffffffffffffffffffffffff1684529284019291870191870162000512565b5050346200014657817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620001465760209073ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754915191168152f35b83807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620002d057620006496200102f565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b828434620002d057807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620002d0578151918160035492600184811c918186169586156200080e575b6020968785108114620007e2578899509688969785829a5291826000146200079a57505060011462000739575b5050506200073592916200072591038562000ea3565b5192828493845283019062000f39565b0390f35b9190869350600383527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b82841062000781575050508201018162000725620007356200070f565b8054848a01860152889550879490930192810162000764565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168782015293151560051b860190930193508492506200072591506200073590506200070f565b60248360228c7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b92607f1692620006e2565b5050346200014657817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011262000146576020905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b83807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620002d05763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b5050346200014657817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011262000146576020905173098c837fef2e146e96ceaf58a10f68fc6326dc4c8152f35b919050346200044e57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200044e576200097b62000f7e565b906024359173ffffffffffffffffffffffffffffffffffffffff908184168094036200044657620009ab6200102f565b831562000c0e57620009bc6200102f565b857fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35516928151937f06fdde0300000000000000000000000000000000000000000000000000000000855285858381845afa94851562000c0457869562000be4575b508251947f95d89b4100000000000000000000000000000000000000000000000000000000865286868481855afa91821562000bda5783949596889362000bae575b506020908651948580927f313ce5670000000000000000000000000000000000000000000000000000000082525afa92831562000ba457879362000b60575b508451936118b78086019186831067ffffffffffffffff841117620003ee57509162000b1e9391869593620011e487397f000000000000000000000000000000000000000000000000000000000000000090620010d4565b039084f0908115620003e5575062000b369062001127565b7fffffffffffffffffffffffff000000000000000000000000000000000000000082541617815580f35b9092506020813d821162000b9b575b8162000b7e6020938362000ea3565b8101031262000442575160ff811681036200044257913862000ac6565b3d915062000b6f565b85513d89823e3d90fd5b602091935062000bd2903d808b833e62000bc9818362000ea3565b81019062001068565b929062000a87565b84513d89823e3d90fd5b62000bfc9195503d8088833e62000bc9818362000ea3565b933862000a45565b83513d88823e3d90fd5b60648560208551917f08c379a0000000000000000000000000000000000000000000000000000000008352820152601e60248201527f436f7265526f7574657220616464726573732063616e6e6f74206265203000006044820152fd5b9050346200044e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200044e57356001548110156200044e5773ffffffffffffffffffffffffffffffffffffffff906001602094527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60154169051908152f35b83807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620002d05763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b828434620002d057807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620002d0578151918160025492600184811c9181861695861562000e4a575b6020968785108114620007e2578899509688969785829a5291826000146200079a57505060011462000de9575050506200073592916200072591038562000ea3565b9190869350600283527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace5b82841062000e31575050508201018162000725620007356200070f565b8054848a01860152889550879490930192810162000e14565b92607f169262000da7565b8490346200014657817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200014657807388e07a0457aa113ab910103d9a01217315da1c9860209252f35b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111762000ee557604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60005b83811062000f285750506000910152565b818101518382015260200162000f17565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209362000f778151809281875287808801910162000f14565b0116010190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820362000fa257565b600080fd5b67ffffffffffffffff811162000ee557601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b81601f8201121562000fa25780359062000ffc8262000fa7565b926200100c604051948562000ea3565b8284526020838301011162000fa257816000926020809301838601378301015290565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739275433036200105a57565b6382b429006000526004601cfd5b60208183031262000fa25780519067ffffffffffffffff821162000fa2570181601f8201121562000fa2578051620010a08162000fa7565b92620010b0604051948562000ea3565b8184526020828401011162000fa257620010d1916020808501910162000f14565b90565b9262001120906200111160609473ffffffffffffffffffffffffffffffffffffffff60ff9599989916875260806020880152608087019062000f39565b90858203604087015262000f39565b9416910152565b6001546801000000000000000081101562000ee5576001810180600155811015620011b45773ffffffffffffffffffffffffffffffffffffffff9060016000527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60191167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfe60e0604090808252346200049757620018b780380380916200002282856200049c565b83398101608082820312620004975781516001600160a01b038116929083900362000497576020818101516001600160401b0392908381116200049757846200006d918301620004c0565b938682015184811162000497576060916200008a918401620004c0565b91015160ff811681036200049757845194848611620004815760009580620000b3885462000537565b92601f9384811162000430575b508690848311600114620003c8578992620003bc575b50508160011b916000199060031b1c19161786555b825190858211620003a857819060019462000107865462000537565b82811162000353575b5086918311600114620002ef578892620002e3575b5050600019600383901b1c191690831b1782555b6080524660a05285518454918186620001528562000537565b9283835286830195878282169182600014620002c357505060011462000283575b5062000182925003826200049c565b519020908551908101917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8352868201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a0815260c0810192818410908411176200026f5782865251902060c052821562000260575081638b78c6d819557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a351611342908162000575823960805181610c2d015260a0518161115d015260c051816111840152f35b63f0e68b9d60e01b8152600490fd5b634e487b7160e01b84526041600452602484fd5b8691508880528189209089915b858310620002aa5750506200018293508201013862000173565b8054838801850152869450889390920191810162000290565b60ff191688526200018295151560051b8501019250389150620001739050565b01519050388062000125565b8589528689208694509190601f1984168a5b898282106200033c575050841162000322575b505050811b01825562000139565b015160001960f88460031b161c1916905538808062000314565b838501518655899790950194938401930162000301565b909192508589528689208380860160051c8201928987106200039e575b91869589929594930160051c01915b8281106200038f57505062000110565b8b81558695508891016200037f565b9250819262000370565b634e487b7160e01b87526041600452602487fd5b015190503880620000d6565b898052878a209250601f1984168a5b8982821062000419575050908460019594939210620003ff575b505050811b018655620000eb565b015160001960f88460031b161c19169055388080620003f1565b6001859682939686015181550195019301620003d7565b9091508880528689208480850160051c82019289861062000477575b9085949392910160051c01905b818110620004685750620000c0565b8a815584935060010162000459565b925081926200044c565b634e487b7160e01b600052604160045260246000fd5b600080fd5b601f909101601f19168101906001600160401b038211908210176200048157604052565b919080601f8401121562000497578251906001600160401b038211620004815760405191602091620004fc601f8301601f19168401856200049c565b818452828287010111620004975760005b8181106200052357508260009394955001015290565b85810183015184820184015282016200050d565b90600182811c9216801562000569575b60208310146200055357565b634e487b7160e01b600052602260045260246000fd5b91607f16916200054756fe608060408181526004918236101561001657600080fd5b600092833560e01c91826306fdde0314610eac57508163095ea7b314610e1157816318160ddd14610dd457816323b872dd14610cba5781632569296214610c51578163313ce56714610bf55781633644e51514610bb357816340c10f1914610adb57816354d1f13d14610a7757816370a0823114610a15578163715018a6146109965781637ecebe00146109345781638da5cb5b146108c257816395d89b41146107a7578382639dc29fac146106ff57508163a9059cbb14610652578163d505accf14610357578163dd62ed3e146102df578163f04e283e14610216578163f2fde38b14610162575063fee81cf41461010e57600080fd5b3461015e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e57602091610148611099565b9063389a75e1600c525281600c20549051908152f35b5080fd5b839060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e57610196611099565b9061019f6110e4565b8160601b1561020b575073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b8360207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102dc57610249611099565b6102516110e4565b63389a75e1600c528082526020600c2092835442116102d157508173ffffffffffffffffffffffffffffffffffffffff929355167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188352601cfd5b80fd5b90503461035357817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035357602092829161031c611099565b6103246110c1565b9173ffffffffffffffffffffffffffffffffffffffff8092168452865283832091168252845220549051908152f35b8280fd5b83833461015e5760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e57610390611099565b906103996110c1565b91604435606435926084359260ff841680940361064e574285106105f1576103bf611158565b9573ffffffffffffffffffffffffffffffffffffffff8092169586895260209560058752848a209889549960018b01905585519285898501957f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c987528b89870152169a8b606086015288608086015260a085015260c084015260c0835260e0830167ffffffffffffffff94848210868311176105c457818852845190206101008501927f19010000000000000000000000000000000000000000000000000000000000008452610102860152610122850152604281526101608401948186109086111761059857848752519020835261018082015260a4356101a082015260c4356101c0909101528780528490889060809060015afa1561058e578651169687151580610585575b1561052a5786977f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259596975283528087208688528352818188205551908152a380f35b8360649251917f08c379a0000000000000000000000000000000000000000000000000000000008352820152600e60248201527f494e56414c49445f5349474e45520000000000000000000000000000000000006044820152fd5b508488146104e7565b81513d88823e3d90fd5b60248c60418f7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b5060248c60418f7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b60648860208451917f08c379a0000000000000000000000000000000000000000000000000000000008352820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152fd5b8680fd5b50503461015e57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e5760209161068d611099565b8273ffffffffffffffffffffffffffffffffffffffff60243592338552600387528285206106bc85825461111c565b90551692838152600386522081815401905582519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef843392a35160018152f35b8084346107a457807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126107a4577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602061075a611099565b73ffffffffffffffffffffffffffffffffffffffff6024359161077b6110e4565b16938486526003835280862061079283825461111c565b9055816002540360025551908152a380f35b50fd5b50503461015e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e578051908260018054916107e983610f70565b8086529282811690811561087c5750600114610820575b5050506108128261081c940383610fc3565b5191829182611033565b0390f35b94508085527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b8286106108645750505061081282602061081c9582010194610800565b80546020878701810191909152909501948101610847565b61081c9750869350602092506108129491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001682840152151560051b82010194610800565b50503461015e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e5760209073ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754915191168152f35b50503461015e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e578060209273ffffffffffffffffffffffffffffffffffffffff610986611099565b1681526005845220549051908152f35b83807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102dc576109c86110e4565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b50503461015e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e578060209273ffffffffffffffffffffffffffffffffffffffff610a67611099565b1681526003845220549051908152f35b83807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102dc5763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b90503461035357817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035357610b13611099565b60243591610b1f6110e4565b60025490838201809211610b875750849273ffffffffffffffffffffffffffffffffffffffff7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9360209360025516948585526003835280852082815401905551908152a380f35b8560116024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b50503461015e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e57602090610bee611158565b9051908152f35b50503461015e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e576020905160ff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b83807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102dc5763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b8284346102dc5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102dc57610cf3611099565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef610d1c6110c1565b946044358573ffffffffffffffffffffffffffffffffffffffff80951694858752602098848a958652838920338a52865283892054857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610db1575b50505086885260038552828820610d9285825461111c565b9055169586815260038452208181540190558551908152a35160018152f35b610dba9161111c565b90888a528652838920338a528652838920558a8085610d7a565b50503461015e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e576020906002549051908152f35b90503461035357817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035357602092610e4c611099565b9183602435928392338252875273ffffffffffffffffffffffffffffffffffffffff8282209516948582528752205582519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925843392a35160018152f35b8490843461035357827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035357828054610ee981610f70565b8085529160019180831690811561087c5750600114610f14575050506108128261081c940383610fc3565b80809650527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5635b828610610f585750505061081282602061081c9582010194610800565b80546020878701810191909152909501948101610f3b565b90600182811c92168015610fb9575b6020831014610f8a57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691610f7f565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761100457604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60208082528251818301819052939260005b858110611085575050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006040809697860101520116010190565b818101830151848201604001528201611045565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036110bc57565b600080fd5b6024359073ffffffffffffffffffffffffffffffffffffffff821682036110bc57565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754330361110e57565b6382b429006000526004601cfd5b9190820391821161112957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000467f0000000000000000000000000000000000000000000000000000000000000000036111a657507f000000000000000000000000000000000000000000000000000000000000000090565b604051815482916111b682610f70565b80825281602094858201946001908782821691826000146112f95750506001146112a0575b506111e892500382610fc3565b51902091604051918201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f845260408301527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a083015260a0825260c082019082821067ffffffffffffffff831117611273575060405251902090565b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526041600452fd5b87805286915087907f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5635b8583106112e15750506111e89350820101386111db565b805483880185015286945088939092019181016112ca565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001688526111e895151560051b85010192503891506111db905056fea164736f6c6343000813000aa164736f6c6343000813000a0000000000000000000000006beef9b5a6e4dd9d74122d62f5ef52ee48281819000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000009f1a52db8b0465cf189206b3a36303cd415a199a00000000000000000000000000000000000000000000000000000000000000074672617874616c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044652415800000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040818152600491823610156200001757600080fd5b600092833560e01c91826310099f1f1462000e55575081631c93b03a1462000d5b578163256929621462000cf1578163450994c01462000c6b578163485cc955146200093e5781634daadff714620008ef57816354d1f13d146200088a5781635abfaf6c14620008195781635ca2f6961462000696578163715018a614620006145781638da5cb5b14620005a0578163c75b6a3414620004a5578163d0ec47d51462000452578163e8a0aed314620002d3578163f04e283e1462000204578163f2fde38b146200014a575063fee81cf414620000f257600080fd5b34620001465760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011262000146576020916200013062000f7e565b9063389a75e1600c525281600c20549051908152f35b5080fd5b839060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011262000146576200018162000f7e565b906200018c6200102f565b8160601b15620001f9575073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b8360207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620002d0576200023a62000f7e565b620002446200102f565b63389a75e1600c528082526020600c209283544211620002c557508173ffffffffffffffffffffffffffffffffffffffff929355167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188352601cfd5b80fd5b9050346200044e5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200044e5767ffffffffffffffff9080358281116200044a5762000329903690830162000fe2565b602435838111620004465762000343903690840162000fe2565b6044359160ff83168303620004425773ffffffffffffffffffffffffffffffffffffffff948588541633036200041a578651946118b7908187019287841090841117620003ee575091620003c39391869593620011e487397f0000000000000000000000006beef9b5a6e4dd9d74122d62f5ef52ee4828181990620010d4565b039084f0918215620003e55760209350620003de8362001127565b5191168152f35b513d84823e3d90fd5b8960416024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8487517f4aa0152c000000000000000000000000000000000000000000000000000000008152fd5b8680fd5b8580fd5b8480fd5b8280fd5b5050346200014657817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620001465773ffffffffffffffffffffffffffffffffffffffff60209254169051908152f35b5050346200014657817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620001465780516001805480835281855260208084019592939186907fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf690855b8181106200057657505050826200052b91038362000ea3565b8451948186019282875251809352850195925b8281106200054c5785870386f35b835173ffffffffffffffffffffffffffffffffffffffff168752958101959281019284016200053e565b825473ffffffffffffffffffffffffffffffffffffffff1684529284019291870191870162000512565b5050346200014657817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620001465760209073ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754915191168152f35b83807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620002d057620006496200102f565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b828434620002d057807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620002d0578151918160035492600184811c918186169586156200080e575b6020968785108114620007e2578899509688969785829a5291826000146200079a57505060011462000739575b5050506200073592916200072591038562000ea3565b5192828493845283019062000f39565b0390f35b9190869350600383527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b82841062000781575050508201018162000725620007356200070f565b8054848a01860152889550879490930192810162000764565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168782015293151560051b860190930193508492506200072591506200073590506200070f565b60248360228c7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b92607f1692620006e2565b5050346200014657817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011262000146576020905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000006beef9b5a6e4dd9d74122d62f5ef52ee48281819168152f35b83807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620002d05763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b5050346200014657817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011262000146576020905173098c837fef2e146e96ceaf58a10f68fc6326dc4c8152f35b919050346200044e57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200044e576200097b62000f7e565b906024359173ffffffffffffffffffffffffffffffffffffffff908184168094036200044657620009ab6200102f565b831562000c0e57620009bc6200102f565b857fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35516928151937f06fdde0300000000000000000000000000000000000000000000000000000000855285858381845afa94851562000c0457869562000be4575b508251947f95d89b4100000000000000000000000000000000000000000000000000000000865286868481855afa91821562000bda5783949596889362000bae575b506020908651948580927f313ce5670000000000000000000000000000000000000000000000000000000082525afa92831562000ba457879362000b60575b508451936118b78086019186831067ffffffffffffffff841117620003ee57509162000b1e9391869593620011e487397f0000000000000000000000006beef9b5a6e4dd9d74122d62f5ef52ee4828181990620010d4565b039084f0908115620003e5575062000b369062001127565b7fffffffffffffffffffffffff000000000000000000000000000000000000000082541617815580f35b9092506020813d821162000b9b575b8162000b7e6020938362000ea3565b8101031262000442575160ff811681036200044257913862000ac6565b3d915062000b6f565b85513d89823e3d90fd5b602091935062000bd2903d808b833e62000bc9818362000ea3565b81019062001068565b929062000a87565b84513d89823e3d90fd5b62000bfc9195503d8088833e62000bc9818362000ea3565b933862000a45565b83513d88823e3d90fd5b60648560208551917f08c379a0000000000000000000000000000000000000000000000000000000008352820152601e60248201527f436f7265526f7574657220616464726573732063616e6e6f74206265203000006044820152fd5b9050346200044e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200044e57356001548110156200044e5773ffffffffffffffffffffffffffffffffffffffff906001602094527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60154169051908152f35b83807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620002d05763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b828434620002d057807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620002d0578151918160025492600184811c9181861695861562000e4a575b6020968785108114620007e2578899509688969785829a5291826000146200079a57505060011462000de9575050506200073592916200072591038562000ea3565b9190869350600283527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace5b82841062000e31575050508201018162000725620007356200070f565b8054848a01860152889550879490930192810162000e14565b92607f169262000da7565b8490346200014657817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200014657807388e07a0457aa113ab910103d9a01217315da1c9860209252f35b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111762000ee557604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60005b83811062000f285750506000910152565b818101518382015260200162000f17565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209362000f778151809281875287808801910162000f14565b0116010190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820362000fa257565b600080fd5b67ffffffffffffffff811162000ee557601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b81601f8201121562000fa25780359062000ffc8262000fa7565b926200100c604051948562000ea3565b8284526020838301011162000fa257816000926020809301838601378301015290565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739275433036200105a57565b6382b429006000526004601cfd5b60208183031262000fa25780519067ffffffffffffffff821162000fa2570181601f8201121562000fa2578051620010a08162000fa7565b92620010b0604051948562000ea3565b8184526020828401011162000fa257620010d1916020808501910162000f14565b90565b9262001120906200111160609473ffffffffffffffffffffffffffffffffffffffff60ff9599989916875260806020880152608087019062000f39565b90858203604087015262000f39565b9416910152565b6001546801000000000000000081101562000ee5576001810180600155811015620011b45773ffffffffffffffffffffffffffffffffffffffff9060016000527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60191167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfe60e0604090808252346200049757620018b780380380916200002282856200049c565b83398101608082820312620004975781516001600160a01b038116929083900362000497576020818101516001600160401b0392908381116200049757846200006d918301620004c0565b938682015184811162000497576060916200008a918401620004c0565b91015160ff811681036200049757845194848611620004815760009580620000b3885462000537565b92601f9384811162000430575b508690848311600114620003c8578992620003bc575b50508160011b916000199060031b1c19161786555b825190858211620003a857819060019462000107865462000537565b82811162000353575b5086918311600114620002ef578892620002e3575b5050600019600383901b1c191690831b1782555b6080524660a05285518454918186620001528562000537565b9283835286830195878282169182600014620002c357505060011462000283575b5062000182925003826200049c565b519020908551908101917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8352868201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a0815260c0810192818410908411176200026f5782865251902060c052821562000260575081638b78c6d819557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a351611342908162000575823960805181610c2d015260a0518161115d015260c051816111840152f35b63f0e68b9d60e01b8152600490fd5b634e487b7160e01b84526041600452602484fd5b8691508880528189209089915b858310620002aa5750506200018293508201013862000173565b8054838801850152869450889390920191810162000290565b60ff191688526200018295151560051b8501019250389150620001739050565b01519050388062000125565b8589528689208694509190601f1984168a5b898282106200033c575050841162000322575b505050811b01825562000139565b015160001960f88460031b161c1916905538808062000314565b838501518655899790950194938401930162000301565b909192508589528689208380860160051c8201928987106200039e575b91869589929594930160051c01915b8281106200038f57505062000110565b8b81558695508891016200037f565b9250819262000370565b634e487b7160e01b87526041600452602487fd5b015190503880620000d6565b898052878a209250601f1984168a5b8982821062000419575050908460019594939210620003ff575b505050811b018655620000eb565b015160001960f88460031b161c19169055388080620003f1565b6001859682939686015181550195019301620003d7565b9091508880528689208480850160051c82019289861062000477575b9085949392910160051c01905b818110620004685750620000c0565b8a815584935060010162000459565b925081926200044c565b634e487b7160e01b600052604160045260246000fd5b600080fd5b601f909101601f19168101906001600160401b038211908210176200048157604052565b919080601f8401121562000497578251906001600160401b038211620004815760405191602091620004fc601f8301601f19168401856200049c565b818452828287010111620004975760005b8181106200052357508260009394955001015290565b85810183015184820184015282016200050d565b90600182811c9216801562000569575b60208310146200055357565b634e487b7160e01b600052602260045260246000fd5b91607f16916200054756fe608060408181526004918236101561001657600080fd5b600092833560e01c91826306fdde0314610eac57508163095ea7b314610e1157816318160ddd14610dd457816323b872dd14610cba5781632569296214610c51578163313ce56714610bf55781633644e51514610bb357816340c10f1914610adb57816354d1f13d14610a7757816370a0823114610a15578163715018a6146109965781637ecebe00146109345781638da5cb5b146108c257816395d89b41146107a7578382639dc29fac146106ff57508163a9059cbb14610652578163d505accf14610357578163dd62ed3e146102df578163f04e283e14610216578163f2fde38b14610162575063fee81cf41461010e57600080fd5b3461015e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e57602091610148611099565b9063389a75e1600c525281600c20549051908152f35b5080fd5b839060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e57610196611099565b9061019f6110e4565b8160601b1561020b575073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b8360207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102dc57610249611099565b6102516110e4565b63389a75e1600c528082526020600c2092835442116102d157508173ffffffffffffffffffffffffffffffffffffffff929355167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188352601cfd5b80fd5b90503461035357817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035357602092829161031c611099565b6103246110c1565b9173ffffffffffffffffffffffffffffffffffffffff8092168452865283832091168252845220549051908152f35b8280fd5b83833461015e5760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e57610390611099565b906103996110c1565b91604435606435926084359260ff841680940361064e574285106105f1576103bf611158565b9573ffffffffffffffffffffffffffffffffffffffff8092169586895260209560058752848a209889549960018b01905585519285898501957f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c987528b89870152169a8b606086015288608086015260a085015260c084015260c0835260e0830167ffffffffffffffff94848210868311176105c457818852845190206101008501927f19010000000000000000000000000000000000000000000000000000000000008452610102860152610122850152604281526101608401948186109086111761059857848752519020835261018082015260a4356101a082015260c4356101c0909101528780528490889060809060015afa1561058e578651169687151580610585575b1561052a5786977f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259596975283528087208688528352818188205551908152a380f35b8360649251917f08c379a0000000000000000000000000000000000000000000000000000000008352820152600e60248201527f494e56414c49445f5349474e45520000000000000000000000000000000000006044820152fd5b508488146104e7565b81513d88823e3d90fd5b60248c60418f7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b5060248c60418f7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b60648860208451917f08c379a0000000000000000000000000000000000000000000000000000000008352820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152fd5b8680fd5b50503461015e57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e5760209161068d611099565b8273ffffffffffffffffffffffffffffffffffffffff60243592338552600387528285206106bc85825461111c565b90551692838152600386522081815401905582519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef843392a35160018152f35b8084346107a457807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126107a4577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602061075a611099565b73ffffffffffffffffffffffffffffffffffffffff6024359161077b6110e4565b16938486526003835280862061079283825461111c565b9055816002540360025551908152a380f35b50fd5b50503461015e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e578051908260018054916107e983610f70565b8086529282811690811561087c5750600114610820575b5050506108128261081c940383610fc3565b5191829182611033565b0390f35b94508085527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b8286106108645750505061081282602061081c9582010194610800565b80546020878701810191909152909501948101610847565b61081c9750869350602092506108129491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001682840152151560051b82010194610800565b50503461015e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e5760209073ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754915191168152f35b50503461015e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e578060209273ffffffffffffffffffffffffffffffffffffffff610986611099565b1681526005845220549051908152f35b83807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102dc576109c86110e4565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b50503461015e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e578060209273ffffffffffffffffffffffffffffffffffffffff610a67611099565b1681526003845220549051908152f35b83807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102dc5763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b90503461035357817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035357610b13611099565b60243591610b1f6110e4565b60025490838201809211610b875750849273ffffffffffffffffffffffffffffffffffffffff7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9360209360025516948585526003835280852082815401905551908152a380f35b8560116024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b50503461015e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e57602090610bee611158565b9051908152f35b50503461015e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e576020905160ff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b83807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102dc5763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b8284346102dc5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102dc57610cf3611099565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef610d1c6110c1565b946044358573ffffffffffffffffffffffffffffffffffffffff80951694858752602098848a958652838920338a52865283892054857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610db1575b50505086885260038552828820610d9285825461111c565b9055169586815260038452208181540190558551908152a35160018152f35b610dba9161111c565b90888a528652838920338a528652838920558a8085610d7a565b50503461015e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e576020906002549051908152f35b90503461035357817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035357602092610e4c611099565b9183602435928392338252875273ffffffffffffffffffffffffffffffffffffffff8282209516948582528752205582519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925843392a35160018152f35b8490843461035357827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035357828054610ee981610f70565b8085529160019180831690811561087c5750600114610f14575050506108128261081c940383610fc3565b80809650527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5635b828610610f585750505061081282602061081c9582010194610800565b80546020878701810191909152909501948101610f3b565b90600182811c92168015610fb9575b6020831014610f8a57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691610f7f565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761100457604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60208082528251818301819052939260005b858110611085575050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006040809697860101520116010190565b818101830151848201604001528201611045565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036110bc57565b600080fd5b6024359073ffffffffffffffffffffffffffffffffffffffff821682036110bc57565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754330361110e57565b6382b429006000526004601cfd5b9190820391821161112957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000467f0000000000000000000000000000000000000000000000000000000000000000036111a657507f000000000000000000000000000000000000000000000000000000000000000090565b604051815482916111b682610f70565b80825281602094858201946001908782821691826000146112f95750506001146112a0575b506111e892500382610fc3565b51902091604051918201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f845260408301527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a083015260a0825260c082019082821067ffffffffffffffff831117611273575060405251902090565b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526041600452fd5b87805286915087907f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5635b8583106112e15750506111e89350820101386111db565b805483880185015286945088939092019181016112ca565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001688526111e895151560051b85010192503891506111db905056fea164736f6c6343000813000aa164736f6c6343000813000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000006beef9b5a6e4dd9d74122d62f5ef52ee48281819000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000009f1a52db8b0465cf189206b3a36303cd415a199a00000000000000000000000000000000000000000000000000000000000000074672617874616c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044652415800000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _localPortAddress (address): 0x6BeEF9B5a6E4Dd9D74122d62f5ef52eE48281819
Arg [1] : _chainName (string): Fraxtal
Arg [2] : _chainSymbol (string): FRAX
Arg [3] : _owner (address): 0x9f1A52dB8b0465cf189206B3A36303cd415A199a
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000006beef9b5a6e4dd9d74122d62f5ef52ee48281819
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [3] : 0000000000000000000000009f1a52db8b0465cf189206b3a36303cd415a199a
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [5] : 4672617874616c00000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [7] : 4652415800000000000000000000000000000000000000000000000000000000
Net Worth in USD
Net Worth in FRAX
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.