Feature Tip: Add private address tag to any address under My Name Tag !
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 | 16493270 | 652 days ago | IN | 0 ETH | 0.01571537 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
ConsensualNonTransferableTokenManager2
Compiler Version
v0.8.10+commit.fc410830
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.10; import "../utils/Ownable.sol"; import "./InterfaceSupportEditionsTokenManager.sol"; import "./interfaces/IPostTransfer.sol"; import "./interfaces/IPostBurn.sol"; import "./interfaces/ITokenManagerEditions.sol"; /** * @author [email protected] * @notice A basic token manager that prevents transfers unless recipient is nft contract owner, and allows burns. Second version */ contract ConsensualNonTransferableTokenManager2 is ITokenManagerEditions, IPostTransfer, IPostBurn, InterfaceSupportEditionsTokenManager { /** * @notice See {ITokenManager-canUpdateMetadata} */ function canUpdateMetadata( address sender, uint256, /* id */ bytes calldata /* newTokenImageUri */ ) external view override returns (bool) { return Ownable(msg.sender).owner() == sender; } /** * @notice See {ITokenManagerEditions-canUpdateEditionsMetadata} */ function canUpdateEditionsMetadata( address editionsAddress, address sender, uint256, /* editionId */ bytes calldata, /* newTokenImageUri */ FieldUpdated /* fieldUpdated */ ) external view override returns (bool) { return Ownable(editionsAddress).owner() == sender; } /** * @notice See {ITokenManager-canSwap} */ function canSwap( address sender, uint256, /* id */ address /* newTokenManager */ ) external view override returns (bool) { return Ownable(msg.sender).owner() == sender; } /** * @notice See {ITokenManager-canRemoveItself} */ function canRemoveItself( address sender, uint256 /* id */ ) external view override returns (bool) { return Ownable(msg.sender).owner() == sender; } /** * @notice See {IPostTransfer-postSafeTransferFrom} */ function postSafeTransferFrom( address, /* operator */ address, /* from */ address to, uint256, /* id */ bytes memory /* data */ ) external view override { if (to != Ownable(msg.sender).owner()) { revert("Transfers disallowed"); } } /** * @notice See {IPostTransfer-postTransferFrom} */ function postTransferFrom( address, /* operator */ address, /* from */ address to, uint256 /* id */ ) external view override { if (to != Ownable(msg.sender).owner()) { revert("Transfers disallowed"); } } /* solhint-disable no-empty-blocks */ /** * @notice See {IPostBurn-postBurn} */ function postBurn( address, /* operator */ address, /* sender */ uint256 /* id */ ) external pure override {} /* solhint-enable no-empty-blocks */ /** * @notice See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(InterfaceSupportEditionsTokenManager) returns (bool) { return interfaceId == type(IPostTransfer).interfaceId || interfaceId == type(IPostBurn).interfaceId || InterfaceSupportEditionsTokenManager.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity 0.8.10; import "@openzeppelin/contracts/utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ /* solhint-disable */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.10; import "./InterfaceSupportTokenManager.sol"; import "./interfaces/ITokenManagerEditions.sol"; /** * @author [email protected] * @notice Abstract contract to be inherited by all valid editions token managers */ abstract contract InterfaceSupportEditionsTokenManager is InterfaceSupportTokenManager { /** * @notice See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(InterfaceSupportTokenManager) returns (bool) { return interfaceId == type(ITokenManagerEditions).interfaceId || InterfaceSupportTokenManager.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.10; /** * @author [email protected] * @notice If token managers implement this, transfer actions will call * postSafeTransferFrom or postTransferFrom on the token manager. */ interface IPostTransfer { /** * @notice Hook called by community after safe transfers, if token manager of transferred token implements this * interface. * @param operator Operator transferring tokens * @param from Token(s) sender * @param to Token(s) recipient * @param id Transferred token's id * @param data Arbitrary data */ function postSafeTransferFrom( address operator, address from, address to, uint256 id, bytes memory data ) external; /** * @notice Hook called by community after transfers, if token manager of transferred token implements * this interface. * @param operator Operator transferring tokens * @param from Token(s) sender * @param to Token(s) recipient * @param id Transferred token's id */ function postTransferFrom( address operator, address from, address to, uint256 id ) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.10; /** * @author [email protected] * @notice If token managers implement this, transfer actions will call * postBurn on the token manager. */ interface IPostBurn { /** * @notice Hook called by contract after burn, if token manager of burned token implements this * interface. * @param operator Operator burning tokens * @param sender Msg sender * @param id Burned token's id */ function postBurn( address operator, address sender, uint256 id ) external; }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.10; import "./ITokenManager.sol"; /** * @title ITokenManager * @author [email protected] * @notice Enables interfacing with custom token managers for editions contracts */ interface ITokenManagerEditions is ITokenManager { /** * @notice The updated field in metadata updates */ enum FieldUpdated { name, description, imageUrl, animationUrl, externalUrl, attributes, other } /** * @notice Returns whether metadata updater is allowed to update * @param editionsAddress Address of editions contract * @param sender Updater * @param editionId Token/edition who's uri is being updated * If id is 0, implementation should decide behaviour for base uri update * @param newData Token's new uri if called by general contract, and any metadata field if called by editions * @param fieldUpdated Which metadata field was updated * @return If invocation can update metadata */ function canUpdateEditionsMetadata( address editionsAddress, address sender, uint256 editionId, bytes calldata newData, FieldUpdated fieldUpdated ) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.10; import "./interfaces/ITokenManager.sol"; import "../utils/ERC165/IERC165.sol"; /** * @author [email protected] * @notice Abstract contract to be inherited by all valid token managers */ abstract contract InterfaceSupportTokenManager { /** * @notice See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(ITokenManager).interfaceId || _supportsERC165Interface(interfaceId); } /** * @notice Used to show support for IERC165, without inheriting contract from IERC165 implementations */ function _supportsERC165Interface(bytes4 interfaceId) internal pure returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.10; /** * @title ITokenManager * @author [email protected] * @notice Enables interfacing with custom token managers */ interface ITokenManager { /** * @notice Returns whether metadata updater is allowed to update * @param sender Updater * @param id Token/edition who's uri is being updated * If id is 0, implementation should decide behaviour for base uri update * @param newData Token's new uri if called by general contract, and any metadata field if called by editions * @return If invocation can update metadata */ function canUpdateMetadata( address sender, uint256 id, bytes calldata newData ) external view returns (bool); /** * @notice Returns whether token manager can be swapped for another one by invocator * @notice Default token manager implementations should ignore id * @param sender Swapper * @param id Token grouping id (token id or edition id) * @param newTokenManager New token manager being swapped to * @return If invocation can swap token managers */ function canSwap( address sender, uint256 id, address newTokenManager ) external view returns (bool); /** * @notice Returns whether token manager can be removed * @notice Default token manager implementations should ignore id * @param sender Swapper * @param id Token grouping id (token id or edition id) * @return If invocation can remove token manager */ function canRemoveItself(address sender, uint256 id) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity 0.8.10; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
{ "metadata": { "bytecodeHash": "none" }, "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"canRemoveItself","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"canSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"editionsAddress","type":"address"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"enum ITokenManagerEditions.FieldUpdated","name":"","type":"uint8"}],"name":"canUpdateEditionsMetadata","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"canUpdateMetadata","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"postBurn","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"postSafeTransferFrom","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"postTransferFrom","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50610907806100206000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c806385e335b61161005b57806385e335b6146100ef5780638af6791b146101025780639d22e78e14610115578063ce2003a51461012857600080fd5b806301ffc9a71461008d578063129dae8b146100b45780633d820a4d146100c95780637f1eaf85146100dc575b600080fd5b6100a061009b36600461055d565b61013b565b604051901515815260200160405180910390f35b6100c76100c23660046105a6565b505050565b005b6100a06100d7366004610630565b610181565b6100c76100ea36600461068c565b610202565b6100a06100fd3660046106dd565b6102c6565b6100c7610110366004610735565b610346565b6100a0610123366004610828565b610406565b6100a06101363660046108b1565b610489565b60006001600160e01b03198216637af46b4f60e11b148061016c57506001600160e01b0319821663129dae8b60e01b145b8061017b575061017b82610508565b92915050565b6000846001600160a01b0316336001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101ef91906108dd565b6001600160a01b03161495945050505050565b336001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610240573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061026491906108dd565b6001600160a01b0316826001600160a01b0316146102c05760405162461bcd60e51b8152602060048201526014602482015273151c985b9cd9995c9cc8191a5cd85b1b1bddd95960621b60448201526064015b60405180910390fd5b50505050565b6000836001600160a01b0316336001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610310573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061033491906108dd565b6001600160a01b031614949350505050565b336001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610384573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a891906108dd565b6001600160a01b0316836001600160a01b0316146103ff5760405162461bcd60e51b8152602060048201526014602482015273151c985b9cd9995c9cc8191a5cd85b1b1bddd95960621b60448201526064016102b7565b5050505050565b6000856001600160a01b0316876001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610450573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061047491906108dd565b6001600160a01b031614979650505050505050565b6000826001600160a01b0316336001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f791906108dd565b6001600160a01b0316149392505050565b60006001600160e01b03198216634e9173c760e11b148061017b575061017b8260006001600160e01b03198216633b209e2f60e11b148061017b57506301ffc9a760e01b6001600160e01b031983161461017b565b60006020828403121561056f57600080fd5b81356001600160e01b03198116811461058757600080fd5b9392505050565b6001600160a01b03811681146105a357600080fd5b50565b6000806000606084860312156105bb57600080fd5b83356105c68161058e565b925060208401356105d68161058e565b929592945050506040919091013590565b60008083601f8401126105f957600080fd5b50813567ffffffffffffffff81111561061157600080fd5b60208301915083602082850101111561062957600080fd5b9250929050565b6000806000806060858703121561064657600080fd5b84356106518161058e565b935060208501359250604085013567ffffffffffffffff81111561067457600080fd5b610680878288016105e7565b95989497509550505050565b600080600080608085870312156106a257600080fd5b84356106ad8161058e565b935060208501356106bd8161058e565b925060408501356106cd8161058e565b9396929550929360600135925050565b6000806000606084860312156106f257600080fd5b83356106fd8161058e565b92506020840135915060408401356107148161058e565b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b600080600080600060a0868803121561074d57600080fd5b85356107588161058e565b945060208601356107688161058e565b935060408601356107788161058e565b925060608601359150608086013567ffffffffffffffff8082111561079c57600080fd5b818801915088601f8301126107b057600080fd5b8135818111156107c2576107c261071f565b604051601f8201601f19908116603f011681019083821181831017156107ea576107ea61071f565b816040528281528b602084870101111561080357600080fd5b8260208601602083013760006020848301015280955050505050509295509295909350565b60008060008060008060a0878903121561084157600080fd5b863561084c8161058e565b9550602087013561085c8161058e565b945060408701359350606087013567ffffffffffffffff81111561087f57600080fd5b61088b89828a016105e7565b9094509250506080870135600781106108a357600080fd5b809150509295509295509295565b600080604083850312156108c457600080fd5b82356108cf8161058e565b946020939093013593505050565b6000602082840312156108ef57600080fd5b81516105878161058e56fea164736f6c634300080a000a
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100885760003560e01c806385e335b61161005b57806385e335b6146100ef5780638af6791b146101025780639d22e78e14610115578063ce2003a51461012857600080fd5b806301ffc9a71461008d578063129dae8b146100b45780633d820a4d146100c95780637f1eaf85146100dc575b600080fd5b6100a061009b36600461055d565b61013b565b604051901515815260200160405180910390f35b6100c76100c23660046105a6565b505050565b005b6100a06100d7366004610630565b610181565b6100c76100ea36600461068c565b610202565b6100a06100fd3660046106dd565b6102c6565b6100c7610110366004610735565b610346565b6100a0610123366004610828565b610406565b6100a06101363660046108b1565b610489565b60006001600160e01b03198216637af46b4f60e11b148061016c57506001600160e01b0319821663129dae8b60e01b145b8061017b575061017b82610508565b92915050565b6000846001600160a01b0316336001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101ef91906108dd565b6001600160a01b03161495945050505050565b336001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610240573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061026491906108dd565b6001600160a01b0316826001600160a01b0316146102c05760405162461bcd60e51b8152602060048201526014602482015273151c985b9cd9995c9cc8191a5cd85b1b1bddd95960621b60448201526064015b60405180910390fd5b50505050565b6000836001600160a01b0316336001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610310573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061033491906108dd565b6001600160a01b031614949350505050565b336001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610384573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a891906108dd565b6001600160a01b0316836001600160a01b0316146103ff5760405162461bcd60e51b8152602060048201526014602482015273151c985b9cd9995c9cc8191a5cd85b1b1bddd95960621b60448201526064016102b7565b5050505050565b6000856001600160a01b0316876001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610450573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061047491906108dd565b6001600160a01b031614979650505050505050565b6000826001600160a01b0316336001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f791906108dd565b6001600160a01b0316149392505050565b60006001600160e01b03198216634e9173c760e11b148061017b575061017b8260006001600160e01b03198216633b209e2f60e11b148061017b57506301ffc9a760e01b6001600160e01b031983161461017b565b60006020828403121561056f57600080fd5b81356001600160e01b03198116811461058757600080fd5b9392505050565b6001600160a01b03811681146105a357600080fd5b50565b6000806000606084860312156105bb57600080fd5b83356105c68161058e565b925060208401356105d68161058e565b929592945050506040919091013590565b60008083601f8401126105f957600080fd5b50813567ffffffffffffffff81111561061157600080fd5b60208301915083602082850101111561062957600080fd5b9250929050565b6000806000806060858703121561064657600080fd5b84356106518161058e565b935060208501359250604085013567ffffffffffffffff81111561067457600080fd5b610680878288016105e7565b95989497509550505050565b600080600080608085870312156106a257600080fd5b84356106ad8161058e565b935060208501356106bd8161058e565b925060408501356106cd8161058e565b9396929550929360600135925050565b6000806000606084860312156106f257600080fd5b83356106fd8161058e565b92506020840135915060408401356107148161058e565b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b600080600080600060a0868803121561074d57600080fd5b85356107588161058e565b945060208601356107688161058e565b935060408601356107788161058e565b925060608601359150608086013567ffffffffffffffff8082111561079c57600080fd5b818801915088601f8301126107b057600080fd5b8135818111156107c2576107c261071f565b604051601f8201601f19908116603f011681019083821181831017156107ea576107ea61071f565b816040528281528b602084870101111561080357600080fd5b8260208601602083013760006020848301015280955050505050509295509295909350565b60008060008060008060a0878903121561084157600080fd5b863561084c8161058e565b9550602087013561085c8161058e565b945060408701359350606087013567ffffffffffffffff81111561087f57600080fd5b61088b89828a016105e7565b9094509250506080870135600781106108a357600080fd5b809150509295509295509295565b600080604083850312156108c457600080fd5b82356108cf8161058e565b946020939093013593505050565b6000602082840312156108ef57600080fd5b81516105878161058e56fea164736f6c634300080a000a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 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.