ETH Price: $2,550.35 (-0.53%)

Contract

0x15cFbf58B02f62E3083D063Ebe394fAc5BDD674c
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
195613352024-04-01 13:40:23172 days ago1711978823
0x15cFbf58...c5BDD674c
0 ETH
195613352024-04-01 13:40:23172 days ago1711978823
0x15cFbf58...c5BDD674c
0 ETH
195613352024-04-01 13:40:23172 days ago1711978823
0x15cFbf58...c5BDD674c
0x15cFbf58...c5BDD674c
0 ETH
195613352024-04-01 13:40:23172 days ago1711978823
0x15cFbf58...c5BDD674c
0 ETH
195613352024-04-01 13:40:23172 days ago1711978823
0x15cFbf58...c5BDD674c
0x15cFbf58...c5BDD674c
0 ETH
195613352024-04-01 13:40:23172 days ago1711978823
0x15cFbf58...c5BDD674c
0 ETH
195613182024-04-01 13:36:47172 days ago1711978607
0x15cFbf58...c5BDD674c
0 ETH
195613182024-04-01 13:36:47172 days ago1711978607
0x15cFbf58...c5BDD674c
0 ETH
195613182024-04-01 13:36:47172 days ago1711978607
0x15cFbf58...c5BDD674c
0x15cFbf58...c5BDD674c
0 ETH
195613182024-04-01 13:36:47172 days ago1711978607
0x15cFbf58...c5BDD674c
0 ETH
195613182024-04-01 13:36:47172 days ago1711978607
0x15cFbf58...c5BDD674c
0x15cFbf58...c5BDD674c
0 ETH
195613182024-04-01 13:36:47172 days ago1711978607
0x15cFbf58...c5BDD674c
0 ETH
195612192024-04-01 13:16:47172 days ago1711977407
0x15cFbf58...c5BDD674c
0 ETH
195612192024-04-01 13:16:47172 days ago1711977407
0x15cFbf58...c5BDD674c
0 ETH
195612192024-04-01 13:16:47172 days ago1711977407
0x15cFbf58...c5BDD674c
0x15cFbf58...c5BDD674c
0 ETH
195612192024-04-01 13:16:47172 days ago1711977407
0x15cFbf58...c5BDD674c
0 ETH
195612192024-04-01 13:16:47172 days ago1711977407
0x15cFbf58...c5BDD674c
0x15cFbf58...c5BDD674c
0 ETH
195612192024-04-01 13:16:47172 days ago1711977407
0x15cFbf58...c5BDD674c
0 ETH
195609292024-04-01 12:18:47172 days ago1711973927
0x15cFbf58...c5BDD674c
0 ETH
195609292024-04-01 12:18:47172 days ago1711973927
0x15cFbf58...c5BDD674c
0 ETH
195609292024-04-01 12:18:47172 days ago1711973927
0x15cFbf58...c5BDD674c
0x15cFbf58...c5BDD674c
0 ETH
195609292024-04-01 12:18:47172 days ago1711973927
0x15cFbf58...c5BDD674c
0 ETH
195609292024-04-01 12:18:47172 days ago1711973927
0x15cFbf58...c5BDD674c
0x15cFbf58...c5BDD674c
0 ETH
195609292024-04-01 12:18:47172 days ago1711973927
0x15cFbf58...c5BDD674c
0 ETH
195609042024-04-01 12:13:47172 days ago1711973627
0x15cFbf58...c5BDD674c
0 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MarketUtils

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
Yes with 1337000 runs

Other Settings:
shanghai EvmVersion
File 1 of 14 : MarketUtils.sol
/*                                                                               
  ・
   * ★ 
      ・ 。
         ・ ゚☆ 。
      * ★ ゚・。 *  。
            * ☆ 。・゚*.。
         ゚ *.。☆。★ ・
    *  ゚。·*・。 ゚*
     ☆゚・。°*. ゚
  ・ ゚*。・゚★。
  ・ *゚。   *
 ・゚*。★・
 ☆∴。 * 
    * ★   。
                      `                     .-:::::-.`              `-::---...```                   
                     `-:`               .:+ssssoooo++//:.`       .-/+shhhhhhhhhhhhhyyyssooo:        
                    .--::.            .+ossso+/////++/:://-`   .////+shhhhhhhhhhhhhhhhhhhhhy        
                  `-----::.         `/+////+++///+++/:--:/+/-  -////+shhhhhhhhhhhhhhhhhhhhhy        
                 `------:::-`      `//-.``.-/+ooosso+:-.-/oso- -////+shhhhhhhhhhhhhhhhhhhhhy        
                .--------:::-`     :+:.`  .-/osyyyyyyso++syhyo.-////+shhhhhhhhhhhhhhhhhhhhhy        
              `-----------:::-.    +o+:-.-:/oyhhhhhhdhhhhhdddy:-////+shhhhhhhhhhhhhhhhhhhhhy        
             .------------::::--  `oys+/::/+shhhhhhhdddddddddy/-////+shhhhhhhhhhhhhhhhhhhhhy        
            .--------------:::::-` +ys+////+yhhhhhhhddddddddhy:-////+yhhhhhhhhhhhhhhhhhhhhhy        
          `----------------::::::-`.ss+/:::+oyhhhhhhhhhhhhhhho`-////+shhhhhhhhhhhhhhhhhhhhhy        
         .------------------:::::::.-so//::/+osyyyhhhhhhhhhys` -////+shhhhhhhhhhhhhhhhhhhhhy        
       `.-------------------::/:::::..+o+////+oosssyyyyyyys+`  .////+shhhhhhhhhhhhhhhhhhhhhy        
       .--------------------::/:::.`   -+o++++++oooosssss/.     `-//+shhhhhhhhhhhhhhhhhhhhyo        
     .-------   ``````.......--`        `-/+ooooosso+/-`          `./++++///:::--...``hhhhyo            
                                              `````       
   *  
      ・ 。
    ・  ゚☆ 。
      * ★ ゚・。 *  。
            * ☆ 。・゚*.。
         ゚ *.。☆。★ ・
    *  ゚。·*・。 ゚*
     ☆゚・。°*. ゚
  ・ ゚*。・゚★。
  ・ *゚。   *
 ・゚*。★・
 ☆∴。 *
・ 。
*/

// SPDX-License-Identifier: MIT OR Apache-2.0

pragma solidity ^0.8.18;

import "@manifoldxyz/royalty-registry-solidity/contracts/IRoyaltyRegistry.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol";

import "./interfaces/internal/IMarketUtils.sol";
import "./interfaces/standards/royalties/IGetFees.sol";
import "./interfaces/standards/royalties/IGetRoyalties.sol";
import "./interfaces/standards/royalties/IOwnable.sol";
import "./interfaces/standards/royalties/IRoyaltyInfo.sol";
import "./interfaces/standards/royalties/ITokenCreator.sol";

import "./libraries/ArrayLibrary.sol";

import "./mixins/shared/Constants.sol";
import "./mixins/shared/MarketStructs.sol";

error MarketUtils_Royalty_Registry_Is_Not_A_Contract();
error MarketUtils_Feth_Is_Not_A_Contract();

/**
 * @title Foundation Market utils.
 * @author smhutch
 */
contract MarketUtils is IMarketUtils {
  using Address for address;
  using ArrayLibrary for address payable[];
  using ArrayLibrary for uint256[];
  using ERC165Checker for address;

  /// @notice The FETH ERC-20 token used as a fallback when ETH transfers fail.
  address private immutable feth;

  /// @notice The royalty registry contract which defines royalty overrides for some collections.
  IRoyaltyRegistry private immutable royaltyRegistry;

  /**
   * @notice Sets the immutable variables for this contract.
   * @param royaltyRegistryAddress The royalty registry contract address.
   * @param fethAddress The FETH ERC-20 token contract address.
   */
  constructor(address royaltyRegistryAddress, address fethAddress) {
    if (!royaltyRegistryAddress.isContract()) {
      // Not using a 165 check since mainnet and goerli are not using the same versions of the registry.
      revert MarketUtils_Royalty_Registry_Is_Not_A_Contract();
    }

    if (!fethAddress.isContract()) {
      revert MarketUtils_Feth_Is_Not_A_Contract();
    }

    royaltyRegistry = IRoyaltyRegistry(royaltyRegistryAddress);
    feth = fethAddress;
  }

  /**
   * @return fethAddress The address of the FETH ERC-20 token contract.
   */
  function getFethAddress() external view returns (address fethAddress) {
    fethAddress = feth;
  }

  /**
   * @notice Returns the address of the registry allowing for royalty configuration overrides.
   * @dev See https://royaltyregistry.xyz/
   * @return royaltyRegistryAddress The address of the royalty registry contract.
   */
  function getRoyaltyRegistryAddress() external view returns (address royaltyRegistryAddress) {
    royaltyRegistryAddress = address(royaltyRegistry);
  }

  /**
   * @notice Returns the recipients of revenue from a sale and their respective amounts.
   * @param options Details about a marketplace sale.
   * @return protocolFeeAmount The value which should be sent to the protocol's treasury.
   * @return creatorRecipients Addresses representing creators of the NFT to be paid royalties.
   * @return creatorShares The value which should be sent to each creator, in the order defined by `creatorRecipients`.
   * @return sellerRev The value which should be sent to the seller of the NFT.
   * When the NFT is being sold by the creator, this value is 0 and all creator revenue is reflected in `creatorShares`.
   * @return buyReferrerFee The value to be paid to the referrer of the buyer, or 0 if n/a.
   * @return sellerReferrerFee The value to be paid to the referrer of the seller, or 0 if n/a.
   */
  function getTransactionBreakdown(
    MarketTransactionOptions calldata options
  )
    external
    view
    returns (
      uint256 protocolFeeAmount,
      address payable[] memory creatorRecipients,
      uint256[] memory creatorShares,
      uint256 sellerRev,
      uint256 buyReferrerFee,
      uint256 sellerReferrerFee
    )
  {
    // Calculate the maximum protocol fee
    // Note that this value may be reduced, if a referrer is involved in the transaction.
    protocolFeeAmount = options.price * options.marketTakeRateInBasisPoints;
    unchecked {
      // Safe math is not required when dividing by a non-zero constant.
      protocolFeeAmount /= BASIS_POINTS;
    }

    address payable creator;
    try this.internalGetTokenCreator(options.nftContract, options.tokenId) returns (address payable _creator) {
      creator = _creator;
    } catch {
      // Fall through
    }

    try this.internalGetImmutableRoyalties(options.nftContract, options.tokenId) returns (
      address payable[] memory _recipients,
      uint256[] memory _splitPerRecipientInBasisPoints
    ) {
      (creatorRecipients, creatorShares) = (_recipients, _splitPerRecipientInBasisPoints);
    } catch {
      // Fall through
    }

    if (creatorRecipients.length == 0) {
      // Check mutable royalties only if we didn't find results from the immutable API
      try this.internalGetMutableRoyalties(options.nftContract, options.tokenId, creator) returns (
        address payable[] memory _recipients,
        uint256[] memory _splitPerRecipientInBasisPoints
      ) {
        (creatorRecipients, creatorShares) = (_recipients, _splitPerRecipientInBasisPoints);
      } catch {
        // Fall through
      }
    }

    if (creatorRecipients.length != 0 || options.assumePrimarySale) {
      uint256 creatorRev;
      if (options.assumePrimarySale) {
        // All revenue should go to the creator recipients
        unchecked {
          // protocolFeeAmount is always < price.
          creatorRev = options.price - protocolFeeAmount;
        }
        if (creatorRecipients.length == 0) {
          // If no creators were found via the royalty APIs, then set that recipient to the seller's address
          creatorRecipients = new address payable[](1);
          creatorRecipients[0] = options.seller;
          creatorShares = new uint256[](1);
          // The split amount is assumed to be 100% when only 1 recipient is returned
        }
      } else if (
        options.seller == creator || (creatorRecipients.length != 0 && options.seller == creatorRecipients[0])
      ) {
        // When sold by the creator, all revenue is split if applicable.
        unchecked {
          // protocolFeeAmount is always < price.
          creatorRev = options.price - protocolFeeAmount;
        }
      } else {
        // Rounding favors the owner first, then creator, and foundation last.
        unchecked {
          // Safe math is not required when dividing by a non-zero constant.
          creatorRev = options.price / ROYALTY_RATIO;
        }
        sellerRev = options.price - protocolFeeAmount - creatorRev;
      }

      // Cap the max number of recipients supported
      creatorRecipients.capLength(MAX_ROYALTY_RECIPIENTS);
      creatorShares.capLength(MAX_ROYALTY_RECIPIENTS);

      // Calculate the seller referrer fee when some revenue is awarded to the creator
      if (options.sellerReferrerTakeRateInBasisPoints != 0) {
        sellerReferrerFee = options.price * options.sellerReferrerTakeRateInBasisPoints;
        unchecked {
          // Safe math is not required when dividing by a non-zero constant.
          sellerReferrerFee /= BASIS_POINTS;
        }

        // Subtract the seller referrer fee from the seller revenue so we do not double pay.
        if (sellerRev == 0) {
          // If the seller revenue is 0, this is a primary sale where all seller revenue is attributed to the "creator".
          creatorRev -= sellerReferrerFee;
        } else {
          sellerRev -= sellerReferrerFee;
        }
      }

      // Sum the total shares defined
      uint256 totalShares;
      if (creatorRecipients.length > 1) {
        unchecked {
          for (uint256 i = 0; i < creatorRecipients.length; ++i) {
            if (creatorRecipients[i] == options.seller) {
              // If the seller is any of the recipients defined, assume a primary sale
              creatorRev += sellerRev;
              sellerRev = 0;
            }
            if (totalShares != type(uint256).max) {
              if (creatorShares[i] > BASIS_POINTS) {
                // If the numbers are >100% we ignore the fee recipients and pay just the first instead
                totalShares = type(uint256).max;
                // Continue the loop in order to detect a potential primary sale condition
              } else {
                totalShares += creatorShares[i];
              }
            }
          }
        }

        if (totalShares == 0 || totalShares == type(uint256).max) {
          // If no shares were defined or shares were out of bounds, pay only the first recipient
          creatorRecipients.capLength(1);
          creatorShares.capLength(1);
        }
      }

      // Send payouts to each additional recipient if more than 1 was defined
      uint256 totalRoyaltiesDistributed;
      for (uint256 i = 1; i < creatorRecipients.length; ) {
        uint256 royalty = (creatorRev * creatorShares[i]) / totalShares;
        totalRoyaltiesDistributed += royalty;
        creatorShares[i] = royalty;
        unchecked {
          ++i;
        }
      }

      // Send the remainder to the 1st creator, rounding in their favor
      creatorShares[0] = creatorRev - totalRoyaltiesDistributed;
    } else {
      // No royalty recipients found.
      unchecked {
        // protocolFeeAmount is always < price.
        sellerRev = options.price - protocolFeeAmount;
      }

      // Calculate the seller referrer fee when there is no creator royalty
      if (options.sellerReferrerTakeRateInBasisPoints != 0) {
        sellerReferrerFee = (options.price * options.sellerReferrerTakeRateInBasisPoints) / BASIS_POINTS;

        sellerRev -= sellerReferrerFee;
      }
    }

    if (
      options.buyReferrer != address(0) &&
      options.buyReferrer != options.sender &&
      options.buyReferrer != options.seller &&
      options.buyReferrer != creator &&
      options.buyReferrer != feth
    ) {
      unchecked {
        buyReferrerFee = options.price / BUY_REFERRER_RATIO;

        // Deduct the referrer's share from the protocol fee
        // buyReferrerFee is always <= protocolFeeAmount
        protocolFeeAmount -= buyReferrerFee;
      }
    }
  }

  /**
   * @notice **For internal use only.**
   * @dev This function is external to allow using try/catch but is not intended for external use.
   * This checks the token creator.
   */
  function internalGetTokenCreator(
    address nftContract,
    uint256 tokenId
  ) external view returns (address payable creator) {
    creator = ITokenCreator(nftContract).tokenCreator{ gas: READ_ONLY_GAS_LIMIT }(tokenId);
  }

  /**
   * @notice **For internal use only.**
   * @dev This function is external to allow using try/catch but is not intended for external use.
   * If ERC2981 royalties (or getRoyalties) are defined by the NFT contract, allow this standard to define immutable
   * royalties that cannot be later changed via the royalty registry.
   */
  function internalGetImmutableRoyalties(
    address nftContract,
    uint256 tokenId
  ) external view returns (address payable[] memory recipients, uint256[] memory splitPerRecipientInBasisPoints) {
    // 1st priority: ERC-2981
    if (nftContract.supportsERC165InterfaceUnchecked(type(IRoyaltyInfo).interfaceId)) {
      try IRoyaltyInfo(nftContract).royaltyInfo{ gas: READ_ONLY_GAS_LIMIT }(tokenId, BASIS_POINTS) returns (
        address receiver,
        uint256 royaltyAmount
      ) {
        // Manifold contracts return (address(this), 0) when royalties are not defined
        // - so ignore results when the amount is 0
        if (royaltyAmount > 0) {
          recipients = new address payable[](1);
          recipients[0] = payable(receiver);
          splitPerRecipientInBasisPoints = new uint256[](1);
          // The split amount is assumed to be 100% when only 1 recipient is returned
          return (recipients, splitPerRecipientInBasisPoints);
        }
      } catch {
        // Fall through
      }
    }

    // 2nd priority: getRoyalties
    if (nftContract.supportsERC165InterfaceUnchecked(type(IGetRoyalties).interfaceId)) {
      try IGetRoyalties(nftContract).getRoyalties{ gas: READ_ONLY_GAS_LIMIT }(tokenId) returns (
        address payable[] memory _recipients,
        uint256[] memory recipientBasisPoints
      ) {
        if (_recipients.length != 0 && _recipients.length == recipientBasisPoints.length) {
          return (_recipients, recipientBasisPoints);
        }
      } catch {
        // Fall through
      }
    }
  }

  /**
   * @notice **For internal use only.**
   * @dev This function is external to allow using try/catch but is not intended for external use.
   * This checks for royalties defined in the royalty registry or via a non-standard royalty API.
   */
  function internalGetMutableRoyalties(
    address nftContract,
    uint256 tokenId,
    address payable creator
  ) external view returns (address payable[] memory recipients, uint256[] memory splitPerRecipientInBasisPoints) {
    /* Overrides must support ERC-165 when registered, except for overrides defined by the registry owner.
       If that results in an override w/o 165 we may need to upgrade the market to support or ignore that override. */
    // The registry requires overrides are not 0 and contracts when set.
    // If no override is set, the nftContract address is returned.

    try royaltyRegistry.getRoyaltyLookupAddress{ gas: READ_ONLY_GAS_LIMIT }(nftContract) returns (
      address overrideContract
    ) {
      if (overrideContract != nftContract) {
        nftContract = overrideContract;

        // The functions above are repeated here if an override is set.

        // 3rd priority: ERC-2981 override
        if (nftContract.supportsERC165InterfaceUnchecked(type(IRoyaltyInfo).interfaceId)) {
          try IRoyaltyInfo(nftContract).royaltyInfo{ gas: READ_ONLY_GAS_LIMIT }(tokenId, BASIS_POINTS) returns (
            address receiver,
            uint256 royaltyAmount
          ) {
            // Manifold contracts return (address(this), 0) when royalties are not defined
            // - so ignore results when the amount is 0
            if (royaltyAmount != 0) {
              recipients = new address payable[](1);
              recipients[0] = payable(receiver);
              splitPerRecipientInBasisPoints = new uint256[](1);
              // The split amount is assumed to be 100% when only 1 recipient is returned
              return (recipients, splitPerRecipientInBasisPoints);
            }
          } catch {
            // Fall through
          }
        }

        // 4th priority: getRoyalties override
        if (recipients.length == 0 && nftContract.supportsERC165InterfaceUnchecked(type(IGetRoyalties).interfaceId)) {
          try IGetRoyalties(nftContract).getRoyalties{ gas: READ_ONLY_GAS_LIMIT }(tokenId) returns (
            address payable[] memory _recipients,
            uint256[] memory recipientBasisPoints
          ) {
            if (_recipients.length != 0 && _recipients.length == recipientBasisPoints.length) {
              return (_recipients, recipientBasisPoints);
            }
          } catch {
            // Fall through
          }
        }
      }
    } catch {
      // Ignore out of gas errors and continue using the nftContract address
    }

    // 5th priority: getFee* from contract or override
    if (nftContract.supportsERC165InterfaceUnchecked(type(IGetFees).interfaceId)) {
      try IGetFees(nftContract).getFeeRecipients{ gas: READ_ONLY_GAS_LIMIT }(tokenId) returns (
        address payable[] memory _recipients
      ) {
        if (_recipients.length != 0) {
          try IGetFees(nftContract).getFeeBps{ gas: READ_ONLY_GAS_LIMIT }(tokenId) returns (
            uint256[] memory recipientBasisPoints
          ) {
            if (_recipients.length == recipientBasisPoints.length) {
              return (_recipients, recipientBasisPoints);
            }
          } catch {
            // Fall through
          }
        }
      } catch {
        // Fall through
      }
    }

    // 6th priority: tokenCreator w/ or w/o requiring 165 from contract or override
    if (creator != address(0)) {
      // Only pay the tokenCreator if there wasn't another royalty defined
      recipients = new address payable[](1);
      recipients[0] = creator;
      splitPerRecipientInBasisPoints = new uint256[](1);
      // The split amount is assumed to be 100% when only 1 recipient is returned
      return (recipients, splitPerRecipientInBasisPoints);
    }

    // 7th priority: owner from contract or override
    try IOwnable(nftContract).owner{ gas: READ_ONLY_GAS_LIMIT }() returns (address owner) {
      if (owner != address(0)) {
        // Only pay the owner if there wasn't another royalty defined
        recipients = new address payable[](1);
        recipients[0] = payable(owner);
        splitPerRecipientInBasisPoints = new uint256[](1);
        // The split amount is assumed to be 100% when only 1 recipient is returned
        return (recipients, splitPerRecipientInBasisPoints);
      }
    } catch {
      // Fall through
    }

    // If no valid payment address or creator is found, return 0 recipients
  }
}

File 2 of 14 : IRoyaltyRegistry.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/// @author: manifold.xyz

import "@openzeppelin/contracts/utils/introspection/IERC165.sol";

/**
 * @dev Royalty registry interface
 */
interface IRoyaltyRegistry is IERC165 {
    event RoyaltyOverride(address owner, address tokenAddress, address royaltyAddress);

    /**
     * Override the location of where to look up royalty information for a given token contract.
     * Allows for backwards compatibility and implementation of royalty logic for contracts that did not previously support them.
     *
     * @param tokenAddress    - The token address you wish to override
     * @param royaltyAddress  - The royalty override address
     */
    function setRoyaltyLookupAddress(address tokenAddress, address royaltyAddress) external returns (bool);

    /**
     * Returns royalty address location.  Returns the tokenAddress by default, or the override if it exists
     *
     * @param tokenAddress    - The token address you are looking up the royalty for
     */
    function getRoyaltyLookupAddress(address tokenAddress) external view returns (address);

    /**
     * Whether or not the message sender can override the royalty address for the given token address
     *
     * @param tokenAddress    - The token address you are looking up the royalty for
     */
    function overrideAllowed(address tokenAddress) external view returns (bool);
}

File 3 of 14 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     *
     * Furthermore, `isContract` will also return true if the target contract within
     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
     * which only has an effect at the end of a transaction.
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

File 4 of 14 : ERC165Checker.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/introspection/ERC165Checker.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Library used to query support of an interface declared via {IERC165}.
 *
 * Note that these functions return the actual result of the query: they do not
 * `revert` if an interface is not supported. It is up to the caller to decide
 * what to do in these cases.
 */
library ERC165Checker {
    // As per the EIP-165 spec, no interface should ever match 0xffffffff
    bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;

    /**
     * @dev Returns true if `account` supports the {IERC165} interface.
     */
    function supportsERC165(address account) internal view returns (bool) {
        // Any contract that implements ERC165 must explicitly indicate support of
        // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid
        return
            supportsERC165InterfaceUnchecked(account, type(IERC165).interfaceId) &&
            !supportsERC165InterfaceUnchecked(account, _INTERFACE_ID_INVALID);
    }

    /**
     * @dev Returns true if `account` supports the interface defined by
     * `interfaceId`. Support for {IERC165} itself is queried automatically.
     *
     * See {IERC165-supportsInterface}.
     */
    function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {
        // query support of both ERC165 as per the spec and support of _interfaceId
        return supportsERC165(account) && supportsERC165InterfaceUnchecked(account, interfaceId);
    }

    /**
     * @dev Returns a boolean array where each value corresponds to the
     * interfaces passed in and whether they're supported or not. This allows
     * you to batch check interfaces for a contract where your expectation
     * is that some interfaces may not be supported.
     *
     * See {IERC165-supportsInterface}.
     *
     * _Available since v3.4._
     */
    function getSupportedInterfaces(
        address account,
        bytes4[] memory interfaceIds
    ) internal view returns (bool[] memory) {
        // an array of booleans corresponding to interfaceIds and whether they're supported or not
        bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);

        // query support of ERC165 itself
        if (supportsERC165(account)) {
            // query support of each interface in interfaceIds
            for (uint256 i = 0; i < interfaceIds.length; i++) {
                interfaceIdsSupported[i] = supportsERC165InterfaceUnchecked(account, interfaceIds[i]);
            }
        }

        return interfaceIdsSupported;
    }

    /**
     * @dev Returns true if `account` supports all the interfaces defined in
     * `interfaceIds`. Support for {IERC165} itself is queried automatically.
     *
     * Batch-querying can lead to gas savings by skipping repeated checks for
     * {IERC165} support.
     *
     * See {IERC165-supportsInterface}.
     */
    function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {
        // query support of ERC165 itself
        if (!supportsERC165(account)) {
            return false;
        }

        // query support of each interface in interfaceIds
        for (uint256 i = 0; i < interfaceIds.length; i++) {
            if (!supportsERC165InterfaceUnchecked(account, interfaceIds[i])) {
                return false;
            }
        }

        // all interfaces supported
        return true;
    }

    /**
     * @notice Query if a contract implements an interface, does not check ERC165 support
     * @param account The address of the contract to query for support of an interface
     * @param interfaceId The interface identifier, as specified in ERC-165
     * @return true if the contract at account indicates support of the interface with
     * identifier interfaceId, false otherwise
     * @dev Assumes that account contains a contract that supports ERC165, otherwise
     * the behavior of this method is undefined. This precondition can be checked
     * with {supportsERC165}.
     *
     * Some precompiled contracts will falsely indicate support for a given interface, so caution
     * should be exercised when using this function.
     *
     * Interface identification is specified in ERC-165.
     */
    function supportsERC165InterfaceUnchecked(address account, bytes4 interfaceId) internal view returns (bool) {
        // prepare call
        bytes memory encodedParams = abi.encodeWithSelector(IERC165.supportsInterface.selector, interfaceId);

        // perform static call
        bool success;
        uint256 returnSize;
        uint256 returnValue;
        assembly {
            success := staticcall(30000, account, add(encodedParams, 0x20), mload(encodedParams), 0x00, 0x20)
            returnSize := returndatasize()
            returnValue := mload(0x00)
        }

        return success && returnSize >= 0x20 && returnValue > 0;
    }
}

File 5 of 14 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 6 of 14 : IMarketUtils.sol
// SPDX-License-Identifier: MIT OR Apache-2.0
pragma solidity ^0.8.18;

import "../../mixins/shared/MarketStructs.sol";

interface IMarketUtils {
  function getTransactionBreakdown(
    MarketTransactionOptions calldata options
  )
    external
    view
    returns (
      uint256 protocolFeeAmount,
      address payable[] memory creatorRecipients,
      uint256[] memory creatorShares,
      uint256 sellerRev,
      uint256 buyReferrerFee,
      uint256 sellerReferrerFee
    );
}

File 7 of 14 : IGetFees.sol
// SPDX-License-Identifier: MIT OR Apache-2.0

pragma solidity ^0.8.18;

/**
 * @notice An interface for communicating fees to 3rd party marketplaces.
 * @dev Originally implemented in mainnet contract 0x44d6e8933f8271abcf253c72f9ed7e0e4c0323b3
 */
interface IGetFees {
  /**
   * @notice Get the recipient addresses to which creator royalties should be sent.
   * @dev The expected royalty amounts are communicated with `getFeeBps`.
   * @param tokenId The ID of the NFT to get royalties for.
   * @return recipients An array of addresses to which royalties should be sent.
   */
  function getFeeRecipients(uint256 tokenId) external view returns (address payable[] memory recipients);

  /**
   * @notice Get the creator royalty amounts to be sent to each recipient, in basis points.
   * @dev The expected recipients are communicated with `getFeeRecipients`.
   * @param tokenId The ID of the NFT to get royalties for.
   * @return royaltiesInBasisPoints The array of fees to be sent to each recipient, in basis points.
   */
  function getFeeBps(uint256 tokenId) external view returns (uint256[] memory royaltiesInBasisPoints);
}

File 8 of 14 : IGetRoyalties.sol
// SPDX-License-Identifier: MIT OR Apache-2.0

pragma solidity ^0.8.18;

interface IGetRoyalties {
  /**
   * @notice Get the creator royalties to be sent.
   * @dev The data is the same as when calling `getFeeRecipients` and `getFeeBps` separately.
   * @param tokenId The ID of the NFT to get royalties for.
   * @return recipients An array of addresses to which royalties should be sent.
   * @return royaltiesInBasisPoints The array of fees to be sent to each recipient, in basis points.
   */
  function getRoyalties(
    uint256 tokenId
  ) external view returns (address payable[] memory recipients, uint256[] memory royaltiesInBasisPoints);
}

File 9 of 14 : IOwnable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.18;

interface IOwnable {
  /**
   * @dev Returns the address of the current owner.
   */
  function owner() external view returns (address);
}

File 10 of 14 : IRoyaltyInfo.sol
// SPDX-License-Identifier: MIT OR Apache-2.0

pragma solidity ^0.8.18;

/**
 * @notice Interface for EIP-2981: NFT Royalty Standard.
 * For more see: https://eips.ethereum.org/EIPS/eip-2981.
 */
interface IRoyaltyInfo {
  /**
   * @notice Get the creator royalties to be sent.
   * @param tokenId The ID of the NFT to get royalties for.
   * @param salePrice The total price of the sale.
   * @return receiver The address to which royalties should be sent.
   * @return royaltyAmount The total amount that should be sent to the `receiver`.
   */
  function royaltyInfo(
    uint256 tokenId,
    uint256 salePrice
  ) external view returns (address receiver, uint256 royaltyAmount);
}

File 11 of 14 : ITokenCreator.sol
// SPDX-License-Identifier: MIT OR Apache-2.0

pragma solidity ^0.8.18;

interface ITokenCreator {
  /**
   * @notice Returns the creator of this NFT collection.
   * @param tokenId The ID of the NFT to get the creator payment address for.
   * @return creator The creator of this collection.
   */
  function tokenCreator(uint256 tokenId) external view returns (address payable creator);
}

File 12 of 14 : ArrayLibrary.sol
// SPDX-License-Identifier: MIT OR Apache-2.0

pragma solidity ^0.8.18;

/**
 * @title Helper functions for arrays.
 * @author batu-inal & HardlyDifficult
 */
library ArrayLibrary {
  /**
   * @notice Reduces the size of an array if it's greater than the specified max size,
   * using the first maxSize elements.
   */
  function capLength(address payable[] memory data, uint256 maxLength) internal pure {
    if (data.length > maxLength) {
      assembly {
        mstore(data, maxLength)
      }
    }
  }

  /**
   * @notice Reduces the size of an array if it's greater than the specified max size,
   * using the first maxSize elements.
   */
  function capLength(uint256[] memory data, uint256 maxLength) internal pure {
    if (data.length > maxLength) {
      assembly {
        mstore(data, maxLength)
      }
    }
  }
}

File 13 of 14 : Constants.sol
// SPDX-License-Identifier: MIT OR Apache-2.0

pragma solidity ^0.8.18;

/// Constant values shared across mixins.

/**
 * @dev 100% in basis points.
 */
uint256 constant BASIS_POINTS = 10_000;

/**
 * @dev The default admin role defined by OZ ACL modules.
 */
bytes32 constant DEFAULT_ADMIN_ROLE = 0x00;

////////////////////////////////////////////////////////////////
// Royalties & Take Rates
////////////////////////////////////////////////////////////////

/**
 * @dev The max take rate a World can have.
 */
uint256 constant MAX_WORLD_TAKE_RATE = 5_000;

/**
 * @dev Cap the number of royalty recipients.
 * A cap is required to ensure gas costs are not too high when a sale is settled.
 */
uint256 constant MAX_ROYALTY_RECIPIENTS = 5;

/**
 * @dev Default royalty cut paid out on secondary sales.
 * Set to 10% of the secondary sale.
 */
uint96 constant ROYALTY_IN_BASIS_POINTS = 1_000;

/**
 * @dev Reward paid to referrers when a sale is made.
 * Set to 1% of the sale amount. This 1% is deducted from the protocol fee.
 */
uint96 constant BUY_REFERRER_IN_BASIS_POINTS = 100;

/**
 * @dev 10%, expressed as a denominator for more efficient calculations.
 */
uint256 constant ROYALTY_RATIO = BASIS_POINTS / ROYALTY_IN_BASIS_POINTS;

/**
 * @dev 1%, expressed as a denominator for more efficient calculations.
 */
uint256 constant BUY_REFERRER_RATIO = BASIS_POINTS / BUY_REFERRER_IN_BASIS_POINTS;

////////////////////////////////////////////////////////////////
// Gas Limits
////////////////////////////////////////////////////////////////

/**
 * @dev The gas limit used when making external read-only calls.
 * This helps to ensure that external calls does not prevent the market from executing.
 */
uint256 constant READ_ONLY_GAS_LIMIT = 40_000;

/**
 * @dev The gas limit to send ETH to multiple recipients, enough for a 5-way split.
 */
uint256 constant SEND_VALUE_GAS_LIMIT_MULTIPLE_RECIPIENTS = 210_000;

/**
 * @dev The gas limit to send ETH to a single recipient, enough for a contract with a simple receiver.
 */
uint256 constant SEND_VALUE_GAS_LIMIT_SINGLE_RECIPIENT = 20_000;

////////////////////////////////////////////////////////////////
// Collection Type Names
////////////////////////////////////////////////////////////////

/**
 * @dev The NFT collection type.
 */
string constant NFT_COLLECTION_TYPE = "NFT Collection";

/**
 * @dev The NFT drop collection type.
 */
string constant NFT_DROP_COLLECTION_TYPE = "NFT Drop Collection";

/**
 * @dev The NFT timed edition collection type.
 */
string constant NFT_TIMED_EDITION_COLLECTION_TYPE = "NFT Timed Edition Collection";

/**
 * @dev The NFT limited edition collection type.
 */
string constant NFT_LIMITED_EDITION_COLLECTION_TYPE = "NFT Limited Edition Collection";

////////////////////////////////////////////////////////////////
// Business Logic
////////////////////////////////////////////////////////////////

/**
 * @dev Limits scheduled start/end times to be less than 2 years in the future.
 */
uint256 constant MAX_SCHEDULED_TIME_IN_THE_FUTURE = 365 days * 2;

/**
 * @dev The minimum increase of 10% required when making an offer or placing a bid.
 */
uint256 constant MIN_PERCENT_INCREMENT_DENOMINATOR = BASIS_POINTS / 1_000;

/**
 * @dev Protocol fee for edition mints in basis points.
 */
uint256 constant EDITION_PROTOCOL_FEE_IN_BASIS_POINTS = 500;

/**
 * @dev Hash of the edition type names.
 * This is precalculated in order to save gas on use.
 * `keccak256(abi.encodePacked(NFT_TIMED_EDITION_COLLECTION_TYPE))`
 */
bytes32 constant timedEditionTypeHash = 0xee2afa3f960e108aca17013728aafa363a0f4485661d9b6f41c6b4ddb55008ee;

bytes32 constant limitedEditionTypeHash = 0x7df1f68d01ab1a6ee0448a4c3fbda832177331ff72c471b12b0051c96742eef5;

File 14 of 14 : MarketStructs.sol
// SPDX-License-Identifier: MIT OR Apache-2.0

pragma solidity ^0.8.18;

/// @notice Details about a marketplace sale.
struct MarketTransactionOptions {
  ////////////////////////////////////////////////////////////////
  // Market config
  ////////////////////////////////////////////////////////////////
  /// @notice Percentage of the transaction to go the the market, expressed in basis points.
  uint256 marketTakeRateInBasisPoints;
  /// @notice set to true when the token is being sold by it's creator
  bool assumePrimarySale;
  ////////////////////////////////////////////////////////////////
  // Sale info
  ////////////////////////////////////////////////////////////////
  /// @notice The contract address of the nft
  address nftContract;
  /// @notice The token id of the nft.
  uint256 tokenId;
  /// @notice price at which the token is being sold
  uint256 price;
  /// @notice address of the account that is selling the token
  address payable seller;
  ////////////////////////////////////////////////////////////////
  // Referrals
  ////////////////////////////////////////////////////////////////
  /// @notice Address of the account that referred the buyer.
  address payable buyReferrer;
  /// @notice Percentage of the transaction to go the the account which referred the seller, expressed in basis points.
  uint16 sellerReferrerTakeRateInBasisPoints;
  ////////////////////////////////////////////////////////////////
  // Transaction info
  ////////////////////////////////////////////////////////////////
  /// @notice The msg.sender which executed the purchase transaction.
  address sender;
}

/// @notice The auction configuration for a specific NFT.
struct ReserveAuction {
  /// @notice The address of the NFT contract.
  address nftContract;
  /// @notice The id of the NFT.
  uint256 tokenId;
  /// @notice The owner of the NFT which listed it in auction.
  address payable seller;
  /// @notice The duration for this auction.
  uint256 duration;
  /// @notice The extension window for this auction.
  uint256 extensionDuration;
  /// @notice The time at which this auction will not accept any new bids.
  /// @dev This is `0` until the first bid is placed.
  uint256 endTime;
  /// @notice The current highest bidder in this auction.
  /// @dev This is `address(0)` until the first bid is placed.
  address payable bidder;
  /// @notice The latest price of the NFT in this auction.
  /// @dev This is set to the reserve price, and then to the highest bid once the auction has started.
  uint256 amount;
}

Settings
{
  "evmVersion": "shanghai",
  "optimizer": {
    "enabled": true,
    "runs": 1337000
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "metadata": {
    "useLiteralContent": true
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"royaltyRegistryAddress","type":"address"},{"internalType":"address","name":"fethAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"MarketUtils_Feth_Is_Not_A_Contract","type":"error"},{"inputs":[],"name":"MarketUtils_Royalty_Registry_Is_Not_A_Contract","type":"error"},{"inputs":[],"name":"getFethAddress","outputs":[{"internalType":"address","name":"fethAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRoyaltyRegistryAddress","outputs":[{"internalType":"address","name":"royaltyRegistryAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"marketTakeRateInBasisPoints","type":"uint256"},{"internalType":"bool","name":"assumePrimarySale","type":"bool"},{"internalType":"address","name":"nftContract","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address payable","name":"seller","type":"address"},{"internalType":"address payable","name":"buyReferrer","type":"address"},{"internalType":"uint16","name":"sellerReferrerTakeRateInBasisPoints","type":"uint16"},{"internalType":"address","name":"sender","type":"address"}],"internalType":"struct MarketTransactionOptions","name":"options","type":"tuple"}],"name":"getTransactionBreakdown","outputs":[{"internalType":"uint256","name":"protocolFeeAmount","type":"uint256"},{"internalType":"address payable[]","name":"creatorRecipients","type":"address[]"},{"internalType":"uint256[]","name":"creatorShares","type":"uint256[]"},{"internalType":"uint256","name":"sellerRev","type":"uint256"},{"internalType":"uint256","name":"buyReferrerFee","type":"uint256"},{"internalType":"uint256","name":"sellerReferrerFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"nftContract","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"internalGetImmutableRoyalties","outputs":[{"internalType":"address payable[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"splitPerRecipientInBasisPoints","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"nftContract","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address payable","name":"creator","type":"address"}],"name":"internalGetMutableRoyalties","outputs":[{"internalType":"address payable[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"splitPerRecipientInBasisPoints","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"nftContract","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"internalGetTokenCreator","outputs":[{"internalType":"address payable","name":"creator","type":"address"}],"stateMutability":"view","type":"function"}]

60c060405234801562000010575f80fd5b5060405162001c2538038062001c258339810160408190526200003391620000b9565b6001600160a01b0382163b6200005c57604051635ce1c91160e11b815260040160405180910390fd5b6001600160a01b0381163b620000855760405163474e692160e11b815260040160405180910390fd5b6001600160a01b0391821660a05216608052620000ef565b80516001600160a01b0381168114620000b4575f80fd5b919050565b5f8060408385031215620000cb575f80fd5b620000d6836200009d565b9150620000e6602084016200009d565b90509250929050565b60805160a051611b076200011e5f395f818160c40152610db301525f818161011e0152610c660152611b075ff3fe608060405234801561000f575f80fd5b506004361061006f575f3560e01c80634c542f771161004d5780634c542f7714610109578063895633ba1461011c578063efef76f814610142575f80fd5b80630d7daf3e146100735780630e13eac11461009d5780632b61ff5b146100c2575b5f80fd5b6100866100813660046115af565b610155565b604051610094929190611658565b60405180910390f35b6100b06100ab366004611685565b6103fa565b6040516100949695949392919061169c565b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610094565b6100e46101173660046115af565b610cce565b7f00000000000000000000000000000000000000000000000000000000000000006100e4565b6100866101503660046116e5565b610d69565b60608061019873ffffffffffffffffffffffffffffffffffffffff85167f2a55205a000000000000000000000000000000000000000000000000000000006114ac565b156102d9576040517f2a55205a00000000000000000000000000000000000000000000000000000000815260048101849052612710602482015273ffffffffffffffffffffffffffffffffffffffff851690632a55205a90619c409060440160408051808303818786fa9350505050801561024e575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261024b91810190611724565b60015b156102d95780156102d657604080516001808252818301909252906020808301908036833701905050935081845f8151811061028c5761028c61177d565b73ffffffffffffffffffffffffffffffffffffffff9290921660209283029190910182015260408051600180825281830190925291828101908036833701905050925050506103f3565b50505b61031973ffffffffffffffffffffffffffffffffffffffff85167fbb3bafd6000000000000000000000000000000000000000000000000000000006114ac565b156103f3576040517fbb3bafd60000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff85169063bb3bafd690619c40906024015f604051808303818786fa935050505080156103cb57506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526103c891908101906118ed565b60015b156103f3578151158015906103e1575080518251145b156103f05790925090506103f3565b50505b9250929050565b5f6060808280806104108735608089013561197a565b612710900495505f30634c542f7761042e60608b0160408c01611991565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260608b01356024820152604401602060405180830381865afa9250505080156104db575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526104d8918101906119ac565b60015b156104e35790505b30630d7daf3e6104f960608b0160408c01611991565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260608b013560248201526044015f60405180830381865afa9250505080156105a957506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526105a691908101906118ed565b60015b156105b45790965094505b85515f03610695573063efef76f86105d260608b0160408c01611991565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff918216600482015260608c0135602482015290841660448201526064015f60405180830381865afa92505050801561068a57506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261068791908101906118ed565b60015b156106955790965094505b85511515806106af57506106af6040890160208a016119c7565b15610ac7575f6106c560408a0160208b016119c7565b156107665787896080013503905086515f0361076157604080516001808252818301909252906020808301908036833701905050965061070b60c08a0160a08b01611991565b875f8151811061071d5761071d61177d565b73ffffffffffffffffffffffffffffffffffffffff929092166020928302919091018201526040805160018082528183019092529182810190803683370190505095505b610849565b73ffffffffffffffffffffffffffffffffffffffff821661078d60c08b0160a08c01611991565b73ffffffffffffffffffffffffffffffffffffffff16148061081057508651158015906108105750865f815181106107c7576107c761177d565b602002602001015173ffffffffffffffffffffffffffffffffffffffff168960a00160208101906107f89190611991565b73ffffffffffffffffffffffffffffffffffffffff16145b1561082357878960800135039050610849565b600a60808a01350490508061083c8960808c01356119e6565b61084691906119e6565b94505b61085487600561157a565b61085f86600561157a565b6108706101008a0160e08b016119f9565b61ffff16156108c95761088a6101008a0160e08b016119f9565b61089c9061ffff1660808b013561197a565b612710900492505f8590036108bc576108b583826119e6565b90506108c9565b6108c683866119e6565b94505b5f600188511115610a23575f5b88518110156109db576108ef60c08c0160a08d01611991565b73ffffffffffffffffffffffffffffffffffffffff168982815181106109175761091761177d565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603610942575f9692909201915b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82146109d35761271088828151811061097e5761097e61177d565b602002602001015111156109b4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff91506109d3565b8781815181106109c6576109c661177d565b6020026020010151820191505b6001016108d6565b50801580610a0857507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81145b15610a2357610a1888600161157a565b610a2387600161157a565b5f60015b8951811015610a96575f838a8381518110610a4457610a4461177d565b602002602001015186610a57919061197a565b610a619190611a1a565b9050610a6d8184611a52565b9250808a8381518110610a8257610a8261177d565b602090810291909101015250600101610a27565b50610aa181846119e6565b885f81518110610ab357610ab361177d565b602002602001018181525050505050610b2a565b60808801358790039350610ae2610100890160e08a016119f9565b61ffff1615610b2a57612710610aff6101008a0160e08b016119f9565b610b119061ffff1660808b013561197a565b610b1b9190611a1a565b9150610b2782856119e6565b93505b5f610b3b60e08a0160c08b01611991565b73ffffffffffffffffffffffffffffffffffffffff1614158015610bab5750610b6c61012089016101008a01611991565b73ffffffffffffffffffffffffffffffffffffffff16610b9260e08a0160c08b01611991565b73ffffffffffffffffffffffffffffffffffffffff1614155b8015610c015750610bc260c0890160a08a01611991565b73ffffffffffffffffffffffffffffffffffffffff16610be860e08a0160c08b01611991565b73ffffffffffffffffffffffffffffffffffffffff1614155b8015610c48575073ffffffffffffffffffffffffffffffffffffffff8116610c2f60e08a0160c08b01611991565b73ffffffffffffffffffffffffffffffffffffffff1614155b8015610caf575073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016610c9660e08a0160c08b01611991565b73ffffffffffffffffffffffffffffffffffffffff1614155b15610cc4576064608089013504925082870396505b5091939550919395565b6040517f40c1a064000000000000000000000000000000000000000000000000000000008152600481018290525f9073ffffffffffffffffffffffffffffffffffffffff8416906340c1a06490619c40906024016020604051808303818786fa158015610d3d573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190610d6291906119ac565b9392505050565b6040517fde5488af00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260609182917f0000000000000000000000000000000000000000000000000000000000000000169063de5488af90619c40906024016020604051808303818786fa93505050508015610e39575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610e36918101906119ac565b60015b1561111e578573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461111c57945084610eb473ffffffffffffffffffffffffffffffffffffffff82167f2a55205a000000000000000000000000000000000000000000000000000000006114ac565b15610ff6576040517f2a55205a00000000000000000000000000000000000000000000000000000000815260048101869052612710602482015273ffffffffffffffffffffffffffffffffffffffff871690632a55205a90619c409060440160408051808303818786fa93505050508015610f6a575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610f6791810190611724565b60015b15610ff6578015610ff357604080516001808252818301909252906020808301908036833701905050945081855f81518110610fa857610fa861177d565b73ffffffffffffffffffffffffffffffffffffffff929092166020928302919091018201526040805160018082528183019092529182810190803683370190505093505050506114a4565b50505b8251158015611040575061104073ffffffffffffffffffffffffffffffffffffffff87167fbb3bafd6000000000000000000000000000000000000000000000000000000006114ac565b1561111c576040517fbb3bafd60000000000000000000000000000000000000000000000000000000081526004810186905273ffffffffffffffffffffffffffffffffffffffff87169063bb3bafd690619c40906024015f604051808303818786fa935050505080156110f257506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526110ef91908101906118ed565b60015b1561111c57815115801590611108575080518251145b156111195790935091506114a49050565b50505b505b61115e73ffffffffffffffffffffffffffffffffffffffff86167fb7799584000000000000000000000000000000000000000000000000000000006114ac565b156112e5576040517fb9c4d9fb0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff86169063b9c4d9fb90619c40906024015f604051808303818786fa9350505050801561121057506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261120d9190810190611a65565b60015b156112e5578051156112e3576040517f0ebd4c7f0000000000000000000000000000000000000000000000000000000081526004810186905273ffffffffffffffffffffffffffffffffffffffff871690630ebd4c7f90619c40906024015f604051808303818786fa935050505080156112c957506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526112c69190810190611a9f565b60015b156112e35780518251036112e15790925090506114a4565b505b505b73ffffffffffffffffffffffffffffffffffffffff83161561137c57604080516001808252818301909252906020808301908036833701905050915082825f815181106113345761133461177d565b73ffffffffffffffffffffffffffffffffffffffff929092166020928302919091018201526040805160018082528183019092529182810190803683370190505090506114a4565b8473ffffffffffffffffffffffffffffffffffffffff16638da5cb5b619c406040518263ffffffff1660e01b81526004016020604051808303818786fa93505050508015611405575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611402918101906119ac565b60015b156114a45773ffffffffffffffffffffffffffffffffffffffff8116156114a257604080516001808252818301909252906020808301908036833701905050925080835f815181106114595761145961177d565b73ffffffffffffffffffffffffffffffffffffffff92909216602092830291909101820152604080516001808252818301909252918281019080368337019050509150506114a4565b505b935093915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a70000000000000000000000000000000000000000000000000000000017815282515f9392849283928392918391908a617530fa92503d91505f519050828015611562575060208210155b801561156d57505f81115b9450505050505b92915050565b8082511115611587578082525b5050565b73ffffffffffffffffffffffffffffffffffffffff811681146115ac575f80fd5b50565b5f80604083850312156115c0575f80fd5b82356115cb8161158b565b946020939093013593505050565b5f815180845260208085019450602084015f5b8381101561161e57815173ffffffffffffffffffffffffffffffffffffffff16875295820195908201906001016115ec565b509495945050505050565b5f815180845260208085019450602084015f5b8381101561161e5781518752958201959082019060010161163c565b604081525f61166a60408301856115d9565b828103602084015261167c8185611629565b95945050505050565b5f6101208284031215611696575f80fd5b50919050565b86815260c060208201525f6116b460c08301886115d9565b82810360408401526116c68188611629565b60608401969096525050608081019290925260a0909101529392505050565b5f805f606084860312156116f7575f80fd5b83356117028161158b565b92506020840135915060408401356117198161158b565b809150509250925092565b5f8060408385031215611735575f80fd5b82516117408161158b565b6020939093015192949293505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156117f1576117f1611750565b604052919050565b5f67ffffffffffffffff82111561181257611812611750565b5060051b60200190565b5f82601f83011261182b575f80fd5b8151602061184061183b836117f9565b6117aa565b8083825260208201915060208460051b870101935086841115611861575f80fd5b602086015b848110156118865780516118798161158b565b8352918301918301611866565b509695505050505050565b5f82601f8301126118a0575f80fd5b815160206118b061183b836117f9565b8083825260208201915060208460051b8701019350868411156118d1575f80fd5b602086015b8481101561188657805183529183019183016118d6565b5f80604083850312156118fe575f80fd5b825167ffffffffffffffff80821115611915575f80fd5b6119218683870161181c565b93506020850151915080821115611936575f80fd5b5061194385828601611891565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820281158282048414176115745761157461194d565b5f602082840312156119a1575f80fd5b8135610d628161158b565b5f602082840312156119bc575f80fd5b8151610d628161158b565b5f602082840312156119d7575f80fd5b81358015158114610d62575f80fd5b818103818111156115745761157461194d565b5f60208284031215611a09575f80fd5b813561ffff81168114610d62575f80fd5b5f82611a4d577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b808201808211156115745761157461194d565b5f60208284031215611a75575f80fd5b815167ffffffffffffffff811115611a8b575f80fd5b611a978482850161181c565b949350505050565b5f60208284031215611aaf575f80fd5b815167ffffffffffffffff811115611ac5575f80fd5b611a978482850161189156fea264697066735822122085afabfc6d13038537b713159ab99aca3643c078a6c3ab454757c00a77241f4c64736f6c63430008170033000000000000000000000000ad2184fb5dbcfc05d8f056542fb25b04fa32a95d00000000000000000000000049128cf8abe9071ee24540a296b5ded3f9d50443

Deployed Bytecode

0x608060405234801561000f575f80fd5b506004361061006f575f3560e01c80634c542f771161004d5780634c542f7714610109578063895633ba1461011c578063efef76f814610142575f80fd5b80630d7daf3e146100735780630e13eac11461009d5780632b61ff5b146100c2575b5f80fd5b6100866100813660046115af565b610155565b604051610094929190611658565b60405180910390f35b6100b06100ab366004611685565b6103fa565b6040516100949695949392919061169c565b7f000000000000000000000000ad2184fb5dbcfc05d8f056542fb25b04fa32a95d5b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610094565b6100e46101173660046115af565b610cce565b7f00000000000000000000000049128cf8abe9071ee24540a296b5ded3f9d504436100e4565b6100866101503660046116e5565b610d69565b60608061019873ffffffffffffffffffffffffffffffffffffffff85167f2a55205a000000000000000000000000000000000000000000000000000000006114ac565b156102d9576040517f2a55205a00000000000000000000000000000000000000000000000000000000815260048101849052612710602482015273ffffffffffffffffffffffffffffffffffffffff851690632a55205a90619c409060440160408051808303818786fa9350505050801561024e575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261024b91810190611724565b60015b156102d95780156102d657604080516001808252818301909252906020808301908036833701905050935081845f8151811061028c5761028c61177d565b73ffffffffffffffffffffffffffffffffffffffff9290921660209283029190910182015260408051600180825281830190925291828101908036833701905050925050506103f3565b50505b61031973ffffffffffffffffffffffffffffffffffffffff85167fbb3bafd6000000000000000000000000000000000000000000000000000000006114ac565b156103f3576040517fbb3bafd60000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff85169063bb3bafd690619c40906024015f604051808303818786fa935050505080156103cb57506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526103c891908101906118ed565b60015b156103f3578151158015906103e1575080518251145b156103f05790925090506103f3565b50505b9250929050565b5f6060808280806104108735608089013561197a565b612710900495505f30634c542f7761042e60608b0160408c01611991565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260608b01356024820152604401602060405180830381865afa9250505080156104db575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526104d8918101906119ac565b60015b156104e35790505b30630d7daf3e6104f960608b0160408c01611991565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260608b013560248201526044015f60405180830381865afa9250505080156105a957506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526105a691908101906118ed565b60015b156105b45790965094505b85515f03610695573063efef76f86105d260608b0160408c01611991565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff918216600482015260608c0135602482015290841660448201526064015f60405180830381865afa92505050801561068a57506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261068791908101906118ed565b60015b156106955790965094505b85511515806106af57506106af6040890160208a016119c7565b15610ac7575f6106c560408a0160208b016119c7565b156107665787896080013503905086515f0361076157604080516001808252818301909252906020808301908036833701905050965061070b60c08a0160a08b01611991565b875f8151811061071d5761071d61177d565b73ffffffffffffffffffffffffffffffffffffffff929092166020928302919091018201526040805160018082528183019092529182810190803683370190505095505b610849565b73ffffffffffffffffffffffffffffffffffffffff821661078d60c08b0160a08c01611991565b73ffffffffffffffffffffffffffffffffffffffff16148061081057508651158015906108105750865f815181106107c7576107c761177d565b602002602001015173ffffffffffffffffffffffffffffffffffffffff168960a00160208101906107f89190611991565b73ffffffffffffffffffffffffffffffffffffffff16145b1561082357878960800135039050610849565b600a60808a01350490508061083c8960808c01356119e6565b61084691906119e6565b94505b61085487600561157a565b61085f86600561157a565b6108706101008a0160e08b016119f9565b61ffff16156108c95761088a6101008a0160e08b016119f9565b61089c9061ffff1660808b013561197a565b612710900492505f8590036108bc576108b583826119e6565b90506108c9565b6108c683866119e6565b94505b5f600188511115610a23575f5b88518110156109db576108ef60c08c0160a08d01611991565b73ffffffffffffffffffffffffffffffffffffffff168982815181106109175761091761177d565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603610942575f9692909201915b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82146109d35761271088828151811061097e5761097e61177d565b602002602001015111156109b4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff91506109d3565b8781815181106109c6576109c661177d565b6020026020010151820191505b6001016108d6565b50801580610a0857507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81145b15610a2357610a1888600161157a565b610a2387600161157a565b5f60015b8951811015610a96575f838a8381518110610a4457610a4461177d565b602002602001015186610a57919061197a565b610a619190611a1a565b9050610a6d8184611a52565b9250808a8381518110610a8257610a8261177d565b602090810291909101015250600101610a27565b50610aa181846119e6565b885f81518110610ab357610ab361177d565b602002602001018181525050505050610b2a565b60808801358790039350610ae2610100890160e08a016119f9565b61ffff1615610b2a57612710610aff6101008a0160e08b016119f9565b610b119061ffff1660808b013561197a565b610b1b9190611a1a565b9150610b2782856119e6565b93505b5f610b3b60e08a0160c08b01611991565b73ffffffffffffffffffffffffffffffffffffffff1614158015610bab5750610b6c61012089016101008a01611991565b73ffffffffffffffffffffffffffffffffffffffff16610b9260e08a0160c08b01611991565b73ffffffffffffffffffffffffffffffffffffffff1614155b8015610c015750610bc260c0890160a08a01611991565b73ffffffffffffffffffffffffffffffffffffffff16610be860e08a0160c08b01611991565b73ffffffffffffffffffffffffffffffffffffffff1614155b8015610c48575073ffffffffffffffffffffffffffffffffffffffff8116610c2f60e08a0160c08b01611991565b73ffffffffffffffffffffffffffffffffffffffff1614155b8015610caf575073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000049128cf8abe9071ee24540a296b5ded3f9d5044316610c9660e08a0160c08b01611991565b73ffffffffffffffffffffffffffffffffffffffff1614155b15610cc4576064608089013504925082870396505b5091939550919395565b6040517f40c1a064000000000000000000000000000000000000000000000000000000008152600481018290525f9073ffffffffffffffffffffffffffffffffffffffff8416906340c1a06490619c40906024016020604051808303818786fa158015610d3d573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190610d6291906119ac565b9392505050565b6040517fde5488af00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260609182917f000000000000000000000000ad2184fb5dbcfc05d8f056542fb25b04fa32a95d169063de5488af90619c40906024016020604051808303818786fa93505050508015610e39575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610e36918101906119ac565b60015b1561111e578573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461111c57945084610eb473ffffffffffffffffffffffffffffffffffffffff82167f2a55205a000000000000000000000000000000000000000000000000000000006114ac565b15610ff6576040517f2a55205a00000000000000000000000000000000000000000000000000000000815260048101869052612710602482015273ffffffffffffffffffffffffffffffffffffffff871690632a55205a90619c409060440160408051808303818786fa93505050508015610f6a575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610f6791810190611724565b60015b15610ff6578015610ff357604080516001808252818301909252906020808301908036833701905050945081855f81518110610fa857610fa861177d565b73ffffffffffffffffffffffffffffffffffffffff929092166020928302919091018201526040805160018082528183019092529182810190803683370190505093505050506114a4565b50505b8251158015611040575061104073ffffffffffffffffffffffffffffffffffffffff87167fbb3bafd6000000000000000000000000000000000000000000000000000000006114ac565b1561111c576040517fbb3bafd60000000000000000000000000000000000000000000000000000000081526004810186905273ffffffffffffffffffffffffffffffffffffffff87169063bb3bafd690619c40906024015f604051808303818786fa935050505080156110f257506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526110ef91908101906118ed565b60015b1561111c57815115801590611108575080518251145b156111195790935091506114a49050565b50505b505b61115e73ffffffffffffffffffffffffffffffffffffffff86167fb7799584000000000000000000000000000000000000000000000000000000006114ac565b156112e5576040517fb9c4d9fb0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff86169063b9c4d9fb90619c40906024015f604051808303818786fa9350505050801561121057506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261120d9190810190611a65565b60015b156112e5578051156112e3576040517f0ebd4c7f0000000000000000000000000000000000000000000000000000000081526004810186905273ffffffffffffffffffffffffffffffffffffffff871690630ebd4c7f90619c40906024015f604051808303818786fa935050505080156112c957506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526112c69190810190611a9f565b60015b156112e35780518251036112e15790925090506114a4565b505b505b73ffffffffffffffffffffffffffffffffffffffff83161561137c57604080516001808252818301909252906020808301908036833701905050915082825f815181106113345761133461177d565b73ffffffffffffffffffffffffffffffffffffffff929092166020928302919091018201526040805160018082528183019092529182810190803683370190505090506114a4565b8473ffffffffffffffffffffffffffffffffffffffff16638da5cb5b619c406040518263ffffffff1660e01b81526004016020604051808303818786fa93505050508015611405575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611402918101906119ac565b60015b156114a45773ffffffffffffffffffffffffffffffffffffffff8116156114a257604080516001808252818301909252906020808301908036833701905050925080835f815181106114595761145961177d565b73ffffffffffffffffffffffffffffffffffffffff92909216602092830291909101820152604080516001808252818301909252918281019080368337019050509150506114a4565b505b935093915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a70000000000000000000000000000000000000000000000000000000017815282515f9392849283928392918391908a617530fa92503d91505f519050828015611562575060208210155b801561156d57505f81115b9450505050505b92915050565b8082511115611587578082525b5050565b73ffffffffffffffffffffffffffffffffffffffff811681146115ac575f80fd5b50565b5f80604083850312156115c0575f80fd5b82356115cb8161158b565b946020939093013593505050565b5f815180845260208085019450602084015f5b8381101561161e57815173ffffffffffffffffffffffffffffffffffffffff16875295820195908201906001016115ec565b509495945050505050565b5f815180845260208085019450602084015f5b8381101561161e5781518752958201959082019060010161163c565b604081525f61166a60408301856115d9565b828103602084015261167c8185611629565b95945050505050565b5f6101208284031215611696575f80fd5b50919050565b86815260c060208201525f6116b460c08301886115d9565b82810360408401526116c68188611629565b60608401969096525050608081019290925260a0909101529392505050565b5f805f606084860312156116f7575f80fd5b83356117028161158b565b92506020840135915060408401356117198161158b565b809150509250925092565b5f8060408385031215611735575f80fd5b82516117408161158b565b6020939093015192949293505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156117f1576117f1611750565b604052919050565b5f67ffffffffffffffff82111561181257611812611750565b5060051b60200190565b5f82601f83011261182b575f80fd5b8151602061184061183b836117f9565b6117aa565b8083825260208201915060208460051b870101935086841115611861575f80fd5b602086015b848110156118865780516118798161158b565b8352918301918301611866565b509695505050505050565b5f82601f8301126118a0575f80fd5b815160206118b061183b836117f9565b8083825260208201915060208460051b8701019350868411156118d1575f80fd5b602086015b8481101561188657805183529183019183016118d6565b5f80604083850312156118fe575f80fd5b825167ffffffffffffffff80821115611915575f80fd5b6119218683870161181c565b93506020850151915080821115611936575f80fd5b5061194385828601611891565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820281158282048414176115745761157461194d565b5f602082840312156119a1575f80fd5b8135610d628161158b565b5f602082840312156119bc575f80fd5b8151610d628161158b565b5f602082840312156119d7575f80fd5b81358015158114610d62575f80fd5b818103818111156115745761157461194d565b5f60208284031215611a09575f80fd5b813561ffff81168114610d62575f80fd5b5f82611a4d577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b808201808211156115745761157461194d565b5f60208284031215611a75575f80fd5b815167ffffffffffffffff811115611a8b575f80fd5b611a978482850161181c565b949350505050565b5f60208284031215611aaf575f80fd5b815167ffffffffffffffff811115611ac5575f80fd5b611a978482850161189156fea264697066735822122085afabfc6d13038537b713159ab99aca3643c078a6c3ab454757c00a77241f4c64736f6c63430008170033

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

000000000000000000000000ad2184fb5dbcfc05d8f056542fb25b04fa32a95d00000000000000000000000049128cf8abe9071ee24540a296b5ded3f9d50443

-----Decoded View---------------
Arg [0] : royaltyRegistryAddress (address): 0xaD2184FB5DBcfC05d8f056542fB25b04fa32A95D
Arg [1] : fethAddress (address): 0x49128CF8ABE9071ee24540a296b5DED3F9D50443

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000ad2184fb5dbcfc05d8f056542fb25b04fa32a95d
Arg [1] : 00000000000000000000000049128cf8abe9071ee24540a296b5ded3f9d50443


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

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.