Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 211 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Mint | 18382828 | 396 days ago | IN | 0 ETH | 0.01558897 | ||||
Mint | 18374587 | 397 days ago | IN | 0 ETH | 0.01333321 | ||||
Mint | 18369384 | 398 days ago | IN | 0 ETH | 0.07314197 | ||||
Mint | 18352390 | 400 days ago | IN | 0 ETH | 0.01101558 | ||||
Mint | 18326694 | 404 days ago | IN | 0 ETH | 0.0114152 | ||||
Mint | 18295762 | 408 days ago | IN | 0 ETH | 0.02120669 | ||||
Mint | 18269673 | 412 days ago | IN | 0 ETH | 0.01464403 | ||||
Mint | 18221592 | 418 days ago | IN | 0 ETH | 0.04620897 | ||||
Mint | 18210369 | 420 days ago | IN | 0 ETH | 0.01704784 | ||||
Mint | 18210319 | 420 days ago | IN | 0 ETH | 0.03938633 | ||||
Mint | 18210315 | 420 days ago | IN | 0 ETH | 0.01363454 | ||||
Mint | 18210302 | 420 days ago | IN | 0 ETH | 0.01483942 | ||||
Mint | 18210290 | 420 days ago | IN | 0 ETH | 0.04983704 | ||||
Mint | 18196622 | 422 days ago | IN | 0 ETH | 0.03848452 | ||||
Mint | 18189329 | 423 days ago | IN | 0 ETH | 0.01556499 | ||||
Mint | 18189326 | 423 days ago | IN | 0 ETH | 0.01513739 | ||||
Mint | 18189326 | 423 days ago | IN | 0 ETH | 0.0205822 | ||||
Mint | 18189326 | 423 days ago | IN | 0 ETH | 0.01319938 | ||||
Mint | 18189326 | 423 days ago | IN | 0 ETH | 0.01636502 | ||||
Mint | 18189326 | 423 days ago | IN | 0 ETH | 0.01239027 | ||||
Mint | 18189326 | 423 days ago | IN | 0 ETH | 0.00740382 | ||||
Mint | 18189326 | 423 days ago | IN | 0 ETH | 0.03419859 | ||||
Mint | 18189326 | 423 days ago | IN | 0 ETH | 0.00778037 | ||||
Mint | 18189326 | 423 days ago | IN | 0 ETH | 0.01106589 | ||||
Mint | 18189103 | 423 days ago | IN | 0 ETH | 0.01195165 |
Latest 25 internal transactions (View All)
Advanced mode:
Loading...
Loading
Contract Name:
Efficax
Compiler Version
v0.8.9+commit.e5eed63a
Optimization Enabled:
Yes with 1000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "@manifoldxyz/libraries-solidity/contracts/access/AdminControl.sol"; import "@manifoldxyz/creator-core-solidity/contracts/core/IERC721CreatorCore.sol"; import "@manifoldxyz/creator-core-solidity/contracts/extensions/ICreatorExtensionTokenURI.sol"; import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; import "./libraries/Base64.sol"; import "./libraries/SSTORE2.sol"; contract Efficax is AdminControl, ICreatorExtensionTokenURI{ struct Token { string metadata; string mimeType; address[] chunks; } /** * @notice The mapping that contains the token data for a given creator contract & token id. */ mapping(address => mapping(uint256 => Token)) public tokenData; /** * @notice A modifier for checking that the sender of the transaction has admin permissions on the Creator Contract they are trying to do something with * * Shamelessly borrowed from the Manifold claim page extension. * * @param creatorContractAddress The Manifold Creator Contract in question */ modifier creatorAdminRequired(address creatorContractAddress) { AdminControl creatorCoreContract = AdminControl(creatorContractAddress); require(creatorCoreContract.isAdmin(msg.sender), 'Wallet is not an administrator for contract'); _; } /** @notice Mints a token with `metadata` of type `mimeType` and image `image` @param creatorContractAddress The Manifold contract to mint to @param image The image data, split into bytes of max len 24576 (EVM contract limit) @param metadata The string metadata for the token, expressed as a JSON with no opening or closing bracket, e.g. `"name": "hello!","description": "world!"` @param mimeType The mime type for `image` */ function mint( address creatorContractAddress, bytes[] calldata image, string calldata metadata, string calldata mimeType ) external creatorAdminRequired(creatorContractAddress) { uint256 tokenId = IERC721CreatorCore(creatorContractAddress).mintExtension(msg.sender); tokenData[creatorContractAddress][tokenId].metadata = metadata; tokenData[creatorContractAddress][tokenId].mimeType = mimeType; // loop through the image array, appending a new byte array // to the chunks. This is because the contract storage limit // is 24576 but we actually get much further than that before // running out of gas in the block. for (uint8 i = 0; i < image.length; i++) { tokenData[creatorContractAddress][tokenId].chunks.push(SSTORE2.write(image[i])); } } /** @notice Updates a token with `metadata` of type `mimeType` and image `image`. @param creatorContractAddress The Manifold contract to mint to @param tokenId the token to update the data for @param image The image data, split into bytes of max len 24576 (EVM contract limit) @param metadata The string metadata for the token, expressed as a JSON with no opening or closing bracket, e.g. `"name": "hello!","description": "world!"` @param mimeType The mime type for `image` */ function updateToken( address creatorContractAddress, uint256 tokenId, bytes[] calldata image, string calldata metadata, string calldata mimeType ) external creatorAdminRequired(creatorContractAddress) { if (bytes(metadata).length > 0) { tokenData[creatorContractAddress][tokenId].metadata = metadata; } if (bytes(mimeType).length > 0) { tokenData[creatorContractAddress][tokenId].mimeType = mimeType; } if (image.length > 0) { delete tokenData[creatorContractAddress][tokenId].chunks; for (uint8 i = 0; i < image.length; i++) { tokenData[creatorContractAddress][tokenId].chunks.push(SSTORE2.write(image[i])); } } } /** @notice Appends chunks of binary data to the chunks for a given token. If your image won't fit in a single "mint" transaction, you can use this to add data to it. @param creatorContractAddress The Manifold contract to mint to @param tokenId The token to add data to @param chunks The chunks of data to add, max length for each individual chunk is 24576 bytes (EVM contract limit) */ function appendChunks( address creatorContractAddress, uint256 tokenId, bytes[] calldata chunks ) external creatorAdminRequired(creatorContractAddress) { for (uint8 i = 0; i < chunks.length; i++) { tokenData[creatorContractAddress][tokenId].chunks.push(SSTORE2.write(chunks[i])); } } /** * @notice what are you doing here? this is an internal function! * @dev packs token data by converting it to base64 and attaching the mime type * * @param creatorContractAddress the contract address containing the token * @param tokenId the token id to pack */ function _pack(address creatorContractAddress, uint256 tokenId) internal view returns (string memory) { string memory image = string( abi.encodePacked( "data:", tokenData[creatorContractAddress][tokenId].mimeType, ";base64," ) ); bytes memory data; for (uint8 i = 0; i < tokenData[creatorContractAddress][tokenId].chunks.length; i++) { data = abi.encodePacked( data, SSTORE2.read(tokenData[creatorContractAddress][tokenId].chunks[i]) ); } image = string( abi.encodePacked( image, Base64.encode(data) ) ); return image; } function tokenURI(address creatorContractAddress, uint256 tokenId) external view override returns (string memory) { require(tokenData[creatorContractAddress][tokenId].chunks.length != 0, "Token metadata doesn't exist here"); return string( abi.encodePacked( 'data:application/json;utf8,{', tokenData[creatorContractAddress][tokenId].metadata, ', "image": "', _pack(creatorContractAddress, tokenId), '"}' ) ); } function supportsInterface(bytes4 interfaceId) public view virtual override(AdminControl, IERC165) returns (bool) { return interfaceId == type(ICreatorExtensionTokenURI).interfaceId || AdminControl.supportsInterface(interfaceId) || super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; /** * @dev Core creator interface */ interface ICreatorCore is IERC165 { event ExtensionRegistered(address indexed extension, address indexed sender); event ExtensionUnregistered(address indexed extension, address indexed sender); event ExtensionBlacklisted(address indexed extension, address indexed sender); event MintPermissionsUpdated(address indexed extension, address indexed permissions, address indexed sender); event RoyaltiesUpdated(uint256 indexed tokenId, address payable[] receivers, uint256[] basisPoints); event DefaultRoyaltiesUpdated(address payable[] receivers, uint256[] basisPoints); event ApproveTransferUpdated(address extension); event ExtensionRoyaltiesUpdated(address indexed extension, address payable[] receivers, uint256[] basisPoints); event ExtensionApproveTransferUpdated(address indexed extension, bool enabled); /** * @dev gets address of all extensions */ function getExtensions() external view returns (address[] memory); /** * @dev add an extension. Can only be called by contract owner or admin. * extension address must point to a contract implementing ICreatorExtension. * Returns True if newly added, False if already added. */ function registerExtension(address extension, string calldata baseURI) external; /** * @dev add an extension. Can only be called by contract owner or admin. * extension address must point to a contract implementing ICreatorExtension. * Returns True if newly added, False if already added. */ function registerExtension(address extension, string calldata baseURI, bool baseURIIdentical) external; /** * @dev add an extension. Can only be called by contract owner or admin. * Returns True if removed, False if already removed. */ function unregisterExtension(address extension) external; /** * @dev blacklist an extension. Can only be called by contract owner or admin. * This function will destroy all ability to reference the metadata of any tokens created * by the specified extension. It will also unregister the extension if needed. * Returns True if removed, False if already removed. */ function blacklistExtension(address extension) external; /** * @dev set the baseTokenURI of an extension. Can only be called by extension. */ function setBaseTokenURIExtension(string calldata uri) external; /** * @dev set the baseTokenURI of an extension. Can only be called by extension. * For tokens with no uri configured, tokenURI will return "uri+tokenId" */ function setBaseTokenURIExtension(string calldata uri, bool identical) external; /** * @dev set the common prefix of an extension. Can only be called by extension. * If configured, and a token has a uri set, tokenURI will return "prefixURI+tokenURI" * Useful if you want to use ipfs/arweave */ function setTokenURIPrefixExtension(string calldata prefix) external; /** * @dev set the tokenURI of a token extension. Can only be called by extension that minted token. */ function setTokenURIExtension(uint256 tokenId, string calldata uri) external; /** * @dev set the tokenURI of a token extension for multiple tokens. Can only be called by extension that minted token. */ function setTokenURIExtension(uint256[] memory tokenId, string[] calldata uri) external; /** * @dev set the baseTokenURI for tokens with no extension. Can only be called by owner/admin. * For tokens with no uri configured, tokenURI will return "uri+tokenId" */ function setBaseTokenURI(string calldata uri) external; /** * @dev set the common prefix for tokens with no extension. Can only be called by owner/admin. * If configured, and a token has a uri set, tokenURI will return "prefixURI+tokenURI" * Useful if you want to use ipfs/arweave */ function setTokenURIPrefix(string calldata prefix) external; /** * @dev set the tokenURI of a token with no extension. Can only be called by owner/admin. */ function setTokenURI(uint256 tokenId, string calldata uri) external; /** * @dev set the tokenURI of multiple tokens with no extension. Can only be called by owner/admin. */ function setTokenURI(uint256[] memory tokenIds, string[] calldata uris) external; /** * @dev set a permissions contract for an extension. Used to control minting. */ function setMintPermissions(address extension, address permissions) external; /** * @dev Configure so transfers of tokens created by the caller (must be extension) gets approval * from the extension before transferring */ function setApproveTransferExtension(bool enabled) external; /** * @dev get the extension of a given token */ function tokenExtension(uint256 tokenId) external view returns (address); /** * @dev Set default royalties */ function setRoyalties(address payable[] calldata receivers, uint256[] calldata basisPoints) external; /** * @dev Set royalties of a token */ function setRoyalties(uint256 tokenId, address payable[] calldata receivers, uint256[] calldata basisPoints) external; /** * @dev Set royalties of an extension */ function setRoyaltiesExtension(address extension, address payable[] calldata receivers, uint256[] calldata basisPoints) external; /** * @dev Get royalites of a token. Returns list of receivers and basisPoints */ function getRoyalties(uint256 tokenId) external view returns (address payable[] memory, uint256[] memory); // Royalty support for various other standards function getFeeRecipients(uint256 tokenId) external view returns (address payable[] memory); function getFeeBps(uint256 tokenId) external view returns (uint[] memory); function getFees(uint256 tokenId) external view returns (address payable[] memory, uint256[] memory); function royaltyInfo(uint256 tokenId, uint256 value) external view returns (address, uint256); /** * @dev Set the default approve transfer contract location. */ function setApproveTransfer(address extension) external; /** * @dev Get the default approve transfer contract location. */ function getApproveTransfer() external view returns (address); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz import "./ICreatorCore.sol"; /** * @dev Core ERC721 creator interface */ interface IERC721CreatorCore is ICreatorCore { /** * @dev mint a token with no extension. Can only be called by an admin. * Returns tokenId minted */ function mintBase(address to) external returns (uint256); /** * @dev mint a token with no extension. Can only be called by an admin. * Returns tokenId minted */ function mintBase(address to, string calldata uri) external returns (uint256); /** * @dev batch mint a token with no extension. Can only be called by an admin. * Returns tokenId minted */ function mintBaseBatch(address to, uint16 count) external returns (uint256[] memory); /** * @dev batch mint a token with no extension. Can only be called by an admin. * Returns tokenId minted */ function mintBaseBatch(address to, string[] calldata uris) external returns (uint256[] memory); /** * @dev mint a token. Can only be called by a registered extension. * Returns tokenId minted */ function mintExtension(address to) external returns (uint256); /** * @dev mint a token. Can only be called by a registered extension. * Returns tokenId minted */ function mintExtension(address to, string calldata uri) external returns (uint256); /** * @dev mint a token. Can only be called by a registered extension. * Returns tokenId minted */ function mintExtension(address to, uint80 data) external returns (uint256); /** * @dev batch mint a token. Can only be called by a registered extension. * Returns tokenIds minted */ function mintExtensionBatch(address to, uint16 count) external returns (uint256[] memory); /** * @dev batch mint a token. Can only be called by a registered extension. * Returns tokenId minted */ function mintExtensionBatch(address to, string[] calldata uris) external returns (uint256[] memory); /** * @dev batch mint a token. Can only be called by a registered extension. * Returns tokenId minted */ function mintExtensionBatch(address to, uint80[] calldata data) external returns (uint256[] memory); /** * @dev burn a token. Can only be called by token owner or approved address. * On burn, calls back to the registered extension's onBurn method */ function burn(uint256 tokenId) external; /** * @dev get token data */ function tokenData(uint256 tokenId) external view returns (uint80); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; /** * @dev Implement this if you want your extension to have overloadable URI's */ interface ICreatorExtensionTokenURI is IERC165 { /** * Get the uri for a given creator/tokenId */ function tokenURI(address creator, uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "./IAdminControl.sol"; abstract contract AdminControl is Ownable, IAdminControl, ERC165 { using EnumerableSet for EnumerableSet.AddressSet; // Track registered admins EnumerableSet.AddressSet private _admins; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IAdminControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Only allows approved admins to call the specified function */ modifier adminRequired() { require(owner() == msg.sender || _admins.contains(msg.sender), "AdminControl: Must be owner or admin"); _; } /** * @dev See {IAdminControl-getAdmins}. */ function getAdmins() external view override returns (address[] memory admins) { admins = new address[](_admins.length()); for (uint i = 0; i < _admins.length(); i++) { admins[i] = _admins.at(i); } return admins; } /** * @dev See {IAdminControl-approveAdmin}. */ function approveAdmin(address admin) external override onlyOwner { if (!_admins.contains(admin)) { emit AdminApproved(admin, msg.sender); _admins.add(admin); } } /** * @dev See {IAdminControl-revokeAdmin}. */ function revokeAdmin(address admin) external override onlyOwner { if (_admins.contains(admin)) { emit AdminRevoked(admin, msg.sender); _admins.remove(admin); } } /** * @dev See {IAdminControl-isAdmin}. */ function isAdmin(address admin) public override view returns (bool) { return (owner() == admin || _admins.contains(admin)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; /** * @dev Interface for admin control */ interface IAdminControl is IERC165 { event AdminApproved(address indexed account, address indexed sender); event AdminRevoked(address indexed account, address indexed sender); /** * @dev gets address of all admins */ function getAdmins() external view returns (address[] memory); /** * @dev add an admin. Can only be called by contract owner. */ function approveAdmin(address admin) external; /** * @dev remove an admin. Can only be called by contract owner. */ function revokeAdmin(address admin) external; /** * @dev checks whether or not given address is an admin * Returns True if they are */ function isAdmin(address admin) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../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. */ 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: 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 v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// [MIT License] /// @title Base64 /// @notice Provides a function for encoding some bytes in base64 /// @author Brecht Devos <[email protected]> library Base64 { bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /// @notice Encodes some bytes to the base64 representation function encode(bytes memory data) internal pure returns (string memory) { uint256 len = data.length; if (len == 0) return ""; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((len + 2) / 3); // Add some extra buffer at the end bytes memory result = new bytes(encodedLen + 32); bytes memory table = TABLE; assembly { let tablePtr := add(table, 1) let resultPtr := add(result, 32) for { let i := 0 } lt(i, len) { } { i := add(i, 3) let input := and(mload(add(data, i)), 0xffffff) let out := mload(add(tablePtr, and(shr(18, input), 0x3F))) out := shl(8, out) out := add( out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF) ) out := shl(8, out) out := add( out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF) ) out := shl(8, out) out := add( out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF) ) out := shl(224, out) mstore(resultPtr, out) resultPtr := add(resultPtr, 4) } switch mod(len, 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } mstore(result, encodedLen) } return string(result); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; library Bytecode { error InvalidCodeAtRange(uint256 _size, uint256 _start, uint256 _end); /** @notice Generate a creation code that results on a contract with `_code` as bytecode @param _code The returning value of the resulting `creationCode` @return creationCode (constructor) for new contract */ function creationCodeFor(bytes memory _code) internal pure returns (bytes memory) { /* 0x00 0x63 0x63XXXXXX PUSH4 _code.length size 0x01 0x80 0x80 DUP1 size size 0x02 0x60 0x600e PUSH1 14 14 size size 0x03 0x60 0x6000 PUSH1 00 0 14 size size 0x04 0x39 0x39 CODECOPY size 0x05 0x60 0x6000 PUSH1 00 0 size 0x06 0xf3 0xf3 RETURN <CODE> */ return abi.encodePacked( hex"63", uint32(_code.length), hex"80_60_0E_60_00_39_60_00_F3", _code ); } /** @notice Returns the size of the code on a given address @param _addr Address that may or may not contain code @return size of the code on the given `_addr` */ function codeSize(address _addr) internal view returns (uint256 size) { assembly { size := extcodesize(_addr) } } /** @notice Returns the code of a given address @dev It will fail if `_end < _start` @param _addr Address that may or may not contain code @param _start number of bytes of code to skip on read @param _end index before which to end extraction @return oCode read from `_addr` deployed bytecode Forked from: https://gist.github.com/KardanovIR/fe98661df9338c842b4a30306d507fbd */ function codeAt(address _addr, uint256 _start, uint256 _end) internal view returns (bytes memory oCode) { uint256 csize = codeSize(_addr); if (csize == 0) return bytes(""); if (_start > csize) return bytes(""); if (_end < _start) revert InvalidCodeAtRange(csize, _start, _end); unchecked { uint256 reqSize = _end - _start; uint256 maxSize = csize - _start; uint256 size = maxSize < reqSize ? maxSize : reqSize; assembly { // allocate output byte array - this could also be done without assembly // by using o_code = new bytes(size) oCode := mload(0x40) // new "memory end" including padding mstore(0x40, add(oCode, and(add(add(size, 0x20), 0x1f), not(0x1f)))) // store length in memory mstore(oCode, size) // actually retrieve the code, this needs assembly extcodecopy(_addr, add(oCode, 0x20), _start, size) } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Bytecode.sol"; /** @title A key-value storage with auto-generated keys for storing chunks of data with a lower write & read cost. @author Agustin Aguilar <[email protected]> Readme: https://github.com/0xsequence/sstore2#readme */ library SSTORE2 { error WriteError(); /** @notice Stores `_data` and returns `pointer` as key for later retrieval @dev The pointer is a contract address with `_data` as code @param _data to be written @return pointer Pointer to the written `_data` */ function write(bytes memory _data) internal returns (address pointer) { // Append 00 to _data so contract can't be called // Build init code bytes memory code = Bytecode.creationCodeFor( abi.encodePacked( hex'00', _data ) ); // Deploy contract using create assembly { pointer := create(0, add(code, 32), mload(code)) } // Address MUST be non-zero if (pointer == address(0)) revert WriteError(); } /** @notice Reads the contents of the `_pointer` code as data, skips the first byte @dev The function is intended for reading pointers generated by `write` @param _pointer to be read @return data read from `_pointer` contract */ function read(address _pointer) internal view returns (bytes memory) { return Bytecode.codeAt(_pointer, 1, type(uint256).max); } /** @notice Reads the contents of the `_pointer` code as data, skips the first byte @dev The function is intended for reading pointers generated by `write` @param _pointer to be read @param _start number of bytes to skip @return data read from `_pointer` contract */ function read(address _pointer, uint256 _start) internal view returns (bytes memory) { return Bytecode.codeAt(_pointer, _start + 1, type(uint256).max); } /** @notice Reads the contents of the `_pointer` code as data, skips the first byte @dev The function is intended for reading pointers generated by `write` @param _pointer to be read @param _start number of bytes to skip @param _end index before which to end extraction @return data read from `_pointer` contract */ function read(address _pointer, uint256 _start, uint256 _end) internal view returns (bytes memory) { return Bytecode.codeAt(_pointer, _start + 1, _end + 1); } }
{ "optimizer": { "enabled": true, "runs": 1000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"_size","type":"uint256"},{"internalType":"uint256","name":"_start","type":"uint256"},{"internalType":"uint256","name":"_end","type":"uint256"}],"name":"InvalidCodeAtRange","type":"error"},{"inputs":[],"name":"WriteError","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"AdminApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"AdminRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"address","name":"creatorContractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes[]","name":"chunks","type":"bytes[]"}],"name":"appendChunks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"approveAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAdmins","outputs":[{"internalType":"address[]","name":"admins","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"creatorContractAddress","type":"address"},{"internalType":"bytes[]","name":"image","type":"bytes[]"},{"internalType":"string","name":"metadata","type":"string"},{"internalType":"string","name":"mimeType","type":"string"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"revokeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenData","outputs":[{"internalType":"string","name":"metadata","type":"string"},{"internalType":"string","name":"mimeType","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"creatorContractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"creatorContractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes[]","name":"image","type":"bytes[]"},{"internalType":"string","name":"metadata","type":"string"},{"internalType":"string","name":"mimeType","type":"string"}],"name":"updateToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611d8f8061007e6000396000f3fe608060405234801561001057600080fd5b50600436106100df5760003560e01c80636d73e6691161008c578063804c400411610066578063804c4004146101ab5780638da5cb5b146101be578063e9dc6375146101d9578063f2fde38b146101f957600080fd5b80636d73e6691461017d578063715018a6146101905780637b00b0e01461019857600080fd5b80632d345670116100bd5780632d3456701461014057806331ae450b146101555780634a1703981461016a57600080fd5b806301ffc9a7146100e457806324ba43281461010c57806324d7806c1461012d575b600080fd5b6100f76100f2366004611538565b61020c565b60405190151581526020015b60405180910390f35b61011f61011a36600461157e565b61025f565b604051610103929190611604565b6100f761013b366004611632565b610396565b61015361014e366004611632565b6103cf565b005b61015d61042d565b604051610103919061164d565b610153610178366004611728565b6104dc565b61015361018b366004611632565b61075a565b6101536107b2565b6101536101a63660046117dc565b6107c6565b6101536101b9366004611836565b610947565b6000546040516001600160a01b039091168152602001610103565b6101ec6101e736600461157e565b610bb8565b60405161010391906118e1565b610153610207366004611632565b610ca9565b60006001600160e01b031982167fe9dc637500000000000000000000000000000000000000000000000000000000148061024a575061024a82610d36565b80610259575061025982610d36565b92915050565b6003602090815260009283526040808420909152908252902080548190610285906118f4565b80601f01602080910402602001604051908101604052809291908181526020018280546102b1906118f4565b80156102fe5780601f106102d3576101008083540402835291602001916102fe565b820191906000526020600020905b8154815290600101906020018083116102e157829003601f168201915b505050505090806001018054610313906118f4565b80601f016020809104026020016040519081016040528092919081815260200182805461033f906118f4565b801561038c5780601f106103615761010080835404028352916020019161038c565b820191906000526020600020905b81548152906001019060200180831161036f57829003601f168201915b5050505050905082565b6000816001600160a01b03166103b46000546001600160a01b031690565b6001600160a01b031614806102595750610259600183610d9d565b6103d7610dc2565b6103e2600182610d9d565b1561042a5760405133906001600160a01b038316907f7c0c3c84c67c85fcac635147348bfe374c24a1a93d0366d1cfe9d8853cbf89d590600090a3610428600182610e1c565b505b50565b60606104396001610e31565b67ffffffffffffffff81111561045157610451611929565b60405190808252806020026020018201604052801561047a578160200160208202803683370190505b50905060005b61048a6001610e31565b8110156104d85761049c600182610e3b565b8282815181106104ae576104ae61193f565b6001600160a01b0390921660209283029190910190910152806104d08161196b565b915050610480565b5090565b604051630935e01b60e21b8152336004820152889081906001600160a01b038216906324d7806c9060240160206040518083038186803b15801561051f57600080fd5b505afa158015610533573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105579190611986565b6105bc5760405162461bcd60e51b815260206004820152602b60248201527f57616c6c6574206973206e6f7420616e2061646d696e6973747261746f72206660448201526a1bdc8818dbdb9d1c9858dd60aa1b60648201526084015b60405180910390fd5b84156105f2576001600160a01b038a1660009081526003602090815260408083208c845290915290206105f0908787611489565b505b821561062b576001600160a01b038a1660009081526003602090815260408083208c84529091529020610629906001018585611489565b505b861561074e576001600160a01b038a1660009081526003602090815260408083208c8452909152812061066391600290910190611509565b60005b60ff811688111561074c576001600160a01b038b1660009081526003602090815260408083208d845290915290206002016106fb8a8a60ff85168181106106af576106af61193f565b90506020028101906106c191906119a8565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610e4792505050565b815460018101835560009283526020909220909101805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0390921691909117905580610744816119ef565b915050610666565b505b50505050505050505050565b610762610dc2565b61076d600182610d9d565b61042a5760405133906001600160a01b038316907f7e1a1a08d52e4ba0e21554733d66165fd5151f99460116223d9e3a608eec5cb190600090a3610428600182610ec5565b6107ba610dc2565b6107c46000610eda565b565b604051630935e01b60e21b8152336004820152849081906001600160a01b038216906324d7806c9060240160206040518083038186803b15801561080957600080fd5b505afa15801561081d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108419190611986565b6108a15760405162461bcd60e51b815260206004820152602b60248201527f57616c6c6574206973206e6f7420616e2061646d696e6973747261746f72206660448201526a1bdc8818dbdb9d1c9858dd60aa1b60648201526084016105b3565b60005b60ff811684111561093e576001600160a01b038716600090815260036020908152604080832089845290915290206002016108ed868660ff85168181106106af576106af61193f565b815460018101835560009283526020909220909101805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0390921691909117905580610936816119ef565b9150506108a4565b50505050505050565b604051630935e01b60e21b8152336004820152879081906001600160a01b038216906324d7806c9060240160206040518083038186803b15801561098a57600080fd5b505afa15801561099e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c29190611986565b610a225760405162461bcd60e51b815260206004820152602b60248201527f57616c6c6574206973206e6f7420616e2061646d696e6973747261746f72206660448201526a1bdc8818dbdb9d1c9858dd60aa1b60648201526084016105b3565b6040517f2928ca580000000000000000000000000000000000000000000000000000000081523360048201526000906001600160a01b038b1690632928ca5890602401602060405180830381600087803b158015610a7f57600080fd5b505af1158015610a93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab79190611a0f565b6001600160a01b038b1660009081526003602090815260408083208484529091529020909150610ae8908888611489565b506001600160a01b038a1660009081526003602090815260408083208484529091529020610b1a906001018686611489565b5060005b60ff811689111561074c576001600160a01b038b1660009081526003602090815260408083208584529091529020600201610b678b8b60ff85168181106106af576106af61193f565b815460018101835560009283526020909220909101805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0390921691909117905580610bb0816119ef565b915050610b1e565b6001600160a01b0382166000908152600360209081526040808320848452909152902060020154606090610c545760405162461bcd60e51b815260206004820152602160248201527f546f6b656e206d6574616461746120646f65736e27742065786973742068657260448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016105b3565b6001600160a01b03831660009081526003602090815260408083208584529091529020610c818484610f37565b604051602001610c92929190611ac2565b604051602081830303815290604052905092915050565b610cb1610dc2565b6001600160a01b038116610d2d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016105b3565b61042a81610eda565b60006001600160e01b031982167f553e757e00000000000000000000000000000000000000000000000000000000148061025957507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610259565b6001600160a01b038116600090815260018301602052604081205415155b9392505050565b6000546001600160a01b031633146107c45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105b3565b6000610dbb836001600160a01b03841661107a565b6000610259825490565b6000610dbb838361116d565b600080610e7283604051602001610e5e9190611b60565b604051602081830303815290604052611197565b90508051602082016000f091506001600160a01b038216610ebf576040517f08d4abb600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50919050565b6000610dbb836001600160a01b0384166111c3565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03821660009081526003602090815260408083208484528252808320905160609392610f6e926001019101611b86565b6040516020818303038152906040529050606060005b6001600160a01b038616600090815260036020908152604080832088845290915290206002015460ff82161015611045576001600160a01b03861660009081526003602090815260408083208884529091529020600201805483916110109160ff8516908110610ff657610ff661193f565b6000918252602090912001546001600160a01b0316611212565b604051602001611021929190611be5565b6040516020818303038152906040529150808061103d906119ef565b915050610f84565b508161105082611222565b604051602001611061929190611be5565b60408051808303601f1901815291905295945050505050565b6000818152600183016020526040812054801561116357600061109e600183611c14565b85549091506000906110b290600190611c14565b90508181146111175760008660000182815481106110d2576110d261193f565b90600052602060002001549050808760000184815481106110f5576110f561193f565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061112857611128611c2b565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610259565b6000915050610259565b60008260000182815481106111845761118461193f565b9060005260206000200154905092915050565b60608151826040516020016111ad929190611c41565b6040516020818303038152906040529050919050565b600081815260018301602052604081205461120a57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610259565b506000610259565b60606102598260016000196113bf565b805160609080611242575050604080516020810190915260008152919050565b60006003611251836002611cc0565b61125b9190611cd8565b611266906004611cfa565b90506000611275826020611cc0565b67ffffffffffffffff81111561128d5761128d611929565b6040519080825280601f01601f1916602001820160405280156112b7576020820181803683370190505b5090506000604051806060016040528060408152602001611d1a604091399050600181016020830160005b86811015611343576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b8352600490920191016112e2565b50600386066001811461135d5760028114611389576113b1565b7f3d3d0000000000000000000000000000000000000000000000000000000000006001198301526113b1565b7f3d000000000000000000000000000000000000000000000000000000000000006000198301525b505050918152949350505050565b6060833b806113de575050604080516020810190915260008152610dbb565b808411156113fc575050604080516020810190915260008152610dbb565b83831015611447576040517f2c4a89fa0000000000000000000000000000000000000000000000000000000081526004810182905260248101859052604481018490526064016105b3565b838303848203600082821061145c578261145e565b815b60408051603f8301601f19168101909152818152955090508087602087018a3c505050509392505050565b828054611495906118f4565b90600052602060002090601f0160209004810192826114b757600085556114fd565b82601f106114d05782800160ff198235161785556114fd565b828001600101855582156114fd579182015b828111156114fd5782358255916020019190600101906114e2565b506104d8929150611523565b508054600082559060005260206000209081019061042a91905b5b808211156104d85760008155600101611524565b60006020828403121561154a57600080fd5b81356001600160e01b031981168114610dbb57600080fd5b80356001600160a01b038116811461157957600080fd5b919050565b6000806040838503121561159157600080fd5b61159a83611562565b946020939093013593505050565b60005b838110156115c35781810151838201526020016115ab565b838111156115d2576000848401525b50505050565b600081518084526115f08160208601602086016115a8565b601f01601f19169290920160200192915050565b60408152600061161760408301856115d8565b828103602084015261162981856115d8565b95945050505050565b60006020828403121561164457600080fd5b610dbb82611562565b6020808252825182820181905260009190848201906040850190845b8181101561168e5783516001600160a01b031683529284019291840191600101611669565b50909695505050505050565b60008083601f8401126116ac57600080fd5b50813567ffffffffffffffff8111156116c457600080fd5b6020830191508360208260051b85010111156116df57600080fd5b9250929050565b60008083601f8401126116f857600080fd5b50813567ffffffffffffffff81111561171057600080fd5b6020830191508360208285010111156116df57600080fd5b60008060008060008060008060a0898b03121561174457600080fd5b61174d89611562565b975060208901359650604089013567ffffffffffffffff8082111561177157600080fd5b61177d8c838d0161169a565b909850965060608b013591508082111561179657600080fd5b6117a28c838d016116e6565b909650945060808b01359150808211156117bb57600080fd5b506117c88b828c016116e6565b999c989b5096995094979396929594505050565b600080600080606085870312156117f257600080fd5b6117fb85611562565b935060208501359250604085013567ffffffffffffffff81111561181e57600080fd5b61182a8782880161169a565b95989497509550505050565b60008060008060008060006080888a03121561185157600080fd5b61185a88611562565b9650602088013567ffffffffffffffff8082111561187757600080fd5b6118838b838c0161169a565b909850965060408a013591508082111561189c57600080fd5b6118a88b838c016116e6565b909650945060608a01359150808211156118c157600080fd5b506118ce8a828b016116e6565b989b979a50959850939692959293505050565b602081526000610dbb60208301846115d8565b600181811c9082168061190857607f821691505b60208210811415610ebf57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561197f5761197f611955565b5060010190565b60006020828403121561199857600080fd5b81518015158114610dbb57600080fd5b6000808335601e198436030181126119bf57600080fd5b83018035915067ffffffffffffffff8211156119da57600080fd5b6020019150368190038213156116df57600080fd5b600060ff821660ff811415611a0657611a06611955565b60010192915050565b600060208284031215611a2157600080fd5b5051919050565b8054600090600181811c9080831680611a4257607f831692505b6020808410821415611a6457634e487b7160e01b600052602260045260246000fd5b818015611a785760018114611a8957611ab6565b60ff19861689528489019650611ab6565b60008881526020902060005b86811015611aae5781548b820152908501908301611a95565b505084890196505b50505050505092915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c7b0000000081526000611af4601c830185611a28565b7f2c2022696d616765223a2022000000000000000000000000000000000000000081528351611b2a81600c8401602088016115a8565b7f227d000000000000000000000000000000000000000000000000000000000000600c9290910191820152600e01949350505050565b6000815260008251611b798160018501602087016115a8565b9190910160010192915050565b7f646174613a00000000000000000000000000000000000000000000000000000081526000611bb86005830184611a28565b7f3b6261736536342c00000000000000000000000000000000000000000000000081526008019392505050565b60008351611bf78184602088016115a8565b835190830190611c0b8183602088016115a8565b01949350505050565b600082821015611c2657611c26611955565b500390565b634e487b7160e01b600052603160045260246000fd5b7f630000000000000000000000000000000000000000000000000000000000000081526001600160e01b03198360e01b1660018201527f80600e6000396000f30000000000000000000000000000000000000000000000600582015260008251611cb281600e8501602087016115a8565b91909101600e019392505050565b60008219821115611cd357611cd3611955565b500190565b600082611cf557634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611d1457611d14611955565b50029056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212201e121b24e4c2ab6d1eaca19d37e3ffe48a31b72bd5eaf5a86710fa7f5308e7fc64736f6c63430008090033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100df5760003560e01c80636d73e6691161008c578063804c400411610066578063804c4004146101ab5780638da5cb5b146101be578063e9dc6375146101d9578063f2fde38b146101f957600080fd5b80636d73e6691461017d578063715018a6146101905780637b00b0e01461019857600080fd5b80632d345670116100bd5780632d3456701461014057806331ae450b146101555780634a1703981461016a57600080fd5b806301ffc9a7146100e457806324ba43281461010c57806324d7806c1461012d575b600080fd5b6100f76100f2366004611538565b61020c565b60405190151581526020015b60405180910390f35b61011f61011a36600461157e565b61025f565b604051610103929190611604565b6100f761013b366004611632565b610396565b61015361014e366004611632565b6103cf565b005b61015d61042d565b604051610103919061164d565b610153610178366004611728565b6104dc565b61015361018b366004611632565b61075a565b6101536107b2565b6101536101a63660046117dc565b6107c6565b6101536101b9366004611836565b610947565b6000546040516001600160a01b039091168152602001610103565b6101ec6101e736600461157e565b610bb8565b60405161010391906118e1565b610153610207366004611632565b610ca9565b60006001600160e01b031982167fe9dc637500000000000000000000000000000000000000000000000000000000148061024a575061024a82610d36565b80610259575061025982610d36565b92915050565b6003602090815260009283526040808420909152908252902080548190610285906118f4565b80601f01602080910402602001604051908101604052809291908181526020018280546102b1906118f4565b80156102fe5780601f106102d3576101008083540402835291602001916102fe565b820191906000526020600020905b8154815290600101906020018083116102e157829003601f168201915b505050505090806001018054610313906118f4565b80601f016020809104026020016040519081016040528092919081815260200182805461033f906118f4565b801561038c5780601f106103615761010080835404028352916020019161038c565b820191906000526020600020905b81548152906001019060200180831161036f57829003601f168201915b5050505050905082565b6000816001600160a01b03166103b46000546001600160a01b031690565b6001600160a01b031614806102595750610259600183610d9d565b6103d7610dc2565b6103e2600182610d9d565b1561042a5760405133906001600160a01b038316907f7c0c3c84c67c85fcac635147348bfe374c24a1a93d0366d1cfe9d8853cbf89d590600090a3610428600182610e1c565b505b50565b60606104396001610e31565b67ffffffffffffffff81111561045157610451611929565b60405190808252806020026020018201604052801561047a578160200160208202803683370190505b50905060005b61048a6001610e31565b8110156104d85761049c600182610e3b565b8282815181106104ae576104ae61193f565b6001600160a01b0390921660209283029190910190910152806104d08161196b565b915050610480565b5090565b604051630935e01b60e21b8152336004820152889081906001600160a01b038216906324d7806c9060240160206040518083038186803b15801561051f57600080fd5b505afa158015610533573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105579190611986565b6105bc5760405162461bcd60e51b815260206004820152602b60248201527f57616c6c6574206973206e6f7420616e2061646d696e6973747261746f72206660448201526a1bdc8818dbdb9d1c9858dd60aa1b60648201526084015b60405180910390fd5b84156105f2576001600160a01b038a1660009081526003602090815260408083208c845290915290206105f0908787611489565b505b821561062b576001600160a01b038a1660009081526003602090815260408083208c84529091529020610629906001018585611489565b505b861561074e576001600160a01b038a1660009081526003602090815260408083208c8452909152812061066391600290910190611509565b60005b60ff811688111561074c576001600160a01b038b1660009081526003602090815260408083208d845290915290206002016106fb8a8a60ff85168181106106af576106af61193f565b90506020028101906106c191906119a8565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610e4792505050565b815460018101835560009283526020909220909101805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0390921691909117905580610744816119ef565b915050610666565b505b50505050505050505050565b610762610dc2565b61076d600182610d9d565b61042a5760405133906001600160a01b038316907f7e1a1a08d52e4ba0e21554733d66165fd5151f99460116223d9e3a608eec5cb190600090a3610428600182610ec5565b6107ba610dc2565b6107c46000610eda565b565b604051630935e01b60e21b8152336004820152849081906001600160a01b038216906324d7806c9060240160206040518083038186803b15801561080957600080fd5b505afa15801561081d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108419190611986565b6108a15760405162461bcd60e51b815260206004820152602b60248201527f57616c6c6574206973206e6f7420616e2061646d696e6973747261746f72206660448201526a1bdc8818dbdb9d1c9858dd60aa1b60648201526084016105b3565b60005b60ff811684111561093e576001600160a01b038716600090815260036020908152604080832089845290915290206002016108ed868660ff85168181106106af576106af61193f565b815460018101835560009283526020909220909101805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0390921691909117905580610936816119ef565b9150506108a4565b50505050505050565b604051630935e01b60e21b8152336004820152879081906001600160a01b038216906324d7806c9060240160206040518083038186803b15801561098a57600080fd5b505afa15801561099e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c29190611986565b610a225760405162461bcd60e51b815260206004820152602b60248201527f57616c6c6574206973206e6f7420616e2061646d696e6973747261746f72206660448201526a1bdc8818dbdb9d1c9858dd60aa1b60648201526084016105b3565b6040517f2928ca580000000000000000000000000000000000000000000000000000000081523360048201526000906001600160a01b038b1690632928ca5890602401602060405180830381600087803b158015610a7f57600080fd5b505af1158015610a93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab79190611a0f565b6001600160a01b038b1660009081526003602090815260408083208484529091529020909150610ae8908888611489565b506001600160a01b038a1660009081526003602090815260408083208484529091529020610b1a906001018686611489565b5060005b60ff811689111561074c576001600160a01b038b1660009081526003602090815260408083208584529091529020600201610b678b8b60ff85168181106106af576106af61193f565b815460018101835560009283526020909220909101805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0390921691909117905580610bb0816119ef565b915050610b1e565b6001600160a01b0382166000908152600360209081526040808320848452909152902060020154606090610c545760405162461bcd60e51b815260206004820152602160248201527f546f6b656e206d6574616461746120646f65736e27742065786973742068657260448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016105b3565b6001600160a01b03831660009081526003602090815260408083208584529091529020610c818484610f37565b604051602001610c92929190611ac2565b604051602081830303815290604052905092915050565b610cb1610dc2565b6001600160a01b038116610d2d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016105b3565b61042a81610eda565b60006001600160e01b031982167f553e757e00000000000000000000000000000000000000000000000000000000148061025957507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610259565b6001600160a01b038116600090815260018301602052604081205415155b9392505050565b6000546001600160a01b031633146107c45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105b3565b6000610dbb836001600160a01b03841661107a565b6000610259825490565b6000610dbb838361116d565b600080610e7283604051602001610e5e9190611b60565b604051602081830303815290604052611197565b90508051602082016000f091506001600160a01b038216610ebf576040517f08d4abb600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50919050565b6000610dbb836001600160a01b0384166111c3565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03821660009081526003602090815260408083208484528252808320905160609392610f6e926001019101611b86565b6040516020818303038152906040529050606060005b6001600160a01b038616600090815260036020908152604080832088845290915290206002015460ff82161015611045576001600160a01b03861660009081526003602090815260408083208884529091529020600201805483916110109160ff8516908110610ff657610ff661193f565b6000918252602090912001546001600160a01b0316611212565b604051602001611021929190611be5565b6040516020818303038152906040529150808061103d906119ef565b915050610f84565b508161105082611222565b604051602001611061929190611be5565b60408051808303601f1901815291905295945050505050565b6000818152600183016020526040812054801561116357600061109e600183611c14565b85549091506000906110b290600190611c14565b90508181146111175760008660000182815481106110d2576110d261193f565b90600052602060002001549050808760000184815481106110f5576110f561193f565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061112857611128611c2b565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610259565b6000915050610259565b60008260000182815481106111845761118461193f565b9060005260206000200154905092915050565b60608151826040516020016111ad929190611c41565b6040516020818303038152906040529050919050565b600081815260018301602052604081205461120a57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610259565b506000610259565b60606102598260016000196113bf565b805160609080611242575050604080516020810190915260008152919050565b60006003611251836002611cc0565b61125b9190611cd8565b611266906004611cfa565b90506000611275826020611cc0565b67ffffffffffffffff81111561128d5761128d611929565b6040519080825280601f01601f1916602001820160405280156112b7576020820181803683370190505b5090506000604051806060016040528060408152602001611d1a604091399050600181016020830160005b86811015611343576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b8352600490920191016112e2565b50600386066001811461135d5760028114611389576113b1565b7f3d3d0000000000000000000000000000000000000000000000000000000000006001198301526113b1565b7f3d000000000000000000000000000000000000000000000000000000000000006000198301525b505050918152949350505050565b6060833b806113de575050604080516020810190915260008152610dbb565b808411156113fc575050604080516020810190915260008152610dbb565b83831015611447576040517f2c4a89fa0000000000000000000000000000000000000000000000000000000081526004810182905260248101859052604481018490526064016105b3565b838303848203600082821061145c578261145e565b815b60408051603f8301601f19168101909152818152955090508087602087018a3c505050509392505050565b828054611495906118f4565b90600052602060002090601f0160209004810192826114b757600085556114fd565b82601f106114d05782800160ff198235161785556114fd565b828001600101855582156114fd579182015b828111156114fd5782358255916020019190600101906114e2565b506104d8929150611523565b508054600082559060005260206000209081019061042a91905b5b808211156104d85760008155600101611524565b60006020828403121561154a57600080fd5b81356001600160e01b031981168114610dbb57600080fd5b80356001600160a01b038116811461157957600080fd5b919050565b6000806040838503121561159157600080fd5b61159a83611562565b946020939093013593505050565b60005b838110156115c35781810151838201526020016115ab565b838111156115d2576000848401525b50505050565b600081518084526115f08160208601602086016115a8565b601f01601f19169290920160200192915050565b60408152600061161760408301856115d8565b828103602084015261162981856115d8565b95945050505050565b60006020828403121561164457600080fd5b610dbb82611562565b6020808252825182820181905260009190848201906040850190845b8181101561168e5783516001600160a01b031683529284019291840191600101611669565b50909695505050505050565b60008083601f8401126116ac57600080fd5b50813567ffffffffffffffff8111156116c457600080fd5b6020830191508360208260051b85010111156116df57600080fd5b9250929050565b60008083601f8401126116f857600080fd5b50813567ffffffffffffffff81111561171057600080fd5b6020830191508360208285010111156116df57600080fd5b60008060008060008060008060a0898b03121561174457600080fd5b61174d89611562565b975060208901359650604089013567ffffffffffffffff8082111561177157600080fd5b61177d8c838d0161169a565b909850965060608b013591508082111561179657600080fd5b6117a28c838d016116e6565b909650945060808b01359150808211156117bb57600080fd5b506117c88b828c016116e6565b999c989b5096995094979396929594505050565b600080600080606085870312156117f257600080fd5b6117fb85611562565b935060208501359250604085013567ffffffffffffffff81111561181e57600080fd5b61182a8782880161169a565b95989497509550505050565b60008060008060008060006080888a03121561185157600080fd5b61185a88611562565b9650602088013567ffffffffffffffff8082111561187757600080fd5b6118838b838c0161169a565b909850965060408a013591508082111561189c57600080fd5b6118a88b838c016116e6565b909650945060608a01359150808211156118c157600080fd5b506118ce8a828b016116e6565b989b979a50959850939692959293505050565b602081526000610dbb60208301846115d8565b600181811c9082168061190857607f821691505b60208210811415610ebf57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561197f5761197f611955565b5060010190565b60006020828403121561199857600080fd5b81518015158114610dbb57600080fd5b6000808335601e198436030181126119bf57600080fd5b83018035915067ffffffffffffffff8211156119da57600080fd5b6020019150368190038213156116df57600080fd5b600060ff821660ff811415611a0657611a06611955565b60010192915050565b600060208284031215611a2157600080fd5b5051919050565b8054600090600181811c9080831680611a4257607f831692505b6020808410821415611a6457634e487b7160e01b600052602260045260246000fd5b818015611a785760018114611a8957611ab6565b60ff19861689528489019650611ab6565b60008881526020902060005b86811015611aae5781548b820152908501908301611a95565b505084890196505b50505050505092915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c7b0000000081526000611af4601c830185611a28565b7f2c2022696d616765223a2022000000000000000000000000000000000000000081528351611b2a81600c8401602088016115a8565b7f227d000000000000000000000000000000000000000000000000000000000000600c9290910191820152600e01949350505050565b6000815260008251611b798160018501602087016115a8565b9190910160010192915050565b7f646174613a00000000000000000000000000000000000000000000000000000081526000611bb86005830184611a28565b7f3b6261736536342c00000000000000000000000000000000000000000000000081526008019392505050565b60008351611bf78184602088016115a8565b835190830190611c0b8183602088016115a8565b01949350505050565b600082821015611c2657611c26611955565b500390565b634e487b7160e01b600052603160045260246000fd5b7f630000000000000000000000000000000000000000000000000000000000000081526001600160e01b03198360e01b1660018201527f80600e6000396000f30000000000000000000000000000000000000000000000600582015260008251611cb281600e8501602087016115a8565b91909101600e019392505050565b60008219821115611cd357611cd3611955565b500190565b600082611cf557634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611d1457611d14611955565b50029056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212201e121b24e4c2ab6d1eaca19d37e3ffe48a31b72bd5eaf5a86710fa7f5308e7fc64736f6c63430008090033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.