ETH Price: $2,688.49 (-3.32%)

Token

Actus Essendi (ACTESSND)
 

Overview

Max Total Supply

10 ACTESSND

Holders

8

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
trollboxed.eth
Balance
1 ACTESSND
0x34a32ad4ba1ea1eb02ccd3ed5b9af9a8d8ea07a8
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ActusEssendi

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license
File 1 of 7 : ActusEssendi.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity 0.8.21;

import {Proxy} from "@openzeppelin/contracts/proxy/Proxy.sol";
import {ERC721Baseline} from "erc721baseline/contracts/ERC721Baseline.sol";
import {IERC721Baseline} from "erc721baseline/contracts/IERC721Baseline.sol";
import {Base64} from "solady/src/utils/Base64.sol";

/**
 * @title Actus Essendi
 * @author 0xG
 *
 * @notice
 * Actus Essendi draws from Aquinas' metaphysical concept that
 * everything has an essence or nature, but existence (actus essendi)
 * is what gives an entity its individuality and reality.
 *
 * 0xG relates this theory to generative art algorithms,
 * which symbolize the essence and inherent nature of the artwork,
 * while their static output, an image, embodies the reality and
 * individuality of Actus Essendi, capturing a momentary expression of the essence.
 *
 * This concept is formalized in this contract as tokens that start with
 * a unique on-chain generative artwork (the essence) which transforms at every resolution.
 *
 * Using the signature on the back of the corresponding physical piece
 * the collector can permanently transitions the token to Actus Essendi.
 *
 * After execution, the token visual reflects the physical piece the collector owns,
 * serving as a permanent expression of the essence at `tokenId` resolution.
 */
contract ActusEssendi is ERC721Baseline {

  /**
   * @notice Returns the address of the creator, 0xG, who signed the artworks.
   *
   * @return The creator address.
   */
  address immutable public creator = msg.sender;

  /**
   * @notice Returns the current state of the token.
   * @dev Available states are:
   *
   * 0. Unminted
   * 1. Essence
   * 2. Actus Essendi
   * 3. Burnt
   *
   * @return state The token state
   */
  mapping(uint256 tokenId => uint8 state) public tokenState;

  /**
   * @notice The artwork description.
   */
  string public description;

  event ActusEssendi(uint256 _tokenId);
  event MetadataUpdate(uint256 _tokenId);
  event Description(string description);

  error ERC721NonexistentToken(uint256 tokenId);

  constructor(address ERC721BaselineImplementation)
    ERC721Baseline(
      ERC721BaselineImplementation,
      "Actus Essendi",
      "ACTESSND"
    )
  { }

  /**
   * @notice Returns the generative on-chain artwork (the essence).
   * Every new token in the collection starts from the essence.
   *
   * @return SVG image encoded as a base64 string
   */
  function essence() external pure returns (string memory) {
    return "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJiYWNrZ3JvdW5kOiNmNWY1ZjUiIHZpZXdCb3g9IjAgMCAxMDAwIDEwMDAiPjxkZWZzPjxmaWx0ZXIgaWQ9ImEiPjxmZVR1cmJ1bGVuY2UgYmFzZUZyZXF1ZW5jeT0iMC4wMDAxIDEiIG51bU9jdGF2ZXM9IjMiIHNlZWQ9IjcwMSIvPjxmZU1vcnBob2xvZ3kgb3BlcmF0b3I9ImRpbGF0ZSIgcmFkaXVzPSI0LjUiLz48ZmVEaXNwbGFjZW1lbnRNYXAgaW49IlNvdXJjZUdyYXBoaWMiIHNjYWxlPSIxNTAwIiB4Q2hhbm5lbFNlbGVjdG9yPSJHIiB5Q2hhbm5lbFNlbGVjdG9yPSJCIi8+PC9maWx0ZXI+PC9kZWZzPjxyZWN0IHdpZHRoPSIxMDAwIiBoZWlnaHQ9IjEwMDAiIGZpbGw9IiNmNWY1ZjUiLz48cmVjdCB3aWR0aD0iNTAwIiBoZWlnaHQ9IjUwMCIgeD0iMjUwIiB5PSIyNTAiIGZpbGw9IiNlMGUwZTAiLz48cmVjdCB3aWR0aD0iNTAwIiBoZWlnaHQ9IjUwMCIgeD0iMjUwIiB5PSIyNTAiIGZpbGw9IiNmNWY1ZjUiIHN0cm9rZT0iIzYwNjA2MCIgc3Ryb2tlLXdpZHRoPSI0MCIgZmlsdGVyPSJ1cmwoI2EpIi8+PHJlY3Qgd2lkdGg9IjIwMCIgaGVpZ2h0PSI1MDAiIHg9IjU4MCIgeT0iMjUwIiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmYiIHN0cm9rZS1kYXNoYXJyYXk9IjIiIHN0cm9rZS13aWR0aD0iNDAiIGZpbHRlcj0idXJsKCNhKSIvPjwvc3ZnPg==";
  }

  /**
   * @notice Permanently transitions the token to Actus Essendi.
   * After execution, the token visual reflects the physical piece the collector owns,
   * serving as a permanent expression of the essence at `tokenId` resolution.
   *
   * @param tokenId The ID of the token to perform Actus Essendi on
   * @param signature The signature on the back of the physical piece counterpart
   */
  function actusEssendi(uint256 tokenId, bytes calldata signature) external {
    if (
      tokenState[tokenId] != 1 ||
      creator != baseline().recoverCalldata(
        keccak256(abi.encodePacked(address(this), tokenId)),
        signature
      ) ||
      msg.sender != baseline().__ownerOf(tokenId)
    ) revert IERC721Baseline.Unauthorized();

    tokenState[tokenId] = 2;

    emit ActusEssendi(tokenId);
    emit MetadataUpdate(tokenId);
  }

  /**
   * @notice Retrieves the token URI for a given tokenId.
   *
   * @param tokenId The ID of the token
   * @return The token URI
   */
  function tokenURI(uint256 tokenId) external view returns (string memory) {
    uint8 state = tokenState[tokenId];
    if (state == 0 || state == 3) revert ERC721NonexistentToken(tokenId);

    return string.concat(
      'data:application/json;base64,',
      Base64.encode(
        abi.encodePacked(
          '{"name":"',(state == 2 ?'Actus Essendi' : 'Essence'),' #',baseline().toString(tokenId),'",',
          '"created_by":"0xG","description":"',description,'",',
          '"image":"',(state == 2 ? baseline().__tokenURI(tokenId) : this.essence()),'"}'
        ),
        true
      )
    );
  }

  /**
   * @notice Allows the collector to update the Actus Essendi URI for a given tokenId.
   * This method exists only as an escape hatch to update the URI in case of issues.
   *
   * @param tokenId The ID of the token
   * @param uri The new URI for Actus Essendi (provided by the creator)
   * @param signature The signature for authorization (provided by the creator)
   */
  function updateActusEssendiUri(uint256 tokenId, string calldata uri, bytes calldata signature) external {
    if (
      tokenState[tokenId] != 2 ||
      false == _isAuthorized(
        keccak256(abi.encodePacked(address(this), tokenId, uri)),
        signature
      ) ||
      msg.sender != baseline().__ownerOf(tokenId)
    ) revert IERC721Baseline.Unauthorized();

    baseline().__setTokenURI(tokenId, uri);
  }

  /**
   * @notice Allows a collector to redeem a specific tokenId.
   *
   * @param tokenId The ID of the token to redeem
   * @param uri The URI for the token (provided by the creator)
   * @param signature The signature for authorization (provided by the creator)
   */
  function mint(uint256 tokenId, string calldata uri, bytes calldata signature) external {
    if (
      tokenState[tokenId] > 0 ||
      false == _isAuthorized(
        keccak256(
          abi.encodePacked(
            msg.sender,
            address(this),
            tokenId,
            uri
          )
        ),
        signature
      )
    ) revert IERC721Baseline.Unauthorized();

    tokenState[tokenId] = 1;
    baseline().__mint(msg.sender, tokenId, uri);
  }

  /**
   * @notice Burns a token with the given tokenId.
   *
   * @param tokenId The ID of the token to burn
   */
  function burn(uint256 tokenId) external {
    if (
      msg.sender != baseline().__ownerOf(tokenId)
    ) revert IERC721Baseline.Unauthorized();

    tokenState[tokenId] = 3;
    baseline().__burn(tokenId);
  }

  /**
   * @notice Sets the artwork description.
   *
   * @param desc The new description
   * @param store Whether the description should be persisted on storage
   * @param emitEvent Whether calling the function should emit a Description event with the description
   */
  function setDescription(string calldata desc, bool store, bool emitEvent) external {
    baseline().requireAdmin(msg.sender);
    if (store) {
      description = desc;
    }
    if (emitEvent) {
      emit Description(desc);
    }
  }

  function _isAuthorized(bytes32 digest, bytes calldata signature) internal returns (bool) {
    IERC721Baseline impl = baseline();
    return impl.isAdmin(impl.recoverCalldata(digest, signature));
  }
}

File 2 of 7 : Base64.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/// @notice Library to encode strings in Base64.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/Base64.sol)
/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/Base64.sol)
/// @author Modified from (https://github.com/Brechtpd/base64/blob/main/base64.sol) by Brecht Devos - <[email protected]>.
library Base64 {
    /// @dev Encodes `data` using the base64 encoding described in RFC 4648.
    /// See: https://datatracker.ietf.org/doc/html/rfc4648
    /// @param fileSafe  Whether to replace '+' with '-' and '/' with '_'.
    /// @param noPadding Whether to strip away the padding.
    function encode(bytes memory data, bool fileSafe, bool noPadding)
        internal
        pure
        returns (string memory result)
    {
        /// @solidity memory-safe-assembly
        assembly {
            let dataLength := mload(data)

            if dataLength {
                // Multiply by 4/3 rounded up.
                // The `shl(2, ...)` is equivalent to multiplying by 4.
                let encodedLength := shl(2, div(add(dataLength, 2), 3))

                // Set `result` to point to the start of the free memory.
                result := mload(0x40)

                // Store the table into the scratch space.
                // Offsetted by -1 byte so that the `mload` will load the character.
                // We will rewrite the free memory pointer at `0x40` later with
                // the allocated size.
                // The magic constant 0x0670 will turn "-_" into "+/".
                mstore(0x1f, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef")
                mstore(0x3f, xor("ghijklmnopqrstuvwxyz0123456789-_", mul(iszero(fileSafe), 0x0670)))

                // Skip the first slot, which stores the length.
                let ptr := add(result, 0x20)
                let end := add(ptr, encodedLength)

                // Run over the input, 3 bytes at a time.
                for {} 1 {} {
                    data := add(data, 3) // Advance 3 bytes.
                    let input := mload(data)

                    // Write 4 bytes. Optimized for fewer stack operations.
                    mstore8(0, mload(and(shr(18, input), 0x3F)))
                    mstore8(1, mload(and(shr(12, input), 0x3F)))
                    mstore8(2, mload(and(shr(6, input), 0x3F)))
                    mstore8(3, mload(and(input, 0x3F)))
                    mstore(ptr, mload(0x00))

                    ptr := add(ptr, 4) // Advance 4 bytes.
                    if iszero(lt(ptr, end)) { break }
                }
                mstore(0x40, add(end, 0x20)) // Allocate the memory.
                // Equivalent to `o = [0, 2, 1][dataLength % 3]`.
                let o := div(2, mod(dataLength, 3))
                // Offset `ptr` and pad with '='. We can simply write over the end.
                mstore(sub(ptr, o), shl(240, 0x3d3d))
                // Set `o` to zero if there is padding.
                o := mul(iszero(iszero(noPadding)), o)
                mstore(sub(ptr, o), 0) // Zeroize the slot after the string.
                mstore(result, sub(encodedLength, o)) // Store the length.
            }
        }
    }

    /// @dev Encodes `data` using the base64 encoding described in RFC 4648.
    /// Equivalent to `encode(data, false, false)`.
    function encode(bytes memory data) internal pure returns (string memory result) {
        result = encode(data, false, false);
    }

    /// @dev Encodes `data` using the base64 encoding described in RFC 4648.
    /// Equivalent to `encode(data, fileSafe, false)`.
    function encode(bytes memory data, bool fileSafe)
        internal
        pure
        returns (string memory result)
    {
        result = encode(data, fileSafe, false);
    }

    /// @dev Decodes base64 encoded `data`.
    ///
    /// Supports:
    /// - RFC 4648 (both standard and file-safe mode).
    /// - RFC 3501 (63: ',').
    ///
    /// Does not support:
    /// - Line breaks.
    ///
    /// Note: For performance reasons,
    /// this function will NOT revert on invalid `data` inputs.
    /// Outputs for invalid inputs will simply be undefined behaviour.
    /// It is the user's responsibility to ensure that the `data`
    /// is a valid base64 encoded string.
    function decode(string memory data) internal pure returns (bytes memory result) {
        /// @solidity memory-safe-assembly
        assembly {
            let dataLength := mload(data)

            if dataLength {
                let decodedLength := mul(shr(2, dataLength), 3)

                for {} 1 {} {
                    // If padded.
                    if iszero(and(dataLength, 3)) {
                        let t := xor(mload(add(data, dataLength)), 0x3d3d)
                        // forgefmt: disable-next-item
                        decodedLength := sub(
                            decodedLength,
                            add(iszero(byte(30, t)), iszero(byte(31, t)))
                        )
                        break
                    }
                    // If non-padded.
                    decodedLength := add(decodedLength, sub(and(dataLength, 3), 1))
                    break
                }
                result := mload(0x40)

                // Write the length of the bytes.
                mstore(result, decodedLength)

                // Skip the first slot, which stores the length.
                let ptr := add(result, 0x20)
                let end := add(ptr, decodedLength)

                // Load the table into the scratch space.
                // Constants are optimized for smaller bytecode with zero gas overhead.
                // `m` also doubles as the mask of the upper 6 bits.
                let m := 0xfc000000fc00686c7074787c8084888c9094989ca0a4a8acb0b4b8bcc0c4c8cc
                mstore(0x5b, m)
                mstore(0x3b, 0x04080c1014181c2024282c3034383c4044484c5054585c6064)
                mstore(0x1a, 0xf8fcf800fcd0d4d8dce0e4e8ecf0f4)

                for {} 1 {} {
                    // Read 4 bytes.
                    data := add(data, 4)
                    let input := mload(data)

                    // Write 3 bytes.
                    // forgefmt: disable-next-item
                    mstore(ptr, or(
                        and(m, mload(byte(28, input))),
                        shr(6, or(
                            and(m, mload(byte(29, input))),
                            shr(6, or(
                                and(m, mload(byte(30, input))),
                                shr(6, mload(byte(31, input)))
                            ))
                        ))
                    ))
                    ptr := add(ptr, 3)
                    if iszero(lt(ptr, end)) { break }
                }
                mstore(0x40, add(end, 0x20)) // Allocate the memory.
                mstore(end, 0) // Zeroize the slot after the bytes.
                mstore(0x60, 0) // Restore the zero slot.
            }
        }
    }
}

File 3 of 7 : IERC721Baseline.sol
// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity 0.8.21;

import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol";

/**
 * @title IERC721Baseline
 * @custom:version v0.1.0-alpha.4
 * @notice A baseline ERC721 contract implementation that exposes internal methods to a proxy instance.
 */
interface IERC721Baseline is IERC721 {

  /**
   * @dev The version of the implementation contract.
   */
  function VERSION() external view returns (string memory);

  /**
   * @dev Indicates an unauthorized operation or unauthorized access attempt.
   */
  error Unauthorized();


  /************************************************
   * Initializer
   ************************************************/

  /**
   * @notice Initializes a proxy contract.
   * @dev This method MUST be called in the proxy constructor via delegatecall
   * to initialize the proxy with a name and symbol for the underlying ERC721.
   *
   * Additionally this method sets the deployer as owner and admin of the proxy.
   *
   * @param name contract name
   * @param symbol contract symbol
   */
  function initialize(string memory name, string memory symbol) external;


  /************************************************
   * Metadata
   ************************************************/

  /**
   * Metadata > ERC-4906 events
   */

  /**
   * @dev This event emits when the metadata of a token is changed.
   * So that the third-party platforms such as NFT market could
   * timely update the images and related attributes of the NFT.
   *
   * @param _tokenId the token ID being updated
   */
  event MetadataUpdate(uint256 _tokenId);

  /**
   * @dev This event emits when the metadata of a range of tokens is changed.
   * So that the third-party platforms such as NFT market could
   * timely update the images and related attributes of the NFTs.
   *
   * @param _fromTokenId the starting token ID
   * @param _toTokenId the ending token ID
   */
  event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId);

  /**
   * @notice The total minted supply.
   * @dev The supply is decreased when a token is burned.
   * Generally it is recommended to use a separate counter variable to track the supply available for minting.
   */
  function totalSupply() external view returns (uint256);

  /**
   * Token URI methods.
   *
   * The ERC721Baseline tokenURI implementation allows to define uris in the following order:
   *
   * 1. Token-specific URI by ID.
   * 2. Shared URI.
   * 3. Shared base URI + token ID.
   * 4. Empty string if none of the above was found.
   */

  /**
   * @notice Returns the token URI for a token ID.
   *
   * @param tokenId token ID
   */
  function __tokenURI(uint256 tokenId) external view returns (string memory);

  /**
   * @notice Sets the token URI for a token ID.
   * @dev Emits EIP-4906's `MetadataUpdate` event with the `tokenId`.
   * This method is internal and only the proxy contract can call it.
   *
   *
   * @param tokenId token ID
   * @param tokenURI URI pointing to the metadata
   */
  function __setTokenURI(uint256 tokenId, string calldata tokenURI) external;

  /**
   * @notice Returns the shared URI for the tokens.
   * @dev This method is internal and only the proxy contract can call it.
   */
  function __sharedURI() external view returns (string memory);

  /**
   * @notice Sets a shared URI for the tokens.
   * @dev This method doesn't emit the EIP-4906's `BatchMetadataUpdate` event
   * because ERC721Baseline allows to mint any token ID, starting at any index.
   * The proxy should emit `BatchMetadataUpdate`.
   *
   * This method is internal and only the proxy contract can call it.
   *
   * @param sharedURI shared URI for the tokens
   */
  function __setSharedURI(string calldata sharedURI) external;

  /**
   * @notice Returns the base URI for the tokens.
   * @dev When set this URI is prepended to the token ID.
   */
  function __baseURI() external view returns (string memory);

  /**
   * @notice Sets a contract-wide base URI.
   * @dev This method doesn't emit the EIP-4906 `BatchMetadataUpdate` event
   * because ERC721Baseline allows to mint any token ID, starting at any index.
   * The proxy should emit `BatchMetadataUpdate`.
   *
   * This method is internal and only the proxy contract can call it.
   *
   * @param baseURI shared base URI for the tokens
   */
  function __setBaseURI(string calldata baseURI) external;


  /************************************************
   * Internal ERC721 methods exposed to the proxy
   ************************************************/

  /**
   * @dev Indicates an invalid attempt to call a method from outside of the proxy.
   */
  error NotProxy();

  /**
   * @dev See {ERC721-_ownerOf}.
   */
  function __ownerOf(uint256 tokenId) external returns (address);

  /**
   * @dev See {ERC721-_update}.
   * This method is internal and only the proxy contract can call it.
   */
  function __update(address to, uint256 tokenId, address auth) external returns (address);

  /**
   * @dev See {ERC721-_mint}.
   * This method is internal and only the proxy contract can call it.
   */
  function __mint(address to, uint256 tokenId) external;

  /**
   * @dev Similar to {ERC721-_mint} but allows to set a dedicated tokenURI for the token.
   * This method is internal and only the proxy contract can call it.
   */
  function __mint(address to, uint256 tokenId, string calldata tokenURI) external;

  /**
   * @dev See {ERC721-_burn}.
   * This method is internal and only the proxy contract can call it.
   */
  function __burn(uint256 tokenId) external;

  /**
   * @dev See {ERC721-_transfer}.
   * This method is internal and only the proxy contract can call it.
   */
  function __transfer(address from, address to, uint256 tokenId) external;

  /**
   * @notice Allows to enable or disable a `_beforeTokenTransfer` hook method defined in the proxy contract.
   * @dev This method is internal and only the proxy contract can call it.
   *
   * When enabled, the proxy's `_beforeTokenTransfer` hook method is invoked prior to a transfer.
   *
   * The proxy's `_beforeTokenTransfer` method is called with the following params:
   *
   * - address the transaction's _msgSender()
   * - address from
   * - address to
   * - uint256 tokenId
   *
   * This method is internal and only the proxy contract can call it.
   */
  function __setBeforeTokenTransferHookEnabled(bool enabled) external;

  /**
   * @dev See {ERC721-_checkOnERC721Received}.
   *
   * NOTE: this method accepts an additional first parameter that is the original transaction's `msg.sender`.
   */
  function __checkOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) external;

  /**
   * @dev See {ERC721-_isAuthorized}.
   */
  function __isAuthorized(address owner, address spender, uint256 tokenId) external view returns (bool);

  /**
   * @dev See {ERC721-_approve}.
   * This method is internal and only the proxy contract can call it.
   */
  function __approve(address to, uint256 tokenId, address auth, bool emitEvent) external;

  /**
   * @dev See {ERC721-_setApprovalForAll}.
   * This method is internal and only the proxy contract can call it.
   */
  function __setApprovalForAll(address owner, address operator, bool approved) external;


  /************************************************
   * Access control
   ************************************************/

  /**
   * Implements a multi-admin system and a minimal Ownable-compatible API.
   */

  /**
   * Access control > multi-admin system
   */

  /**
   * @notice Checks if an address is the contract owner or an admin.
   *
   * @param addr address to check
   * @return bool whether the address is an admin or not
   */
  function isAdmin(address addr) external view returns (bool);

  /**
   * @dev Emits when an admin is added or removed.
   *
   * @param addr address that is being added or removed as an admin
   * @param add boolean indicating whether the address was grented or revoked admin rights
   */
  event AdminSet(address indexed addr, bool indexed add);

  /**
   * @notice Allows to add or remove an admin.
   * Can only be called by an admin.
   *
   * @param addr address to add or remove
   * @param add boolean indicating whether the address should be granted or revoked rights
   */
  function setAdmin(address addr, bool add) external;

  /**
   * @notice Checks whether an address is an admin and reverts with an `Unauthorized` error if not.
   * @dev Call `requireAdmin` in proxies to implement admin-only public methods.
   *
   * @param addr the address to check
   */
  function requireAdmin(address addr) external view;

  /**
   * @notice Allows to add or remove an admin.
   * @dev This method is internal and only the proxy contract can call it.
   *
   * @param addr address to add or remove
   * @param add boolean indicating whether the address should be granted or revoked rights
   */
  function __setAdmin(address addr, bool add) external;

  /**
   * Access control > Ownable-compatible API.
   */

  /**
   * @notice Returns the address of the contract owner.
   *
   * @return address of the contract owner
   */
  function owner() external view returns (address);

  /**
   * @dev Emits when the contract ownership is transferred.
   *
   * @param previousOwner old owner address
   * @param newOwner new owner address
   */
  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

  /**
   * @notice Transfers ownership of the contract to a new account.
   * Can only be called by an admin.
   *
   * @param newOwner new owner address
   */
  function transferOwnership(address newOwner) external;

  /**
   * @notice Transfers ownership of the contract to a new account.
   * @dev This method is internal and only the proxy contract can call it.
   *
   * @param newOwner new owner address
   */
  function __transferOwnership(address newOwner) external;


  /************************************************
   * Utils
   ************************************************/

  /**
   * @dev Indicates an invalid signature.
   */
  error InvalidSignature();

  /**
   * @notice Recovers the signer's address from a message digest `hash`, and the `signature`.
   *
   * @param hash the message digest that was signed
   * @param signature the signature for hash
   * @return result address the recovered address
   */
  function recover(bytes32 hash, bytes memory signature) external view returns (address result);

  /**
   * @notice Recovers the signer's address from a message digest `hash`, and the `signature`.
   * @dev In this method the signature comes from calldata.
   *
   * @param hash the message digest that was signed
   * @param signature the signature for hash
   * @return result address the recovered address
   */
  function recoverCalldata(bytes32 hash, bytes calldata signature) external view returns (address result);

  /**
   * @notice Converts a uint256 to string
   *
   * @param value the uint256 to convert
   * @return string ASCII string decimal representation of `value`
   */
  function toString(uint256 value) external pure returns (string memory);

}

File 4 of 7 : ERC721Baseline.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.21;

import {Proxy} from "@openzeppelin/contracts/proxy/Proxy.sol";
import {IERC721Baseline} from "./IERC721Baseline.sol";

/**
 * @title ERC721Baseline
 * @custom:version v0.1.0
 * @notice A minimal proxy contract for ERC721BaselineImplementation.
 *
 * @dev ERC721BaselineImplementation uses ERC-7201 (Namespaced Storage Layout)
 * to prevent collisions with the proxies storage.
 * See https://eips.ethereum.org/EIPS/eip-7201.
 *
 * Proxies are encouraged, but not required, to use a similar pattern for storage.
 */
contract ERC721Baseline is Proxy {

  struct ImplementationSlot {
    address value;
  }

  /**
   * @dev Storage slot with the address of the current implementation.
   * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1.
   */
  bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;

  constructor(
    address ERC721BaselineImplementation,
    string memory name,
    string memory symbol
  ) {
    ImplementationSlot storage implementation;
    assembly {
      implementation.slot := _IMPLEMENTATION_SLOT
    }
    implementation.value = ERC721BaselineImplementation;

    (bool success, bytes memory reason) = ERC721BaselineImplementation.delegatecall(
      abi.encodeCall(IERC721Baseline.initialize, (name, symbol))
    );

    if (success == false) {
      if (reason.length == 0) revert("Initialization Failed.");
      assembly {
        revert(add(32, reason), mload(reason))
      }
    }
  }

  function _implementation() internal view override returns (address) {
    ImplementationSlot storage implementation;
    assembly {
      implementation.slot := _IMPLEMENTATION_SLOT
    }
    return implementation.value;
  }

  function implementation() external view returns (address) {
    return _implementation();
  }

  /**
   * @notice Returns a reference to the ERC721BaselineImplementation contract.
   */
  function baseline() internal view returns (IERC721Baseline) {
    return IERC721Baseline(address(this));
  }
}

File 5 of 7 : Proxy.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (proxy/Proxy.sol)

pragma solidity ^0.8.20;

/**
 * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM
 * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to
 * be specified by overriding the virtual {_implementation} function.
 *
 * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a
 * different contract through the {_delegate} function.
 *
 * The success and return data of the delegated call will be returned back to the caller of the proxy.
 */
abstract contract Proxy {
    /**
     * @dev Delegates the current call to `implementation`.
     *
     * This function does not return to its internal call site, it will return directly to the external caller.
     */
    function _delegate(address implementation) internal virtual {
        assembly {
            // Copy msg.data. We take full control of memory in this inline assembly
            // block because it will not return to Solidity code. We overwrite the
            // Solidity scratch pad at memory position 0.
            calldatacopy(0, 0, calldatasize())

            // Call the implementation.
            // out and outsize are 0 because we don't know the size yet.
            let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)

            // Copy the returned data.
            returndatacopy(0, 0, returndatasize())

            switch result
            // delegatecall returns 0 on error.
            case 0 {
                revert(0, returndatasize())
            }
            default {
                return(0, returndatasize())
            }
        }
    }

    /**
     * @dev This is a virtual function that should be overridden so it returns the address to which the fallback
     * function and {_fallback} should delegate.
     */
    function _implementation() internal view virtual returns (address);

    /**
     * @dev Delegates the current call to the address returned by `_implementation()`.
     *
     * This function does not return to its internal call site, it will return directly to the external caller.
     */
    function _fallback() internal virtual {
        _delegate(_implementation());
    }

    /**
     * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other
     * function in the contract matches the call data.
     */
    fallback() external payable virtual {
        _fallback();
    }
}

File 6 of 7 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.20;

import {IERC165} from "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon
     *   a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or
     *   {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon
     *   a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the address zero.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

File 7 of 7 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)

pragma solidity ^0.8.20;

/**
 * @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);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "remappings": []
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"ERC721BaselineImplementation","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonexistentToken","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ActusEssendi","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"description","type":"string"}],"name":"Description","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"MetadataUpdate","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"actusEssendi","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"creator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"description","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"essence","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"desc","type":"string"},{"internalType":"bool","name":"store","type":"bool"},{"internalType":"bool","name":"emitEvent","type":"bool"}],"name":"setDescription","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenState","outputs":[{"internalType":"uint8","name":"state","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"updateActusEssendiUri","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040523360805234801562000014575f80fd5b5060405162001aa638038062001aa68339810160408190526200003791620001c3565b604080518082018252600d81526c416374757320457373656e646960981b6020808301919091528251808401845260088152671050d51154d4d39160c21b918101919091527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0386169081178255935185945f91829190620000d3908790879060240162000243565b60408051601f198184030181529181526020820180516001600160e01b031663266c45bb60e11b179052516200010a919062000274565b5f60405180830381855af49150503d805f811462000144576040519150601f19603f3d011682016040523d82523d5f602084013e62000149565b606091505b5090925090508115155f03620001b65780515f03620001ae5760405162461bcd60e51b815260206004820152601660248201527f496e697469616c697a6174696f6e204661696c65642e00000000000000000000604482015260640160405180910390fd5b805181602001fd5b5050505050505062000291565b5f60208284031215620001d4575f80fd5b81516001600160a01b0381168114620001eb575f80fd5b9392505050565b5f5b838110156200020e578181015183820152602001620001f4565b50505f910152565b5f81518084526200022f816020860160208601620001f2565b601f01601f19169290920160200192915050565b604081525f62000257604083018562000216565b82810360208401526200026b818562000216565b95945050505050565b5f825162000287818460208701620001f2565b9190910192915050565b6080516117f6620002b05f395f818160b6015261044701526117f65ff3fe60806040526004361061009b575f3560e01c80637284e416116100635780637284e41614610168578063785cc9971461017c5780639745cc3d1461019b5780639e46b6f7146101db578063a506472a146101fa578063c87b56dd146102195761009b565b806302d05d3f146100a557806342966c68146100f557806348b45f2c146101145780635c60da1b146101335780635c7abcc214610147575b6100a3610238565b005b3480156100b0575f80fd5b506100d87f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610100575f80fd5b506100a361010f366004610d3a565b610273565b34801561011f575f80fd5b506100a361012e366004610d96565b61037e565b34801561013e575f80fd5b506100d8610594565b348015610152575f80fd5b5061015b6105cb565b6040516100ec9190610e00565b348015610173575f80fd5b5061015b6105ee565b348015610187575f80fd5b506100a3610196366004610e32565b61067a565b3480156101a6575f80fd5b506101c96101b5366004610d3a565b5f6020819052908152604090205460ff1681565b60405160ff90911681526020016100ec565b3480156101e6575f80fd5b506100a36101f5366004610eb6565b61076f565b348015610205575f80fd5b506100a3610214366004610e32565b610820565b348015610224575f80fd5b5061015b610233366004610d3a565b610916565b61027161026c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b610b3d565b565b604051631f44bb2560e01b8152600481018290523090631f44bb25906024016020604051808303815f875af11580156102ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102d29190610f1a565b6001600160a01b0316336001600160a01b031614610302576040516282b42960e81b815260040160405180910390fd5b5f818152602081905260409020805460ff191660031790556103213090565b6001600160a01b031663d1a01520826040518263ffffffff1660e01b815260040161034e91815260200190565b5f604051808303815f87803b158015610365575f80fd5b505af1158015610377573d5f803e3d5ffd5b5050505050565b5f8381526020819052604090205460ff16600114158061047257506040805130606081901b6bffffffffffffffffffffffff191660208084019190915260348084018890528451808503909101815260548401948590528051910120633b98c1d160e21b9093529163ee630744916103fd919086908690605801610f68565b602060405180830381865afa158015610418573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061043c9190610f1a565b6001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614155b806104ed5750604051631f44bb2560e01b8152600481018490523090631f44bb25906024016020604051808303815f875af11580156104b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d79190610f1a565b6001600160a01b0316336001600160a01b031614155b1561050a576040516282b42960e81b815260040160405180910390fd5b5f8381526020819052604090819020805460ff19166002179055517f41fe025400223d5e24141e6cef77fea9466ef25000e864c6799111c5a56eb55d906105549085815260200190565b60405180910390a16040518381527ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79060200160405180910390a1505050565b5f6105c67f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b6060604051806103e001604052806103be81526020016114036103be9139905090565b600180546105fb90610f81565b80601f016020809104026020016040519081016040528092919081815260200182805461062790610f81565b80156106725780601f1061064957610100808354040283529160200191610672565b820191905f5260205f20905b81548152906001019060200180831161065557829003601f168201915b505050505081565b5f8581526020819052604090205460ff161515806106ce57506106cc33308787876040516020016106af959493929190610fb9565b604051602081830303815290604052805190602001208383610b60565b155b156106eb576040516282b42960e81b815260040160405180910390fd5b5f858152602081905260409020805460ff1916600117905561070a3090565b6001600160a01b0316637a66e596338787876040518563ffffffff1660e01b815260040161073b9493929190610ffb565b5f604051808303815f87803b158015610752575f80fd5b505af1158015610764573d5f803e3d5ffd5b505050505050505050565b30604051632abb908560e11b81523360048201526001600160a01b039190911690635577210a906024015f6040518083038186803b1580156107af575f80fd5b505afa1580156107c1573d5f803e3d5ffd5b5050505081156107da5760016107d884868361108d565b505b801561081a577f8bcd33bdc33e3bcc8a7478b67302b3905987363bfc8d2f03d061a482d858795f8484604051610811929190611148565b60405180910390a15b50505050565b5f8581526020819052604090205460ff1660021415806108575750610855308686866040516020016106af9493929190611163565b155b806108d25750604051631f44bb2560e01b8152600481018690523090631f44bb25906024016020604051808303815f875af1158015610898573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108bc9190610f1a565b6001600160a01b0316336001600160a01b031614155b156108ef576040516282b42960e81b815260040160405180910390fd5b6040516358ee717360e01b815230906358ee71739061073b90889088908890600401610f68565b5f8181526020819052604090205460609060ff1680158061093a57508060ff166003145b1561095f57604051637e27328960e01b81526004810184905260240160405180910390fd5b610b168160ff166002146109925760405180604001604052806007815260200166457373656e636560c81b8152506109b9565b6040518060400160405280600d81526020016c416374757320457373656e646960981b8152505b60405163348051d760e11b8152600481018690523090636900a3ae906024015f60405180830381865afa1580156109f2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610a199190810190611195565b60018460ff16600214610a8d57306001600160a01b0316635c7abcc26040518163ffffffff1660e01b81526004015f60405180830381865afa158015610a61573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610a889190810190611195565b610aed565b60405163f5dbba9d60e01b815260048101889052309063f5dbba9d906024015f60405180830381865afa158015610ac6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610aed9190810190611195565b604051602001610b009493929190611258565b6040516020818303038152906040526001610c41565b604051602001610b2691906113a3565b604051602081830303815290604052915050919050565b365f80375f80365f845af43d5f803e808015610b57573d5ff35b3d5ffd5b505050565b604051633b98c1d160e21b81525f90309081906324d7806c90829063ee63074490610b93908a908a908a90600401610f68565b602060405180830381865afa158015610bae573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd29190610f1a565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015610c14573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c3891906113e7565b95945050505050565b6060610c4e83835f610c55565b9392505050565b606083518015610d32576003600282010460021b60405192507f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f526106708515027f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f18603f52602083018181015b6003880197508751603f8160121c16515f53603f81600c1c1651600153603f8160061c1651600253603f811651600353505f518252600482019150808210610cc557602001604052613d3d60f01b60038406600204808303919091525f8615159091029182900352900382525b509392505050565b5f60208284031215610d4a575f80fd5b5035919050565b5f8083601f840112610d61575f80fd5b50813567ffffffffffffffff811115610d78575f80fd5b602083019150836020828501011115610d8f575f80fd5b9250929050565b5f805f60408486031215610da8575f80fd5b83359250602084013567ffffffffffffffff811115610dc5575f80fd5b610dd186828701610d51565b9497909650939450505050565b5f5b83811015610df8578181015183820152602001610de0565b50505f910152565b602081525f8251806020840152610e1e816040850160208701610dde565b601f01601f19169190910160400192915050565b5f805f805f60608688031215610e46575f80fd5b85359450602086013567ffffffffffffffff80821115610e64575f80fd5b610e7089838a01610d51565b90965094506040880135915080821115610e88575f80fd5b50610e9588828901610d51565b969995985093965092949392505050565b8015158114610eb3575f80fd5b50565b5f805f8060608587031215610ec9575f80fd5b843567ffffffffffffffff811115610edf575f80fd5b610eeb87828801610d51565b9095509350506020850135610eff81610ea6565b91506040850135610f0f81610ea6565b939692955090935050565b5f60208284031215610f2a575f80fd5b81516001600160a01b0381168114610c4e575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b838152604060208201525f610c38604083018486610f40565b600181811c90821680610f9557607f821691505b602082108103610fb357634e487b7160e01b5f52602260045260245ffd5b50919050565b5f6bffffffffffffffffffffffff19808860601b168352808760601b1660148401525084602883015282846048840137505f9101604801908152949350505050565b60018060a01b0385168152836020820152606060408201525f611022606083018486610f40565b9695505050505050565b634e487b7160e01b5f52604160045260245ffd5b601f821115610b5b575f81815260208120601f850160051c810160208610156110665750805b601f850160051c820191505b8181101561108557828155600101611072565b505050505050565b67ffffffffffffffff8311156110a5576110a561102c565b6110b9836110b38354610f81565b83611040565b5f601f8411600181146110ea575f85156110d35750838201355b5f19600387901b1c1916600186901b178355610377565b5f83815260209020601f19861690835b8281101561111a57868501358255602094850194600190920191016110fa565b5086821015611136575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b602081525f61115b602083018486610f40565b949350505050565b6bffffffffffffffffffffffff198560601b168152836014820152818360348301375f91016034019081529392505050565b5f602082840312156111a5575f80fd5b815167ffffffffffffffff808211156111bc575f80fd5b818401915084601f8301126111cf575f80fd5b8151818111156111e1576111e161102c565b604051601f8201601f19908116603f011681019083821181831017156112095761120961102c565b81604052828152876020848701011115611221575f80fd5b611232836020830160208801610dde565b979650505050505050565b5f815161124e818560208601610dde565b9290920192915050565b683d913730b6b2911d1160b91b815284515f90602061127d8260098601838b01610dde565b61202360f01b600992850192830152865161129e81600b8501848b01610dde565b61088b60f21b600b93909101928301527f22637265617465645f6279223a22307847222c226465736372697074696f6e22600d830152611d1160f11b602d8301528554602f905f906112ef81610f81565b6001828116801561130757600181146113205761134d565b60ff19841688870152821515830288018601945061134d565b8b5f52865f205f5b848110156113435781548a8201890152908301908801611328565b5050858389010194505b5050505061139561138761138161136c8461088b60f21b815260020190565b681134b6b0b3b2911d1160b91b815260090190565b8961123d565b61227d60f01b815260020190565b9a9950505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081525f82516113da81601d850160208701610dde565b91909101601d0192915050565b5f602082840312156113f7575f80fd5b8151610c4e81610ea656fe646174613a696d6167652f7376672b786d6c3b6261736536342c50484e325a79423462577875637a30696148523063446f764c336433647935334d793576636d63764d6a41774d43397a646d636949484e306557786c50534a6959574e725a334a766457356b4f694e6d4e5759315a6a556949485a705a58644362336739496a41674d4341784d444177494445774d444169506a786b5a575a7a506a786d615778305a58496761575139496d4569506a786d5a565231636d4a316247567559325567596d467a5a555a795a5846315a57356a655430694d4334774d44417849444569494735316255396a644746325a584d39496a4d6949484e6c5a575139496a63774d534976506a786d5a553176636e426f623278765a336b676233426c636d463062334939496d5270624746305a534967636d466b6158567a505349304c6a55694c7a34385a6d564561584e776247466a5a57316c626e524e5958416761573439496c4e7664584a6a5a5564795958426f61574d6949484e6a5957786c505349784e5441774969423451326868626d356c62464e6c6247566a6447397950534a484969423551326868626d356c62464e6c6247566a6447397950534a434969382b5043396d615778305a58492b5043396b5a575a7a506a78795a574e30494864705a48526f505349784d4441774969426f5a576c6e61485139496a45774d44416949475a706247773949694e6d4e5759315a6a55694c7a3438636d566a6443423361575230614430694e5441774969426f5a576c6e61485139496a55774d434967654430694d6a557749694235505349794e54416949475a706247773949694e6c4d4755775a5441694c7a3438636d566a6443423361575230614430694e5441774969426f5a576c6e61485139496a55774d434967654430694d6a557749694235505349794e54416949475a706247773949694e6d4e5759315a6a556949484e30636d39725a543069497a59774e6a41324d434967633352796232746c4c5864705a48526f505349304d4349675a6d6c736447567950534a31636d776f493245704969382b50484a6c5933516764326c6b64476739496a49774d434967614756705a326830505349314d44416949486739496a55344d434967655430694d6a55774969426d6157787350534a756232356c4969427a64484a766132553949694e6d5a6d596949484e30636d39725a53316b59584e6f59584a7959586b39496a496949484e30636d39725a53313361575230614430694e44416949475a706248526c636a306964584a734b434e684b534976506a777663335a6e50673d3da2646970667358221220ce20a4b437f534691af2940889b9d3276ab283feb9f0dc052cb1bf2e4a0cec7c64736f6c63430008150033000000000000000000000000faf29f632d24c018fbb043ea21f1d6c28657108a

Deployed Bytecode

0x60806040526004361061009b575f3560e01c80637284e416116100635780637284e41614610168578063785cc9971461017c5780639745cc3d1461019b5780639e46b6f7146101db578063a506472a146101fa578063c87b56dd146102195761009b565b806302d05d3f146100a557806342966c68146100f557806348b45f2c146101145780635c60da1b146101335780635c7abcc214610147575b6100a3610238565b005b3480156100b0575f80fd5b506100d87f000000000000000000000000e1e01dc3e6527d2fef00164f4e938a39e6628b3981565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610100575f80fd5b506100a361010f366004610d3a565b610273565b34801561011f575f80fd5b506100a361012e366004610d96565b61037e565b34801561013e575f80fd5b506100d8610594565b348015610152575f80fd5b5061015b6105cb565b6040516100ec9190610e00565b348015610173575f80fd5b5061015b6105ee565b348015610187575f80fd5b506100a3610196366004610e32565b61067a565b3480156101a6575f80fd5b506101c96101b5366004610d3a565b5f6020819052908152604090205460ff1681565b60405160ff90911681526020016100ec565b3480156101e6575f80fd5b506100a36101f5366004610eb6565b61076f565b348015610205575f80fd5b506100a3610214366004610e32565b610820565b348015610224575f80fd5b5061015b610233366004610d3a565b610916565b61027161026c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b610b3d565b565b604051631f44bb2560e01b8152600481018290523090631f44bb25906024016020604051808303815f875af11580156102ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102d29190610f1a565b6001600160a01b0316336001600160a01b031614610302576040516282b42960e81b815260040160405180910390fd5b5f818152602081905260409020805460ff191660031790556103213090565b6001600160a01b031663d1a01520826040518263ffffffff1660e01b815260040161034e91815260200190565b5f604051808303815f87803b158015610365575f80fd5b505af1158015610377573d5f803e3d5ffd5b5050505050565b5f8381526020819052604090205460ff16600114158061047257506040805130606081901b6bffffffffffffffffffffffff191660208084019190915260348084018890528451808503909101815260548401948590528051910120633b98c1d160e21b9093529163ee630744916103fd919086908690605801610f68565b602060405180830381865afa158015610418573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061043c9190610f1a565b6001600160a01b03167f000000000000000000000000e1e01dc3e6527d2fef00164f4e938a39e6628b396001600160a01b031614155b806104ed5750604051631f44bb2560e01b8152600481018490523090631f44bb25906024016020604051808303815f875af11580156104b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d79190610f1a565b6001600160a01b0316336001600160a01b031614155b1561050a576040516282b42960e81b815260040160405180910390fd5b5f8381526020819052604090819020805460ff19166002179055517f41fe025400223d5e24141e6cef77fea9466ef25000e864c6799111c5a56eb55d906105549085815260200190565b60405180910390a16040518381527ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79060200160405180910390a1505050565b5f6105c67f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b6060604051806103e001604052806103be81526020016114036103be9139905090565b600180546105fb90610f81565b80601f016020809104026020016040519081016040528092919081815260200182805461062790610f81565b80156106725780601f1061064957610100808354040283529160200191610672565b820191905f5260205f20905b81548152906001019060200180831161065557829003601f168201915b505050505081565b5f8581526020819052604090205460ff161515806106ce57506106cc33308787876040516020016106af959493929190610fb9565b604051602081830303815290604052805190602001208383610b60565b155b156106eb576040516282b42960e81b815260040160405180910390fd5b5f858152602081905260409020805460ff1916600117905561070a3090565b6001600160a01b0316637a66e596338787876040518563ffffffff1660e01b815260040161073b9493929190610ffb565b5f604051808303815f87803b158015610752575f80fd5b505af1158015610764573d5f803e3d5ffd5b505050505050505050565b30604051632abb908560e11b81523360048201526001600160a01b039190911690635577210a906024015f6040518083038186803b1580156107af575f80fd5b505afa1580156107c1573d5f803e3d5ffd5b5050505081156107da5760016107d884868361108d565b505b801561081a577f8bcd33bdc33e3bcc8a7478b67302b3905987363bfc8d2f03d061a482d858795f8484604051610811929190611148565b60405180910390a15b50505050565b5f8581526020819052604090205460ff1660021415806108575750610855308686866040516020016106af9493929190611163565b155b806108d25750604051631f44bb2560e01b8152600481018690523090631f44bb25906024016020604051808303815f875af1158015610898573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108bc9190610f1a565b6001600160a01b0316336001600160a01b031614155b156108ef576040516282b42960e81b815260040160405180910390fd5b6040516358ee717360e01b815230906358ee71739061073b90889088908890600401610f68565b5f8181526020819052604090205460609060ff1680158061093a57508060ff166003145b1561095f57604051637e27328960e01b81526004810184905260240160405180910390fd5b610b168160ff166002146109925760405180604001604052806007815260200166457373656e636560c81b8152506109b9565b6040518060400160405280600d81526020016c416374757320457373656e646960981b8152505b60405163348051d760e11b8152600481018690523090636900a3ae906024015f60405180830381865afa1580156109f2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610a199190810190611195565b60018460ff16600214610a8d57306001600160a01b0316635c7abcc26040518163ffffffff1660e01b81526004015f60405180830381865afa158015610a61573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610a889190810190611195565b610aed565b60405163f5dbba9d60e01b815260048101889052309063f5dbba9d906024015f60405180830381865afa158015610ac6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610aed9190810190611195565b604051602001610b009493929190611258565b6040516020818303038152906040526001610c41565b604051602001610b2691906113a3565b604051602081830303815290604052915050919050565b365f80375f80365f845af43d5f803e808015610b57573d5ff35b3d5ffd5b505050565b604051633b98c1d160e21b81525f90309081906324d7806c90829063ee63074490610b93908a908a908a90600401610f68565b602060405180830381865afa158015610bae573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd29190610f1a565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015610c14573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c3891906113e7565b95945050505050565b6060610c4e83835f610c55565b9392505050565b606083518015610d32576003600282010460021b60405192507f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f526106708515027f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f18603f52602083018181015b6003880197508751603f8160121c16515f53603f81600c1c1651600153603f8160061c1651600253603f811651600353505f518252600482019150808210610cc557602001604052613d3d60f01b60038406600204808303919091525f8615159091029182900352900382525b509392505050565b5f60208284031215610d4a575f80fd5b5035919050565b5f8083601f840112610d61575f80fd5b50813567ffffffffffffffff811115610d78575f80fd5b602083019150836020828501011115610d8f575f80fd5b9250929050565b5f805f60408486031215610da8575f80fd5b83359250602084013567ffffffffffffffff811115610dc5575f80fd5b610dd186828701610d51565b9497909650939450505050565b5f5b83811015610df8578181015183820152602001610de0565b50505f910152565b602081525f8251806020840152610e1e816040850160208701610dde565b601f01601f19169190910160400192915050565b5f805f805f60608688031215610e46575f80fd5b85359450602086013567ffffffffffffffff80821115610e64575f80fd5b610e7089838a01610d51565b90965094506040880135915080821115610e88575f80fd5b50610e9588828901610d51565b969995985093965092949392505050565b8015158114610eb3575f80fd5b50565b5f805f8060608587031215610ec9575f80fd5b843567ffffffffffffffff811115610edf575f80fd5b610eeb87828801610d51565b9095509350506020850135610eff81610ea6565b91506040850135610f0f81610ea6565b939692955090935050565b5f60208284031215610f2a575f80fd5b81516001600160a01b0381168114610c4e575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b838152604060208201525f610c38604083018486610f40565b600181811c90821680610f9557607f821691505b602082108103610fb357634e487b7160e01b5f52602260045260245ffd5b50919050565b5f6bffffffffffffffffffffffff19808860601b168352808760601b1660148401525084602883015282846048840137505f9101604801908152949350505050565b60018060a01b0385168152836020820152606060408201525f611022606083018486610f40565b9695505050505050565b634e487b7160e01b5f52604160045260245ffd5b601f821115610b5b575f81815260208120601f850160051c810160208610156110665750805b601f850160051c820191505b8181101561108557828155600101611072565b505050505050565b67ffffffffffffffff8311156110a5576110a561102c565b6110b9836110b38354610f81565b83611040565b5f601f8411600181146110ea575f85156110d35750838201355b5f19600387901b1c1916600186901b178355610377565b5f83815260209020601f19861690835b8281101561111a57868501358255602094850194600190920191016110fa565b5086821015611136575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b602081525f61115b602083018486610f40565b949350505050565b6bffffffffffffffffffffffff198560601b168152836014820152818360348301375f91016034019081529392505050565b5f602082840312156111a5575f80fd5b815167ffffffffffffffff808211156111bc575f80fd5b818401915084601f8301126111cf575f80fd5b8151818111156111e1576111e161102c565b604051601f8201601f19908116603f011681019083821181831017156112095761120961102c565b81604052828152876020848701011115611221575f80fd5b611232836020830160208801610dde565b979650505050505050565b5f815161124e818560208601610dde565b9290920192915050565b683d913730b6b2911d1160b91b815284515f90602061127d8260098601838b01610dde565b61202360f01b600992850192830152865161129e81600b8501848b01610dde565b61088b60f21b600b93909101928301527f22637265617465645f6279223a22307847222c226465736372697074696f6e22600d830152611d1160f11b602d8301528554602f905f906112ef81610f81565b6001828116801561130757600181146113205761134d565b60ff19841688870152821515830288018601945061134d565b8b5f52865f205f5b848110156113435781548a8201890152908301908801611328565b5050858389010194505b5050505061139561138761138161136c8461088b60f21b815260020190565b681134b6b0b3b2911d1160b91b815260090190565b8961123d565b61227d60f01b815260020190565b9a9950505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081525f82516113da81601d850160208701610dde565b91909101601d0192915050565b5f602082840312156113f7575f80fd5b8151610c4e81610ea656fe646174613a696d6167652f7376672b786d6c3b6261736536342c50484e325a79423462577875637a30696148523063446f764c336433647935334d793576636d63764d6a41774d43397a646d636949484e306557786c50534a6959574e725a334a766457356b4f694e6d4e5759315a6a556949485a705a58644362336739496a41674d4341784d444177494445774d444169506a786b5a575a7a506a786d615778305a58496761575139496d4569506a786d5a565231636d4a316247567559325567596d467a5a555a795a5846315a57356a655430694d4334774d44417849444569494735316255396a644746325a584d39496a4d6949484e6c5a575139496a63774d534976506a786d5a553176636e426f623278765a336b676233426c636d463062334939496d5270624746305a534967636d466b6158567a505349304c6a55694c7a34385a6d564561584e776247466a5a57316c626e524e5958416761573439496c4e7664584a6a5a5564795958426f61574d6949484e6a5957786c505349784e5441774969423451326868626d356c62464e6c6247566a6447397950534a484969423551326868626d356c62464e6c6247566a6447397950534a434969382b5043396d615778305a58492b5043396b5a575a7a506a78795a574e30494864705a48526f505349784d4441774969426f5a576c6e61485139496a45774d44416949475a706247773949694e6d4e5759315a6a55694c7a3438636d566a6443423361575230614430694e5441774969426f5a576c6e61485139496a55774d434967654430694d6a557749694235505349794e54416949475a706247773949694e6c4d4755775a5441694c7a3438636d566a6443423361575230614430694e5441774969426f5a576c6e61485139496a55774d434967654430694d6a557749694235505349794e54416949475a706247773949694e6d4e5759315a6a556949484e30636d39725a543069497a59774e6a41324d434967633352796232746c4c5864705a48526f505349304d4349675a6d6c736447567950534a31636d776f493245704969382b50484a6c5933516764326c6b64476739496a49774d434967614756705a326830505349314d44416949486739496a55344d434967655430694d6a55774969426d6157787350534a756232356c4969427a64484a766132553949694e6d5a6d596949484e30636d39725a53316b59584e6f59584a7959586b39496a496949484e30636d39725a53313361575230614430694e44416949475a706248526c636a306964584a734b434e684b534976506a777663335a6e50673d3da2646970667358221220ce20a4b437f534691af2940889b9d3276ab283feb9f0dc052cb1bf2e4a0cec7c64736f6c63430008150033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000faf29f632d24c018fbb043ea21f1d6c28657108a

-----Decoded View---------------
Arg [0] : ERC721BaselineImplementation (address): 0xfAf29F632D24c018fBB043EA21f1D6c28657108A

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000faf29f632d24c018fbb043ea21f1d6c28657108a


Deployed Bytecode Sourcemap

1343:6346:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2649:11:0;:9;:11::i;:::-;1343:6346:3;1518:45;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;178:32:7;;;160:51;;148:2;133:18;1518:45:3;;;;;;;;6760:211;;;;;;;;;;-1:-1:-1;6760:211:3;;;;;:::i;:::-;;:::i;3892:449::-;;;;;;;;;;-1:-1:-1;3892:449:3;;;;;:::i;:::-;;:::i;1801:93:4:-;;;;;;;;;;;;;:::i;2455:1035:3:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;1891:25::-;;;;;;;;;;;;;:::i;6168:472::-;;;;;;;;;;-1:-1:-1;6168:472:3;;;;;:::i;:::-;;:::i;1779:57::-;;;;;;;;;;-1:-1:-1;1779:57:3;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;2860:4:7;2848:17;;;2830:36;;2818:2;2803:18;1779:57:3;2688:184:7;7249:235:3;;;;;;;;;;-1:-1:-1;7249:235:3;;;;;:::i;:::-;;:::i;5474:417::-;;;;;;;;;;-1:-1:-1;5474:417:3;;;;;:::i;:::-;;:::i;4487:602::-;;;;;;;;;;-1:-1:-1;4487:602:3;;;;;:::i;:::-;;:::i;2323:83:0:-;2371:28;2381:17;1734:20:4;1772;-1:-1:-1;;;;;1772:20:4;;1573:224;2381:17:0;2371:9;:28::i;:::-;2323:83::o;6760:211:3:-;6831:29;;-1:-1:-1;;;6831:29:3;;;;;3825:25:7;;;2086:4:4;;6831:20:3;;3798:18:7;;6831:29:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;6817:43:3;:10;-1:-1:-1;;;;;6817:43:3;;6806:98;;6874:30;;-1:-1:-1;;;6874:30:3;;;;;;;;;;;6806:98;6911:10;:19;;;;;;;;;;:23;;-1:-1:-1;;6911:23:3;6933:1;6911:23;;;6940:10;2086:4:4;;1989:108;6940:10:3;-1:-1:-1;;;;;6940:17:3;;6958:7;6940:26;;;;;;;;;;;;;3825:25:7;;3813:2;3798:18;;3679:177;6940:26:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6760:211;:::o;3892:449::-;3983:10;:19;;;;;;;;;;;;;;:24;;;:159;;-1:-1:-1;4074:40:3;;;2086:4:4;4333:2:7;4329:15;;;-1:-1:-1;;4325:53:7;4074:40:3;;;;4313:66:7;;;;4395:12;;;;4388:28;;;4074:40:3;;;;;;;;;;4432:12:7;;;4074:40:3;;;;4064:51;;;;;-1:-1:-1;;;4028:114:3;;;2086:4:4;4028:26:3;;:114;;4064:51;4125:9;;;;4028:114;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;4017:125:3;:7;-1:-1:-1;;;;;4017:125:3;;;3983:159;:212;;;-1:-1:-1;4166:29:3;;-1:-1:-1;;;4166:29:3;;;;;3825:25:7;;;2086:4:4;;4166:20:3;;3798:18:7;;4166:29:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;4152:43:3;:10;-1:-1:-1;;;;;4152:43:3;;;3983:212;3972:267;;;4209:30;;-1:-1:-1;;;4209:30:3;;;;;;;;;;;3972:267;4246:10;:19;;;;;;;;;;;;:23;;-1:-1:-1;;4246:23:3;4268:1;4246:23;;;4281:21;;;;;4257:7;3825:25:7;;3813:2;3798:18;;3679:177;4281:21:3;;;;;;;;4313:23;;3825:25:7;;;4313:23:3;;3813:2:7;3798:18;4313:23:3;;;;;;;3892:449;;;:::o;1801:93:4:-;1850:7;1872:17;1734:20;1772;-1:-1:-1;;;;;1772:20:4;;1573:224;1872:17;1865:24;;1801:93;:::o;2455:1035:3:-;2497:13;2518:967;;;;;;;;;;;;;;;;;;;2455:1035;:::o;1891:25::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6168:472::-;6294:1;6272:19;;;;;;;;;;;;;:23;;;:240;;;6314:198;6388:10;6420:4;6439:7;6460:3;;6358:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6337:148;;;;;;6495:9;;6314:13;:198::i;:::-;6305:207;6272:240;6261:295;;;6526:30;;-1:-1:-1;;;6526:30:3;;;;;;;;;;;6261:295;6563:10;:19;;;;;;;;;;:23;;-1:-1:-1;;6563:23:3;6585:1;6563:23;;;6592:10;2086:4:4;;1989:108;6592:10:3;-1:-1:-1;;;;;6592:17:3;;6610:10;6622:7;6631:3;;6592:43;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6168:472;;;;;:::o;7249:235::-;2086:4:4;7338:35:3;;-1:-1:-1;;;7338:35:3;;7362:10;7338:35;;;160:51:7;-1:-1:-1;;;;;7338:23:3;;;;;;;133:18:7;;7338:35:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7383:5;7379:44;;;7398:11;:18;7412:4;;7398:11;:18;:::i;:::-;;7379:44;7432:9;7428:52;;;7456:17;7468:4;;7456:17;;;;;;;:::i;:::-;;;;;;;;7428:52;7249:235;;;;:::o;5474:417::-;5595:10;:19;;;;;;;;;;;;;5618:1;5595:24;;;:149;;;5638:106;5696:4;5703:7;5712:3;;5671:45;;;;;;;;;;;:::i;5638:106::-;5629:115;5595:149;:202;;;-1:-1:-1;5768:29:3;;-1:-1:-1;;;5768:29:3;;;;;3825:25:7;;;2086:4:4;;5768:20:3;;3798:18:7;;5768:29:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;5754:43:3;:10;-1:-1:-1;;;;;5754:43:3;;;5595:202;5584:257;;;5811:30;;-1:-1:-1;;;5811:30:3;;;;;;;;;;;5584:257;5848:38;;-1:-1:-1;;;5848:38:3;;2086:4:4;;5848:24:3;;:38;;5873:7;;5882:3;;;;5848:38;;;:::i;4487:602::-;4566:11;4580:19;;;;;;;;;;;4545:13;;4580:19;;4609:10;;;:24;;;4623:5;:10;;4632:1;4623:10;4609:24;4605:68;;;4642:31;;-1:-1:-1;;;4642:31:3;;;;;3825:25:7;;;3798:18;;4642:31:3;;;;;;;4605:68;4747:331;4811:5;:10;;4820:1;4811:10;:39;;;;;;;;;;;;;;;-1:-1:-1;;;4811:39:3;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4811:39:3;;;;4857:28;;-1:-1:-1;;;4857:28:3;;;;;3825:25:7;;;2086:4:4;;4857:19:3;;3798:18:7;;4857:28:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4857:28:3;;;;;;;;;;;;:::i;:::-;4939:11;4980:5;:10;;4989:1;4980:10;:60;;5026:4;-1:-1:-1;;;;;5026:12:3;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5026:14:3;;;;;;;;;;;;:::i;:::-;4980:60;;;4993:30;;-1:-1:-1;;;4993:30:3;;;;;3825:25:7;;;2086:4:4;;4993:21:3;;3798:18:7;;4993:30:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4993:30:3;;;;;;;;;;;;:::i;:::-;4770:286;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5066:4;4747:13;:331::i;:::-;4687:397;;;;;;;;:::i;:::-;;;;;;;;;;;;;4680:404;;;4487:602;;;:::o;949:895:0:-;1287:14;1284:1;1281;1268:34;1501:1;1498;1482:14;1479:1;1463:14;1456:5;1443:60;1577:16;1574:1;1571;1556:38;1615:6;1682:66;;;;1797:16;1794:1;1787:27;1682:66;1717:16;1714:1;1707:27;1608:220;;;949:895;:::o;7488:199:3:-;7642:39;;-1:-1:-1;;;7642:39:3;;7571:4;;2086::4;;;;7629:12:3;;2086:4:4;;7642:20:3;;:39;;7663:6;;7671:9;;;;7642:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7629:53;;-1:-1:-1;;;;;;7629:53:3;;;;;;;-1:-1:-1;;;;;178:32:7;;;7629:53:3;;;160:51:7;133:18;;7629:53:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7622:60;7488:199;-1:-1:-1;;;;;7488:199:3:o;3684:178:6:-;3781:20;3826:29;3833:4;3839:8;3849:5;3826:6;:29::i;:::-;3817:38;3684:178;-1:-1:-1;;;3684:178:6:o;722:2557::-;835:20;961:4;955:11;983:10;980:2283;;;1183:1;1179;1167:10;1163:18;1159:26;1156:1;1152:34;1294:4;1288:11;1278:21;;1664:34;1658:4;1651:48;1791:6;1780:8;1773:16;1769:29;1733:34;1729:70;1723:4;1716:84;1906:4;1898:6;1894:17;1948:13;1943:3;1939:23;2038:623;2090:1;2084:4;2080:12;2072:20;;2152:4;2146:11;2292:4;2284:5;2280:2;2276:14;2272:25;2266:32;2263:1;2255:44;2357:4;2349:5;2345:2;2341:14;2337:25;2331:32;2328:1;2320:44;2421:4;2413:5;2410:1;2406:13;2402:24;2396:31;2393:1;2385:43;2477:4;2470:5;2466:16;2460:23;2457:1;2449:35;;2523:4;2517:11;2512:3;2505:24;2567:1;2562:3;2558:11;2551:18;;2628:3;2623;2620:12;2038:623;2610:33;2700:4;2691:14;2685:4;2678:28;-1:-1:-1;;;2845:1:6;2829:18;;2826:1;2822:26;2956:11;;;2949:37;;;;3134:1;3075:17;;3068:25;3064:33;;;3121:11;;;;3114:22;3206:21;;3191:37;;980:2283;;722:2557;;;;;:::o;222:180:7:-;281:6;334:2;322:9;313:7;309:23;305:32;302:52;;;350:1;347;340:12;302:52;-1:-1:-1;373:23:7;;222:180;-1:-1:-1;222:180:7:o;407:347::-;458:8;468:6;522:3;515:4;507:6;503:17;499:27;489:55;;540:1;537;530:12;489:55;-1:-1:-1;563:20:7;;606:18;595:30;;592:50;;;638:1;635;628:12;592:50;675:4;667:6;663:17;651:29;;727:3;720:4;711:6;703;699:19;695:30;692:39;689:59;;;744:1;741;734:12;689:59;407:347;;;;;:::o;759:477::-;838:6;846;854;907:2;895:9;886:7;882:23;878:32;875:52;;;923:1;920;913:12;875:52;959:9;946:23;936:33;;1020:2;1009:9;1005:18;992:32;1047:18;1039:6;1036:30;1033:50;;;1079:1;1076;1069:12;1033:50;1118:58;1168:7;1159:6;1148:9;1144:22;1118:58;:::i;:::-;759:477;;1195:8;;-1:-1:-1;1092:84:7;;-1:-1:-1;;;;759:477:7:o;1241:250::-;1326:1;1336:113;1350:6;1347:1;1344:13;1336:113;;;1426:11;;;1420:18;1407:11;;;1400:39;1372:2;1365:10;1336:113;;;-1:-1:-1;;1483:1:7;1465:16;;1458:27;1241:250::o;1496:396::-;1645:2;1634:9;1627:21;1608:4;1677:6;1671:13;1720:6;1715:2;1704:9;1700:18;1693:34;1736:79;1808:6;1803:2;1792:9;1788:18;1783:2;1775:6;1771:15;1736:79;:::i;:::-;1876:2;1855:15;-1:-1:-1;;1851:29:7;1836:45;;;;1883:2;1832:54;;1496:396;-1:-1:-1;;1496:396:7:o;1897:786::-;1997:6;2005;2013;2021;2029;2082:2;2070:9;2061:7;2057:23;2053:32;2050:52;;;2098:1;2095;2088:12;2050:52;2134:9;2121:23;2111:33;;2195:2;2184:9;2180:18;2167:32;2218:18;2259:2;2251:6;2248:14;2245:34;;;2275:1;2272;2265:12;2245:34;2314:58;2364:7;2355:6;2344:9;2340:22;2314:58;:::i;:::-;2391:8;;-1:-1:-1;2288:84:7;-1:-1:-1;2479:2:7;2464:18;;2451:32;;-1:-1:-1;2495:16:7;;;2492:36;;;2524:1;2521;2514:12;2492:36;;2563:60;2615:7;2604:8;2593:9;2589:24;2563:60;:::i;:::-;1897:786;;;;-1:-1:-1;1897:786:7;;-1:-1:-1;2642:8:7;;2537:86;1897:786;-1:-1:-1;;;1897:786:7:o;2877:118::-;2963:5;2956:13;2949:21;2942:5;2939:32;2929:60;;2985:1;2982;2975:12;2929:60;2877:118;:::o;3000:674::-;3083:6;3091;3099;3107;3160:2;3148:9;3139:7;3135:23;3131:32;3128:52;;;3176:1;3173;3166:12;3128:52;3216:9;3203:23;3249:18;3241:6;3238:30;3235:50;;;3281:1;3278;3271:12;3235:50;3320:58;3370:7;3361:6;3350:9;3346:22;3320:58;:::i;:::-;3397:8;;-1:-1:-1;3294:84:7;-1:-1:-1;;3482:2:7;3467:18;;3454:32;3495:28;3454:32;3495:28;:::i;:::-;3542:5;-1:-1:-1;3599:2:7;3584:18;;3571:32;3612:30;3571:32;3612:30;:::i;:::-;3000:674;;;;-1:-1:-1;3000:674:7;;-1:-1:-1;;3000:674:7:o;3861:290::-;3931:6;3984:2;3972:9;3963:7;3959:23;3955:32;3952:52;;;4000:1;3997;3990:12;3952:52;4026:16;;-1:-1:-1;;;;;4071:31:7;;4061:42;;4051:70;;4117:1;4114;4107:12;4455:266;4543:6;4538:3;4531:19;4595:6;4588:5;4581:4;4576:3;4572:14;4559:43;-1:-1:-1;4647:1:7;4622:16;;;4640:4;4618:27;;;4611:38;;;;4703:2;4682:15;;;-1:-1:-1;;4678:29:7;4669:39;;;4665:50;;4455:266::o;4726:315::-;4911:6;4900:9;4893:25;4954:2;4949;4938:9;4934:18;4927:30;4874:4;4974:61;5031:2;5020:9;5016:18;5008:6;5000;4974:61;:::i;5046:380::-;5125:1;5121:12;;;;5168;;;5189:61;;5243:4;5235:6;5231:17;5221:27;;5189:61;5296:2;5288:6;5285:14;5265:18;5262:38;5259:161;;5342:10;5337:3;5333:20;5330:1;5323:31;5377:4;5374:1;5367:15;5405:4;5402:1;5395:15;5259:161;;5046:380;;;:::o;5431:563::-;5656:3;5688:26;5684:31;5757:2;5748:6;5744:2;5740:15;5736:24;5731:3;5724:37;5812:2;5803:6;5799:2;5795:15;5791:24;5786:2;5781:3;5777:12;5770:46;;5846:6;5841:2;5836:3;5832:12;5825:28;5897:6;5889;5884:2;5879:3;5875:12;5862:42;-1:-1:-1;5968:1:7;5927:16;;5945:2;5923:25;5957:13;;;5923:25;5431:563;-1:-1:-1;;;;5431:563:7:o;5999:414::-;6243:1;6239;6234:3;6230:11;6226:19;6218:6;6214:32;6203:9;6196:51;6283:6;6278:2;6267:9;6263:18;6256:34;6326:2;6321;6310:9;6306:18;6299:30;6177:4;6346:61;6403:2;6392:9;6388:18;6380:6;6372;6346:61;:::i;:::-;6338:69;5999:414;-1:-1:-1;;;;;;5999:414:7:o;6418:127::-;6479:10;6474:3;6470:20;6467:1;6460:31;6510:4;6507:1;6500:15;6534:4;6531:1;6524:15;6676:545;6778:2;6773:3;6770:11;6767:448;;;6814:1;6839:5;6835:2;6828:17;6884:4;6880:2;6870:19;6954:2;6942:10;6938:19;6935:1;6931:27;6925:4;6921:38;6990:4;6978:10;6975:20;6972:47;;;-1:-1:-1;7013:4:7;6972:47;7068:2;7063:3;7059:12;7056:1;7052:20;7046:4;7042:31;7032:41;;7123:82;7141:2;7134:5;7131:13;7123:82;;;7186:17;;;7167:1;7156:13;7123:82;;;7127:3;;;6676:545;;;:::o;7397:1206::-;7521:18;7516:3;7513:27;7510:53;;;7543:18;;:::i;:::-;7572:94;7662:3;7622:38;7654:4;7648:11;7622:38;:::i;:::-;7616:4;7572:94;:::i;:::-;7692:1;7717:2;7712:3;7709:11;7734:1;7729:616;;;;8389:1;8406:3;8403:93;;;-1:-1:-1;8462:19:7;;;8449:33;8403:93;-1:-1:-1;;7354:1:7;7350:11;;;7346:24;7342:29;7332:40;7378:1;7374:11;;;7329:57;8509:78;;7702:895;;7729:616;6623:1;6616:14;;;6660:4;6647:18;;-1:-1:-1;;7765:17:7;;;7866:9;7888:229;7902:7;7899:1;7896:14;7888:229;;;7991:19;;;7978:33;7963:49;;8098:4;8083:20;;;;8051:1;8039:14;;;;7918:12;7888:229;;;7892:3;8145;8136:7;8133:16;8130:159;;;8269:1;8265:6;8259:3;8253;8250:1;8246:11;8242:21;8238:34;8234:39;8221:9;8216:3;8212:19;8199:33;8195:79;8187:6;8180:95;8130:159;;;8332:1;8326:3;8323:1;8319:11;8315:19;8309:4;8302:33;7702:895;;7397:1206;;;:::o;8608:246::-;8767:2;8756:9;8749:21;8730:4;8787:61;8844:2;8833:9;8829:18;8821:6;8813;8787:61;:::i;:::-;8779:69;8608:246;-1:-1:-1;;;;8608:246:7:o;8859:459::-;9111:26;9107:31;9098:6;9094:2;9090:15;9086:53;9081:3;9074:66;9170:6;9165:2;9160:3;9156:12;9149:28;9221:6;9213;9208:2;9203:3;9199:12;9186:42;9056:3;9251:16;;9269:2;9247:25;9281:13;;;9247:25;8859:459;-1:-1:-1;;;8859:459:7:o;9645:897::-;9725:6;9778:2;9766:9;9757:7;9753:23;9749:32;9746:52;;;9794:1;9791;9784:12;9746:52;9827:9;9821:16;9856:18;9897:2;9889:6;9886:14;9883:34;;;9913:1;9910;9903:12;9883:34;9951:6;9940:9;9936:22;9926:32;;9996:7;9989:4;9985:2;9981:13;9977:27;9967:55;;10018:1;10015;10008:12;9967:55;10047:2;10041:9;10069:2;10065;10062:10;10059:36;;;10075:18;;:::i;:::-;10150:2;10144:9;10118:2;10204:13;;-1:-1:-1;;10200:22:7;;;10224:2;10196:31;10192:40;10180:53;;;10248:18;;;10268:22;;;10245:46;10242:72;;;10294:18;;:::i;:::-;10334:10;10330:2;10323:22;10369:2;10361:6;10354:18;10409:7;10404:2;10399;10395;10391:11;10387:20;10384:33;10381:53;;;10430:1;10427;10420:12;10381:53;10443:68;10508:2;10503;10495:6;10491:15;10486:2;10482;10478:11;10443:68;:::i;:::-;10530:6;9645:897;-1:-1:-1;;;;;;;9645:897:7:o;10547:198::-;10589:3;10627:5;10621:12;10642:65;10700:6;10695:3;10688:4;10681:5;10677:16;10642:65;:::i;:::-;10723:16;;;;;10547:198;-1:-1:-1;;10547:198:7:o;11151:2445::-;-1:-1:-1;;;12148:43:7;;12214:13;;12130:3;;12246:4;12259:72;12214:13;12320:1;12311:11;;12294:15;;;12259:72;:::i;:::-;-1:-1:-1;;;12390:1:7;12350:16;;;12382:10;;;12375:24;12424:13;;12446:74;12424:13;12506:2;12498:11;;12481:15;;;12446:74;:::i;:::-;-1:-1:-1;;;12580:2:7;12539:17;;;;12572:11;;;12565:35;12629:66;12624:2;12616:11;;12609:87;-1:-1:-1;;;12720:2:7;12712:11;;12705:35;12808:13;;12759:2;;-1:-1:-1;;12846:36:7;12808:13;12846:36;:::i;:::-;12901:1;12918:18;;;12945:153;;;;13112:1;13107:349;;;;12911:545;;12945:153;-1:-1:-1;;12986:24:7;;12973:11;;;12966:45;13064:16;;13057:24;13043:39;;13035:48;;13031:57;;;-1:-1:-1;12945:153:7;;13107:349;13138:6;13135:1;13128:17;13186:2;13183:1;13173:16;13211:1;13225:175;13239:8;13236:1;13233:15;13225:175;;;13327:14;;13310:10;;;13306:19;;13299:43;13370:16;;;;13256:10;;13225:175;;;13229:3;;13443:2;13432:8;13428:2;13424:17;13420:26;13413:33;;12911:545;;;;;13472:118;13502:87;13528:60;13558:29;13583:3;-1:-1:-1;;;10810:27:7;;10862:1;10853:11;;10750:120;13558:29;-1:-1:-1;;;10940:43:7;;11008:1;10999:11;;10875:141;13528:60;13520:6;13502:87;:::i;:::-;-1:-1:-1;;;11086:27:7;;11138:1;11129:11;;11021:125;13472:118;13465:125;11151:2445;-1:-1:-1;;;;;;;;;;11151:2445:7:o;13601:451::-;13853:31;13848:3;13841:44;13823:3;13914:6;13908:13;13930:75;13998:6;13993:2;13988:3;13984:12;13977:4;13969:6;13965:17;13930:75;:::i;:::-;14025:16;;;;14043:2;14021:25;;13601:451;-1:-1:-1;;13601:451:7:o;14057:245::-;14124:6;14177:2;14165:9;14156:7;14152:23;14148:32;14145:52;;;14193:1;14190;14183:12;14145:52;14225:9;14219:16;14244:28;14266:5;14244:28;:::i

Swarm Source

ipfs://ce20a4b437f534691af2940889b9d3276ab283feb9f0dc052cb1bf2e4a0cec7c
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.