Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 16354232 | 644 days ago | IN | 0 ETH | 0.01141934 |
Loading...
Loading
Contract Name:
ERC721MintableRoleBasedERC2771
Compiler Version
v0.8.15+commit.e14f2714
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; import "../../../../metatx/ERC2771ContextInternal.sol"; import "./ERC721MintableRoleBased.sol"; /** * @dev Extension of {ERC721} to mint by MINTER_ROLE */ /** * @title ERC721 - Mint as role - with meta-transactions * @notice Allow minting for senders with MINTER_ROLE to mint new tokens with meta-transactions supported via ERC2771 (supports ERC721A). * * @custom:type eip-2535-facet * @custom:category NFTs * @custom:required-dependencies IERC721MintableExtension * @custom:provides-interfaces IERC721MintableRoleBased */ contract ERC721MintableRoleBasedERC2771 is ERC721MintableRoleBased, ERC2771ContextInternal { function _msgSender() internal view virtual override(Context, ERC2771ContextInternal) returns (address) { return ERC2771ContextInternal._msgSender(); } function _msgData() internal view virtual override(Context, ERC2771ContextInternal) returns (bytes calldata) { return ERC2771ContextInternal._msgData(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; import "@openzeppelin/contracts/utils/Context.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "./AccessControlStorage.sol"; import "./IAccessControlEvents.sol"; abstract contract AccessControlInternal is Context, IAccessControlEvents { using AccessControlStorage for AccessControlStorage.Layout; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev Returns `true` if `account` has been granted `role`. */ function _hasRole(bytes32 role, address account) internal view virtual returns (bool) { return AccessControlStorage.layout().roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!_hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(account), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function _getRoleAdmin(bytes32 role) internal view virtual returns (bytes32) { return AccessControlStorage.layout().roles[role].adminRole; } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function _renounceRole(bytes32 role, address account) internal virtual { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = _getRoleAdmin(role); AccessControlStorage.layout().roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!_hasRole(role, account)) { AccessControlStorage.layout().roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (_hasRole(role, account)) { AccessControlStorage.layout().roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; library AccessControlStorage { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } struct Layout { mapping(bytes32 => RoleData) roles; } bytes32 internal constant STORAGE_SLOT = keccak256("openzeppelin.contracts.storage.AccessControl"); function layout() internal pure returns (Layout storage l) { bytes32 slot = STORAGE_SLOT; assembly { l.slot := slot } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControlEvents { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; /** * The caller must be the current contract itself. */ error ErrSenderIsNotSelf();
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; import "@openzeppelin/contracts/utils/Context.sol"; import "./ERC2771ContextStorage.sol"; abstract contract ERC2771ContextInternal is Context { function _isTrustedForwarder(address operator) internal view returns (bool) { return ERC2771ContextStorage.layout().trustedForwarder == operator; } function _msgSender() internal view virtual override returns (address sender) { if (_isTrustedForwarder(msg.sender)) { // The assembly code is more direct than the Solidity version using `abi.decode`. /// @solidity memory-safe-assembly assembly { sender := shr(96, calldataload(sub(calldatasize(), 20))) } } else { return super._msgSender(); } } function _msgData() internal view virtual override returns (bytes calldata) { if (_isTrustedForwarder(msg.sender)) { return msg.data[:msg.data.length - 20]; } else { return super._msgData(); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; library ERC2771ContextStorage { struct Layout { address trustedForwarder; } bytes32 internal constant STORAGE_SLOT = keccak256("openzeppelin.contracts.storage.ERC2771Context"); function layout() internal pure returns (Layout storage l) { bytes32 slot = STORAGE_SLOT; assembly { l.slot := slot } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; /** * @dev Extension of {ERC721A} that allows other facets from the diamond to mint tokens. */ interface IERC721MintableExtension { /** * @dev Creates `amount` new tokens for `to`, of token type `id`. * * See {ERC721A-_mint}. * * Requirements: * * - the caller must be diamond itself (other facets). */ function mintByFacet(address to, uint256 amount) external; /** * @dev Mint new tokens for multiple addresses with different amounts. */ function mintByFacet(address[] memory tos, uint256[] memory amounts) external; /** * @dev Mint constant amount of new tokens for multiple addresses (e.g. 1 nft for each address). */ function mintByFacet(address[] memory tos, uint256 amount) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; library ERC721SupplyStorage { struct Layout { // The next token ID to be minted. uint256 currentIndex; // The number of tokens burned. uint256 burnCounter; // Maximum possible supply of tokens. uint256 maxSupply; } bytes32 internal constant STORAGE_SLOT = keccak256("v2.flair.contracts.storage.ERC721Supply"); function layout() internal pure returns (Layout storage l) { bytes32 slot = STORAGE_SLOT; assembly { l.slot := slot } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; import "../../../../common/Errors.sol"; import "../../../../access/roles/AccessControlInternal.sol"; import "../../extensions/mintable/IERC721MintableExtension.sol"; import "../../../common/metadata/TokenMetadataAdminInternal.sol"; import "../../../ERC721/extensions/supply/ERC721SupplyStorage.sol"; import "./IERC721MintableRoleBased.sol"; /** * @title ERC721 - Mint as role * @notice Allow minting for senders with MINTER_ROLE to mint new tokens (supports ERC721A). * * @custom:type eip-2535-facet * @custom:category NFTs * @custom:required-dependencies IERC721MintableExtension * @custom:provides-interfaces IERC721MintableRoleBased */ contract ERC721MintableRoleBased is IERC721MintableRoleBased, AccessControlInternal, TokenMetadataAdminInternal { using ERC721SupplyStorage for ERC721SupplyStorage.Layout; bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); /** * @inheritdoc IERC721MintableRoleBased */ function mintByRole(address to, uint256 amount) public virtual onlyRole(MINTER_ROLE) { IERC721MintableExtension(address(this)).mintByFacet(to, amount); } /** * @inheritdoc IERC721MintableRoleBased */ function mintByRole(address[] calldata tos, uint256[] calldata amounts) public virtual onlyRole(MINTER_ROLE) { IERC721MintableExtension(address(this)).mintByFacet(tos, amounts); } /** * @inheritdoc IERC721MintableRoleBased */ function mintByRole(address[] calldata tos, uint256 amount) public virtual onlyRole(MINTER_ROLE) { IERC721MintableExtension(address(this)).mintByFacet(tos, amount); } /** * @inheritdoc IERC721MintableRoleBased */ function mintByRole( address to, uint256 amount, string[] calldata tokenURIs ) public virtual onlyRole(MINTER_ROLE) { uint256 nextTokenId = ERC721SupplyStorage.layout().currentIndex; IERC721MintableExtension(address(this)).mintByFacet(to, amount); for (uint256 i = 0; i < amount; i++) { _setURI(nextTokenId + i, tokenURIs[i]); } } /** * @inheritdoc IERC721MintableRoleBased */ function mintByRole(address[] calldata tos, string[] calldata tokenURIs) public virtual onlyRole(MINTER_ROLE) { uint256 nextTokenId = ERC721SupplyStorage.layout().currentIndex; uint256 total = tos.length; IERC721MintableExtension(address(this)).mintByFacet(tos, 1); for (uint256 i = 0; i < total; i++) { _setURI(nextTokenId + i, tokenURIs[i]); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; /** * @dev Extension of {ERC721} that allows a specific role to mint tokens. */ interface IERC721MintableRoleBased { /** * @dev Mints `amount` new tokens for `to`. */ function mintByRole(address to, uint256 amount) external; /** * @dev Mints multiple `amount`s of new tokens for every single address in `tos`. */ function mintByRole(address[] calldata tos, uint256[] calldata amounts) external; /** * @dev Mint constant amount of new tokens for multiple addresses (e.g. 1 nft for each address). */ function mintByRole(address[] calldata tos, uint256 amount) external; /** * @dev Mint new tokens for single address with dedicated tokenURIs. */ function mintByRole( address to, uint256 amount, string[] calldata tokenURIs ) external; /** * @dev Mint new tokens for multiple addresses with dedicated tokenURIs. */ function mintByRole(address[] calldata tos, string[] calldata tokenURIs) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; interface ITokenMetadataInternal { event URI(string value, uint256 indexed tokenId); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; import "./ITokenMetadataInternal.sol"; import "./TokenMetadataStorage.sol"; abstract contract TokenMetadataAdminInternal is ITokenMetadataInternal { function _setBaseURI(string memory baseURI) internal virtual { require(!TokenMetadataStorage.layout().baseURILocked, "Metadata: baseURI locked"); TokenMetadataStorage.layout().baseURI = baseURI; } function _setFallbackURI(string memory baseURI) internal virtual { require(!TokenMetadataStorage.layout().fallbackURILocked, "Metadata: fallbackURI locked"); TokenMetadataStorage.layout().fallbackURI = baseURI; } function _setURI(uint256 tokenId, string memory tokenURI) internal virtual { require(tokenId >= TokenMetadataStorage.layout().lastUnlockedTokenId, "Metadata: tokenURI locked"); TokenMetadataStorage.layout().tokenURIs[tokenId] = tokenURI; emit URI(tokenURI, tokenId); } function _setURISuffix(string memory uriSuffix) internal virtual { require(!TokenMetadataStorage.layout().uriSuffixLocked, "Metadata: uriSuffix locked"); TokenMetadataStorage.layout().uriSuffix = uriSuffix; } function _lockBaseURI() internal virtual { TokenMetadataStorage.layout().baseURILocked = true; } function _lockFallbackURI() internal virtual { TokenMetadataStorage.layout().fallbackURILocked = true; } function _lockURIUntil(uint256 tokenId) internal virtual { TokenMetadataStorage.layout().lastUnlockedTokenId = tokenId; } function _lockURISuffix() internal virtual { TokenMetadataStorage.layout().uriSuffixLocked = true; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; library TokenMetadataStorage { bytes32 internal constant STORAGE_SLOT = keccak256("v2.flair.contracts.storage.TokenMetadata"); struct Layout { string baseURI; bool baseURILocked; string fallbackURI; bool fallbackURILocked; string uriSuffix; bool uriSuffixLocked; uint256 lastUnlockedTokenId; mapping(uint256 => string) tokenURIs; } function layout() internal pure returns (Layout storage l) { bytes32 slot = STORAGE_SLOT; assembly { l.slot := slot } } }
{ "evmVersion": "london", "libraries": {}, "metadata": { "bytecodeHash": "ipfs", "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 1337 }, "remappings": [], "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintByRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string[]","name":"tokenURIs","type":"string[]"}],"name":"mintByRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tos","type":"address[]"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintByRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tos","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"mintByRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tos","type":"address[]"},{"internalType":"string[]","name":"tokenURIs","type":"string[]"}],"name":"mintByRole","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50610ef6806100206000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c8063a217fddf1161005b578063a217fddf146100bd578063b9a47ff2146100d7578063d5391393146100ea578063e4322f0d1461011157600080fd5b80631a056e71146100825780634c361a8c1461009757806380bfddb4146100aa575b600080fd5b610095610090366004610951565b610124565b005b6100956100a53660046109c7565b6101b3565b6100956100b8366004610a21565b6102ec565b6100c5600081565b60405190815260200160405180910390f35b6100956100e5366004610a6d565b610375565b6100c57f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61009561011f366004610a6d565b61041a565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661014e816104fe565b604051632d4f475f60e01b81526001600160a01b0384166004820152602481018390523090632d4f475f90604401600060405180830381600087803b15801561019657600080fd5b505af11580156101aa573d6000803e3d6000fd5b50505050505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66101dd816104fe565b60007faa3a0910ce5fb062d392dc5a532ff9d50bb9d0f614a8eda1a3ec786de0b761f354604051632d4f475f60e01b81526001600160a01b0388166004820152602481018790529091503090632d4f475f90604401600060405180830381600087803b15801561024c57600080fd5b505af1158015610260573d6000803e3d6000fd5b5050505060005b858110156101aa576102da61027c8284610ae3565b86868481811061028e5761028e610afb565b90506020028101906102a09190610b11565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061051292505050565b806102e481610b58565b915050610267565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610316816104fe565b6040516392c56e2d60e01b815230906392c56e2d9061033d90879087908790600401610bb8565b600060405180830381600087803b15801561035757600080fd5b505af115801561036b573d6000803e3d6000fd5b5050505050505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661039f816104fe565b6040517f49142a1400000000000000000000000000000000000000000000000000000000815230906349142a14906103e1908890889088908890600401610bdc565b600060405180830381600087803b1580156103fb57600080fd5b505af115801561040f573d6000803e3d6000fd5b505050505050505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610444816104fe565b7faa3a0910ce5fb062d392dc5a532ff9d50bb9d0f614a8eda1a3ec786de0b761f3546040516392c56e2d60e01b8152859030906392c56e2d90610490908a908590600190600401610bb8565b600060405180830381600087803b1580156104aa57600080fd5b505af11580156104be573d6000803e3d6000fd5b5050505060005b8181101561036b576104ec6104da8285610ae3565b87878481811061028e5761028e610afb565b806104f681610b58565b9150506104c5565b61050f8161050a6105fc565b61060b565b50565b7f021fe373f7e014154d4f551c37c047b9ed9093c774291911030896b9b2dfef65548210156105885760405162461bcd60e51b815260206004820152601960248201527f4d657461646174613a20746f6b656e555249206c6f636b65640000000000000060448201526064015b60405180910390fd5b60008281527f021fe373f7e014154d4f551c37c047b9ed9093c774291911030896b9b2dfef66602052604090206105bf8282610ce6565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b826040516105f09190610dd6565b60405180910390a25050565b60006106066106a3565b905090565b60008281527f2e59e4c2e927cdddbb64e181e0668d9a0fa70dd88f94d999cd87d5496a20da62602090815260408083206001600160a01b038516845290915290205460ff1661069f5761065d816106e9565b610668836020610705565b604051602001610679929190610e09565b60408051601f198184030181529082905262461bcd60e51b825261057f91600401610dd6565b5050565b7fdb1d5e345c4903e9a32b6674ecc8b1deaddbbb2551474fb34c9d34becbe7f420546000906001600160a01b031633036106e4575060131936013560601c90565b503390565b60606106ff6001600160a01b0383166014610705565b92915050565b60606000610714836002610e8a565b61071f906002610ae3565b67ffffffffffffffff81111561073757610737610c47565b6040519080825280601f01601f191660200182016040528015610761576020820181803683370190505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061079857610798610afb565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106107fb576107fb610afb565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000610837846002610e8a565b610842906001610ae3565b90505b60018111156108df577f303132333435363738396162636465660000000000000000000000000000000085600f166010811061088357610883610afb565b1a60f81b82828151811061089957610899610afb565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c936108d881610ea9565b9050610845565b50831561092e5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161057f565b9392505050565b80356001600160a01b038116811461094c57600080fd5b919050565b6000806040838503121561096457600080fd5b61096d83610935565b946020939093013593505050565b60008083601f84011261098d57600080fd5b50813567ffffffffffffffff8111156109a557600080fd5b6020830191508360208260051b85010111156109c057600080fd5b9250929050565b600080600080606085870312156109dd57600080fd5b6109e685610935565b935060208501359250604085013567ffffffffffffffff811115610a0957600080fd5b610a158782880161097b565b95989497509550505050565b600080600060408486031215610a3657600080fd5b833567ffffffffffffffff811115610a4d57600080fd5b610a598682870161097b565b909790965060209590950135949350505050565b60008060008060408587031215610a8357600080fd5b843567ffffffffffffffff80821115610a9b57600080fd5b610aa78883890161097b565b90965094506020870135915080821115610ac057600080fd5b50610a158782880161097b565b634e487b7160e01b600052601160045260246000fd5b60008219821115610af657610af6610acd565b500190565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112610b2857600080fd5b83018035915067ffffffffffffffff821115610b4357600080fd5b6020019150368190038213156109c057600080fd5b600060018201610b6a57610b6a610acd565b5060010190565b8183526000602080850194508260005b85811015610bad576001600160a01b03610b9a83610935565b1687529582019590820190600101610b81565b509495945050505050565b604081526000610bcc604083018587610b71565b9050826020830152949350505050565b604081526000610bf0604083018688610b71565b82810360208401528381527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115610c2857600080fd5b8360051b80866020840137600091016020019081529695505050505050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680610c7157607f821691505b602082108103610c9157634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610ce157600081815260208120601f850160051c81016020861015610cbe5750805b601f850160051c820191505b81811015610cdd57828155600101610cca565b5050505b505050565b815167ffffffffffffffff811115610d0057610d00610c47565b610d1481610d0e8454610c5d565b84610c97565b602080601f831160018114610d495760008415610d315750858301515b600019600386901b1c1916600185901b178555610cdd565b600085815260208120601f198616915b82811015610d7857888601518255948401946001909101908401610d59565b5085821015610d965787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60005b83811015610dc1578181015183820152602001610da9565b83811115610dd0576000848401525b50505050565b6020815260008251806020840152610df5816040850160208701610da6565b601f01601f19169190910160400192915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351610e41816017850160208801610da6565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351610e7e816028840160208801610da6565b01602801949350505050565b6000816000190483118215151615610ea457610ea4610acd565b500290565b600081610eb857610eb8610acd565b50600019019056fea2646970667358221220810208c900e3a8fdd8b317b06e3818dcc9076af9bc5d34776e0c0a18d31265ca64736f6c634300080f0033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061007d5760003560e01c8063a217fddf1161005b578063a217fddf146100bd578063b9a47ff2146100d7578063d5391393146100ea578063e4322f0d1461011157600080fd5b80631a056e71146100825780634c361a8c1461009757806380bfddb4146100aa575b600080fd5b610095610090366004610951565b610124565b005b6100956100a53660046109c7565b6101b3565b6100956100b8366004610a21565b6102ec565b6100c5600081565b60405190815260200160405180910390f35b6100956100e5366004610a6d565b610375565b6100c57f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61009561011f366004610a6d565b61041a565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661014e816104fe565b604051632d4f475f60e01b81526001600160a01b0384166004820152602481018390523090632d4f475f90604401600060405180830381600087803b15801561019657600080fd5b505af11580156101aa573d6000803e3d6000fd5b50505050505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66101dd816104fe565b60007faa3a0910ce5fb062d392dc5a532ff9d50bb9d0f614a8eda1a3ec786de0b761f354604051632d4f475f60e01b81526001600160a01b0388166004820152602481018790529091503090632d4f475f90604401600060405180830381600087803b15801561024c57600080fd5b505af1158015610260573d6000803e3d6000fd5b5050505060005b858110156101aa576102da61027c8284610ae3565b86868481811061028e5761028e610afb565b90506020028101906102a09190610b11565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061051292505050565b806102e481610b58565b915050610267565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610316816104fe565b6040516392c56e2d60e01b815230906392c56e2d9061033d90879087908790600401610bb8565b600060405180830381600087803b15801561035757600080fd5b505af115801561036b573d6000803e3d6000fd5b5050505050505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661039f816104fe565b6040517f49142a1400000000000000000000000000000000000000000000000000000000815230906349142a14906103e1908890889088908890600401610bdc565b600060405180830381600087803b1580156103fb57600080fd5b505af115801561040f573d6000803e3d6000fd5b505050505050505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610444816104fe565b7faa3a0910ce5fb062d392dc5a532ff9d50bb9d0f614a8eda1a3ec786de0b761f3546040516392c56e2d60e01b8152859030906392c56e2d90610490908a908590600190600401610bb8565b600060405180830381600087803b1580156104aa57600080fd5b505af11580156104be573d6000803e3d6000fd5b5050505060005b8181101561036b576104ec6104da8285610ae3565b87878481811061028e5761028e610afb565b806104f681610b58565b9150506104c5565b61050f8161050a6105fc565b61060b565b50565b7f021fe373f7e014154d4f551c37c047b9ed9093c774291911030896b9b2dfef65548210156105885760405162461bcd60e51b815260206004820152601960248201527f4d657461646174613a20746f6b656e555249206c6f636b65640000000000000060448201526064015b60405180910390fd5b60008281527f021fe373f7e014154d4f551c37c047b9ed9093c774291911030896b9b2dfef66602052604090206105bf8282610ce6565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b826040516105f09190610dd6565b60405180910390a25050565b60006106066106a3565b905090565b60008281527f2e59e4c2e927cdddbb64e181e0668d9a0fa70dd88f94d999cd87d5496a20da62602090815260408083206001600160a01b038516845290915290205460ff1661069f5761065d816106e9565b610668836020610705565b604051602001610679929190610e09565b60408051601f198184030181529082905262461bcd60e51b825261057f91600401610dd6565b5050565b7fdb1d5e345c4903e9a32b6674ecc8b1deaddbbb2551474fb34c9d34becbe7f420546000906001600160a01b031633036106e4575060131936013560601c90565b503390565b60606106ff6001600160a01b0383166014610705565b92915050565b60606000610714836002610e8a565b61071f906002610ae3565b67ffffffffffffffff81111561073757610737610c47565b6040519080825280601f01601f191660200182016040528015610761576020820181803683370190505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061079857610798610afb565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106107fb576107fb610afb565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000610837846002610e8a565b610842906001610ae3565b90505b60018111156108df577f303132333435363738396162636465660000000000000000000000000000000085600f166010811061088357610883610afb565b1a60f81b82828151811061089957610899610afb565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c936108d881610ea9565b9050610845565b50831561092e5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161057f565b9392505050565b80356001600160a01b038116811461094c57600080fd5b919050565b6000806040838503121561096457600080fd5b61096d83610935565b946020939093013593505050565b60008083601f84011261098d57600080fd5b50813567ffffffffffffffff8111156109a557600080fd5b6020830191508360208260051b85010111156109c057600080fd5b9250929050565b600080600080606085870312156109dd57600080fd5b6109e685610935565b935060208501359250604085013567ffffffffffffffff811115610a0957600080fd5b610a158782880161097b565b95989497509550505050565b600080600060408486031215610a3657600080fd5b833567ffffffffffffffff811115610a4d57600080fd5b610a598682870161097b565b909790965060209590950135949350505050565b60008060008060408587031215610a8357600080fd5b843567ffffffffffffffff80821115610a9b57600080fd5b610aa78883890161097b565b90965094506020870135915080821115610ac057600080fd5b50610a158782880161097b565b634e487b7160e01b600052601160045260246000fd5b60008219821115610af657610af6610acd565b500190565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112610b2857600080fd5b83018035915067ffffffffffffffff821115610b4357600080fd5b6020019150368190038213156109c057600080fd5b600060018201610b6a57610b6a610acd565b5060010190565b8183526000602080850194508260005b85811015610bad576001600160a01b03610b9a83610935565b1687529582019590820190600101610b81565b509495945050505050565b604081526000610bcc604083018587610b71565b9050826020830152949350505050565b604081526000610bf0604083018688610b71565b82810360208401528381527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115610c2857600080fd5b8360051b80866020840137600091016020019081529695505050505050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680610c7157607f821691505b602082108103610c9157634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610ce157600081815260208120601f850160051c81016020861015610cbe5750805b601f850160051c820191505b81811015610cdd57828155600101610cca565b5050505b505050565b815167ffffffffffffffff811115610d0057610d00610c47565b610d1481610d0e8454610c5d565b84610c97565b602080601f831160018114610d495760008415610d315750858301515b600019600386901b1c1916600185901b178555610cdd565b600085815260208120601f198616915b82811015610d7857888601518255948401946001909101908401610d59565b5085821015610d965787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60005b83811015610dc1578181015183820152602001610da9565b83811115610dd0576000848401525b50505050565b6020815260008251806020840152610df5816040850160208701610da6565b601f01601f19169190910160400192915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351610e41816017850160208801610da6565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351610e7e816028840160208801610da6565b01602801949350505050565b6000816000190483118215151615610ea457610ea4610acd565b500290565b600081610eb857610eb8610acd565b50600019019056fea2646970667358221220810208c900e3a8fdd8b317b06e3818dcc9076af9bc5d34776e0c0a18d31265ca64736f6c634300080f0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.