Source Code
Overview
FRAX Balance | FXTL Balance
0 FRAX | 0 FXTL
FRAX Value
$0.00| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 1406829 | 690 days ago | Contract Creation | 0 FRAX |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
InterchainToken
Compiler Version
v0.8.21+commit.d9974bed
Contract Source Code (Solidity)
/** *Submitted for verification at fraxscan.com on 2024-04-11 */ // Sources flattened with hardhat v2.19.1 https://hardhat.org // SPDX-License-Identifier: MIT // File @axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/[email protected] // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; /** * @title IRolesBase Interface * @notice IRolesBase is an interface that abstracts the implementation of a * contract with role control internal functions. */ interface IRolesBase { error MissingRole(address account, uint8 role); error MissingAllRoles(address account, uint256 accountRoles); error MissingAnyOfRoles(address account, uint256 accountRoles); error InvalidProposedRoles(address fromAccount, address toAccount, uint256 accountRoles); event RolesProposed(address indexed fromAccount, address indexed toAccount, uint256 accountRoles); event RolesAdded(address indexed account, uint256 accountRoles); event RolesRemoved(address indexed account, uint256 accountRoles); /** * @notice Checks if an account has a role. * @param account The address to check * @param role The role to check * @return True if the account has the role, false otherwise */ function hasRole(address account, uint8 role) external view returns (bool); } // File @axelar-network/axelar-gmp-sdk-solidity/contracts/utils/[email protected] // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; /** * @title RolesBase * @notice A contract module which provides a set if internal functions * for implementing role control features. */ contract RolesBase is IRolesBase { bytes32 internal constant ROLES_PREFIX = keccak256('roles'); bytes32 internal constant PROPOSE_ROLES_PREFIX = keccak256('propose-roles'); /** * @notice Modifier that throws an error if called by any account missing the role. */ modifier onlyRole(uint8 role) { if (!_hasRole(_getRoles(msg.sender), role)) revert MissingRole(msg.sender, role); _; } /** * @notice Modifier that throws an error if called by an account without all the roles. */ modifier withEveryRole(uint8[] memory roles) { uint256 accountRoles = _toAccountRoles(roles); if (!_hasAllTheRoles(_getRoles(msg.sender), accountRoles)) revert MissingAllRoles(msg.sender, accountRoles); _; } /** * @notice Modifier that throws an error if called by an account without any of the roles. */ modifier withAnyRole(uint8[] memory roles) { uint256 accountRoles = _toAccountRoles(roles); if (!_hasAnyOfRoles(_getRoles(msg.sender), accountRoles)) revert MissingAnyOfRoles(msg.sender, accountRoles); _; } /** * @notice Checks if an account has a role. * @param account The address to check * @param role The role to check * @return True if the account has the role, false otherwise */ function hasRole(address account, uint8 role) public view returns (bool) { return _hasRole(_getRoles(account), role); } /** * @notice Internal function to convert an array of roles to a uint256. * @param roles The roles to convert * @return accountRoles The roles in uint256 format */ function _toAccountRoles(uint8[] memory roles) internal pure returns (uint256) { uint256 length = roles.length; uint256 accountRoles; for (uint256 i = 0; i < length; ++i) { accountRoles |= (1 << roles[i]); } return accountRoles; } /** * @notice Internal function to get the key of the roles mapping. * @param account The address to get the key for * @return key The key of the roles mapping */ function _rolesKey(address account) internal view virtual returns (bytes32 key) { return keccak256(abi.encodePacked(ROLES_PREFIX, account)); } /** * @notice Internal function to get the roles of an account. * @param account The address to get the roles for * @return accountRoles The roles of the account in uint256 format */ function _getRoles(address account) internal view returns (uint256 accountRoles) { bytes32 key = _rolesKey(account); assembly { accountRoles := sload(key) } } /** * @notice Internal function to set the roles of an account. * @param account The address to set the roles for * @param accountRoles The roles to set */ function _setRoles(address account, uint256 accountRoles) private { bytes32 key = _rolesKey(account); assembly { sstore(key, accountRoles) } } /** * @notice Internal function to get the key of the proposed roles mapping. * @param fromAccount The address of the current role * @param toAccount The address of the pending role * @return key The key of the proposed roles mapping */ function _proposalKey(address fromAccount, address toAccount) internal view virtual returns (bytes32 key) { return keccak256(abi.encodePacked(PROPOSE_ROLES_PREFIX, fromAccount, toAccount)); } /** * @notice Internal function to get the proposed roles of an account. * @param fromAccount The address of the current role * @param toAccount The address of the pending role * @return proposedRoles_ The proposed roles of the account in uint256 format */ function _getProposedRoles(address fromAccount, address toAccount) internal view returns (uint256 proposedRoles_) { bytes32 key = _proposalKey(fromAccount, toAccount); assembly { proposedRoles_ := sload(key) } } /** * @notice Internal function to set the proposed roles of an account. * @param fromAccount The address of the current role * @param toAccount The address of the pending role * @param proposedRoles_ The proposed roles to set in uint256 format */ function _setProposedRoles( address fromAccount, address toAccount, uint256 proposedRoles_ ) private { bytes32 key = _proposalKey(fromAccount, toAccount); assembly { sstore(key, proposedRoles_) } } /** * @notice Internal function to add a role to an account. * @dev emits a RolesAdded event. * @param account The address to add the role to * @param role The role to add */ function _addRole(address account, uint8 role) internal { _addAccountRoles(account, 1 << role); } /** * @notice Internal function to add roles to an account. * @dev emits a RolesAdded event. * @dev Called in the constructor to set the initial roles. * @param account The address to add roles to * @param roles The roles to add */ function _addRoles(address account, uint8[] memory roles) internal { _addAccountRoles(account, _toAccountRoles(roles)); } /** * @notice Internal function to add roles to an account. * @dev emits a RolesAdded event. * @dev Called in the constructor to set the initial roles. * @param account The address to add roles to * @param accountRoles The roles to add */ function _addAccountRoles(address account, uint256 accountRoles) internal { uint256 newAccountRoles = _getRoles(account) | accountRoles; _setRoles(account, newAccountRoles); emit RolesAdded(account, accountRoles); } /** * @notice Internal function to remove a role from an account. * @dev emits a RolesRemoved event. * @param account The address to remove the role from * @param role The role to remove */ function _removeRole(address account, uint8 role) internal { _removeAccountRoles(account, 1 << role); } /** * @notice Internal function to remove roles from an account. * @dev emits a RolesRemoved event. * @param account The address to remove roles from * @param roles The roles to remove */ function _removeRoles(address account, uint8[] memory roles) internal { _removeAccountRoles(account, _toAccountRoles(roles)); } /** * @notice Internal function to remove roles from an account. * @dev emits a RolesRemoved event. * @param account The address to remove roles from * @param accountRoles The roles to remove */ function _removeAccountRoles(address account, uint256 accountRoles) internal { uint256 newAccountRoles = _getRoles(account) & ~accountRoles; _setRoles(account, newAccountRoles); emit RolesRemoved(account, accountRoles); } /** * @notice Internal function to check if an account has a role. * @param accountRoles The roles of the account in uint256 format * @param role The role to check * @return True if the account has the role, false otherwise */ function _hasRole(uint256 accountRoles, uint8 role) internal pure returns (bool) { return accountRoles & (1 << role) != 0; } /** * @notice Internal function to check if an account has all the roles. * @param hasAccountRoles The roles of the account in uint256 format * @param mustHaveAccountRoles The roles the account must have * @return True if the account has all the roles, false otherwise */ function _hasAllTheRoles(uint256 hasAccountRoles, uint256 mustHaveAccountRoles) internal pure returns (bool) { return (hasAccountRoles & mustHaveAccountRoles) == mustHaveAccountRoles; } /** * @notice Internal function to check if an account has any of the roles. * @param hasAccountRoles The roles of the account in uint256 format * @param mustHaveAnyAccountRoles The roles to check in uint256 format * @return True if the account has any of the roles, false otherwise */ function _hasAnyOfRoles(uint256 hasAccountRoles, uint256 mustHaveAnyAccountRoles) internal pure returns (bool) { return (hasAccountRoles & mustHaveAnyAccountRoles) != 0; } /** * @notice Internal function to propose to transfer roles of message sender to a new account. * @dev Original account must have all the proposed roles. * @dev Emits a RolesProposed event. * @dev Roles are not transferred until the new role accepts the role transfer. * @param fromAccount The address of the current roles * @param toAccount The address to transfer roles to * @param role The role to transfer */ function _proposeRole( address fromAccount, address toAccount, uint8 role ) internal { _proposeAccountRoles(fromAccount, toAccount, 1 << role); } /** * @notice Internal function to propose to transfer roles of message sender to a new account. * @dev Original account must have all the proposed roles. * @dev Emits a RolesProposed event. * @dev Roles are not transferred until the new role accepts the role transfer. * @param fromAccount The address of the current roles * @param toAccount The address to transfer roles to * @param roles The roles to transfer */ function _proposeRoles( address fromAccount, address toAccount, uint8[] memory roles ) internal { _proposeAccountRoles(fromAccount, toAccount, _toAccountRoles(roles)); } /** * @notice Internal function to propose to transfer roles of message sender to a new account. * @dev Original account must have all the proposed roles. * @dev Emits a RolesProposed event. * @dev Roles are not transferred until the new role accepts the role transfer. * @param fromAccount The address of the current roles * @param toAccount The address to transfer roles to * @param accountRoles The account roles to transfer */ function _proposeAccountRoles( address fromAccount, address toAccount, uint256 accountRoles ) internal { if (!_hasAllTheRoles(_getRoles(fromAccount), accountRoles)) revert MissingAllRoles(fromAccount, accountRoles); _setProposedRoles(fromAccount, toAccount, accountRoles); emit RolesProposed(fromAccount, toAccount, accountRoles); } /** * @notice Internal function to accept roles transferred from another account. * @dev Pending account needs to pass all the proposed roles. * @dev Emits RolesRemoved and RolesAdded events. * @param fromAccount The address of the current role * @param role The role to accept */ function _acceptRole( address fromAccount, address toAccount, uint8 role ) internal virtual { _acceptAccountRoles(fromAccount, toAccount, 1 << role); } /** * @notice Internal function to accept roles transferred from another account. * @dev Pending account needs to pass all the proposed roles. * @dev Emits RolesRemoved and RolesAdded events. * @param fromAccount The address of the current role * @param roles The roles to accept */ function _acceptRoles( address fromAccount, address toAccount, uint8[] memory roles ) internal virtual { _acceptAccountRoles(fromAccount, toAccount, _toAccountRoles(roles)); } /** * @notice Internal function to accept roles transferred from another account. * @dev Pending account needs to pass all the proposed roles. * @dev Emits RolesRemoved and RolesAdded events. * @param fromAccount The address of the current role * @param accountRoles The account roles to accept */ function _acceptAccountRoles( address fromAccount, address toAccount, uint256 accountRoles ) internal virtual { if (_getProposedRoles(fromAccount, toAccount) != accountRoles) { revert InvalidProposedRoles(fromAccount, toAccount, accountRoles); } _setProposedRoles(fromAccount, toAccount, 0); _transferAccountRoles(fromAccount, toAccount, accountRoles); } /** * @notice Internal function to transfer roles from one account to another. * @dev Original account must have all the proposed roles. * @param fromAccount The address of the current role * @param toAccount The address to transfer role to * @param role The role to transfer */ function _transferRole( address fromAccount, address toAccount, uint8 role ) internal { _transferAccountRoles(fromAccount, toAccount, 1 << role); } /** * @notice Internal function to transfer roles from one account to another. * @dev Original account must have all the proposed roles. * @param fromAccount The address of the current role * @param toAccount The address to transfer role to * @param roles The roles to transfer */ function _transferRoles( address fromAccount, address toAccount, uint8[] memory roles ) internal { _transferAccountRoles(fromAccount, toAccount, _toAccountRoles(roles)); } /** * @notice Internal function to transfer roles from one account to another. * @dev Original account must have all the proposed roles. * @param fromAccount The address of the current role * @param toAccount The address to transfer role to * @param accountRoles The account roles to transfer */ function _transferAccountRoles( address fromAccount, address toAccount, uint256 accountRoles ) internal { if (!_hasAllTheRoles(_getRoles(fromAccount), accountRoles)) revert MissingAllRoles(fromAccount, accountRoles); _removeAccountRoles(fromAccount, accountRoles); _addAccountRoles(toAccount, accountRoles); } } // File @axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/[email protected] // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { error InvalidAccount(); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File contracts/interchain-token/ERC20.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is IERC20 { mapping(address => uint256) public override balanceOf; mapping(address => mapping(address => uint256)) public override allowance; uint256 public override totalSupply; uint256 internal constant UINT256_MAX = type(uint256).max; /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) external virtual override returns (bool) { _transfer(msg.sender, recipient, amount); return true; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) external virtual override returns (bool) { _approve(msg.sender, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) external virtual override returns (bool) { uint256 _allowance = allowance[sender][msg.sender]; if (_allowance != UINT256_MAX) { _approve(sender, msg.sender, _allowance - amount); } _transfer(sender, recipient, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { _approve(msg.sender, spender, allowance[msg.sender][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) external virtual returns (bool) { _approve(msg.sender, spender, allowance[msg.sender][spender] - subtractedValue); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { if (sender == address(0) || recipient == address(0)) revert InvalidAccount(); balanceOf[sender] -= amount; balanceOf[recipient] += amount; emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { if (account == address(0)) revert InvalidAccount(); totalSupply += amount; balanceOf[account] += amount; emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { if (account == address(0)) revert InvalidAccount(); balanceOf[account] -= amount; totalSupply -= amount; emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { if (owner == address(0) || spender == address(0)) revert InvalidAccount(); allowance[owner][spender] = amount; emit Approval(owner, spender, amount); } } // File @axelar-network/axelar-cgp-solidity/contracts/interfaces/[email protected] // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.9; interface IERC20Permit { function DOMAIN_SEPARATOR() external view returns (bytes32); function nonces(address account) external view returns (uint256); function permit( address issuer, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; } // File contracts/interchain-token/ERC20Permit.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; /** * @title ERC20Permit Contract * @dev Extension of ERC20 to include permit functionality (EIP-2612). * Allows for approval of ERC20 tokens by signature rather than transaction. */ abstract contract ERC20Permit is IERC20, IERC20Permit, ERC20 { error PermitExpired(); error InvalidS(); error InvalidV(); error InvalidSignature(); /** * @dev Represents hash of the EIP-712 Domain Separator. */ bytes32 public nameHash; string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = '\x19\x01'; // keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)') bytes32 private constant DOMAIN_TYPE_SIGNATURE_HASH = bytes32(0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f); // keccak256('Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)') bytes32 private constant PERMIT_SIGNATURE_HASH = bytes32(0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9); /** * @dev Mapping of nonces for each address. */ mapping(address => uint256) public nonces; /** * @notice Internal function to set the token name hash * @param name The token name */ function _setNameHash(string memory name) internal { nameHash = keccak256(bytes(name)); } /** * @notice Calculates the domain separator. * @dev This is not cached because chainid can change on chain forks. */ // solhint-disable func-name-mixedcase // slither-disable-next-line naming-convention function DOMAIN_SEPARATOR() public view returns (bytes32) { return keccak256(abi.encode(DOMAIN_TYPE_SIGNATURE_HASH, nameHash, keccak256(bytes('1')), block.chainid, address(this))); } // solhint-enable func-name-mixedcase /** * @notice Permit the designated spender to spend the holder's tokens * @dev The permit function is used to allow a holder to designate a spender * to spend tokens on their behalf via a signed message. * @param issuer The address of the token holder * @param spender The address of the designated spender * @param value The number of tokens to be spent * @param deadline The time at which the permission to spend expires * @param v The recovery id of the signature * @param r Half of the ECDSA signature pair * @param s Half of the ECDSA signature pair */ function permit(address issuer, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external { if (block.timestamp > deadline) revert PermitExpired(); if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) revert InvalidS(); if (v != 27 && v != 28) revert InvalidV(); bytes32 digest = keccak256( abi.encodePacked( EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA, DOMAIN_SEPARATOR(), keccak256(abi.encode(PERMIT_SIGNATURE_HASH, issuer, spender, value, nonces[issuer]++, deadline)) ) ); address recoveredAddress = ecrecover(digest, v, r, s); if (recoveredAddress != issuer) revert InvalidSignature(); // _approve will revert if issuer is address(0x0) _approve(issuer, spender, value); } } // File @axelar-network/axelar-gmp-sdk-solidity/contracts/libs/[email protected] // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; /** * @title AddressBytesUtils * @dev This library provides utility functions to convert between `address` and `bytes`. */ library AddressBytes { error InvalidBytesLength(bytes bytesAddress); /** * @dev Converts a bytes address to an address type. * @param bytesAddress The bytes representation of an address * @return addr The converted address */ function toAddress(bytes memory bytesAddress) internal pure returns (address addr) { if (bytesAddress.length != 20) revert InvalidBytesLength(bytesAddress); assembly { addr := mload(add(bytesAddress, 20)) } } /** * @dev Converts an address to bytes. * @param addr The address to be converted * @return bytesAddress The bytes representation of the address */ function toBytes(address addr) internal pure returns (bytes memory bytesAddress) { bytesAddress = new bytes(20); // we can test if using a single 32 byte variable that is the address with the length together and using one mstore would be slightly cheaper. assembly { mstore(add(bytesAddress, 20), addr) mstore(bytesAddress, 20) } } } // File contracts/interfaces/IInterchainTokenStandard.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; /** * @title IInterchainTokenStandard interface * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IInterchainTokenStandard { /** * @notice Implementation of the interchainTransfer method. * @dev We chose to either pass `metadata` as raw data on a remote contract call, or if no data is passed, just do a transfer. * A different implementation could use metadata to specify a function to invoke, or for other purposes as well. * @param destinationChain The destination chain identifier. * @param recipient The bytes representation of the address of the recipient. * @param amount The amount of token to be transferred. * @param metadata Optional metadata for the call for additional effects (such as calling a destination contract). */ function interchainTransfer( string calldata destinationChain, bytes calldata recipient, uint256 amount, bytes calldata metadata ) external payable; /** * @notice Implementation of the interchainTransferFrom method * @dev We chose to either pass `metadata` as raw data on a remote contract call, or, if no data is passed, just do a transfer. * A different implementation could use metadata to specify a function to invoke, or for other purposes as well. * @param sender The sender of the tokens. They need to have approved `msg.sender` before this is called. * @param destinationChain The string representation of the destination chain. * @param recipient The bytes representation of the address of the recipient. * @param amount The amount of token to be transferred. * @param metadata Optional metadata for the call for additional effects (such as calling a destination contract.) */ function interchainTransferFrom( address sender, string calldata destinationChain, bytes calldata recipient, uint256 amount, bytes calldata metadata ) external payable; } // File contracts/interfaces/ITransmitInterchainToken.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; /** * @title ITransmitInterchainToken Interface * @notice Interface for transmiting interchain tokens via the interchain token service */ interface ITransmitInterchainToken { /** * @notice Transmit an interchain transfer for the given tokenId. * @dev Only callable by a token registered under a tokenId. * @param tokenId The tokenId of the token (which must be the msg.sender). * @param sourceAddress The address where the token is coming from. * @param destinationChain The name of the chain to send tokens to. * @param destinationAddress The destinationAddress for the interchainTransfer. * @param amount The amount of token to give. * @param metadata Optional metadata for the call for additional effects (such as calling a destination contract). */ function transmitInterchainTransfer( bytes32 tokenId, address sourceAddress, string calldata destinationChain, bytes memory destinationAddress, uint256 amount, bytes calldata metadata ) external payable; } // File contracts/interchain-token/InterchainTokenStandard.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; /** * @title An example implementation of the IInterchainTokenStandard. * @notice The is an abstract contract that needs to be extended with an ERC20 implementation. See `InterchainToken` for an example implementation. */ abstract contract InterchainTokenStandard is IInterchainTokenStandard { /** * @notice Getter for the tokenId used for this token. * @dev Needs to be overwritten. * @return tokenId_ The tokenId that this token is registerred under. */ function interchainTokenId() public view virtual returns (bytes32 tokenId_); /** * @notice Getter for the interchain token service. * @dev Needs to be overwritten. * @return service The address of the interchain token service. */ function interchainTokenService() public view virtual returns (address service); /** * @notice Implementation of the interchainTransfer method * @dev We chose to either pass `metadata` as raw data on a remote contract call, or if no data is passed, just do a transfer. * A different implementation could use metadata to specify a function to invoke, or for other purposes as well. * @param destinationChain The destination chain identifier. * @param recipient The bytes representation of the address of the recipient. * @param amount The amount of token to be transferred. * @param metadata Either empty, just to facilitate an interchain transfer, or the data to be passed for an interchain contract call with transfer * as per semantics defined by the token service. */ function interchainTransfer( string calldata destinationChain, bytes calldata recipient, uint256 amount, bytes calldata metadata ) external payable { address sender = msg.sender; _beforeInterchainTransfer(msg.sender, destinationChain, recipient, amount, metadata); ITransmitInterchainToken(interchainTokenService()).transmitInterchainTransfer{ value: msg.value }( interchainTokenId(), sender, destinationChain, recipient, amount, metadata ); } /** * @notice Implementation of the interchainTransferFrom method * @dev We chose to either pass `metadata` as raw data on a remote contract call, or, if no data is passed, just do a transfer. * A different implementation could use metadata to specify a function to invoke, or for other purposes as well. * @param sender The sender of the tokens. They need to have approved `msg.sender` before this is called. * @param destinationChain The string representation of the destination chain. * @param recipient The bytes representation of the address of the recipient. * @param amount The amount of token to be transferred. * @param metadata Either empty, just to facilitate an interchain transfer, or the data to be passed to an interchain contract call and transfer. */ function interchainTransferFrom( address sender, string calldata destinationChain, bytes calldata recipient, uint256 amount, bytes calldata metadata ) external payable { _spendAllowance(sender, msg.sender, amount); _beforeInterchainTransfer(sender, destinationChain, recipient, amount, metadata); ITransmitInterchainToken(interchainTokenService()).transmitInterchainTransfer{ value: msg.value }( interchainTokenId(), sender, destinationChain, recipient, amount, metadata ); } /** * @notice A method to be overwritten that will be called before an interchain transfer. One can approve the tokenManager here if needed, * to allow users for a 1-call transfer in case of a lock-unlock token manager. * @param from The sender of the tokens. They need to have approved `msg.sender` before this is called. * @param destinationChain The string representation of the destination chain. * @param destinationAddress The bytes representation of the address of the recipient. * @param amount The amount of token to be transferred. * @param metadata Either empty, just to facilitate an interchain transfer, or the data to be passed to an interchain contract call and transfer. */ function _beforeInterchainTransfer( address from, string calldata destinationChain, bytes calldata destinationAddress, uint256 amount, bytes calldata metadata ) internal virtual {} /** * @notice A method to be overwritten that will decrease the allowance of the `spender` from `sender` by `amount`. * @dev Needs to be overwritten. This provides flexibility for the choice of ERC20 implementation used. Must revert if allowance is not sufficient. */ function _spendAllowance(address sender, address spender, uint256 amount) internal virtual; } // File contracts/interfaces/IERC20MintableBurnable.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; /** * @title IERC20MintableBurnable Interface * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20MintableBurnable { /** * @notice Function to mint new tokens. * @dev Can only be called by the minter address. * @param to The address that will receive the minted tokens. * @param amount The amount of tokens to mint. */ function mint(address to, uint256 amount) external; /** * @notice Function to burn tokens. * @dev Can only be called by the minter address. * @param from The address that will have its tokens burnt. * @param amount The amount of tokens to burn. */ function burn(address from, uint256 amount) external; } // File contracts/interfaces/IERC20Named.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; /** * @title IERC20Named Interface * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Named is IERC20 { /** * @notice Getter for the name of the token. * @return string Name of the token. */ function name() external view returns (string memory); /** * @notice Getter for the symbol of the token. * @return string The symbol of the token. */ function symbol() external view returns (string memory); /** * @notice Getter for the decimals of the token. * @return uint8 The decimals of the token. */ function decimals() external view returns (uint8); } // File contracts/interfaces/IMinter.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; /** * @title IMinter Interface * @notice An interface for a contract module which provides a basic access control mechanism, where * there is an account (a minter) that can be granted exclusive access to specific functions. */ interface IMinter is IRolesBase { /** * @notice Change the minter of the contract. * @dev Can only be called by the current minter. * @param minter_ The address of the new minter. */ function transferMintership(address minter_) external; /** * @notice Proposed a change of the minter of the contract. * @dev Can only be called by the current minter. * @param minter_ The address of the new minter. */ function proposeMintership(address minter_) external; /** * @notice Accept a change of the minter of the contract. * @dev Can only be called by the proposed minter. * @param fromMinter The previous minter. */ function acceptMintership(address fromMinter) external; /** * @notice Query if an address is a minter * @param addr the address to query for * @return bool Boolean value representing whether or not the address is a minter. */ function isMinter(address addr) external view returns (bool); } // File contracts/interfaces/IInterchainToken.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; /** * @title IInterchainToken interface * @dev Extends IInterchainTokenStandard and IMinter. */ interface IInterchainToken is IInterchainTokenStandard, IMinter, IERC20MintableBurnable, IERC20Named { error InterchainTokenServiceAddressZero(); error TokenIdZero(); error TokenNameEmpty(); error TokenSymbolEmpty(); error AlreadyInitialized(); /** * @notice Getter for the interchain token service contract. * @dev Needs to be overwitten. * @return interchainTokenServiceAddress The interchain token service address. */ function interchainTokenService() external view returns (address interchainTokenServiceAddress); /** * @notice Getter for the tokenId used for this token. * @dev Needs to be overwitten. * @return tokenId_ The tokenId for this token. */ function interchainTokenId() external view returns (bytes32 tokenId_); /** * @notice Setup function to initialize contract parameters. * @param tokenId_ The tokenId of the token. * @param minter The address of the token minter. * @param tokenName The name of the token. * @param tokenSymbol The symbopl of the token. * @param tokenDecimals The decimals of the token. */ function init(bytes32 tokenId_, address minter, string calldata tokenName, string calldata tokenSymbol, uint8 tokenDecimals) external; } // File contracts/utils/RolesConstants.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; /** * @title RolesConstants * @notice This contract contains enum values representing different contract roles. */ contract RolesConstants { enum Roles { MINTER, OPERATOR, FLOW_LIMITER } } // File contracts/utils/Minter.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; /** * @title Minter Contract * @notice A contract module which provides a basic access control mechanism, where * there is an account (a minter) that can be granted exclusive access to * specific functions. * @dev This module is used through inheritance. */ contract Minter is IMinter, RolesBase, RolesConstants { /** * @notice Internal function that stores the new minter address in the correct storage slot. * @param minter_ The address of the new minter. */ function _addMinter(address minter_) internal { _addRole(minter_, uint8(Roles.MINTER)); } /** * @notice Changes the minter of the contract. * @dev Can only be called by the current minter. * @param minter_ The address of the new minter. */ function transferMintership(address minter_) external onlyRole(uint8(Roles.MINTER)) { _transferRole(msg.sender, minter_, uint8(Roles.MINTER)); } /** * @notice Proposes a change of the minter of the contract. * @dev Can only be called by the current minter. * @param minter_ The address of the new minter. */ function proposeMintership(address minter_) external onlyRole(uint8(Roles.MINTER)) { _proposeRole(msg.sender, minter_, uint8(Roles.MINTER)); } /** * @notice Accept a change of the minter of the contract. * @dev Can only be called by the proposed minter. * @param fromMinter The previous minter. */ function acceptMintership(address fromMinter) external { _acceptRole(fromMinter, msg.sender, uint8(Roles.MINTER)); } /** * @notice Query if an address is a minter * @param addr the address to query for * @return bool Boolean value representing whether or not the address is a minter. */ function isMinter(address addr) external view returns (bool) { return hasRole(addr, uint8(Roles.MINTER)); } } // File contracts/interchain-token/InterchainToken.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; /** * @title InterchainToken * @notice This contract implements an interchain token which extends InterchainToken functionality. * @dev This contract also inherits Minter and Implementation logic. */ contract InterchainToken is InterchainTokenStandard, ERC20, ERC20Permit, Minter, IInterchainToken { using AddressBytes for bytes; string public name; string public symbol; uint8 public decimals; bytes32 internal tokenId; address internal immutable interchainTokenService_; // bytes32(uint256(keccak256('interchain-token-initialized')) - 1); bytes32 internal constant INITIALIZED_SLOT = 0xc778385ecb3e8cecb82223fa1f343ec6865b2d64c65b0c15c7e8aef225d9e214; /** * @notice Constructs the InterchainToken contract. * @dev Makes the implementation act as if it has been setup already to disallow calls to init() (even though that would not achieve anything really). */ constructor(address interchainTokenServiceAddress) { _initialize(); if (interchainTokenServiceAddress == address(0)) revert InterchainTokenServiceAddressZero(); interchainTokenService_ = interchainTokenServiceAddress; } /** * @notice Returns true if the contract has been setup. * @return initialized True if the contract has been setup, false otherwise. */ function _isInitialized() internal view returns (bool initialized) { assembly { initialized := sload(INITIALIZED_SLOT) } } /** * @notice Sets initialized to true, to allow only a single init. */ function _initialize() internal { assembly { sstore(INITIALIZED_SLOT, true) } } /** * @notice Returns the interchain token service * @return address The interchain token service contract */ function interchainTokenService() public view override(InterchainTokenStandard, IInterchainToken) returns (address) { return interchainTokenService_; } /** * @notice Returns the tokenId for this token. * @return bytes32 The token manager contract. */ function interchainTokenId() public view override(InterchainTokenStandard, IInterchainToken) returns (bytes32) { return tokenId; } /** * @notice Setup function to initialize contract parameters. * @param tokenId_ The tokenId of the token. * @param minter The address of the token minter. * @param tokenName The name of the token. * @param tokenSymbol The symbopl of the token. * @param tokenDecimals The decimals of the token. */ function init(bytes32 tokenId_, address minter, string calldata tokenName, string calldata tokenSymbol, uint8 tokenDecimals) external { if (_isInitialized()) revert AlreadyInitialized(); _initialize(); if (tokenId_ == bytes32(0)) revert TokenIdZero(); if (bytes(tokenName).length == 0) revert TokenNameEmpty(); if (bytes(tokenSymbol).length == 0) revert TokenSymbolEmpty(); name = tokenName; symbol = tokenSymbol; decimals = tokenDecimals; tokenId = tokenId_; /** * @dev Set the token service as a minter to allow it to mint and burn tokens. * Also add the provided address as a minter. If `address(0)` was provided, * add it as a minter to allow anyone to easily check that no custom minter was set. */ _addMinter(interchainTokenService_); _addMinter(minter); _setNameHash(tokenName); } /** * @notice Function to mint new tokens. * @dev Can only be called by the minter address. * @param account The address that will receive the minted tokens. * @param amount The amount of tokens to mint. */ function mint(address account, uint256 amount) external onlyRole(uint8(Roles.MINTER)) { _mint(account, amount); } /** * @notice Function to burn tokens. * @dev Can only be called by the minter address. * @param account The address that will have its tokens burnt. * @param amount The amount of tokens to burn. */ function burn(address account, uint256 amount) external onlyRole(uint8(Roles.MINTER)) { _burn(account, amount); } /** * @notice A method to be overwritten that will decrease the allowance of the `spender` from `sender` by `amount`. * @dev Needs to be overwritten. This provides flexibility for the choice of ERC20 implementation used. Must revert if allowance is not sufficient. */ function _spendAllowance(address sender, address spender, uint256 amount) internal override { uint256 _allowance = allowance[sender][spender]; if (_allowance != UINT256_MAX) { _approve(sender, spender, _allowance - amount); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"interchainTokenServiceAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyInitialized","type":"error"},{"inputs":[],"name":"InterchainTokenServiceAddressZero","type":"error"},{"inputs":[],"name":"InvalidAccount","type":"error"},{"inputs":[{"internalType":"address","name":"fromAccount","type":"address"},{"internalType":"address","name":"toAccount","type":"address"},{"internalType":"uint256","name":"accountRoles","type":"uint256"}],"name":"InvalidProposedRoles","type":"error"},{"inputs":[],"name":"InvalidS","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[],"name":"InvalidV","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"accountRoles","type":"uint256"}],"name":"MissingAllRoles","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"accountRoles","type":"uint256"}],"name":"MissingAnyOfRoles","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint8","name":"role","type":"uint8"}],"name":"MissingRole","type":"error"},{"inputs":[],"name":"PermitExpired","type":"error"},{"inputs":[],"name":"TokenIdZero","type":"error"},{"inputs":[],"name":"TokenNameEmpty","type":"error"},{"inputs":[],"name":"TokenSymbolEmpty","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"accountRoles","type":"uint256"}],"name":"RolesAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"fromAccount","type":"address"},{"indexed":true,"internalType":"address","name":"toAccount","type":"address"},{"indexed":false,"internalType":"uint256","name":"accountRoles","type":"uint256"}],"name":"RolesProposed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"accountRoles","type":"uint256"}],"name":"RolesRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fromMinter","type":"address"}],"name":"acceptMintership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint8","name":"role","type":"uint8"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"tokenId_","type":"bytes32"},{"internalType":"address","name":"minter","type":"address"},{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"uint8","name":"tokenDecimals","type":"uint8"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"interchainTokenId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"interchainTokenService","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"destinationChain","type":"string"},{"internalType":"bytes","name":"recipient","type":"bytes"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"metadata","type":"bytes"}],"name":"interchainTransfer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"string","name":"destinationChain","type":"string"},{"internalType":"bytes","name":"recipient","type":"bytes"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"metadata","type":"bytes"}],"name":"interchainTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nameHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"issuer","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter_","type":"address"}],"name":"proposeMintership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter_","type":"address"}],"name":"transferMintership","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60a060405234801561001057600080fd5b5060405162001d3b38038062001d3b83398101604081905261003191610092565b61005a60017fc778385ecb3e8cecb82223fa1f343ec6865b2d64c65b0c15c7e8aef225d9e21455565b6001600160a01b0381166100815760405163a76361c360e01b815260040160405180910390fd5b6001600160a01b03166080526100c2565b6000602082840312156100a457600080fd5b81516001600160a01b03811681146100bb57600080fd5b9392505050565b608051611c48620000f360003960008181610226015281816108cc01528181610a030152610b040152611c486000f3fe6080604052600436106101ac5760003560e01c806395a8c58d116100ec578063aa271e1a1161008a578063cf86a95a11610064578063cf86a95a14610550578063d505accf14610570578063dd62ed3e14610590578063f172a4ce146105c857600080fd5b8063aa271e1a146104fd578063b5ef694d1461051d578063bc0ba3c51461053d57600080fd5b80639dc29fac116100c65780639dc29fac1461048a578063a457c2d7146104aa578063a60fee37146104ca578063a9059cbb146104dd57600080fd5b806395a8c58d1461043557806395d89b41146104555780639c1766771461046a57600080fd5b8063313ce5671161015957806340c10f191161013357806340c10f191461039957806370a08231146103bb5780637ecebe00146103e85780638626698f1461041557600080fd5b8063313ce567146102a55780633644e515146102d1578063395093511461037957600080fd5b8063129d81881161018a578063129d81881461025057806318160ddd1461026f57806323b872dd1461028557600080fd5b806306fdde03146101b1578063095ea7b3146101dc57806309c6bed91461020c575b600080fd5b3480156101bd57600080fd5b506101c66105de565b6040516101d391906115c3565b60405180910390f35b3480156101e857600080fd5b506101fc6101f7366004611612565b61066c565b60405190151581526020016101d3565b34801561021857600080fd5b506040516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001681526020016101d3565b34801561025c57600080fd5b506008545b6040519081526020016101d3565b34801561027b57600080fd5b5061026160025481565b34801561029157600080fd5b506101fc6102a036600461163c565b610683565b3480156102b157600080fd5b506007546102bf9060ff1681565b60405160ff90911681526020016101d3565b3480156102dd57600080fd5b5060035460408051808201825260018152603160f81b60209182015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81830152808301939093527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608401524660808401523060a0808501919091528251808503909101815260c09093019091528151910120610261565b34801561038557600080fd5b506101fc610394366004611612565b6106da565b3480156103a557600080fd5b506103b96103b4366004611612565b610711565b005b3480156103c757600080fd5b506102616103d6366004611678565b60006020819052908152604090205481565b3480156103f457600080fd5b50610261610403366004611678565b60046020526000908152604090205481565b34801561042157600080fd5b506103b96104303660046116ed565b610768565b34801561044157600080fd5b506101fc610450366004611788565b610941565b34801561046157600080fd5b506101c6610963565b34801561047657600080fd5b506103b9610485366004611678565b610970565b34801561049657600080fd5b506103b96104a5366004611612565b61097f565b3480156104b657600080fd5b506101fc6104c5366004611612565b6109bf565b6103b96104d83660046117bb565b6109f6565b3480156104e957600080fd5b506101fc6104f8366004611612565b610aa2565b34801561050957600080fd5b506101fc610518366004611678565b610aaf565b34801561052957600080fd5b506103b9610538366004611678565b610abb565b6103b961054b36600461186f565b610b01565b34801561055c57600080fd5b506103b961056b366004611678565b610b67565b34801561057c57600080fd5b506103b961058b366004611913565b610ba9565b34801561059c57600080fd5b506102616105ab36600461197d565b600160209081526000928352604080842090915290825290205481565b3480156105d457600080fd5b5061026160035481565b600580546105eb906119a7565b80601f0160208091040260200160405190810160405280929190818152602001828054610617906119a7565b80156106645780601f1061063957610100808354040283529160200191610664565b820191906000526020600020905b81548152906001019060200180831161064757829003601f168201915b505050505081565b6000610679338484610eea565b5060015b92915050565b6001600160a01b038316600090815260016020908152604080832033845290915281205460001981146106c4576106c485336106bf86856119f7565b610eea565b6106cf858585610f87565b506001949350505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916106799185906106bf908690611a0a565b600061072c61071f33611063565b600160ff84161b16151590565b6107595760405163bb6c163960e01b815233600482015260ff821660248201526044015b60405180910390fd5b6107638383611077565b505050565b7fc778385ecb3e8cecb82223fa1f343ec6865b2d64c65b0c15c7e8aef225d9e21454156107c1576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107ea60017fc778385ecb3e8cecb82223fa1f343ec6865b2d64c65b0c15c7e8aef225d9e21455565b86610821576040517f248fd78f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084900361085c576040517f0d7673b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000829003610897576040517ff09ce01300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60056108a4858783611a81565b5060066108b2838583611a81565b506007805460ff191660ff831617905560088790556108f07f0000000000000000000000000000000000000000000000000000000000000000611128565b6108f986611128565b61093885858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061113392505050565b50505050505050565b600061095c61094f84611063565b600160ff85161b16151590565b9392505050565b600680546105eb906119a7565b61097c81336000611140565b50565b600061098d61071f33611063565b6109b55760405163bb6c163960e01b815233600482015260ff82166024820152604401610750565b6107638383611151565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916106799185906106bf9086906119f7565b610a018833856111fc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370756cde34610a3a60085490565b8b8b8b8b8b8b8b8b6040518b63ffffffff1660e01b8152600401610a6699989796959493929190611b6b565b6000604051808303818588803b158015610a7f57600080fd5b505af1158015610a93573d6000803e3d6000fd5b50505050505050505050505050565b6000610679338484610f87565b600061067d8282610941565b6000610ac961071f33611063565b610af15760405163bb6c163960e01b815233600482015260ff82166024820152604401610750565b610afd33836000611240565b5050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370756cde34610b3b60085490565b848c8c8c8c8c8c8c6040518b63ffffffff1660e01b8152600401610a6699989796959493929190611b6b565b6000610b7561071f33611063565b610b9d5760405163bb6c163960e01b815233600482015260ff82166024820152604401610750565b610afd33836000611251565b83421115610be3576040517f1a15a3cc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0811115610c3d576040517f40c1e74800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260ff16601b14158015610c5557508260ff16601c14155b15610c8c576040517f119bce3900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006040518060400160405280600281526020017f1901000000000000000000000000000000000000000000000000000000000000815250610d6060035460408051808201825260018152603160f81b60209182015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81830152808301939093527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608401524660808401523060a0808501919091528251808503909101815260c0909301909152815191012090565b6001600160a01b038a16600090815260046020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9928d928d928d92909190610dae83611bd2565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810188905260e00160405160208183030381529060405280519060200120604051602001610e1293929190611beb565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015610e7d573d6000803e3d6000fd5b505050602060405103519050886001600160a01b0316816001600160a01b031614610ed4576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610edf898989610eea565b505050505050505050565b6001600160a01b0383161580610f0757506001600160a01b038216155b15610f2557604051630da30f6560e31b815260040160405180910390fd5b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383161580610fa457506001600160a01b038216155b15610fc257604051630da30f6560e31b815260040160405180910390fd5b6001600160a01b03831660009081526020819052604081208054839290610fea9084906119f7565b90915550506001600160a01b03821660009081526020819052604081208054839290611017908490611a0a565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610f7a91815260200190565b60008061106f83611262565b549392505050565b6001600160a01b03821661109e57604051630da30f6560e31b815260040160405180910390fd5b80600260008282546110b09190611a0a565b90915550506001600160a01b038216600090815260208190526040812080548392906110dd908490611a0a565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b61097c8160006112cf565b8051602090910120600355565b6107638383600160ff85161b6112df565b6001600160a01b03821661117857604051630da30f6560e31b815260040160405180910390fd5b6001600160a01b038216600090815260208190526040812080548392906111a09084906119f7565b9250508190555080600260008282546111b991906119f7565b90915550506040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161111c565b6001600160a01b03808416600090815260016020908152604080832093861683529290522054600019811461123a5761123a84846106bf85856119f7565b50505050565b6107638383600160ff85161b611352565b6107638383600160ff85161b6113e4565b60007fde9bdca322e1a848f72215bc15cf2c87fe7749145789a9ee281a2a6290af26ab826040516020016112b292919091825260601b6bffffffffffffffffffffffff1916602082015260340190565b604051602081830303815290604052805190602001209050919050565b610afd82600160ff84161b61142f565b806112ea8484611490565b1461133b576040517f6004fe400000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301528316602482015260448101829052606401610750565b611347838360006114a6565b6107638383836113e4565b61136561135e84611063565b8216821490565b61139457604051631fe9beed60e21b81526001600160a01b038416600482015260248101829052604401610750565b61139f8383836114a6565b816001600160a01b0316836001600160a01b03167ff7158d1591c2cf17c0e6b9459d86365c47fe0969c79f40ef49e0c437d8f3991483604051610f7a91815260200190565b6113f061135e84611063565b61141f57604051631fe9beed60e21b81526001600160a01b038416600482015260248101829052604401610750565b61142983826114bb565b61076382825b60008161143b84611063565b1790506114488382611510565b826001600160a01b03167f34e73c57659d4b6809b53db4feee9b007b892e978114eda420d2991aba1501438360405161148391815260200190565b60405180910390a2505050565b60008061149d8484611523565b54949350505050565b60006114b28484611523565b91909155505050565b600081196114c884611063565b1690506114d58382611510565b826001600160a01b03167fccf920c8facee98a9c2a6c6124f2857b87b17e9f3a819bfcc6945196ee77366b8360405161148391815260200190565b600061151b83611262565b919091555050565b60007ff96e07b2f4fbb81c31567d2b261589af429e98f0958d53f7e6ad5d63aea0ab7c838360405160200161158193929190928352606091821b6bffffffffffffffffffffffff199081166020850152911b16603482015260480190565b60405160208183030381529060405280519060200120905092915050565b60005b838110156115ba5781810151838201526020016115a2565b50506000910152565b60208152600082518060208401526115e281604085016020870161159f565b601f01601f19169190910160400192915050565b80356001600160a01b038116811461160d57600080fd5b919050565b6000806040838503121561162557600080fd5b61162e836115f6565b946020939093013593505050565b60008060006060848603121561165157600080fd5b61165a846115f6565b9250611668602085016115f6565b9150604084013590509250925092565b60006020828403121561168a57600080fd5b61095c826115f6565b60008083601f8401126116a557600080fd5b50813567ffffffffffffffff8111156116bd57600080fd5b6020830191508360208285010111156116d557600080fd5b9250929050565b803560ff8116811461160d57600080fd5b600080600080600080600060a0888a03121561170857600080fd5b87359650611718602089016115f6565b9550604088013567ffffffffffffffff8082111561173557600080fd5b6117418b838c01611693565b909750955060608a013591508082111561175a57600080fd5b506117678a828b01611693565b909450925061177a9050608089016116dc565b905092959891949750929550565b6000806040838503121561179b57600080fd5b6117a4836115f6565b91506117b2602084016116dc565b90509250929050565b60008060008060008060008060a0898b0312156117d757600080fd5b6117e0896115f6565b9750602089013567ffffffffffffffff808211156117fd57600080fd5b6118098c838d01611693565b909950975060408b013591508082111561182257600080fd5b61182e8c838d01611693565b909750955060608b0135945060808b013591508082111561184e57600080fd5b5061185b8b828c01611693565b999c989b5096995094979396929594505050565b60008060008060008060006080888a03121561188a57600080fd5b873567ffffffffffffffff808211156118a257600080fd5b6118ae8b838c01611693565b909950975060208a01359150808211156118c757600080fd5b6118d38b838c01611693565b909750955060408a0135945060608a01359150808211156118f357600080fd5b506119008a828b01611693565b989b979a50959850939692959293505050565b600080600080600080600060e0888a03121561192e57600080fd5b611937886115f6565b9650611945602089016115f6565b95506040880135945060608801359350611961608089016116dc565b925060a0880135915060c0880135905092959891949750929550565b6000806040838503121561199057600080fd5b611999836115f6565b91506117b2602084016115f6565b600181811c908216806119bb57607f821691505b6020821081036119db57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561067d5761067d6119e1565b8082018082111561067d5761067d6119e1565b634e487b7160e01b600052604160045260246000fd5b601f82111561076357600081815260208120601f850160051c81016020861015611a5a5750805b601f850160051c820191505b81811015611a7957828155600101611a66565b505050505050565b67ffffffffffffffff831115611a9957611a99611a1d565b611aad83611aa783546119a7565b83611a33565b6000601f841160018114611ae15760008515611ac95750838201355b600019600387901b1c1916600186901b178355611b3b565b600083815260209020601f19861690835b82811015611b125786850135825560209485019460019092019101611af2565b5086821015611b2f5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8981526001600160a01b038916602082015260c060408201526000611b9460c08301898b611b42565b8281036060840152611ba781888a611b42565b905085608084015282810360a0840152611bc2818587611b42565b9c9b505050505050505050505050565b600060018201611be457611be46119e1565b5060010190565b60008451611bfd81846020890161159f565b9190910192835250602082015260400191905056fea26469706673582212203daee882a83c8072ebb1f4308392c6f302a1c043ed2eda3bf4b01322f3ef9bcf64736f6c63430008150033000000000000000000000000b5fb4be02232b1bba4dc8f81dc24c26980de9e3c
Deployed Bytecode
0x6080604052600436106101ac5760003560e01c806395a8c58d116100ec578063aa271e1a1161008a578063cf86a95a11610064578063cf86a95a14610550578063d505accf14610570578063dd62ed3e14610590578063f172a4ce146105c857600080fd5b8063aa271e1a146104fd578063b5ef694d1461051d578063bc0ba3c51461053d57600080fd5b80639dc29fac116100c65780639dc29fac1461048a578063a457c2d7146104aa578063a60fee37146104ca578063a9059cbb146104dd57600080fd5b806395a8c58d1461043557806395d89b41146104555780639c1766771461046a57600080fd5b8063313ce5671161015957806340c10f191161013357806340c10f191461039957806370a08231146103bb5780637ecebe00146103e85780638626698f1461041557600080fd5b8063313ce567146102a55780633644e515146102d1578063395093511461037957600080fd5b8063129d81881161018a578063129d81881461025057806318160ddd1461026f57806323b872dd1461028557600080fd5b806306fdde03146101b1578063095ea7b3146101dc57806309c6bed91461020c575b600080fd5b3480156101bd57600080fd5b506101c66105de565b6040516101d391906115c3565b60405180910390f35b3480156101e857600080fd5b506101fc6101f7366004611612565b61066c565b60405190151581526020016101d3565b34801561021857600080fd5b506040516001600160a01b037f000000000000000000000000b5fb4be02232b1bba4dc8f81dc24c26980de9e3c1681526020016101d3565b34801561025c57600080fd5b506008545b6040519081526020016101d3565b34801561027b57600080fd5b5061026160025481565b34801561029157600080fd5b506101fc6102a036600461163c565b610683565b3480156102b157600080fd5b506007546102bf9060ff1681565b60405160ff90911681526020016101d3565b3480156102dd57600080fd5b5060035460408051808201825260018152603160f81b60209182015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81830152808301939093527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608401524660808401523060a0808501919091528251808503909101815260c09093019091528151910120610261565b34801561038557600080fd5b506101fc610394366004611612565b6106da565b3480156103a557600080fd5b506103b96103b4366004611612565b610711565b005b3480156103c757600080fd5b506102616103d6366004611678565b60006020819052908152604090205481565b3480156103f457600080fd5b50610261610403366004611678565b60046020526000908152604090205481565b34801561042157600080fd5b506103b96104303660046116ed565b610768565b34801561044157600080fd5b506101fc610450366004611788565b610941565b34801561046157600080fd5b506101c6610963565b34801561047657600080fd5b506103b9610485366004611678565b610970565b34801561049657600080fd5b506103b96104a5366004611612565b61097f565b3480156104b657600080fd5b506101fc6104c5366004611612565b6109bf565b6103b96104d83660046117bb565b6109f6565b3480156104e957600080fd5b506101fc6104f8366004611612565b610aa2565b34801561050957600080fd5b506101fc610518366004611678565b610aaf565b34801561052957600080fd5b506103b9610538366004611678565b610abb565b6103b961054b36600461186f565b610b01565b34801561055c57600080fd5b506103b961056b366004611678565b610b67565b34801561057c57600080fd5b506103b961058b366004611913565b610ba9565b34801561059c57600080fd5b506102616105ab36600461197d565b600160209081526000928352604080842090915290825290205481565b3480156105d457600080fd5b5061026160035481565b600580546105eb906119a7565b80601f0160208091040260200160405190810160405280929190818152602001828054610617906119a7565b80156106645780601f1061063957610100808354040283529160200191610664565b820191906000526020600020905b81548152906001019060200180831161064757829003601f168201915b505050505081565b6000610679338484610eea565b5060015b92915050565b6001600160a01b038316600090815260016020908152604080832033845290915281205460001981146106c4576106c485336106bf86856119f7565b610eea565b6106cf858585610f87565b506001949350505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916106799185906106bf908690611a0a565b600061072c61071f33611063565b600160ff84161b16151590565b6107595760405163bb6c163960e01b815233600482015260ff821660248201526044015b60405180910390fd5b6107638383611077565b505050565b7fc778385ecb3e8cecb82223fa1f343ec6865b2d64c65b0c15c7e8aef225d9e21454156107c1576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107ea60017fc778385ecb3e8cecb82223fa1f343ec6865b2d64c65b0c15c7e8aef225d9e21455565b86610821576040517f248fd78f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084900361085c576040517f0d7673b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000829003610897576040517ff09ce01300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60056108a4858783611a81565b5060066108b2838583611a81565b506007805460ff191660ff831617905560088790556108f07f000000000000000000000000b5fb4be02232b1bba4dc8f81dc24c26980de9e3c611128565b6108f986611128565b61093885858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061113392505050565b50505050505050565b600061095c61094f84611063565b600160ff85161b16151590565b9392505050565b600680546105eb906119a7565b61097c81336000611140565b50565b600061098d61071f33611063565b6109b55760405163bb6c163960e01b815233600482015260ff82166024820152604401610750565b6107638383611151565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916106799185906106bf9086906119f7565b610a018833856111fc565b7f000000000000000000000000b5fb4be02232b1bba4dc8f81dc24c26980de9e3c6001600160a01b03166370756cde34610a3a60085490565b8b8b8b8b8b8b8b8b6040518b63ffffffff1660e01b8152600401610a6699989796959493929190611b6b565b6000604051808303818588803b158015610a7f57600080fd5b505af1158015610a93573d6000803e3d6000fd5b50505050505050505050505050565b6000610679338484610f87565b600061067d8282610941565b6000610ac961071f33611063565b610af15760405163bb6c163960e01b815233600482015260ff82166024820152604401610750565b610afd33836000611240565b5050565b337f000000000000000000000000b5fb4be02232b1bba4dc8f81dc24c26980de9e3c6001600160a01b03166370756cde34610b3b60085490565b848c8c8c8c8c8c8c6040518b63ffffffff1660e01b8152600401610a6699989796959493929190611b6b565b6000610b7561071f33611063565b610b9d5760405163bb6c163960e01b815233600482015260ff82166024820152604401610750565b610afd33836000611251565b83421115610be3576040517f1a15a3cc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0811115610c3d576040517f40c1e74800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260ff16601b14158015610c5557508260ff16601c14155b15610c8c576040517f119bce3900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006040518060400160405280600281526020017f1901000000000000000000000000000000000000000000000000000000000000815250610d6060035460408051808201825260018152603160f81b60209182015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81830152808301939093527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608401524660808401523060a0808501919091528251808503909101815260c0909301909152815191012090565b6001600160a01b038a16600090815260046020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9928d928d928d92909190610dae83611bd2565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810188905260e00160405160208183030381529060405280519060200120604051602001610e1293929190611beb565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015610e7d573d6000803e3d6000fd5b505050602060405103519050886001600160a01b0316816001600160a01b031614610ed4576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610edf898989610eea565b505050505050505050565b6001600160a01b0383161580610f0757506001600160a01b038216155b15610f2557604051630da30f6560e31b815260040160405180910390fd5b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383161580610fa457506001600160a01b038216155b15610fc257604051630da30f6560e31b815260040160405180910390fd5b6001600160a01b03831660009081526020819052604081208054839290610fea9084906119f7565b90915550506001600160a01b03821660009081526020819052604081208054839290611017908490611a0a565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610f7a91815260200190565b60008061106f83611262565b549392505050565b6001600160a01b03821661109e57604051630da30f6560e31b815260040160405180910390fd5b80600260008282546110b09190611a0a565b90915550506001600160a01b038216600090815260208190526040812080548392906110dd908490611a0a565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b61097c8160006112cf565b8051602090910120600355565b6107638383600160ff85161b6112df565b6001600160a01b03821661117857604051630da30f6560e31b815260040160405180910390fd5b6001600160a01b038216600090815260208190526040812080548392906111a09084906119f7565b9250508190555080600260008282546111b991906119f7565b90915550506040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161111c565b6001600160a01b03808416600090815260016020908152604080832093861683529290522054600019811461123a5761123a84846106bf85856119f7565b50505050565b6107638383600160ff85161b611352565b6107638383600160ff85161b6113e4565b60007fde9bdca322e1a848f72215bc15cf2c87fe7749145789a9ee281a2a6290af26ab826040516020016112b292919091825260601b6bffffffffffffffffffffffff1916602082015260340190565b604051602081830303815290604052805190602001209050919050565b610afd82600160ff84161b61142f565b806112ea8484611490565b1461133b576040517f6004fe400000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301528316602482015260448101829052606401610750565b611347838360006114a6565b6107638383836113e4565b61136561135e84611063565b8216821490565b61139457604051631fe9beed60e21b81526001600160a01b038416600482015260248101829052604401610750565b61139f8383836114a6565b816001600160a01b0316836001600160a01b03167ff7158d1591c2cf17c0e6b9459d86365c47fe0969c79f40ef49e0c437d8f3991483604051610f7a91815260200190565b6113f061135e84611063565b61141f57604051631fe9beed60e21b81526001600160a01b038416600482015260248101829052604401610750565b61142983826114bb565b61076382825b60008161143b84611063565b1790506114488382611510565b826001600160a01b03167f34e73c57659d4b6809b53db4feee9b007b892e978114eda420d2991aba1501438360405161148391815260200190565b60405180910390a2505050565b60008061149d8484611523565b54949350505050565b60006114b28484611523565b91909155505050565b600081196114c884611063565b1690506114d58382611510565b826001600160a01b03167fccf920c8facee98a9c2a6c6124f2857b87b17e9f3a819bfcc6945196ee77366b8360405161148391815260200190565b600061151b83611262565b919091555050565b60007ff96e07b2f4fbb81c31567d2b261589af429e98f0958d53f7e6ad5d63aea0ab7c838360405160200161158193929190928352606091821b6bffffffffffffffffffffffff199081166020850152911b16603482015260480190565b60405160208183030381529060405280519060200120905092915050565b60005b838110156115ba5781810151838201526020016115a2565b50506000910152565b60208152600082518060208401526115e281604085016020870161159f565b601f01601f19169190910160400192915050565b80356001600160a01b038116811461160d57600080fd5b919050565b6000806040838503121561162557600080fd5b61162e836115f6565b946020939093013593505050565b60008060006060848603121561165157600080fd5b61165a846115f6565b9250611668602085016115f6565b9150604084013590509250925092565b60006020828403121561168a57600080fd5b61095c826115f6565b60008083601f8401126116a557600080fd5b50813567ffffffffffffffff8111156116bd57600080fd5b6020830191508360208285010111156116d557600080fd5b9250929050565b803560ff8116811461160d57600080fd5b600080600080600080600060a0888a03121561170857600080fd5b87359650611718602089016115f6565b9550604088013567ffffffffffffffff8082111561173557600080fd5b6117418b838c01611693565b909750955060608a013591508082111561175a57600080fd5b506117678a828b01611693565b909450925061177a9050608089016116dc565b905092959891949750929550565b6000806040838503121561179b57600080fd5b6117a4836115f6565b91506117b2602084016116dc565b90509250929050565b60008060008060008060008060a0898b0312156117d757600080fd5b6117e0896115f6565b9750602089013567ffffffffffffffff808211156117fd57600080fd5b6118098c838d01611693565b909950975060408b013591508082111561182257600080fd5b61182e8c838d01611693565b909750955060608b0135945060808b013591508082111561184e57600080fd5b5061185b8b828c01611693565b999c989b5096995094979396929594505050565b60008060008060008060006080888a03121561188a57600080fd5b873567ffffffffffffffff808211156118a257600080fd5b6118ae8b838c01611693565b909950975060208a01359150808211156118c757600080fd5b6118d38b838c01611693565b909750955060408a0135945060608a01359150808211156118f357600080fd5b506119008a828b01611693565b989b979a50959850939692959293505050565b600080600080600080600060e0888a03121561192e57600080fd5b611937886115f6565b9650611945602089016115f6565b95506040880135945060608801359350611961608089016116dc565b925060a0880135915060c0880135905092959891949750929550565b6000806040838503121561199057600080fd5b611999836115f6565b91506117b2602084016115f6565b600181811c908216806119bb57607f821691505b6020821081036119db57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561067d5761067d6119e1565b8082018082111561067d5761067d6119e1565b634e487b7160e01b600052604160045260246000fd5b601f82111561076357600081815260208120601f850160051c81016020861015611a5a5750805b601f850160051c820191505b81811015611a7957828155600101611a66565b505050505050565b67ffffffffffffffff831115611a9957611a99611a1d565b611aad83611aa783546119a7565b83611a33565b6000601f841160018114611ae15760008515611ac95750838201355b600019600387901b1c1916600186901b178355611b3b565b600083815260209020601f19861690835b82811015611b125786850135825560209485019460019092019101611af2565b5086821015611b2f5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8981526001600160a01b038916602082015260c060408201526000611b9460c08301898b611b42565b8281036060840152611ba781888a611b42565b905085608084015282810360a0840152611bc2818587611b42565b9c9b505050505050505050505050565b600060018201611be457611be46119e1565b5060010190565b60008451611bfd81846020890161159f565b9190910192835250602082015260400191905056fea26469706673582212203daee882a83c8072ebb1f4308392c6f302a1c043ed2eda3bf4b01322f3ef9bcf64736f6c63430008150033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b5fb4be02232b1bba4dc8f81dc24c26980de9e3c
-----Decoded View---------------
Arg [0] : interchainTokenServiceAddress (address): 0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000b5fb4be02232b1bba4dc8f81dc24c26980de9e3c
Deployed Bytecode Sourcemap
48160:4745:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48302:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21508:169;;;;;;;;;;-1:-1:-1;21508:169:0;;;;;:::i;:::-;;:::i;:::-;;;1295:14:1;;1288:22;1270:41;;1258:2;1243:18;21508:169:0;1130:187:1;49831:165:0;;;;;;;;;;-1:-1:-1;49831:165:0;;-1:-1:-1;;;;;49965:23:0;1486:55:1;1468:74;;1456:2;1441:18;49831:165:0;1322:226:1;50126:144:0;;;;;;;;;;-1:-1:-1;50255:7:0;;50126:144;;;1699:25:1;;;1687:2;1672:18;50126:144:0;1553:177:1;20700:35:0;;;;;;;;;;;;;;;;22159:375;;;;;;;;;;-1:-1:-1;22159:375:0;;;;;:::i;:::-;;:::i;48354:21::-;;;;;;;;;;-1:-1:-1;48354:21:0;;;;;;;;;;;2422:4:1;2410:17;;;2392:36;;2380:2;2365:18;48354:21:0;2250:184:1;28838:196:0;;;;;;;;;;-1:-1:-1;28963:8:0;;28983:10;;;;;;;;;;;-1:-1:-1;;;28983:10:0;;;;;28924:101;;27945:66;28924:101;;;8483:25:1;8524:18;;;8517:34;;;;28973:21:0;8567:18:1;;;8560:34;28996:13:0;8610:18:1;;;8603:34;29019:4:0;8653:19:1;;;;8646:84;;;;28924:101:0;;;;;;;;;;8455:19:1;;;;28924:101:0;;;28914:112;;;;;28838:196;;22943:211;;;;;;;;;;-1:-1:-1;22943:211:0;;;;;:::i;:::-;;:::i;51833:127::-;;;;;;;;;;-1:-1:-1;51833:127:0;;;;;:::i;:::-;;:::i;:::-;;20556:53;;;;;;;;;;-1:-1:-1;20556:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;;28325:41;;;;;;;;;;-1:-1:-1;28325:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;50624:959;;;;;;;;;;-1:-1:-1;50624:959:0;;;;;:::i;:::-;;:::i;3009:133::-;;;;;;;;;;-1:-1:-1;3009:133:0;;;;;:::i;:::-;;:::i;48327:20::-;;;;;;;;;;;;;:::i;47340:130::-;;;;;;;;;;-1:-1:-1;47340:130:0;;;;;:::i;:::-;;:::i;52202:127::-;;;;;;;;;;-1:-1:-1;52202:127:0;;;;;:::i;:::-;;:::i;23657:221::-;;;;;;;;;;-1:-1:-1;23657:221:0;;;;;:::i;:::-;;:::i;38664:648::-;;;;;;:::i;:::-;;:::i;21013:175::-;;;;;;;;;;-1:-1:-1;21013:175:0;;;;;:::i;:::-;;:::i;47677:121::-;;;;;;;;;;-1:-1:-1;47677:121:0;;;;;:::i;:::-;;:::i;46992:156::-;;;;;;;;;;-1:-1:-1;46992:156:0;;;;;:::i;:::-;;:::i;37222:607::-;;;;;;:::i;:::-;;:::i;46634:158::-;;;;;;;;;;-1:-1:-1;46634:158:0;;;;;:::i;:::-;;:::i;29717:911::-;;;;;;;;;;-1:-1:-1;29717:911:0;;;;;:::i;:::-;;:::i;20618:73::-;;;;;;;;;;-1:-1:-1;20618:73:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;27661:23;;;;;;;;;;;;;;;;48302:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21508:169::-;21593:4;21610:37;21619:10;21631:7;21640:6;21610:8;:37::i;:::-;-1:-1:-1;21665:4:0;21508:169;;;;;:::o;22159:375::-;-1:-1:-1;;;;;22305:17:0;;22267:4;22305:17;;;:9;:17;;;;;;;;22323:10;22305:29;;;;;;;;-1:-1:-1;;22351:25:0;;22347:107;;22393:49;22402:6;22410:10;22422:19;22435:6;22422:10;:19;:::i;:::-;22393:8;:49::i;:::-;22466:36;22476:6;22484:9;22495:6;22466:9;:36::i;:::-;-1:-1:-1;22522:4:0;;22159:375;-1:-1:-1;;;;22159:375:0:o;22943:211::-;23059:10;23033:4;23080:21;;;:9;:21;;;;;;;;-1:-1:-1;;;;;23080:30:0;;;;;;;;;;23033:4;;23050:74;;23071:7;;23080:43;;23113:10;;23080:43;:::i;51833:127::-;51904:12;1967:37;1976:21;1986:10;1976:9;:21::i;:::-;9292:1;:9;;;;9276:26;:31;;;9177:138;1967:37;1962:80;;2013:29;;-1:-1:-1;;;2013:29:0;;2025:10;2013:29;;;9230:74:1;9352:4;9340:17;;9320:18;;;9313:45;9203:18;;2013:29:0;;;;;;;;1962:80;51930:22:::1;51936:7;51945:6;51930:5;:22::i;:::-;51833:127:::0;;;:::o;50624:959::-;49443:16;49437:23;50769:49;;;50798:20;;;;;;;;;;;;;;50769:49;50831:13;49667:4;49649:16;49642:30;49575:115;50831:13;50861:8;50857:48;;50892:13;;;;;;;;;;;;;;50857:48;50947:1;50920:28;;;50916:57;;50957:16;;;;;;;;;;;;;;50916:57;51017:1;50988:30;;;50984:61;;51027:18;;;;;;;;;;;;;;50984:61;51058:4;:16;51065:9;;51058:4;:16;:::i;:::-;-1:-1:-1;51085:6:0;:20;51094:11;;51085:6;:20;:::i;:::-;-1:-1:-1;51116:8:0;:24;;-1:-1:-1;;51116:24:0;;;;;;;51151:7;:18;;;51475:35;51486:23;51475:10;:35::i;:::-;51521:18;51532:6;51521:10;:18::i;:::-;51552:23;51565:9;;51552:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51552:12:0;;-1:-1:-1;;;51552:23:0:i;:::-;50624:959;;;;;;;:::o;3009:133::-;3076:4;3100:34;3109:18;3119:7;3109:9;:18::i;:::-;9292:1;:9;;;;9276:26;:31;;;9177:138;3100:34;3093:41;3009:133;-1:-1:-1;;;3009:133:0:o;48327:20::-;;;;;;;:::i;47340:130::-;47406:56;47418:10;47430;47448:12;47406:11;:56::i;:::-;47340:130;:::o;52202:127::-;52273:12;1967:37;1976:21;1986:10;1976:9;:21::i;1967:37::-;1962:80;;2013:29;;-1:-1:-1;;;2013:29:0;;2025:10;2013:29;;;9230:74:1;9352:4;9340:17;;9320:18;;;9313:45;9203:18;;2013:29:0;9060:304:1;1962:80:0;52299:22:::1;52305:7;52314:6;52299:5;:22::i;23657:221::-:0;23778:10;23752:4;23799:21;;;:9;:21;;;;;;;;-1:-1:-1;;;;;23799:30:0;;;;;;;;;;23752:4;;23769:79;;23790:7;;23799:48;;23832:15;;23799:48;:::i;38664:648::-;38893:43;38909:6;38917:10;38929:6;38893:15;:43::i;:::-;49965:23;-1:-1:-1;;;;;39042:77:0;;39128:9;39154:19;50255:7;;;50126:144;39154:19;39188:6;39209:16;;39240:9;;39264:6;39285:8;;39042:262;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38664:648;;;;;;;;:::o;21013:175::-;21101:4;21118:40;21128:10;21140:9;21151:6;21118:9;:40::i;47677:121::-;47732:4;47756:34;47764:4;47732;3009:133;:::i;46992:156::-;47060:12;1967:37;1976:21;1986:10;1976:9;:21::i;1967:37::-;1962:80;;2013:29;;-1:-1:-1;;;2013:29:0;;2025:10;2013:29;;;9230:74:1;9352:4;9340:17;;9320:18;;;9313:45;9203:18;;2013:29:0;9060:304:1;1962:80:0;47086:54:::1;47099:10;47111:7:::0;47126:12:::1;47086;:54::i;:::-;46992:156:::0;;:::o;37222:607::-;37439:10;49965:23;-1:-1:-1;;;;;37559:77:0;;37645:9;37671:19;50255:7;;;50126:144;37671:19;37705:6;37726:16;;37757:9;;37781:6;37802:8;;37559:262;;;;;;;;;;;;;;;;;;;;;;;:::i;46634:158::-;46703:12;1967:37;1976:21;1986:10;1976:9;:21::i;1967:37::-;1962:80;;2013:29;;-1:-1:-1;;;2013:29:0;;2025:10;2013:29;;;9230:74:1;9352:4;9340:17;;9320:18;;;9313:45;9203:18;;2013:29:0;9060:304:1;1962:80:0;46729:55:::1;46743:10;46755:7:::0;46770:12:::1;46729:13;:55::i;29717:911::-:0;29872:8;29854:15;:26;29850:54;;;29889:15;;;;;;;;;;;;;;29850:54;29934:66;29921:79;;29917:102;;;30009:10;;;;;;;;;;;;;;29917:102;30036:1;:7;;30041:2;30036:7;;:18;;;;;30047:1;:7;;30052:2;30047:7;;30036:18;30032:41;;;30063:10;;;;;;;;;;;;;;30032:41;30086:14;30162:40;;;;;;;;;;;;;;;;;30221:18;28963:8;;28983:10;;;;;;;;;;;-1:-1:-1;;;28983:10:0;;;;;28924:101;;27945:66;28924:101;;;8483:25:1;8524:18;;;8517:34;;;;28973:21:0;8567:18:1;;;8560:34;28996:13:0;8610:18:1;;;8603:34;29019:4:0;8653:19:1;;;;8646:84;;;;28924:101:0;;;;;;;;;;8455:19:1;;;;28924:101:0;;;28914:112;;;;;;28838:196;30221:18;-1:-1:-1;;;;;30326:14:0;;28174:75;30326:14;;;:6;:14;;;;;:16;;28182:66;;30302:6;;30310:7;;30319:5;;30326:16;;:14;:16;;;:::i;:::-;;;;-1:-1:-1;30268:85:0;;;;;;13209:25:1;;;;-1:-1:-1;;;;;13331:15:1;;;13311:18;;;13304:43;13383:15;;;;13363:18;;;13356:43;13415:18;;;13408:34;13458:19;;;13451:35;13502:19;;;13495:35;;;13181:19;;30268:85:0;;;;;;;;;;;;30258:96;;;;;;30127:242;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;30127:242:0;;;;;;;;;30103:277;;30127:242;30103:277;;;;30393:24;30420:26;;;;;;;;;14225:25:1;;;14298:4;14286:17;;14266:18;;;14259:45;;;;14320:18;;;14313:34;;;14363:18;;;14356:34;;;30103:277:0;;-1:-1:-1;30393:24:0;30420:26;;14197:19:1;;30420:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30393:53;;30483:6;-1:-1:-1;;;;;30463:26:0;:16;-1:-1:-1;;;;;30463:26:0;;30459:57;;30498:18;;;;;;;;;;;;;;30459:57;30588:32;30597:6;30605:7;30614:5;30588:8;:32::i;:::-;29839:789;;29717:911;;;;;;;:::o;26255:270::-;-1:-1:-1;;;;;26353:19:0;;;;:44;;-1:-1:-1;;;;;;26376:21:0;;;26353:44;26349:73;;;26406:16;;-1:-1:-1;;;26406:16:0;;;;;;;;;;;26349:73;-1:-1:-1;;;;;26435:16:0;;;;;;;:9;:16;;;;;;;;:25;;;;;;;;;;;;;:34;;;26485:32;;1699:25:1;;;26485:32:0;;1672:18:1;26485:32:0;;;;;;;;26255:270;;;:::o;24368:314::-;-1:-1:-1;;;;;24470:20:0;;;;:47;;-1:-1:-1;;;;;;24494:23:0;;;24470:47;24466:76;;;24526:16;;-1:-1:-1;;;24526:16:0;;;;;;;;;;;24466:76;-1:-1:-1;;;;;24555:17:0;;:9;:17;;;;;;;;;;:27;;24576:6;;24555:9;:27;;24576:6;;24555:27;:::i;:::-;;;;-1:-1:-1;;;;;;;24593:20:0;;:9;:20;;;;;;;;;;:30;;24617:6;;24593:9;:30;;24617:6;;24593:30;:::i;:::-;;;;;;;;24656:9;-1:-1:-1;;;;;24639:35:0;24648:6;-1:-1:-1;;;;;24639:35:0;;24667:6;24639:35;;;;1699:25:1;;1687:2;1672:18;;1553:177;4217:203:0;4276:20;4309:11;4323:18;4333:7;4323:9;:18::i;:::-;4392:10;;4217:203;-1:-1:-1;;;4217:203:0:o;24964:260::-;-1:-1:-1;;;;;25044:21:0;;25040:50;;25074:16;;-1:-1:-1;;;25074:16:0;;;;;;;;;;;25040:50;25118:6;25103:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;25135:18:0;;:9;:18;;;;;;;;;;:28;;25157:6;;25135:9;:28;;25157:6;;25135:28;:::i;:::-;;;;-1:-1:-1;;25179:37:0;;1699:25:1;;;-1:-1:-1;;;;;25179:37:0;;;25196:1;;25179:37;;1687:2:1;1672:18;25179:37:0;;;;;;;;24964:260;;:::o;46344:103::-;46401:38;46410:7;46425:12;46401:8;:38::i;28489:103::-;28562:22;;;;;;;28551:8;:33;28489:103::o;12923:197::-;13058:54;13078:11;13091:9;13102:1;:9;;;;13058:19;:54::i;25557:260::-;-1:-1:-1;;;;;25637:21:0;;25633:50;;25667:16;;-1:-1:-1;;;25667:16:0;;;;;;;;;;;25633:50;-1:-1:-1;;;;;25696:18:0;;:9;:18;;;;;;;;;;:28;;25718:6;;25696:9;:28;;25718:6;;25696:28;:::i;:::-;;;;;;;;25750:6;25735:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;25772:37:0;;1699:25:1;;;25798:1:0;;-1:-1:-1;;;;;25772:37:0;;;;;1687:2:1;1672:18;25772:37:0;1553:177:1;52628:274:0;-1:-1:-1;;;;;52752:17:0;;;52731:18;52752:17;;;:9;:17;;;;;;;;:26;;;;;;;;;;-1:-1:-1;;52795:25:0;;52791:104;;52837:46;52846:6;52854:7;52863:19;52876:6;52863:10;:19;:::i;52837:46::-;52720:182;52628:274;;;:::o;10818:191::-;10946:55;10967:11;10980:9;10991:1;:9;;;;10946:20;:55::i;14790:193::-;14919:56;14941:11;14954:9;14965:1;:9;;;;14919:21;:56::i;3841:156::-;3908:11;1705:18;3980:7;3949:39;;;;;;;;14558:19:1;;;14615:2;14611:15;-1:-1:-1;;14607:53:1;14602:2;14593:12;;14586:75;14686:2;14677:12;;14401:294;3949:39:0;;;;;;;;;;;;;3939:50;;;;;;3932:57;;3841:156;;;:::o;6624:111::-;6691:36;6708:7;6717:1;:9;;;;6691:16;:36::i;14020:442::-;14222:12;14177:41;14195:11;14208:9;14177:17;:41::i;:::-;:57;14173:155;;14258:58;;;;;-1:-1:-1;;;;;14981:15:1;;;14258:58:0;;;14963:34:1;15033:15;;15013:18;;;15006:43;15065:18;;;15058:34;;;14875:18;;14258:58:0;14700:398:1;14173:155:0;14340:44;14358:11;14371:9;14382:1;14340:17;:44::i;:::-;14395:59;14417:11;14430:9;14441:12;14395:21;:59::i;12193:400::-;12344:53;12360:22;12370:11;12360:9;:22::i;:::-;9758:38;;9757:64;;;9630:199;12344:53;12339:109;;12406:42;;-1:-1:-1;;;12406:42:0;;-1:-1:-1;;;;;15295:55:1;;12406:42:0;;;15277:74:1;15367:18;;;15360:34;;;15250:18;;12406:42:0;15103:297:1;12339:109:0;12461:55;12479:11;12492:9;12503:12;12461:17;:55::i;:::-;12561:9;-1:-1:-1;;;;;12534:51:0;12548:11;-1:-1:-1;;;;;12534:51:0;;12572:12;12534:51;;;;1699:25:1;;1687:2;1672:18;;1553:177;15875:375:0;16027:53;16043:22;16053:11;16043:9;:22::i;16027:53::-;16022:109;;16089:42;;-1:-1:-1;;;16089:42:0;;-1:-1:-1;;;;;15295:55:1;;16089:42:0;;;15277:74:1;15367:18;;;15360:34;;;15250:18;;16089:42:0;15103:297:1;16022:109:0;16144:46;16164:11;16177:12;16144:19;:46::i;:::-;16201:41;16218:9;16229:12;7439:251;7524:23;7571:12;7550:18;7560:7;7550:9;:18::i;:::-;:33;7524:59;;7596:35;7606:7;7615:15;7596:9;:35::i;:::-;7660:7;-1:-1:-1;;;;;7649:33:0;;7669:12;7649:33;;;;1699:25:1;;1687:2;1672:18;;1553:177;7649:33:0;;;;;;;;7513:177;7439:251;;:::o;5585:256::-;5675:22;5710:11;5724:36;5737:11;5750:9;5724:12;:36::i;:::-;5813:10;;5585:256;-1:-1:-1;;;;5585:256:0:o;6132:274::-;6276:11;6290:36;6303:11;6316:9;6290:12;:36::i;:::-;6361:27;;;;-1:-1:-1;;;6132:274:0:o;8650:257::-;8738:23;8786:12;8785:13;8764:18;8774:7;8764:9;:18::i;:::-;:34;8738:60;;8811:35;8821:7;8830:15;8811:9;:35::i;:::-;8877:7;-1:-1:-1;;;;;8864:35:0;;8886:12;8864:35;;;;1699:25:1;;1687:2;1672:18;;1553:177;4613:187:0;4690:11;4704:18;4714:7;4704:9;:18::i;:::-;4757:25;;;;-1:-1:-1;;4613:187:0:o;5080:205::-;5173:11;1779:26;5253:11;5266:9;5214:62;;;;;;;;;15590:19:1;;;15697:2;15693:15;;;-1:-1:-1;;15689:24:1;;;15684:2;15675:12;;15668:46;15748:15;;15744:24;15739:2;15730:12;;15723:46;15794:2;15785:12;;15405:398;5214:62:0;;;;;;;;;;;;;5204:73;;;;;;5197:80;;5080:205;;;;:::o;14:250:1:-;99:1;109:113;123:6;120:1;117:13;109:113;;;199:11;;;193:18;180:11;;;173:39;145:2;138:10;109:113;;;-1:-1:-1;;256:1:1;238:16;;231:27;14:250::o;269:396::-;418:2;407:9;400:21;381:4;450:6;444:13;493:6;488:2;477:9;473:18;466:34;509:79;581:6;576:2;565:9;561:18;556:2;548:6;544:15;509:79;:::i;:::-;649:2;628:15;-1:-1:-1;;624:29:1;609:45;;;;656:2;605:54;;269:396;-1:-1:-1;;269:396:1:o;670:196::-;738:20;;-1:-1:-1;;;;;787:54:1;;777:65;;767:93;;856:1;853;846:12;767:93;670:196;;;:::o;871:254::-;939:6;947;1000:2;988:9;979:7;975:23;971:32;968:52;;;1016:1;1013;1006:12;968:52;1039:29;1058:9;1039:29;:::i;:::-;1029:39;1115:2;1100:18;;;;1087:32;;-1:-1:-1;;;871:254:1:o;1917:328::-;1994:6;2002;2010;2063:2;2051:9;2042:7;2038:23;2034:32;2031:52;;;2079:1;2076;2069:12;2031:52;2102:29;2121:9;2102:29;:::i;:::-;2092:39;;2150:38;2184:2;2173:9;2169:18;2150:38;:::i;:::-;2140:48;;2235:2;2224:9;2220:18;2207:32;2197:42;;1917:328;;;;;:::o;2439:186::-;2498:6;2551:2;2539:9;2530:7;2526:23;2522:32;2519:52;;;2567:1;2564;2557:12;2519:52;2590:29;2609:9;2590:29;:::i;2630:348::-;2682:8;2692:6;2746:3;2739:4;2731:6;2727:17;2723:27;2713:55;;2764:1;2761;2754:12;2713:55;-1:-1:-1;2787:20:1;;2830:18;2819:30;;2816:50;;;2862:1;2859;2852:12;2816:50;2899:4;2891:6;2887:17;2875:29;;2951:3;2944:4;2935:6;2927;2923:19;2919:30;2916:39;2913:59;;;2968:1;2965;2958:12;2913:59;2630:348;;;;;:::o;2983:156::-;3049:20;;3109:4;3098:16;;3088:27;;3078:55;;3129:1;3126;3119:12;3144:935;3261:6;3269;3277;3285;3293;3301;3309;3362:3;3350:9;3341:7;3337:23;3333:33;3330:53;;;3379:1;3376;3369:12;3330:53;3415:9;3402:23;3392:33;;3444:38;3478:2;3467:9;3463:18;3444:38;:::i;:::-;3434:48;;3533:2;3522:9;3518:18;3505:32;3556:18;3597:2;3589:6;3586:14;3583:34;;;3613:1;3610;3603:12;3583:34;3652:59;3703:7;3694:6;3683:9;3679:22;3652:59;:::i;:::-;3730:8;;-1:-1:-1;3626:85:1;-1:-1:-1;3818:2:1;3803:18;;3790:32;;-1:-1:-1;3834:16:1;;;3831:36;;;3863:1;3860;3853:12;3831:36;;3902:61;3955:7;3944:8;3933:9;3929:24;3902:61;:::i;:::-;3982:8;;-1:-1:-1;3876:87:1;-1:-1:-1;4036:37:1;;-1:-1:-1;4068:3:1;4053:19;;4036:37;:::i;:::-;4026:47;;3144:935;;;;;;;;;;:::o;4084:256::-;4150:6;4158;4211:2;4199:9;4190:7;4186:23;4182:32;4179:52;;;4227:1;4224;4217:12;4179:52;4250:29;4269:9;4250:29;:::i;:::-;4240:39;;4298:36;4330:2;4319:9;4315:18;4298:36;:::i;:::-;4288:46;;4084:256;;;;;:::o;4345:1152::-;4474:6;4482;4490;4498;4506;4514;4522;4530;4583:3;4571:9;4562:7;4558:23;4554:33;4551:53;;;4600:1;4597;4590:12;4551:53;4623:29;4642:9;4623:29;:::i;:::-;4613:39;;4703:2;4692:9;4688:18;4675:32;4726:18;4767:2;4759:6;4756:14;4753:34;;;4783:1;4780;4773:12;4753:34;4822:59;4873:7;4864:6;4853:9;4849:22;4822:59;:::i;:::-;4900:8;;-1:-1:-1;4796:85:1;-1:-1:-1;4988:2:1;4973:18;;4960:32;;-1:-1:-1;5004:16:1;;;5001:36;;;5033:1;5030;5023:12;5001:36;5072:61;5125:7;5114:8;5103:9;5099:24;5072:61;:::i;:::-;5152:8;;-1:-1:-1;5046:87:1;-1:-1:-1;5234:2:1;5219:18;;5206:32;;-1:-1:-1;5291:3:1;5276:19;;5263:33;;-1:-1:-1;5308:16:1;;;5305:36;;;5337:1;5334;5327:12;5305:36;;5376:61;5429:7;5418:8;5407:9;5403:24;5376:61;:::i;:::-;4345:1152;;;;-1:-1:-1;4345:1152:1;;-1:-1:-1;4345:1152:1;;;;;;5456:8;-1:-1:-1;;;4345:1152:1:o;5502:1077::-;5622:6;5630;5638;5646;5654;5662;5670;5723:3;5711:9;5702:7;5698:23;5694:33;5691:53;;;5740:1;5737;5730:12;5691:53;5780:9;5767:23;5809:18;5850:2;5842:6;5839:14;5836:34;;;5866:1;5863;5856:12;5836:34;5905:59;5956:7;5947:6;5936:9;5932:22;5905:59;:::i;:::-;5983:8;;-1:-1:-1;5879:85:1;-1:-1:-1;6071:2:1;6056:18;;6043:32;;-1:-1:-1;6087:16:1;;;6084:36;;;6116:1;6113;6106:12;6084:36;6155:61;6208:7;6197:8;6186:9;6182:24;6155:61;:::i;:::-;6235:8;;-1:-1:-1;6129:87:1;-1:-1:-1;6317:2:1;6302:18;;6289:32;;-1:-1:-1;6374:2:1;6359:18;;6346:32;;-1:-1:-1;6390:16:1;;;6387:36;;;6419:1;6416;6409:12;6387:36;;6458:61;6511:7;6500:8;6489:9;6485:24;6458:61;:::i;:::-;5502:1077;;;;-1:-1:-1;5502:1077:1;;-1:-1:-1;5502:1077:1;;;;6432:87;;-1:-1:-1;;;5502:1077:1:o;6584:606::-;6695:6;6703;6711;6719;6727;6735;6743;6796:3;6784:9;6775:7;6771:23;6767:33;6764:53;;;6813:1;6810;6803:12;6764:53;6836:29;6855:9;6836:29;:::i;:::-;6826:39;;6884:38;6918:2;6907:9;6903:18;6884:38;:::i;:::-;6874:48;;6969:2;6958:9;6954:18;6941:32;6931:42;;7020:2;7009:9;7005:18;6992:32;6982:42;;7043:37;7075:3;7064:9;7060:19;7043:37;:::i;:::-;7033:47;;7127:3;7116:9;7112:19;7099:33;7089:43;;7179:3;7168:9;7164:19;7151:33;7141:43;;6584:606;;;;;;;;;;:::o;7195:260::-;7263:6;7271;7324:2;7312:9;7303:7;7299:23;7295:32;7292:52;;;7340:1;7337;7330:12;7292:52;7363:29;7382:9;7363:29;:::i;:::-;7353:39;;7411:38;7445:2;7434:9;7430:18;7411:38;:::i;7460:437::-;7539:1;7535:12;;;;7582;;;7603:61;;7657:4;7649:6;7645:17;7635:27;;7603:61;7710:2;7702:6;7699:14;7679:18;7676:38;7673:218;;-1:-1:-1;;;7744:1:1;7737:88;7848:4;7845:1;7838:15;7876:4;7873:1;7866:15;7673:218;;7460:437;;;:::o;7902:184::-;-1:-1:-1;;;7951:1:1;7944:88;8051:4;8048:1;8041:15;8075:4;8072:1;8065:15;8091:128;8158:9;;;8179:11;;;8176:37;;;8193:18;;:::i;8741:125::-;8806:9;;;8827:10;;;8824:36;;;8840:18;;:::i;9369:184::-;-1:-1:-1;;;9418:1:1;9411:88;9518:4;9515:1;9508:15;9542:4;9539:1;9532:15;9684:545;9786:2;9781:3;9778:11;9775:448;;;9822:1;9847:5;9843:2;9836:17;9892:4;9888:2;9878:19;9962:2;9950:10;9946:19;9943:1;9939:27;9933:4;9929:38;9998:4;9986:10;9983:20;9980:47;;;-1:-1:-1;10021:4:1;9980:47;10076:2;10071:3;10067:12;10064:1;10060:20;10054:4;10050:31;10040:41;;10131:82;10149:2;10142:5;10139:13;10131:82;;;10194:17;;;10175:1;10164:13;10131:82;;;10135:3;;;9684:545;;;:::o;10405:1206::-;10529:18;10524:3;10521:27;10518:53;;;10551:18;;:::i;:::-;10580:94;10670:3;10630:38;10662:4;10656:11;10630:38;:::i;:::-;10624:4;10580:94;:::i;:::-;10700:1;10725:2;10720:3;10717:11;10742:1;10737:616;;;;11397:1;11414:3;11411:93;;;-1:-1:-1;11470:19:1;;;11457:33;11411:93;-1:-1:-1;;10362:1:1;10358:11;;;10354:24;10350:29;10340:40;10386:1;10382:11;;;10337:57;11517:78;;10710:895;;10737:616;9631:1;9624:14;;;9668:4;9655:18;;-1:-1:-1;;10773:17:1;;;10874:9;10896:229;10910:7;10907:1;10904:14;10896:229;;;10999:19;;;10986:33;10971:49;;11106:4;11091:20;;;;11059:1;11047:14;;;;10926:12;10896:229;;;10900:3;11153;11144:7;11141:16;11138:159;;;11277:1;11273:6;11267:3;11261;11258:1;11254:11;11250:21;11246:34;11242:39;11229:9;11224:3;11220:19;11207:33;11203:79;11195:6;11188:95;11138:159;;;11340:1;11334:3;11331:1;11327:11;11323:19;11317:4;11310:33;10710:895;;;10405:1206;;;:::o;11616:267::-;11705:6;11700:3;11693:19;11757:6;11750:5;11743:4;11738:3;11734:14;11721:43;-1:-1:-1;11809:1:1;11784:16;;;11802:4;11780:27;;;11773:38;;;;11865:2;11844:15;;;-1:-1:-1;;11840:29:1;11831:39;;;11827:50;;11616:267::o;11888:889::-;12243:6;12232:9;12225:25;-1:-1:-1;;;;;12290:6:1;12286:55;12281:2;12270:9;12266:18;12259:83;12378:3;12373:2;12362:9;12358:18;12351:31;12206:4;12405:63;12463:3;12452:9;12448:19;12440:6;12432;12405:63;:::i;:::-;12516:9;12508:6;12504:22;12499:2;12488:9;12484:18;12477:50;12550;12593:6;12585;12577;12550:50;:::i;:::-;12536:64;;12637:6;12631:3;12620:9;12616:19;12609:35;12693:9;12685:6;12681:22;12675:3;12664:9;12660:19;12653:51;12721:50;12764:6;12756;12748;12721:50;:::i;:::-;12713:58;11888:889;-1:-1:-1;;;;;;;;;;;;11888:889:1:o;12782:135::-;12821:3;12842:17;;;12839:43;;12862:18;;:::i;:::-;-1:-1:-1;12909:1:1;12898:13;;12782:135::o;13541:452::-;13728:3;13766:6;13760:13;13782:66;13841:6;13836:3;13829:4;13821:6;13817:17;13782:66;:::i;:::-;13870:16;;;;13895:21;;;-1:-1:-1;13943:4:1;13932:16;;13925:32;13984:2;13973:14;;13541:452;-1:-1:-1;13541:452:1:o
Swarm Source
ipfs://3daee882a83c8072ebb1f4308392c6f302a1c043ed2eda3bf4b01322f3ef9bcf
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in FRAX
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.