ETH Price: $3,488.48 (+0.78%)
Gas: 5 Gwei

Contract

0xBAE27a895fA6C53d3ec55d8df9A96953867d7FE0
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Mint201539352024-06-23 10:56:5923 days ago1719140219IN
0xBAE27a89...3867d7FE0
0 ETH0.00098414.72614793
Safe Transfer Fr...201327222024-06-20 11:44:5926 days ago1718883899IN
0xBAE27a89...3867d7FE0
0 ETH0.0009267414.26400611
Safe Transfer Fr...201322182024-06-20 10:03:2326 days ago1718877803IN
0xBAE27a89...3867d7FE0
0 ETH0.000520018.0037482
Mint201322102024-06-20 10:01:4726 days ago1718877707IN
0xBAE27a89...3867d7FE0
0 ETH0.0021594210.37123376
Mint201008192024-06-16 0:38:3531 days ago1718498315IN
0xBAE27a89...3867d7FE0
0 ETH0.001053755.06092551
Actus Essendi197476222024-04-27 15:40:4780 days ago1714232447IN
0xBAE27a89...3867d7FE0
0 ETH0.000373458.45883049
Mint197188102024-04-23 14:52:5984 days ago1713883979IN
0xBAE27a89...3867d7FE0
0 ETH0.0053865725.87197562
Mint195575122024-04-01 0:44:59107 days ago1711932299IN
0xBAE27a89...3867d7FE0
0 ETH0.0037238319.48500957
Mint195365542024-03-29 2:01:35110 days ago1711677695IN
0xBAE27a89...3867d7FE0
0 ETH0.0047555824.88362875
Mint195365492024-03-29 2:00:35110 days ago1711677635IN
0xBAE27a89...3867d7FE0
0 ETH0.0050214224.11815289
Mint192826312024-02-22 10:42:47145 days ago1708598567IN
0xBAE27a89...3867d7FE0
0 ETH0.0078895937.89196079
Mint192805972024-02-22 3:51:35146 days ago1708573895IN
0xBAE27a89...3867d7FE0
0 ETH0.0062612930.06986305
Mint192122862024-02-12 13:37:11155 days ago1707745031IN
0xBAE27a89...3867d7FE0
0 ETH0.005287823.46872552
Set Admin192122682024-02-12 13:33:35155 days ago1707744815IN
0xBAE27a89...3867d7FE0
0 ETH0.0011627321.39512713
0x60a06040191476752024-02-03 11:56:47164 days ago1706961407IN
 Create: ActusEssendi
0 ETH0.0208987313.62543648

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

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

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.