Contract 0x73a705D49dcF9900005f185A5FAEd9278DB55e78 2

Contract Overview

Balance:
0 Ether

Txn Hash
Method
Block
From
To
Value
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xb2e1b9e7aef95977ef6d16841be1d13bb62da188662710925c24a896fd628644114713922022-09-30 16:27:406 hrs 40 mins ago 0xb1278cbe9da520c4229907515c88e2caa46793c1 0x73a705d49dcf9900005f185a5faed9278db55e780 Ether
0x267603bc3e8d33129e3f10d2c09d37e6a15bd8fe2c8cbe38d07872af46054ac7114713422022-09-30 16:14:576 hrs 53 mins ago 0xd24c4d5c6a462586c1e90c897e1436f3d37db49e 0x73a705d49dcf9900005f185a5faed9278db55e780 Ether
0x384c1f15bd649835e4e2ee5ca0227d80c4f88b09bd28ecdfedf9d00307857a23114712672022-09-30 15:56:037 hrs 11 mins ago 0x1158465a06951a5a2137955401f5a34652953d50 0x73a705d49dcf9900005f185a5faed9278db55e780 Ether
0xf66b1e9800309a2e6e08359ad6cd085b2ec8ad7f9aa301306ff3e89dcc005307114711362022-09-30 15:22:537 hrs 45 mins ago 0xcc7f91563dc53b306d6dadd75673eef05cef8435 0x73a705d49dcf9900005f185a5faed9278db55e780 Ether
0x12b8dd0c9b254221f8bd60535cf523ae28909c0bad84f2de7c6a6868807fe628114711272022-09-30 15:20:347 hrs 47 mins ago 0xdd3ddabcd28c8e79bfe87e6f38de11d2945c6896 0x73a705d49dcf9900005f185a5faed9278db55e780 Ether
0x2ba58a2193e2e6c7d4287915b6848fb07ef217bfb2f8e957ef79b4a9e73f6bb1114711222022-09-30 15:19:197 hrs 48 mins ago 0x1d8cd13c7a875c09afdbbb66e08b39919a3f2c60 0x73a705d49dcf9900005f185a5faed9278db55e780 Ether
0x328ac204af92dcc2c5e85183120a2f104c67a40aad391aa21041b4ba39dd91c7114711182022-09-30 15:18:197 hrs 49 mins ago 0x68c24f7757d779b41cf4f1844a82faa41b62ab56 0x73a705d49dcf9900005f185a5faed9278db55e780 Ether
0xa99ae36d56c3f1313dc09642f8bdc8f2db797a95b1ff0f4618074b2461176d36114711182022-09-30 15:18:197 hrs 49 mins ago 0x38df633c027f088cc130ecfed10c4dffcf4b41c8 0x73a705d49dcf9900005f185a5faed9278db55e780 Ether
0x3bc5c3dad6cc5c7b6572f97c6d2f5478261f7a81561a3127f63538241de1c292114711062022-09-30 15:15:197 hrs 52 mins ago 0x1fd183c6de6733036f796a57fecb44d7406feffe 0x73a705d49dcf9900005f185a5faed9278db55e780 Ether
0xeae998fc0a500da11d20e3586e73b8c258c7ab220161f53b81b447a0656e784c114710992022-09-30 15:13:337 hrs 54 mins ago 0xd4db4706f1222f00471eeacd1b5eb1a845c71b7d 0x73a705d49dcf9900005f185a5faed9278db55e780 Ether
0xdb2af30d89c9b0b46882dbf73f3f94a41f005091acd0266e0c187b8254ec9267114710982022-09-30 15:13:187 hrs 54 mins ago 0x287a3053dd46f113fbac3461210970e8573fe8e1 0x73a705d49dcf9900005f185a5faed9278db55e780 Ether
0x8711b3aed98fa3a01119fa92507fdeaeeb37768af2e72a3d1ef5d6e7339a9b8c114710932022-09-30 15:11:597 hrs 55 mins ago 0x91945a97c2a113bdc89cbc759191ffc10df8e1b7 0x73a705d49dcf9900005f185a5faed9278db55e780 Ether
0x173d22f7a4b403e75bb0a645c80fd8c9abd069dbd02913cb582fbde46e2a2df1114710832022-09-30 15:09:297 hrs 58 mins ago 0xc57c85e75555547b841064dc8c53bdb3cbda1372 0x73a705d49dcf9900005f185a5faed9278db55e780 Ether
0x004ad916f0af1d5b4a8ce003b0221454cecc41ee5277dc4d41f308c03b06597b114710802022-09-30 15:08:447 hrs 59 mins ago 0xb434b62b8c71d6a3b439a4b26ab908320a021a25 0x73a705d49dcf9900005f185a5faed9278db55e780 Ether
0x4eaf596eac450d8bc97057b7c7056e0bdee7d7c391d5dd0d7030442e6167e169114710752022-09-30 15:07:298 hrs ago 0xb20866b037cadde59506503fc8d6c9096a3cd2f6 0x73a705d49dcf9900005f185a5faed9278db55e780 Ether
0x4977329c4697ccbd09a3877cf7f617e79e646fb4e013b388cd3d50a6324757e6114710742022-09-30 15:07:148 hrs ago 0xe4ae07593e738f7293017a1e8b0a973cab349ade 0x73a705d49dcf9900005f185a5faed9278db55e780 Ether
0x8dbe391078d798dd6590c4262173b42be196a1e0b080015f93f5d7acc6f0d2fd114710652022-09-30 15:04:598 hrs 2 mins ago 0x6c79d2bff24cd9237f5f23ff9c52c74cb74e4e27 0x73a705d49dcf9900005f185a5faed9278db55e780 Ether
0x5e8d12b99514ec4206edec9f9106f026e3abacb806cd1ae98d785af0cfda5ba9114710572022-09-30 15:02:598 hrs 4 mins ago 0x665c31cf097fc6295a39ea5ff4b3a515fe464520 0x73a705d49dcf9900005f185a5faed9278db55e780 Ether
0x04466d5c0be6ad6dca05e1ce806cc718a0ebbdfe376a9468a526a6cd4147bc28114710532022-09-30 15:01:598 hrs 5 mins ago 0x9d4ad8ac3592e3ad9bf2eae73febd0c337e4cb4b 0x73a705d49dcf9900005f185a5faed9278db55e780 Ether
0xf4565d92bef3d54fadb5f7e9b98447502f1e4b90169a5bc18f96f3cf7182e99e114710512022-09-30 15:01:298 hrs 6 mins ago 0xa01d8e8b620da9f367306e1f1565341716388476 0x73a705d49dcf9900005f185a5faed9278db55e780 Ether
0x74718ada9d7d3436bccc3afc9861b6a807af5b71ba9b1918e097fcf7e548fe84114710422022-09-30 14:59:138 hrs 8 mins ago 0x46afec2cf3a104c2d02dec28a32a1aab846ac5f9 0x73a705d49dcf9900005f185a5faed9278db55e780 Ether
0x6373a1149939d1d2f1b9157e6a3e351a41c009e2142262e3dc0428a1d593bb97114710402022-09-30 14:58:438 hrs 9 mins ago 0xf08b72328cb8313213a36fd8db101cb981d4536f 0x73a705d49dcf9900005f185a5faed9278db55e780 Ether
0xe8c3a7a77527696cfba9b8ac43a511d9d1c5f151bf7b421bb3c662f2dad2a380114710342022-09-30 14:57:138 hrs 10 mins ago 0xc69afeea345f8387019584a3a75600e19297582d 0x73a705d49dcf9900005f185a5faed9278db55e780 Ether
0xc5d6968165425d6092cc39809a9bc2f9881445d4b76382de51f4ece5c662169d114710332022-09-30 14:56:588 hrs 11 mins ago 0x040d3f806a0f094bb372a9bae0a6c5d06873b04c 0x73a705d49dcf9900005f185a5faed9278db55e780 Ether
0x73f43d3dfb82e27f97ead32bc2c7005793dceb2e8cc08dba9d6857ccb70c73e2114710232022-09-30 14:54:288 hrs 13 mins ago 0xfa160c1d14f0d348c4b44c761a02508ecf9e290f 0x73a705d49dcf9900005f185a5faed9278db55e780 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PA1D

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion
File 1 of 8 : PA1D.sol
// SPDX-License-Identifier: UNLICENSED
/*

  ,,,,,,,,,,,
 [ HOLOGRAPH ]
  '''''''''''
  _____________________________________________________________
 |                                                             |
 |                            / ^ \                            |
 |                            ~~*~~            .               |
 |                         [ '<>:<>' ]         |=>             |
 |               __           _/"\_           _|               |
 |             .:[]:.          """          .:[]:.             |
 |           .'  []  '.        \_/        .'  []  '.           |
 |         .'|   []   |'.               .'|   []   |'.         |
 |       .'  |   []   |  '.           .'  |   []   |  '.       |
 |     .'|   |   []   |   |'.       .'|   |   []   |   |'.     |
 |   .'  |   |   []   |   |  '.   .'  |   |   []   |   |  '.   |
 |.:'|   |   |   []   |   |   |':'|   |   |   []   |   |   |':.|
 |___|___|___|___[]___|___|___|___|___|___|___[]___|___|___|___|
 |XxXxXxXxXxXxXxX[]XxXxXxXxXxXxXxXxXxXxXxXxXxX[]XxXxXxXxXxXxXxX|
 |^^^^^^^^^^^^^^^[]^^^^^^^^^^^^^^^^^^^^^^^^^^^[]^^^^^^^^^^^^^^^|
 |               []                           []               |
 |               []                           []               |
 |    ,          []     ,        ,'      *    []               |
 |~~~~~^~~~~~~~~/##\~~~^~~~~~~~~^^~~~~~~~~^~~/##\~~~~~~~^~~~~~~|
 |_____________________________________________________________|

      - one protocol, one bridge = infinite possibilities -


 ***************************************************************

 DISCLAIMER: U.S Patent Pending

 LICENSE: Holograph Limited Public License (H-LPL)

 https://holograph.xyz/licenses/h-lpl/1.0.0

 This license governs use of the accompanying software. If you
 use the software, you accept this license. If you do not accept
 the license, you are not permitted to use the software.

 1. Definitions

 The terms "reproduce," "reproduction," "derivative works," and
 "distribution" have the same meaning here as under U.S.
 copyright law. A "contribution" is the original software, or
 any additions or changes to the software. A "contributor" is
 any person that distributes its contribution under this
 license. "Licensed patents" are a contributor’s patent claims
 that read directly on its contribution.

 2. Grant of Rights

 A) Copyright Grant- Subject to the terms of this license,
 including the license conditions and limitations in sections 3
 and 4, each contributor grants you a non-exclusive, worldwide,
 royalty-free copyright license to reproduce its contribution,
 prepare derivative works of its contribution, and distribute
 its contribution or any derivative works that you create.
 B) Patent Grant- Subject to the terms of this license,
 including the license conditions and limitations in section 3,
 each contributor grants you a non-exclusive, worldwide,
 royalty-free license under its licensed patents to make, have
 made, use, sell, offer for sale, import, and/or otherwise
 dispose of its contribution in the software or derivative works
 of the contribution in the software.

 3. Conditions and Limitations

 A) No Trademark License- This license does not grant you rights
 to use any contributors’ name, logo, or trademarks.
 B) If you bring a patent claim against any contributor over
 patents that you claim are infringed by the software, your
 patent license from such contributor is terminated with
 immediate effect.
 C) If you distribute any portion of the software, you must
 retain all copyright, patent, trademark, and attribution
 notices that are present in the software.
 D) If you distribute any portion of the software in source code
 form, you may do so only under this license by including a
 complete copy of this license with your distribution. If you
 distribute any portion of the software in compiled or object
 code form, you may only do so under a license that complies
 with this license.
 E) The software is licensed “as-is.” You bear all risks of
 using it. The contributors give no express warranties,
 guarantees, or conditions. You may have additional consumer
 rights under your local laws which this license cannot change.
 To the extent permitted under your local laws, the contributors
 exclude all implied warranties, including those of
 merchantability, fitness for a particular purpose and
 non-infringement.

 4. (F) Platform Limitation- The licenses granted in sections
 2.A & 2.B extend only to the software or derivative works that
 you create that run on a Holograph system product.

 ***************************************************************

*/

pragma solidity 0.8.13;

import "./abstract/Admin.sol";
import "./abstract/Initializable.sol";
import "./abstract/Owner.sol";

import "./library/Zora.sol";

import "./interface/ERC20.sol";
import "./interface/IInitializable.sol";
import "./interface/IPA1D.sol";

/**
 * @title PA1D (CXIP)
 * @author CXIP-Labs
 * @notice A smart contract for providing royalty info, collecting royalties, and distributing it to configured payout wallets.
 * @dev This smart contract is not intended to be used directly. Apply it to any of your ERC721 or ERC1155 smart contracts through a delegatecall fallback.
 */
contract PA1D is Admin, Owner, Initializable {
  /**
   * @notice Event emitted when setting/updating royalty info/fees. This is used by Rarible V1.
   * @dev Emits event in order to comply with Rarible V1 royalty spec.
   * @param tokenId Specific token id for which royalty info is being set, set as 0 for all tokens inside of the smart contract.
   * @param recipients Address array of wallets that will receive tha royalties.
   * @param bps Uint256 array of base points(percentages) that each wallet(specified in recipients) will receive from the royalty payouts. Make sure that all the base points add up to a total of 10000.
   */
  event SecondarySaleFees(uint256 tokenId, address[] recipients, uint256[] bps);

  /**
   * @dev Use this modifier to lock public functions that should not be accesible to non-owners.
   */
  modifier onlyOwner() override {
    require(isOwner(), "PA1D: caller not an owner");
    _;
  }

  /**
   * @notice Constructor is empty and not utilised.
   * @dev Since the smart contract is being used inside of a fallback context, the constructor function is not being used.
   */
  constructor() {}

  function init(bytes memory data) external override returns (bytes4) {
    require(!_isInitialized(), "PA1D: already initialized");
    assembly {
      sstore(0x5705f5753aa4f617eef2cae1dada3d3355e9387b04d19191f09b545e684ca50d, caller())
      sstore(0x89b583059fdb0b2e807359b64eba1a8a1e6d099210701fafe6dad5dd2cd64fb8, caller())
    }
    (address receiver, uint256 bp) = abi.decode(data, (address, uint256));
    setRoyalties(0, payable(receiver), bp);
    _setInitialized();
    return IInitializable.init.selector;
  }

  function initPA1D(bytes memory data) external returns (bytes4) {
    uint256 initialized;
    assembly {
      initialized := sload(0x33a44e907d5bf333e203bebc20bb8c91c00375213b80f466a908f3d50b337c6c)
    }
    require(initialized == 0, "PA1D: already initialized");
    (address receiver, uint256 bp) = abi.decode(data, (address, uint256));
    setRoyalties(0, payable(receiver), bp);
    initialized = 1;
    assembly {
      sstore(0x33a44e907d5bf333e203bebc20bb8c91c00375213b80f466a908f3d50b337c6c, initialized)
    }
    return IInitializable.init.selector;
  }

  /**
   * @notice Check if message sender is a legitimate owner of the smart contract
   * @dev We check owner, admin, and identity for a more comprehensive coverage.
   * @return Returns true is message sender is an owner.
   */
  function isOwner() private view returns (bool) {
    return (msg.sender == getOwner() ||
      msg.sender == getAdmin() ||
      msg.sender == Owner(address(this)).getOwner() ||
      msg.sender == Admin(address(this)).getAdmin());
  }

  /**
   * @dev Gets the default royalty payment receiver address from storage slot.
   * @return receiver Wallet or smart contract that will receive the initial royalty payouts.
   */
  function _getDefaultReceiver() private view returns (address payable receiver) {
    // The slot hash has been precomputed for gas optimizaion
    // bytes32 slot = bytes32(uint256(keccak256('eip1967.Holograph.PA1D.defaultReceiver')) - 1);
    assembly {
      receiver := sload(
        /* slot */
        0xfd430e1c7265cc31dbd9a10ce657e68878a41cfe179c80cd68c5edf961516848
      )
    }
  }

  /**
   * @dev Sets the default royalty payment receiver address to storage slot.
   * @param receiver Wallet or smart contract that will receive the initial royalty payouts.
   */
  function _setDefaultReceiver(address receiver) private {
    // The slot hash has been precomputed for gas optimizaion
    // bytes32 slot = bytes32(uint256(keccak256('eip1967.Holograph.PA1D.defaultReceiver')) - 1);
    assembly {
      sstore(
        /* slot */
        0xfd430e1c7265cc31dbd9a10ce657e68878a41cfe179c80cd68c5edf961516848,
        receiver
      )
    }
  }

  /**
   * @dev Gets the default royalty base points(percentage) from storage slot.
   * @return bp Royalty base points(percentage) for royalty payouts.
   */
  function _getDefaultBp() private view returns (uint256 bp) {
    // The slot hash has been precomputed for gas optimizaion
    // bytes32 slot = bytes32(uint256(keccak256('eip1967.Holograph.PA1D.defaultBp')) - 1);
    assembly {
      bp := sload(
        /* slot */
        0x3ab91e3c2ba71a57537d782545f8feb1d402b604f5e070fa6c3b911fc2f18f75
      )
    }
  }

  /**
   * @dev Sets the default royalty base points(percentage) to storage slot.
   * @param bp Uint256 of royalty percentage, provided in base points format.
   */
  function _setDefaultBp(uint256 bp) private {
    // The slot hash has been precomputed for gas optimizaion
    // bytes32 slot = bytes32(uint256(keccak256('eip1967.Holograph.PA1D.defaultBp')) - 1);
    assembly {
      sstore(
        /* slot */
        0x3ab91e3c2ba71a57537d782545f8feb1d402b604f5e070fa6c3b911fc2f18f75,
        bp
      )
    }
  }

  /**
   * @dev Gets the royalty payment receiver address, for a particular token id, from storage slot.
   * @return receiver Wallet or smart contract that will receive the royalty payouts for a particular token id.
   */
  function _getReceiver(uint256 tokenId) private view returns (address payable receiver) {
    bytes32 slot = bytes32(uint256(keccak256(abi.encodePacked("eip1967.Holograph.PA1D.receiver", tokenId))) - 1);
    assembly {
      receiver := sload(slot)
    }
  }

  /**
   * @dev Sets the royalty payment receiver address, for a particular token id, to storage slot.
   * @param tokenId Uint256 of the token id to set the receiver for.
   * @param receiver Wallet or smart contract that will receive the royalty payouts for a particular token id.
   */
  function _setReceiver(uint256 tokenId, address receiver) private {
    bytes32 slot = bytes32(uint256(keccak256(abi.encodePacked("eip1967.Holograph.PA1D.receiver", tokenId))) - 1);
    assembly {
      sstore(slot, receiver)
    }
  }

  /**
   * @dev Gets the royalty base points(percentage), for a particular token id, from storage slot.
   * @return bp Royalty base points(percentage) for the royalty payouts of a specific token id.
   */
  function _getBp(uint256 tokenId) private view returns (uint256 bp) {
    bytes32 slot = bytes32(uint256(keccak256(abi.encodePacked("eip1967.Holograph.PA1D.bp", tokenId))) - 1);
    assembly {
      bp := sload(slot)
    }
  }

  /**
   * @dev Sets the royalty base points(percentage), for a particular token id, to storage slot.
   * @param tokenId Uint256 of the token id to set the base points for.
   * @param bp Uint256 of royalty percentage, provided in base points format, for a particular token id.
   */
  function _setBp(uint256 tokenId, uint256 bp) private {
    bytes32 slot = bytes32(uint256(keccak256(abi.encodePacked("eip1967.Holograph.PA1D.bp", tokenId))) - 1);
    assembly {
      sstore(slot, bp)
    }
  }

  function _getPayoutAddresses() private view returns (address payable[] memory addresses) {
    // The slot hash has been precomputed for gas optimizaion
    // bytes32 slot = bytes32(uint256(keccak256('eip1967.Holograph.PA1D.payout.addresses')) - 1);
    bytes32 slot = 0x700a541bc37f227b0d36d34e7b77cc0108bde768297c6f80f448f380387371df;
    uint256 length;
    assembly {
      length := sload(slot)
    }
    addresses = new address payable[](length);
    address payable value;
    for (uint256 i = 0; i < length; i++) {
      slot = keccak256(abi.encodePacked(i, slot));
      assembly {
        value := sload(slot)
      }
      addresses[i] = value;
    }
  }

  function _setPayoutAddresses(address payable[] memory addresses) private {
    // The slot hash has been precomputed for gas optimizaion
    // bytes32 slot = bytes32(uint256(keccak256('eip1967.Holograph.PA1D.payout.addresses')) - 1);
    bytes32 slot = 0x700a541bc37f227b0d36d34e7b77cc0108bde768297c6f80f448f380387371df;
    uint256 length = addresses.length;
    assembly {
      sstore(slot, length)
    }
    address payable value;
    for (uint256 i = 0; i < length; i++) {
      slot = keccak256(abi.encodePacked(i, slot));
      value = addresses[i];
      assembly {
        sstore(slot, value)
      }
    }
  }

  function _getPayoutBps() private view returns (uint256[] memory bps) {
    // The slot hash has been precomputed for gas optimizaion
    // bytes32 slot = bytes32(uint256(keccak256('eip1967.Holograph.PA1D.payout.bps')) - 1);
    bytes32 slot = 0x7a62e8104cd2cc2ef6bd3a26bcb71428108fbe0e0ead6a5bfb8676781e2ed28d;
    uint256 length;
    assembly {
      length := sload(slot)
    }
    bps = new uint256[](length);
    uint256 value;
    for (uint256 i = 0; i < length; i++) {
      slot = keccak256(abi.encodePacked(i, slot));
      assembly {
        value := sload(slot)
      }
      bps[i] = value;
    }
  }

  function _setPayoutBps(uint256[] memory bps) private {
    // The slot hash has been precomputed for gas optimizaion
    // bytes32 slot = bytes32(uint256(keccak256('eip1967.Holograph.PA1D.payout.bps')) - 1);
    bytes32 slot = 0x7a62e8104cd2cc2ef6bd3a26bcb71428108fbe0e0ead6a5bfb8676781e2ed28d;
    uint256 length = bps.length;
    assembly {
      sstore(slot, length)
    }
    uint256 value;
    for (uint256 i = 0; i < length; i++) {
      slot = keccak256(abi.encodePacked(i, slot));
      value = bps[i];
      assembly {
        sstore(slot, value)
      }
    }
  }

  function _getTokenAddress(string memory tokenName) private view returns (address tokenAddress) {
    bytes32 slot = bytes32(uint256(keccak256(abi.encodePacked("eip1967.Holograph.PA1D.tokenAddress", tokenName))) - 1);
    assembly {
      tokenAddress := sload(slot)
    }
  }

  function _setTokenAddress(string memory tokenName, address tokenAddress) private {
    bytes32 slot = bytes32(uint256(keccak256(abi.encodePacked("eip1967.Holograph.PA1D.tokenAddress", tokenName))) - 1);
    assembly {
      sstore(slot, tokenAddress)
    }
  }

  /**
   * @dev Internal function that transfers ETH to all payout recipients.
   */
  function _payoutEth() private {
    address payable[] memory addresses = _getPayoutAddresses();
    uint256[] memory bps = _getPayoutBps();
    uint256 length = addresses.length;
    // accommodating the 2300 gas stipend
    // adding 1x for each item in array to accomodate rounding errors
    uint256 gasCost = (23300 * length) + length;
    uint256 balance = address(this).balance;
    require(balance - gasCost > 10000, "PA1D: Not enough ETH to transfer");
    balance = balance - gasCost;
    uint256 sending;
    // uint256 sent;
    for (uint256 i = 0; i < length; i++) {
      sending = ((bps[i] * balance) / 10000);
      addresses[i].transfer(sending);
      // sent = sent + sending;
    }
  }

  /**
   * @dev Internal function that transfers tokens to all payout recipients.
   * @param tokenAddress Smart contract address of ERC20 token.
   */
  function _payoutToken(address tokenAddress) private {
    address payable[] memory addresses = _getPayoutAddresses();
    uint256[] memory bps = _getPayoutBps();
    uint256 length = addresses.length;
    ERC20 erc20 = ERC20(tokenAddress);
    uint256 balance = erc20.balanceOf(address(this));
    require(balance > 10000, "PA1D: Not enough tokens to transfer");
    uint256 sending;
    //uint256 sent;
    for (uint256 i = 0; i < length; i++) {
      sending = ((bps[i] * balance) / 10000);
      require(erc20.transfer(addresses[i], sending), "PA1D: Couldn't transfer token");
      // sent = sent + sending;
    }
  }

  /**
   * @dev Internal function that transfers multiple tokens to all payout recipients.
   * @dev Try to use _payoutToken and handle each token individually.
   * @param tokenAddresses Array of smart contract addresses of ERC20 tokens.
   */
  function _payoutTokens(address[] memory tokenAddresses) private {
    address payable[] memory addresses = _getPayoutAddresses();
    uint256[] memory bps = _getPayoutBps();
    ERC20 erc20;
    uint256 balance;
    uint256 sending;
    for (uint256 t = 0; t < tokenAddresses.length; t++) {
      erc20 = ERC20(tokenAddresses[t]);
      balance = erc20.balanceOf(address(this));
      require(balance > 10000, "PA1D: Not enough tokens to transfer");
      // uint256 sent;
      for (uint256 i = 0; i < addresses.length; i++) {
        sending = ((bps[i] * balance) / 10000);
        require(erc20.transfer(addresses[i], sending), "PA1D: Couldn't transfer token");
        // sent = sent + sending;
      }
    }
  }

  /**
   * @dev This function validates that the call is being made by an authorised wallet.
   * @dev Will revert entire tranaction if it fails.
   */
  function _validatePayoutRequestor() private view {
    if (!isOwner()) {
      bool matched;
      address payable[] memory addresses = _getPayoutAddresses();
      address payable sender = payable(msg.sender);
      for (uint256 i = 0; i < addresses.length; i++) {
        if (addresses[i] == sender) {
          matched = true;
          break;
        }
      }
      require(matched, "PA1D: sender not authorized");
    }
  }

  /**
   * @notice Set the wallets and percentages for royalty payouts.
   * @dev Function can only we called by owner, admin, or identity wallet.
   * @dev Addresses and bps arrays must be equal length. Bps values added together must equal 10000 exactly.
   * @param addresses An array of all the addresses that will be receiving royalty payouts.
   * @param bps An array of the percentages that each address will receive from the royalty payouts.
   */
  function configurePayouts(address payable[] memory addresses, uint256[] memory bps) public onlyOwner {
    require(addresses.length == bps.length, "PA1D: missmatched array lenghts");
    uint256 totalBp;
    for (uint256 i = 0; i < addresses.length; i++) {
      totalBp = totalBp + bps[i];
    }
    require(totalBp == 10000, "PA1D: bps down't equal 10000");
    _setPayoutAddresses(addresses);
    _setPayoutBps(bps);
  }

  /**
   * @notice Show the wallets and percentages of payout recipients.
   * @dev These are the recipients that will be getting royalty payouts.
   * @return addresses An array of all the addresses that will be receiving royalty payouts.
   * @return bps An array of the percentages that each address will receive from the royalty payouts.
   */
  function getPayoutInfo() public view returns (address payable[] memory addresses, uint256[] memory bps) {
    addresses = _getPayoutAddresses();
    bps = _getPayoutBps();
  }

  /**
   * @notice Get payout of all ETH in smart contract.
   * @dev Distribute all the ETH(minus gas fees) to payout recipients.
   */
  function getEthPayout() public {
    _validatePayoutRequestor();
    _payoutEth();
  }

  /**
   * @notice Get payout for a specific token address. Token must have a positive balance!
   * @dev Contract owner, admin, identity wallet, and payout recipients can call this function.
   * @param tokenAddress An address of the token for which to issue payouts for.
   */
  function getTokenPayout(address tokenAddress) public {
    _validatePayoutRequestor();
    _payoutToken(tokenAddress);
  }

  /**
   * @notice Get payouts for tokens listed by address. Tokens must have a positive balance!
   * @dev Each token balance must be equal or greater than 10000. Otherwise calculating BP is difficult.
   * @param tokenAddresses An address array of tokens to issue payouts for.
   */
  function getTokensPayout(address[] memory tokenAddresses) public {
    _validatePayoutRequestor();
    _payoutTokens(tokenAddresses);
  }

  /**
   * @notice Inform about supported interfaces(eip-165).
   * @dev Provides the supported interface ids that this contract implements.
   * @param interfaceId Bytes4 of the interface, derived through bytes4(keccak256('sampleFunction(uin256,address)')).
   * @return True if function is supported/implemented, false if not.
   */
  function supportsInterface(bytes4 interfaceId) public pure returns (bool) {
    if (
      // EIP2981
      // bytes4(keccak256('royaltyInfo(uint256,uint256)')) == 0x2a55205a
      interfaceId == 0x2a55205a ||
      // Rarible V1
      // bytes4(keccak256('getFeeBps(uint256)')) == 0xb7799584
      interfaceId == 0xb7799584 ||
      // Rarible V1
      // bytes4(keccak256('getFeeRecipients(uint256)')) == 0xb9c4d9fb
      interfaceId == 0xb9c4d9fb ||
      // Rarible V2(not being used since it creates a conflict with Manifold royalties)
      // bytes4(keccak256('getRoyalties(uint256)')) == 0xcad96cca
      // interfaceId == 0xcad96cca ||
      // Manifold
      // bytes4(keccak256('getRoyalties(uint256)')) == 0xbb3bafd6
      interfaceId == 0xbb3bafd6 ||
      // Foundation
      // bytes4(keccak256('getFees(uint256)')) == 0xd5a06d4c
      interfaceId == 0xd5a06d4c ||
      // SuperRare
      // bytes4(keccak256('tokenCreator(address,uint256)')) == 0xb85ed7e4
      interfaceId == 0xb85ed7e4 ||
      // SuperRare
      // bytes4(keccak256('calculateRoyaltyFee(address,uint256,uint256)')) == 0x860110f5
      interfaceId == 0x860110f5 ||
      // Zora
      // bytes4(keccak256('marketContract()')) == 0xa1794bcd
      interfaceId == 0xa1794bcd ||
      // Zora
      // bytes4(keccak256('tokenCreators(uint256)')) == 0xe0fd045f
      interfaceId == 0xe0fd045f ||
      // Zora
      // bytes4(keccak256('bidSharesForToken(uint256)')) == 0xf9ce0582
      interfaceId == 0xf9ce0582
    ) {
      return true;
    }
    return false;
  }

  /**
   * @notice Set the royalty information for entire contract, or a specific token.
   * @dev Take great care to not make this function accessible by other public functions in your overlying smart contract.
   * @param tokenId Set a specific token id, or leave at 0 to set as default parameters.
   * @param receiver Wallet or smart contract that will receive the royalty payouts.
   * @param bp Uint256 of royalty percentage, provided in base points format.
   */
  function setRoyalties(
    uint256 tokenId,
    address payable receiver,
    uint256 bp
  ) public onlyOwner {
    if (tokenId == 0) {
      _setDefaultReceiver(receiver);
      _setDefaultBp(bp);
    } else {
      _setReceiver(tokenId, receiver);
      _setBp(tokenId, bp);
    }
    address[] memory receivers = new address[](1);
    receivers[0] = address(receiver);
    uint256[] memory bps = new uint256[](1);
    bps[0] = bp;
    emit SecondarySaleFees(tokenId, receivers, bps);
  }

  // IEIP2981
  function royaltyInfo(uint256 tokenId, uint256 value) public view returns (address, uint256) {
    if (_getReceiver(tokenId) == address(0)) {
      return (_getDefaultReceiver(), (_getDefaultBp() * value) / 10000);
    } else {
      return (_getReceiver(tokenId), (_getBp(tokenId) * value) / 10000);
    }
  }

  // Rarible V1
  function getFeeBps(uint256 tokenId) public view returns (uint256[] memory) {
    uint256[] memory bps = new uint256[](1);
    if (_getReceiver(tokenId) == address(0)) {
      bps[0] = _getDefaultBp();
    } else {
      bps[0] = _getBp(tokenId);
    }
    return bps;
  }

  // Rarible V1
  function getFeeRecipients(uint256 tokenId) public view returns (address payable[] memory) {
    address payable[] memory receivers = new address payable[](1);
    if (_getReceiver(tokenId) == address(0)) {
      receivers[0] = _getDefaultReceiver();
    } else {
      receivers[0] = _getReceiver(tokenId);
    }
    return receivers;
  }

  // Rarible V2(not being used since it creates a conflict with Manifold royalties)
  // struct Part {
  //     address payable account;
  //     uint96 value;
  // }

  // function getRoyalties(uint256 tokenId) public view returns (Part[] memory) {
  //     return royalties[id];
  // }

  // Manifold
  function getRoyalties(uint256 tokenId) public view returns (address payable[] memory, uint256[] memory) {
    address payable[] memory receivers = new address payable[](1);
    uint256[] memory bps = new uint256[](1);
    if (_getReceiver(tokenId) == address(0)) {
      receivers[0] = _getDefaultReceiver();
      bps[0] = _getDefaultBp();
    } else {
      receivers[0] = _getReceiver(tokenId);
      bps[0] = _getBp(tokenId);
    }
    return (receivers, bps);
  }

  // Foundation
  function getFees(uint256 tokenId) public view returns (address payable[] memory, uint256[] memory) {
    address payable[] memory receivers = new address payable[](1);
    uint256[] memory bps = new uint256[](1);
    if (_getReceiver(tokenId) == address(0)) {
      receivers[0] = _getDefaultReceiver();
      bps[0] = _getDefaultBp();
    } else {
      receivers[0] = _getReceiver(tokenId);
      bps[0] = _getBp(tokenId);
    }
    return (receivers, bps);
  }

  // SuperRare
  // Hint taken from Manifold's RoyaltyEngine(https://github.com/manifoldxyz/royalty-registry-solidity/blob/main/contracts/RoyaltyEngineV1.sol)
  // To be quite honest, SuperRare is a closed marketplace. They're working on opening it up but looks like they want to use private smart contracts.
  // We'll just leave this here for just in case they open the flood gates.
  function tokenCreator(
    address,
    /* contractAddress*/
    uint256 tokenId
  ) public view returns (address) {
    address receiver = _getReceiver(tokenId);
    if (receiver == address(0)) {
      return _getDefaultReceiver();
    }
    return receiver;
  }

  // SuperRare
  function calculateRoyaltyFee(
    address,
    /* contractAddress */
    uint256 tokenId,
    uint256 amount
  ) public view returns (uint256) {
    if (_getReceiver(tokenId) == address(0)) {
      return (_getDefaultBp() * amount) / 10000;
    } else {
      return (_getBp(tokenId) * amount) / 10000;
    }
  }

  // Zora
  // we indicate that this contract operates market functions
  function marketContract() public view returns (address) {
    return address(this);
  }

  // Zora
  // we indicate that the receiver is the creator, to convince the smart contract to pay
  function tokenCreators(uint256 tokenId) public view returns (address) {
    address receiver = _getReceiver(tokenId);
    if (receiver == address(0)) {
      return _getDefaultReceiver();
    }
    return receiver;
  }

  // Zora
  // we provide the percentage that needs to be paid out from the sale
  function bidSharesForToken(uint256 tokenId) public view returns (Zora.BidShares memory bidShares) {
    // this information is outside of the scope of our
    bidShares.prevOwner.value = 0;
    bidShares.owner.value = 0;
    if (_getReceiver(tokenId) == address(0)) {
      bidShares.creator.value = _getDefaultBp();
    } else {
      bidShares.creator.value = _getBp(tokenId);
    }
    return bidShares;
  }

  /**
   * @notice Get the smart contract address of a token by common name.
   * @dev Used only to identify really major/common tokens. Avoid using due to gas usages.
   * @param tokenName The ticker symbol of the token. For example "USDC" or "DAI".
   * @return The smart contract address of the token ticker symbol. Or zero address if not found.
   */
  function getTokenAddress(string memory tokenName) public view returns (address) {
    return _getTokenAddress(tokenName);
  }
}

File 2 of 8 : Admin.sol
// SPDX-License-Identifier: UNLICENSED
/*

  ,,,,,,,,,,,
 [ HOLOGRAPH ]
  '''''''''''
  _____________________________________________________________
 |                                                             |
 |                            / ^ \                            |
 |                            ~~*~~            .               |
 |                         [ '<>:<>' ]         |=>             |
 |               __           _/"\_           _|               |
 |             .:[]:.          """          .:[]:.             |
 |           .'  []  '.        \_/        .'  []  '.           |
 |         .'|   []   |'.               .'|   []   |'.         |
 |       .'  |   []   |  '.           .'  |   []   |  '.       |
 |     .'|   |   []   |   |'.       .'|   |   []   |   |'.     |
 |   .'  |   |   []   |   |  '.   .'  |   |   []   |   |  '.   |
 |.:'|   |   |   []   |   |   |':'|   |   |   []   |   |   |':.|
 |___|___|___|___[]___|___|___|___|___|___|___[]___|___|___|___|
 |XxXxXxXxXxXxXxX[]XxXxXxXxXxXxXxXxXxXxXxXxXxX[]XxXxXxXxXxXxXxX|
 |^^^^^^^^^^^^^^^[]^^^^^^^^^^^^^^^^^^^^^^^^^^^[]^^^^^^^^^^^^^^^|
 |               []                           []               |
 |               []                           []               |
 |    ,          []     ,        ,'      *    []               |
 |~~~~~^~~~~~~~~/##\~~~^~~~~~~~~^^~~~~~~~~^~~/##\~~~~~~~^~~~~~~|
 |_____________________________________________________________|

      - one protocol, one bridge = infinite possibilities -


 ***************************************************************

 DISCLAIMER: U.S Patent Pending

 LICENSE: Holograph Limited Public License (H-LPL)

 https://holograph.xyz/licenses/h-lpl/1.0.0

 This license governs use of the accompanying software. If you
 use the software, you accept this license. If you do not accept
 the license, you are not permitted to use the software.

 1. Definitions

 The terms "reproduce," "reproduction," "derivative works," and
 "distribution" have the same meaning here as under U.S.
 copyright law. A "contribution" is the original software, or
 any additions or changes to the software. A "contributor" is
 any person that distributes its contribution under this
 license. "Licensed patents" are a contributor’s patent claims
 that read directly on its contribution.

 2. Grant of Rights

 A) Copyright Grant- Subject to the terms of this license,
 including the license conditions and limitations in sections 3
 and 4, each contributor grants you a non-exclusive, worldwide,
 royalty-free copyright license to reproduce its contribution,
 prepare derivative works of its contribution, and distribute
 its contribution or any derivative works that you create.
 B) Patent Grant- Subject to the terms of this license,
 including the license conditions and limitations in section 3,
 each contributor grants you a non-exclusive, worldwide,
 royalty-free license under its licensed patents to make, have
 made, use, sell, offer for sale, import, and/or otherwise
 dispose of its contribution in the software or derivative works
 of the contribution in the software.

 3. Conditions and Limitations

 A) No Trademark License- This license does not grant you rights
 to use any contributors’ name, logo, or trademarks.
 B) If you bring a patent claim against any contributor over
 patents that you claim are infringed by the software, your
 patent license from such contributor is terminated with
 immediate effect.
 C) If you distribute any portion of the software, you must
 retain all copyright, patent, trademark, and attribution
 notices that are present in the software.
 D) If you distribute any portion of the software in source code
 form, you may do so only under this license by including a
 complete copy of this license with your distribution. If you
 distribute any portion of the software in compiled or object
 code form, you may only do so under a license that complies
 with this license.
 E) The software is licensed “as-is.” You bear all risks of
 using it. The contributors give no express warranties,
 guarantees, or conditions. You may have additional consumer
 rights under your local laws which this license cannot change.
 To the extent permitted under your local laws, the contributors
 exclude all implied warranties, including those of
 merchantability, fitness for a particular purpose and
 non-infringement.

 4. (F) Platform Limitation- The licenses granted in sections
 2.A & 2.B extend only to the software or derivative works that
 you create that run on a Holograph system product.

 ***************************************************************

*/

pragma solidity 0.8.13;

abstract contract Admin {
  constructor() {}

  modifier onlyAdmin() {
    require(msg.sender == getAdmin(), "HOLOGRAPH: admin only function");
    _;
  }

  function admin() public view returns (address) {
    return getAdmin();
  }

  function getAdmin() public view returns (address adminAddress) {
    // The slot hash has been precomputed for gas optimizaion
    // bytes32 slot = bytes32(uint256(keccak256('eip1967.Holograph.Bridge.admin')) - 1);
    assembly {
      adminAddress := sload(
        /* slot */
        0x5705f5753aa4f617eef2cae1dada3d3355e9387b04d19191f09b545e684ca50d
      )
    }
  }

  function setAdmin(address adminAddress) public onlyAdmin {
    // The slot hash has been precomputed for gas optimizaion
    // bytes32 slot = bytes32(uint256(keccak256('eip1967.Holograph.Bridge.admin')) - 1);
    assembly {
      sstore(
        /* slot */
        0x5705f5753aa4f617eef2cae1dada3d3355e9387b04d19191f09b545e684ca50d,
        adminAddress
      )
    }
  }

  function adminCall(address target, bytes calldata data) external payable onlyAdmin {
    assembly {
      calldatacopy(0, data.offset, data.length)
      let result := call(gas(), target, callvalue(), 0, data.length, 0, 0)
      returndatacopy(0, 0, returndatasize())
      switch result
      case 0 {
        revert(0, returndatasize())
      }
      default {
        return(0, returndatasize())
      }
    }
  }
}

File 3 of 8 : Initializable.sol
// SPDX-License-Identifier: UNLICENSED
/*

  ,,,,,,,,,,,
 [ HOLOGRAPH ]
  '''''''''''
  _____________________________________________________________
 |                                                             |
 |                            / ^ \                            |
 |                            ~~*~~            .               |
 |                         [ '<>:<>' ]         |=>             |
 |               __           _/"\_           _|               |
 |             .:[]:.          """          .:[]:.             |
 |           .'  []  '.        \_/        .'  []  '.           |
 |         .'|   []   |'.               .'|   []   |'.         |
 |       .'  |   []   |  '.           .'  |   []   |  '.       |
 |     .'|   |   []   |   |'.       .'|   |   []   |   |'.     |
 |   .'  |   |   []   |   |  '.   .'  |   |   []   |   |  '.   |
 |.:'|   |   |   []   |   |   |':'|   |   |   []   |   |   |':.|
 |___|___|___|___[]___|___|___|___|___|___|___[]___|___|___|___|
 |XxXxXxXxXxXxXxX[]XxXxXxXxXxXxXxXxXxXxXxXxXxX[]XxXxXxXxXxXxXxX|
 |^^^^^^^^^^^^^^^[]^^^^^^^^^^^^^^^^^^^^^^^^^^^[]^^^^^^^^^^^^^^^|
 |               []                           []               |
 |               []                           []               |
 |    ,          []     ,        ,'      *    []               |
 |~~~~~^~~~~~~~~/##\~~~^~~~~~~~~^^~~~~~~~~^~~/##\~~~~~~~^~~~~~~|
 |_____________________________________________________________|

      - one protocol, one bridge = infinite possibilities -


 ***************************************************************

 DISCLAIMER: U.S Patent Pending

 LICENSE: Holograph Limited Public License (H-LPL)

 https://holograph.xyz/licenses/h-lpl/1.0.0

 This license governs use of the accompanying software. If you
 use the software, you accept this license. If you do not accept
 the license, you are not permitted to use the software.

 1. Definitions

 The terms "reproduce," "reproduction," "derivative works," and
 "distribution" have the same meaning here as under U.S.
 copyright law. A "contribution" is the original software, or
 any additions or changes to the software. A "contributor" is
 any person that distributes its contribution under this
 license. "Licensed patents" are a contributor’s patent claims
 that read directly on its contribution.

 2. Grant of Rights

 A) Copyright Grant- Subject to the terms of this license,
 including the license conditions and limitations in sections 3
 and 4, each contributor grants you a non-exclusive, worldwide,
 royalty-free copyright license to reproduce its contribution,
 prepare derivative works of its contribution, and distribute
 its contribution or any derivative works that you create.
 B) Patent Grant- Subject to the terms of this license,
 including the license conditions and limitations in section 3,
 each contributor grants you a non-exclusive, worldwide,
 royalty-free license under its licensed patents to make, have
 made, use, sell, offer for sale, import, and/or otherwise
 dispose of its contribution in the software or derivative works
 of the contribution in the software.

 3. Conditions and Limitations

 A) No Trademark License- This license does not grant you rights
 to use any contributors’ name, logo, or trademarks.
 B) If you bring a patent claim against any contributor over
 patents that you claim are infringed by the software, your
 patent license from such contributor is terminated with
 immediate effect.
 C) If you distribute any portion of the software, you must
 retain all copyright, patent, trademark, and attribution
 notices that are present in the software.
 D) If you distribute any portion of the software in source code
 form, you may do so only under this license by including a
 complete copy of this license with your distribution. If you
 distribute any portion of the software in compiled or object
 code form, you may only do so under a license that complies
 with this license.
 E) The software is licensed “as-is.” You bear all risks of
 using it. The contributors give no express warranties,
 guarantees, or conditions. You may have additional consumer
 rights under your local laws which this license cannot change.
 To the extent permitted under your local laws, the contributors
 exclude all implied warranties, including those of
 merchantability, fitness for a particular purpose and
 non-infringement.

 4. (F) Platform Limitation- The licenses granted in sections
 2.A & 2.B extend only to the software or derivative works that
 you create that run on a Holograph system product.

 ***************************************************************

*/

pragma solidity 0.8.13;

import "../interface/IInitializable.sol";

abstract contract Initializable is IInitializable {
  function init(bytes memory _data) external virtual returns (bytes4);

  function _isInitialized() internal view returns (bool) {
    // The slot hash has been precomputed for gas optimizaion
    // bytes32 slot = bytes32(uint256(keccak256('eip1967.Holograph.initialized')) - 1);
    uint256 initialized;
    assembly {
      initialized := sload(0x4e5f991bca30eca2d4643aaefa807e88f96a4a97398933d572a3c0d973004a01)
    }
    return (initialized > 0);
  }

  function _setInitialized() internal {
    // The slot hash has been precomputed for gas optimizaion
    // bytes32 slot = bytes32(uint256(keccak256('eip1967.Holograph.initialized')) - 1);
    uint256 initialized = 1;
    assembly {
      sstore(
        /* slot */
        0x4e5f991bca30eca2d4643aaefa807e88f96a4a97398933d572a3c0d973004a01,
        initialized
      )
    }
  }
}

File 4 of 8 : Owner.sol
// SPDX-License-Identifier: UNLICENSED
/*

  ,,,,,,,,,,,
 [ HOLOGRAPH ]
  '''''''''''
  _____________________________________________________________
 |                                                             |
 |                            / ^ \                            |
 |                            ~~*~~            .               |
 |                         [ '<>:<>' ]         |=>             |
 |               __           _/"\_           _|               |
 |             .:[]:.          """          .:[]:.             |
 |           .'  []  '.        \_/        .'  []  '.           |
 |         .'|   []   |'.               .'|   []   |'.         |
 |       .'  |   []   |  '.           .'  |   []   |  '.       |
 |     .'|   |   []   |   |'.       .'|   |   []   |   |'.     |
 |   .'  |   |   []   |   |  '.   .'  |   |   []   |   |  '.   |
 |.:'|   |   |   []   |   |   |':'|   |   |   []   |   |   |':.|
 |___|___|___|___[]___|___|___|___|___|___|___[]___|___|___|___|
 |XxXxXxXxXxXxXxX[]XxXxXxXxXxXxXxXxXxXxXxXxXxX[]XxXxXxXxXxXxXxX|
 |^^^^^^^^^^^^^^^[]^^^^^^^^^^^^^^^^^^^^^^^^^^^[]^^^^^^^^^^^^^^^|
 |               []                           []               |
 |               []                           []               |
 |    ,          []     ,        ,'      *    []               |
 |~~~~~^~~~~~~~~/##\~~~^~~~~~~~~^^~~~~~~~~^~~/##\~~~~~~~^~~~~~~|
 |_____________________________________________________________|

      - one protocol, one bridge = infinite possibilities -


 ***************************************************************

 DISCLAIMER: U.S Patent Pending

 LICENSE: Holograph Limited Public License (H-LPL)

 https://holograph.xyz/licenses/h-lpl/1.0.0

 This license governs use of the accompanying software. If you
 use the software, you accept this license. If you do not accept
 the license, you are not permitted to use the software.

 1. Definitions

 The terms "reproduce," "reproduction," "derivative works," and
 "distribution" have the same meaning here as under U.S.
 copyright law. A "contribution" is the original software, or
 any additions or changes to the software. A "contributor" is
 any person that distributes its contribution under this
 license. "Licensed patents" are a contributor’s patent claims
 that read directly on its contribution.

 2. Grant of Rights

 A) Copyright Grant- Subject to the terms of this license,
 including the license conditions and limitations in sections 3
 and 4, each contributor grants you a non-exclusive, worldwide,
 royalty-free copyright license to reproduce its contribution,
 prepare derivative works of its contribution, and distribute
 its contribution or any derivative works that you create.
 B) Patent Grant- Subject to the terms of this license,
 including the license conditions and limitations in section 3,
 each contributor grants you a non-exclusive, worldwide,
 royalty-free license under its licensed patents to make, have
 made, use, sell, offer for sale, import, and/or otherwise
 dispose of its contribution in the software or derivative works
 of the contribution in the software.

 3. Conditions and Limitations

 A) No Trademark License- This license does not grant you rights
 to use any contributors’ name, logo, or trademarks.
 B) If you bring a patent claim against any contributor over
 patents that you claim are infringed by the software, your
 patent license from such contributor is terminated with
 immediate effect.
 C) If you distribute any portion of the software, you must
 retain all copyright, patent, trademark, and attribution
 notices that are present in the software.
 D) If you distribute any portion of the software in source code
 form, you may do so only under this license by including a
 complete copy of this license with your distribution. If you
 distribute any portion of the software in compiled or object
 code form, you may only do so under a license that complies
 with this license.
 E) The software is licensed “as-is.” You bear all risks of
 using it. The contributors give no express warranties,
 guarantees, or conditions. You may have additional consumer
 rights under your local laws which this license cannot change.
 To the extent permitted under your local laws, the contributors
 exclude all implied warranties, including those of
 merchantability, fitness for a particular purpose and
 non-infringement.

 4. (F) Platform Limitation- The licenses granted in sections
 2.A & 2.B extend only to the software or derivative works that
 you create that run on a Holograph system product.

 ***************************************************************

*/

pragma solidity 0.8.13;

abstract contract Owner {
  /**
   * @dev Event emitted when contract owner is changed.
   */
  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

  constructor() {}

  modifier onlyOwner() virtual {
    require(msg.sender == getOwner(), "HOLOGRAPH: owner only function");
    _;
  }

  function owner() public view virtual returns (address) {
    return getOwner();
  }

  function getOwner() public view returns (address ownerAddress) {
    // The slot hash has been precomputed for gas optimizaion
    // bytes32 slot = bytes32(uint256(keccak256('eip1967.Holograph.Bridge.owner')) - 1);
    assembly {
      ownerAddress := sload(
        /* slot */
        0x89b583059fdb0b2e807359b64eba1a8a1e6d099210701fafe6dad5dd2cd64fb8
      )
    }
  }

  function setOwner(address ownerAddress) public onlyOwner {
    // The slot hash has been precomputed for gas optimizaion
    // bytes32 slot = bytes32(uint256(keccak256('eip1967.Holograph.Bridge.owner')) - 1);
    address previousOwner = getOwner();
    assembly {
      sstore(
        /* slot */
        0x89b583059fdb0b2e807359b64eba1a8a1e6d099210701fafe6dad5dd2cd64fb8,
        ownerAddress
      )
    }
    emit OwnershipTransferred(previousOwner, ownerAddress);
  }

  function transferOwnership(address newOwner) public onlyOwner {
    require(newOwner != address(0), "HOLOGRAPH: zero address");
    assembly {
      sstore(0x89b583059fdb0b2e807359b64eba1a8a1e6d099210701fafe6dad5dd2cd64fb8, newOwner)
    }
  }

  function ownerCall(address target, bytes calldata data) external payable onlyOwner {
    assembly {
      calldatacopy(0, data.offset, data.length)
      let result := call(gas(), target, callvalue(), 0, data.length, 0, 0)
      returndatacopy(0, 0, returndatasize())
      switch result
      case 0 {
        revert(0, returndatasize())
      }
      default {
        return(0, returndatasize())
      }
    }
  }
}

File 5 of 8 : Zora.sol
// SPDX-License-Identifier: UNLICENSED
/*

  ,,,,,,,,,,,
 [ HOLOGRAPH ]
  '''''''''''
  _____________________________________________________________
 |                                                             |
 |                            / ^ \                            |
 |                            ~~*~~            .               |
 |                         [ '<>:<>' ]         |=>             |
 |               __           _/"\_           _|               |
 |             .:[]:.          """          .:[]:.             |
 |           .'  []  '.        \_/        .'  []  '.           |
 |         .'|   []   |'.               .'|   []   |'.         |
 |       .'  |   []   |  '.           .'  |   []   |  '.       |
 |     .'|   |   []   |   |'.       .'|   |   []   |   |'.     |
 |   .'  |   |   []   |   |  '.   .'  |   |   []   |   |  '.   |
 |.:'|   |   |   []   |   |   |':'|   |   |   []   |   |   |':.|
 |___|___|___|___[]___|___|___|___|___|___|___[]___|___|___|___|
 |XxXxXxXxXxXxXxX[]XxXxXxXxXxXxXxXxXxXxXxXxXxX[]XxXxXxXxXxXxXxX|
 |^^^^^^^^^^^^^^^[]^^^^^^^^^^^^^^^^^^^^^^^^^^^[]^^^^^^^^^^^^^^^|
 |               []                           []               |
 |               []                           []               |
 |    ,          []     ,        ,'      *    []               |
 |~~~~~^~~~~~~~~/##\~~~^~~~~~~~~^^~~~~~~~~^~~/##\~~~~~~~^~~~~~~|
 |_____________________________________________________________|

      - one protocol, one bridge = infinite possibilities -


 ***************************************************************

 DISCLAIMER: U.S Patent Pending

 LICENSE: Holograph Limited Public License (H-LPL)

 https://holograph.xyz/licenses/h-lpl/1.0.0

 This license governs use of the accompanying software. If you
 use the software, you accept this license. If you do not accept
 the license, you are not permitted to use the software.

 1. Definitions

 The terms "reproduce," "reproduction," "derivative works," and
 "distribution" have the same meaning here as under U.S.
 copyright law. A "contribution" is the original software, or
 any additions or changes to the software. A "contributor" is
 any person that distributes its contribution under this
 license. "Licensed patents" are a contributor’s patent claims
 that read directly on its contribution.

 2. Grant of Rights

 A) Copyright Grant- Subject to the terms of this license,
 including the license conditions and limitations in sections 3
 and 4, each contributor grants you a non-exclusive, worldwide,
 royalty-free copyright license to reproduce its contribution,
 prepare derivative works of its contribution, and distribute
 its contribution or any derivative works that you create.
 B) Patent Grant- Subject to the terms of this license,
 including the license conditions and limitations in section 3,
 each contributor grants you a non-exclusive, worldwide,
 royalty-free license under its licensed patents to make, have
 made, use, sell, offer for sale, import, and/or otherwise
 dispose of its contribution in the software or derivative works
 of the contribution in the software.

 3. Conditions and Limitations

 A) No Trademark License- This license does not grant you rights
 to use any contributors’ name, logo, or trademarks.
 B) If you bring a patent claim against any contributor over
 patents that you claim are infringed by the software, your
 patent license from such contributor is terminated with
 immediate effect.
 C) If you distribute any portion of the software, you must
 retain all copyright, patent, trademark, and attribution
 notices that are present in the software.
 D) If you distribute any portion of the software in source code
 form, you may do so only under this license by including a
 complete copy of this license with your distribution. If you
 distribute any portion of the software in compiled or object
 code form, you may only do so under a license that complies
 with this license.
 E) The software is licensed “as-is.” You bear all risks of
 using it. The contributors give no express warranties,
 guarantees, or conditions. You may have additional consumer
 rights under your local laws which this license cannot change.
 To the extent permitted under your local laws, the contributors
 exclude all implied warranties, including those of
 merchantability, fitness for a particular purpose and
 non-infringement.

 4. (F) Platform Limitation- The licenses granted in sections
 2.A & 2.B extend only to the software or derivative works that
 you create that run on a Holograph system product.

 ***************************************************************

*/

pragma solidity 0.8.13;

library Zora {
  struct Decimal {
    uint256 value;
  }

  struct BidShares {
    // % of sale value that goes to the _previous_ owner of the nft
    Decimal prevOwner;
    // % of sale value that goes to the original creator of the nft
    Decimal creator;
    // % of sale value that goes to the seller (current owner) of the nft
    Decimal owner;
  }
}

File 6 of 8 : ERC20.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity 0.8.13;

interface ERC20 {
  function totalSupply() external view returns (uint256);

  function balanceOf(address _owner) external view returns (uint256 balance);

  function transfer(address _to, uint256 _value) external returns (bool success);

  function transferFrom(
    address _from,
    address _to,
    uint256 _value
  ) external returns (bool success);

  function approve(address _spender, uint256 _value) external returns (bool success);

  function allowance(address _owner, address _spender) external view returns (uint256 remaining);

  event Transfer(address indexed _from, address indexed _to, uint256 _value);

  event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}

File 7 of 8 : IInitializable.sol
// SPDX-License-Identifier: UNLICENSED
/*

  ,,,,,,,,,,,
 [ HOLOGRAPH ]
  '''''''''''
  _____________________________________________________________
 |                                                             |
 |                            / ^ \                            |
 |                            ~~*~~            .               |
 |                         [ '<>:<>' ]         |=>             |
 |               __           _/"\_           _|               |
 |             .:[]:.          """          .:[]:.             |
 |           .'  []  '.        \_/        .'  []  '.           |
 |         .'|   []   |'.               .'|   []   |'.         |
 |       .'  |   []   |  '.           .'  |   []   |  '.       |
 |     .'|   |   []   |   |'.       .'|   |   []   |   |'.     |
 |   .'  |   |   []   |   |  '.   .'  |   |   []   |   |  '.   |
 |.:'|   |   |   []   |   |   |':'|   |   |   []   |   |   |':.|
 |___|___|___|___[]___|___|___|___|___|___|___[]___|___|___|___|
 |XxXxXxXxXxXxXxX[]XxXxXxXxXxXxXxXxXxXxXxXxXxX[]XxXxXxXxXxXxXxX|
 |^^^^^^^^^^^^^^^[]^^^^^^^^^^^^^^^^^^^^^^^^^^^[]^^^^^^^^^^^^^^^|
 |               []                           []               |
 |               []                           []               |
 |    ,          []     ,        ,'      *    []               |
 |~~~~~^~~~~~~~~/##\~~~^~~~~~~~~^^~~~~~~~~^~~/##\~~~~~~~^~~~~~~|
 |_____________________________________________________________|

      - one protocol, one bridge = infinite possibilities -


 ***************************************************************

 DISCLAIMER: U.S Patent Pending

 LICENSE: Holograph Limited Public License (H-LPL)

 https://holograph.xyz/licenses/h-lpl/1.0.0

 This license governs use of the accompanying software. If you
 use the software, you accept this license. If you do not accept
 the license, you are not permitted to use the software.

 1. Definitions

 The terms "reproduce," "reproduction," "derivative works," and
 "distribution" have the same meaning here as under U.S.
 copyright law. A "contribution" is the original software, or
 any additions or changes to the software. A "contributor" is
 any person that distributes its contribution under this
 license. "Licensed patents" are a contributor’s patent claims
 that read directly on its contribution.

 2. Grant of Rights

 A) Copyright Grant- Subject to the terms of this license,
 including the license conditions and limitations in sections 3
 and 4, each contributor grants you a non-exclusive, worldwide,
 royalty-free copyright license to reproduce its contribution,
 prepare derivative works of its contribution, and distribute
 its contribution or any derivative works that you create.
 B) Patent Grant- Subject to the terms of this license,
 including the license conditions and limitations in section 3,
 each contributor grants you a non-exclusive, worldwide,
 royalty-free license under its licensed patents to make, have
 made, use, sell, offer for sale, import, and/or otherwise
 dispose of its contribution in the software or derivative works
 of the contribution in the software.

 3. Conditions and Limitations

 A) No Trademark License- This license does not grant you rights
 to use any contributors’ name, logo, or trademarks.
 B) If you bring a patent claim against any contributor over
 patents that you claim are infringed by the software, your
 patent license from such contributor is terminated with
 immediate effect.
 C) If you distribute any portion of the software, you must
 retain all copyright, patent, trademark, and attribution
 notices that are present in the software.
 D) If you distribute any portion of the software in source code
 form, you may do so only under this license by including a
 complete copy of this license with your distribution. If you
 distribute any portion of the software in compiled or object
 code form, you may only do so under a license that complies
 with this license.
 E) The software is licensed “as-is.” You bear all risks of
 using it. The contributors give no express warranties,
 guarantees, or conditions. You may have additional consumer
 rights under your local laws which this license cannot change.
 To the extent permitted under your local laws, the contributors
 exclude all implied warranties, including those of
 merchantability, fitness for a particular purpose and
 non-infringement.

 4. (F) Platform Limitation- The licenses granted in sections
 2.A & 2.B extend only to the software or derivative works that
 you create that run on a Holograph system product.

 ***************************************************************

*/

pragma solidity 0.8.13;

interface IInitializable {
  function init(bytes memory _data) external returns (bytes4);
}

File 8 of 8 : IPA1D.sol
// SPDX-License-Identifier: UNLICENSED
/*

  ,,,,,,,,,,,
 [ HOLOGRAPH ]
  '''''''''''
  _____________________________________________________________
 |                                                             |
 |                            / ^ \                            |
 |                            ~~*~~            .               |
 |                         [ '<>:<>' ]         |=>             |
 |               __           _/"\_           _|               |
 |             .:[]:.          """          .:[]:.             |
 |           .'  []  '.        \_/        .'  []  '.           |
 |         .'|   []   |'.               .'|   []   |'.         |
 |       .'  |   []   |  '.           .'  |   []   |  '.       |
 |     .'|   |   []   |   |'.       .'|   |   []   |   |'.     |
 |   .'  |   |   []   |   |  '.   .'  |   |   []   |   |  '.   |
 |.:'|   |   |   []   |   |   |':'|   |   |   []   |   |   |':.|
 |___|___|___|___[]___|___|___|___|___|___|___[]___|___|___|___|
 |XxXxXxXxXxXxXxX[]XxXxXxXxXxXxXxXxXxXxXxXxXxX[]XxXxXxXxXxXxXxX|
 |^^^^^^^^^^^^^^^[]^^^^^^^^^^^^^^^^^^^^^^^^^^^[]^^^^^^^^^^^^^^^|
 |               []                           []               |
 |               []                           []               |
 |    ,          []     ,        ,'      *    []               |
 |~~~~~^~~~~~~~~/##\~~~^~~~~~~~~^^~~~~~~~~^~~/##\~~~~~~~^~~~~~~|
 |_____________________________________________________________|

      - one protocol, one bridge = infinite possibilities -


 ***************************************************************

 DISCLAIMER: U.S Patent Pending

 LICENSE: Holograph Limited Public License (H-LPL)

 https://holograph.xyz/licenses/h-lpl/1.0.0

 This license governs use of the accompanying software. If you
 use the software, you accept this license. If you do not accept
 the license, you are not permitted to use the software.

 1. Definitions

 The terms "reproduce," "reproduction," "derivative works," and
 "distribution" have the same meaning here as under U.S.
 copyright law. A "contribution" is the original software, or
 any additions or changes to the software. A "contributor" is
 any person that distributes its contribution under this
 license. "Licensed patents" are a contributor’s patent claims
 that read directly on its contribution.

 2. Grant of Rights

 A) Copyright Grant- Subject to the terms of this license,
 including the license conditions and limitations in sections 3
 and 4, each contributor grants you a non-exclusive, worldwide,
 royalty-free copyright license to reproduce its contribution,
 prepare derivative works of its contribution, and distribute
 its contribution or any derivative works that you create.
 B) Patent Grant- Subject to the terms of this license,
 including the license conditions and limitations in section 3,
 each contributor grants you a non-exclusive, worldwide,
 royalty-free license under its licensed patents to make, have
 made, use, sell, offer for sale, import, and/or otherwise
 dispose of its contribution in the software or derivative works
 of the contribution in the software.

 3. Conditions and Limitations

 A) No Trademark License- This license does not grant you rights
 to use any contributors’ name, logo, or trademarks.
 B) If you bring a patent claim against any contributor over
 patents that you claim are infringed by the software, your
 patent license from such contributor is terminated with
 immediate effect.
 C) If you distribute any portion of the software, you must
 retain all copyright, patent, trademark, and attribution
 notices that are present in the software.
 D) If you distribute any portion of the software in source code
 form, you may do so only under this license by including a
 complete copy of this license with your distribution. If you
 distribute any portion of the software in compiled or object
 code form, you may only do so under a license that complies
 with this license.
 E) The software is licensed “as-is.” You bear all risks of
 using it. The contributors give no express warranties,
 guarantees, or conditions. You may have additional consumer
 rights under your local laws which this license cannot change.
 To the extent permitted under your local laws, the contributors
 exclude all implied warranties, including those of
 merchantability, fitness for a particular purpose and
 non-infringement.

 4. (F) Platform Limitation- The licenses granted in sections
 2.A & 2.B extend only to the software or derivative works that
 you create that run on a Holograph system product.

 ***************************************************************

*/

pragma solidity 0.8.13;

import "../library/Zora.sol";

interface IPA1D {
  function initPA1D(bytes memory data) external returns (bytes4);

  function configurePayouts(address payable[] memory addresses, uint256[] memory bps) external;

  function getPayoutInfo() external view returns (address payable[] memory addresses, uint256[] memory bps);

  function getEthPayout() external;

  function getTokenPayout(address tokenAddress) external;

  function getTokensPayout(address[] memory tokenAddresses) external;

  function supportsInterface(bytes4 interfaceId) external pure returns (bool);

  function setRoyalties(
    uint256 tokenId,
    address payable receiver,
    uint256 bp
  ) external;

  function royaltyInfo(uint256 tokenId, uint256 value) external view returns (address, uint256);

  function getFeeBps(uint256 tokenId) external view returns (uint256[] memory);

  function getFeeRecipients(uint256 tokenId) external view returns (address payable[] memory);

  function getRoyalties(uint256 tokenId) external view returns (address payable[] memory, uint256[] memory);

  function getFees(uint256 tokenId) external view returns (address payable[] memory, uint256[] memory);

  function tokenCreator(
    address, /* contractAddress*/
    uint256 tokenId
  ) external view returns (address);

  function calculateRoyaltyFee(
    address, /* contractAddress */
    uint256 tokenId,
    uint256 amount
  ) external view returns (uint256);

  function marketContract() external view returns (address);

  function tokenCreators(uint256 tokenId) external view returns (address);

  function bidSharesForToken(uint256 tokenId) external view returns (Zora.BidShares memory bidShares);

  function getStorageSlot(string calldata slot) external pure returns (bytes32);

  function getTokenAddress(string memory tokenName) external view returns (address);
}

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

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"recipients","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"bps","type":"uint256[]"}],"name":"SecondarySaleFees","type":"event"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"adminCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"bidSharesForToken","outputs":[{"components":[{"components":[{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct Zora.Decimal","name":"prevOwner","type":"tuple"},{"components":[{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct Zora.Decimal","name":"creator","type":"tuple"},{"components":[{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct Zora.Decimal","name":"owner","type":"tuple"}],"internalType":"struct Zora.BidShares","name":"bidShares","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"calculateRoyaltyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"bps","type":"uint256[]"}],"name":"configurePayouts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAdmin","outputs":[{"internalType":"address","name":"adminAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEthPayout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFeeBps","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFeeRecipients","outputs":[{"internalType":"address payable[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFees","outputs":[{"internalType":"address payable[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"ownerAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPayoutInfo","outputs":[{"internalType":"address payable[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"bps","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getRoyalties","outputs":[{"internalType":"address payable[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"tokenName","type":"string"}],"name":"getTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"getTokenPayout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokenAddresses","type":"address[]"}],"name":"getTokensPayout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"init","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"initPA1D","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"ownerCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"adminAddress","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ownerAddress","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address payable","name":"receiver","type":"address"},{"internalType":"uint256","name":"bp","type":"uint256"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenCreator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenCreators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b506130dc806100206000396000f3fe6080604052600436106101c25760003560e01c80638da5cb5b116100f7578063c409123611610095578063eb66dbcf11610064578063eb66dbcf1461057f578063f2fde38b14610592578063f851a440146105b2578063f9ce0582146105c757600080fd5b8063c40912361461051f578063d5a06d4c146104ec578063e0fd045f1461053f578063e2c7f3381461055f57600080fd5b8063b85ed7e4116100d1578063b85ed7e41461049f578063b9c4d9fb146104bf578063bb3bafd6146104ec578063bf64a82d1461050c57600080fd5b80638da5cb5b14610454578063990803c314610469578063a1794bcd1461048c57600080fd5b80633328d219116101645780636e9960c31161013e5780636e9960c31461037d578063704b6c02146103d2578063860110f5146103f2578063893d20e81461042057600080fd5b80633328d219146102ec5780634ddf47d41461030c57806365b85eb51461035d57600080fd5b806313af4035116101a057806313af4035146102405780631949ddf31461026057806320c60d2a146102805780632a55205a146102a057600080fd5b806301ffc9a7146101c75780630ebd4c7f146101fc57806312cb473814610229575b600080fd5b3480156101d357600080fd5b506101e76101e2366004612828565b61060c565b60405190151581526020015b60405180910390f35b34801561020857600080fd5b5061021c61021736600461286a565b610914565b6040516101f391906128be565b34801561023557600080fd5b5061023e6109d5565b005b34801561024c57600080fd5b5061023e61025b3660046128f3565b6109e7565b34801561026c57600080fd5b5061023e61027b3660046128f3565b610b07565b34801561028c57600080fd5b5061023e61029b3660046129b2565b610b1b565b3480156102ac57600080fd5b506102c06102bb366004612a51565b610b2c565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152016101f3565b3480156102f857600080fd5b5061023e610307366004612ad9565b610bdc565b34801561031857600080fd5b5061032c610327366004612c11565b610d7e565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016101f3565b34801561036957600080fd5b5061032c610378366004612c11565b610ed0565b34801561038957600080fd5b507f5705f5753aa4f617eef2cae1dada3d3355e9387b04d19191f09b545e684ca50d545b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101f3565b3480156103de57600080fd5b5061023e6103ed3660046128f3565b610fd2565b3480156103fe57600080fd5b5061041261040d366004612c62565b6110ac565b6040519081526020016101f3565b34801561042c57600080fd5b507f89b583059fdb0b2e807359b64eba1a8a1e6d099210701fafe6dad5dd2cd64fb8546103ad565b34801561046057600080fd5b506103ad61112e565b34801561047557600080fd5b5061047e61115d565b6040516101f3929190612cdd565b34801561049857600080fd5b50306103ad565b3480156104ab57600080fd5b506103ad6104ba366004612d0b565b611178565b3480156104cb57600080fd5b506104df6104da36600461286a565b6111ca565b6040516101f39190612d37565b3480156104f857600080fd5b5061047e61050736600461286a565b6112e6565b61023e61051a366004612d4a565b61147f565b34801561052b57600080fd5b506103ad61053a366004612c11565b611561565b34801561054b57600080fd5b506103ad61055a36600461286a565b61156c565b34801561056b57600080fd5b5061023e61057a366004612dcf565b6115bc565b61023e61058d366004612d4a565b61177d565b34801561059e57600080fd5b5061023e6105ad3660046128f3565b6117eb565b3480156105be57600080fd5b506103ad6118fa565b3480156105d357600080fd5b506105e76105e236600461286a565b611924565b60408051825151815260208084015151908201529181015151908201526060016101f3565b60007f2a55205a000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061069f57507fb7799584000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b806106eb57507fb9c4d9fb000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b8061073757507fbb3bafd6000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b8061078357507fd5a06d4c000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b806107cf57507fb85ed7e4000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b8061081b57507f860110f5000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b8061086757507fa1794bcd000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b806108b357507fe0fd045f000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b806108ff57507ff9ce0582000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b1561090c57506001919050565b506000919050565b60408051600180825281830190925260609160009190602080830190803683370190505090506000610945846119cc565b73ffffffffffffffffffffffffffffffffffffffff16036109a6577f3ab91e3c2ba71a57537d782545f8feb1d402b604f5e070fa6c3b911fc2f18f75548160008151811061099557610995612e07565b6020026020010181815250506109cf565b6109af83611a33565b816000815181106109c2576109c2612e07565b6020026020010181815250505b92915050565b6109dd611a73565b6109e5611b68565b565b6109ef611cda565b610a5a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f504131443a2063616c6c6572206e6f7420616e206f776e65720000000000000060448201526064015b60405180910390fd5b6000610a847f89b583059fdb0b2e807359b64eba1a8a1e6d099210701fafe6dad5dd2cd64fb85490565b9050817f89b583059fdb0b2e807359b64eba1a8a1e6d099210701fafe6dad5dd2cd64fb8558173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b610b0f611a73565b610b1881611ed5565b50565b610b23611a73565b610b1881612191565b60008080610b39856119cc565b73ffffffffffffffffffffffffffffffffffffffff1603610bbf577ffd430e1c7265cc31dbd9a10ce657e68878a41cfe179c80cd68c5edf9615168485461271084610ba27f3ab91e3c2ba71a57537d782545f8feb1d402b604f5e070fa6c3b911fc2f18f755490565b610bac9190612e65565b610bb69190612ea2565b91509150610bd5565b610bc8846119cc565b61271084610ba287611a33565b9250929050565b610be4611cda565b610c4a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f504131443a2063616c6c6572206e6f7420616e206f776e6572000000000000006044820152606401610a51565b8051825114610cb5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f504131443a206d6973736d617463686564206172726179206c656e67687473006044820152606401610a51565b6000805b8351811015610cfb57828181518110610cd457610cd4612e07565b602002602001015182610ce79190612edd565b915080610cf381612ef5565b915050610cb9565b508061271014610d67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f504131443a2062707320646f776e277420657175616c203130303030000000006044820152606401610a51565b610d708361247c565b610d798261250d565b505050565b6000610daa7f4e5f991bca30eca2d4643aaefa807e88f96a4a97398933d572a3c0d973004a0154151590565b15610e11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f504131443a20616c726561647920696e697469616c697a6564000000000000006044820152606401610a51565b337f5705f5753aa4f617eef2cae1dada3d3355e9387b04d19191f09b545e684ca50d55337f89b583059fdb0b2e807359b64eba1a8a1e6d099210701fafe6dad5dd2cd64fb85560008083806020019051810190610e6e9190612f2d565b91509150610e7e600083836115bc565b610ea760017f4e5f991bca30eca2d4643aaefa807e88f96a4a97398933d572a3c0d973004a0155565b507f4ddf47d4000000000000000000000000000000000000000000000000000000009392505050565b7f33a44e907d5bf333e203bebc20bb8c91c00375213b80f466a908f3d50b337c6c546000908015610f5d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f504131443a20616c726561647920696e697469616c697a6564000000000000006044820152606401610a51565b60008084806020019051810190610f749190612f2d565b91509150610f84600083836115bc565b505060017f33a44e907d5bf333e203bebc20bb8c91c00375213b80f466a908f3d50b337c6c55507f4ddf47d40000000000000000000000000000000000000000000000000000000092915050565b7f5705f5753aa4f617eef2cae1dada3d3355e9387b04d19191f09b545e684ca50d5473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f484f4c4f47524150483a2061646d696e206f6e6c792066756e6374696f6e00006044820152606401610a51565b7f5705f5753aa4f617eef2cae1dada3d3355e9387b04d19191f09b545e684ca50d55565b6000806110b8846119cc565b73ffffffffffffffffffffffffffffffffffffffff160361111a57612710826110ff7f3ab91e3c2ba71a57537d782545f8feb1d402b604f5e070fa6c3b911fc2f18f755490565b6111099190612e65565b6111139190612ea2565b9050611127565b612710826110ff85611a33565b9392505050565b60006111587f89b583059fdb0b2e807359b64eba1a8a1e6d099210701fafe6dad5dd2cd64fb85490565b905090565b60608061116861259e565b9150611172612697565b90509091565b600080611184836119cc565b905073ffffffffffffffffffffffffffffffffffffffff81166111275750507ffd430e1c7265cc31dbd9a10ce657e68878a41cfe179c80cd68c5edf961516848546109cf565b604080516001808252818301909252606091600091906020808301908036833701905050905060006111fb846119cc565b73ffffffffffffffffffffffffffffffffffffffff160361128a577ffd430e1c7265cc31dbd9a10ce657e68878a41cfe179c80cd68c5edf961516848548160008151811061124b5761124b612e07565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506109cf565b611293836119cc565b816000815181106112a6576112a6612e07565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505092915050565b6040805160018082528183019092526060918291600091602080830190803683375050604080516001808252818301909252929350600092915060208083019080368337019050509050600061133b866119cc565b73ffffffffffffffffffffffffffffffffffffffff16036113f6577ffd430e1c7265cc31dbd9a10ce657e68878a41cfe179c80cd68c5edf961516848548260008151811061138b5761138b612e07565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101527f3ab91e3c2ba71a57537d782545f8feb1d402b604f5e070fa6c3b911fc2f18f7554816000815181106113e5576113e5612e07565b602002602001018181525050611475565b6113ff856119cc565b8260008151811061141257611412612e07565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061145585611a33565b8160008151811061146857611468612e07565b6020026020010181815250505b9094909350915050565b7f5705f5753aa4f617eef2cae1dada3d3355e9387b04d19191f09b545e684ca50d5473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f484f4c4f47524150483a2061646d696e206f6e6c792066756e6374696f6e00006044820152606401610a51565b808260003760008082600034875af13d6000803e808015611555573d6000f35b3d6000fd5b5050505050565b60006109cf8261276f565b600080611578836119cc565b905073ffffffffffffffffffffffffffffffffffffffff81166109cf577ffd430e1c7265cc31dbd9a10ce657e68878a41cfe179c80cd68c5edf96151684854611127565b6115c4611cda565b61162a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f504131443a2063616c6c6572206e6f7420616e206f776e6572000000000000006044820152606401610a51565b826000036116875761165a827ffd430e1c7265cc31dbd9a10ce657e68878a41cfe179c80cd68c5edf96151684855565b611682817f3ab91e3c2ba71a57537d782545f8feb1d402b604f5e070fa6c3b911fc2f18f7555565b61169b565b6116918383612785565b61169b83826127ea565b6040805160018082528183019092526000916020808301908036833701905050905082816000815181106116d1576116d1612e07565b73ffffffffffffffffffffffffffffffffffffffff9290921660209283029190910190910152604080516001808252818301909252600091816020016020820280368337019050509050828160008151811061172f5761172f612e07565b6020026020010181815250507f99aba1d63749cfd5ad1afda7c4663840924d54eb5f005bbbeadedc6ec13674b285838360405161176e93929190612f5b565b60405180910390a15050505050565b611785611cda565b611535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f504131443a2063616c6c6572206e6f7420616e206f776e6572000000000000006044820152606401610a51565b6117f3611cda565b611859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f504131443a2063616c6c6572206e6f7420616e206f776e6572000000000000006044820152606401610a51565b73ffffffffffffffffffffffffffffffffffffffff81166118d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f484f4c4f47524150483a207a65726f20616464726573730000000000000000006044820152606401610a51565b7f89b583059fdb0b2e807359b64eba1a8a1e6d099210701fafe6dad5dd2cd64fb855565b60006111587f5705f5753aa4f617eef2cae1dada3d3355e9387b04d19191f09b545e684ca50d5490565b6119616040805160808101825260006060820181815282528251602080820185528282528084019190915283519081018452908152909182015290565b8051600090819052604082015181905261197a836119cc565b73ffffffffffffffffffffffffffffffffffffffff16036119c3577f3ab91e3c2ba71a57537d782545f8feb1d402b604f5e070fa6c3b911fc2f18f75545b602082015152919050565b6119b882611a33565b6040517f656970313936372e486f6c6f67726170682e504131442e7265636569766572006020820152603f81018290526000908190600190605f015b6040516020818303038152906040528051906020012060001c611a2b9190612fd2565b549392505050565b6040517f656970313936372e486f6c6f67726170682e504131442e6270000000000000006020820152603981018290526000908190600190605901611a08565b611a7b611cda565b6109e557600080611a8a61259e565b90503360005b8251811015611b00578173ffffffffffffffffffffffffffffffffffffffff16838281518110611ac257611ac2612e07565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603611aee5760019350611b00565b80611af881612ef5565b915050611a90565b5082610d79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f504131443a2073656e646572206e6f7420617574686f72697a656400000000006044820152606401610a51565b6000611b7261259e565b90506000611b7e612697565b8251909150600081611b9281615b04612e65565b611b9c9190612edd565b905047612710611bac8383612fd2565b11611c13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f504131443a204e6f7420656e6f7567682045544820746f207472616e736665726044820152606401610a51565b611c1d8282612fd2565b90506000805b84811015611cd15761271083878381518110611c4157611c41612e07565b6020026020010151611c539190612e65565b611c5d9190612ea2565b9150868181518110611c7157611c71612e07565b602002602001015173ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611cbe573d6000803e3d6000fd5b5080611cc981612ef5565b915050611c23565b50505050505050565b6000611d047f89b583059fdb0b2e807359b64eba1a8a1e6d099210701fafe6dad5dd2cd64fb85490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611d8957507f5705f5753aa4f617eef2cae1dada3d3355e9387b04d19191f09b545e684ca50d5473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80611e2d57503073ffffffffffffffffffffffffffffffffffffffff1663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611dda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfe9190612fe9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061115857503073ffffffffffffffffffffffffffffffffffffffff16636e9960c36040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea29190612fe9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6000611edf61259e565b90506000611eeb612697565b82516040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291925090849060009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015611f60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f849190613006565b90506127108111612017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f504131443a204e6f7420656e6f75676820746f6b656e7320746f207472616e7360448201527f66657200000000000000000000000000000000000000000000000000000000006064820152608401610a51565b6000805b84811015612187576127108387838151811061203957612039612e07565b602002602001015161204b9190612e65565b6120559190612ea2565b91508373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb88838151811061208557612085612e07565b6020026020010151846040518363ffffffff1660e01b81526004016120cc92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af11580156120eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061210f919061301f565b612175576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f504131443a20436f756c646e2774207472616e7366657220746f6b656e0000006044820152606401610a51565b8061217f81612ef5565b91505061201b565b5050505050505050565b600061219b61259e565b905060006121a7612697565b905060008080805b8651811015611cd1578681815181106121ca576121ca612e07565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290945073ffffffffffffffffffffffffffffffffffffffff8516906370a0823190602401602060405180830381865afa158015612242573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122669190613006565b925061271083116122f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f504131443a204e6f7420656e6f75676820746f6b656e7320746f207472616e7360448201527f66657200000000000000000000000000000000000000000000000000000000006064820152608401610a51565b60005b8651811015612469576127108487838151811061231b5761231b612e07565b602002602001015161232d9190612e65565b6123379190612ea2565b92508473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb88838151811061236757612367612e07565b6020026020010151856040518363ffffffff1660e01b81526004016123ae92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af11580156123cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123f1919061301f565b612457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f504131443a20436f756c646e2774207472616e7366657220746f6b656e0000006044820152606401610a51565b8061246181612ef5565b9150506122fc565b508061247481612ef5565b9150506121af565b80517f700a541bc37f227b0d36d34e7b77cc0108bde768297c6f80f448f380387371df818155906000805b8281101561155a5760408051602081018390529081018590526060016040516020818303038152906040528051906020012093508481815181106124ed576124ed612e07565b60200260200101519150818455808061250590612ef5565b9150506124a7565b80517f7a62e8104cd2cc2ef6bd3a26bcb71428108fbe0e0ead6a5bfb8676781e2ed28d818155906000805b8281101561155a57604080516020810183905290810185905260600160405160208183030381529060405280519060200120935084818151811061257e5761257e612e07565b60200260200101519150818455808061259690612ef5565b915050612538565b7f700a541bc37f227b0d36d34e7b77cc0108bde768297c6f80f448f380387371df8054606091908067ffffffffffffffff8111156125de576125de612910565b604051908082528060200260200182016040528015612607578160200160208202803683370190505b5092506000805b82811015612690576040805160208101839052908101859052606001604051602081830303815290604052805190602001209350835491508185828151811061265957612659612e07565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101528061268881612ef5565b91505061260e565b5050505090565b7f7a62e8104cd2cc2ef6bd3a26bcb71428108fbe0e0ead6a5bfb8676781e2ed28d8054606091908067ffffffffffffffff8111156126d7576126d7612910565b604051908082528060200260200182016040528015612700578160200160208202803683370190505b5092506000805b82811015612690576040805160208101839052908101859052606001604051602081830303815290604052805190602001209350835491508185828151811061275257612752612e07565b60209081029190910101528061276781612ef5565b915050612707565b600080600183604051602001611a089190613041565b6040517f656970313936372e486f6c6f67726170682e504131442e7265636569766572006020820152603f8101839052600090600190605f015b6040516020818303038152906040528051906020012060001c6127e29190612fd2565b919091555050565b6040517f656970313936372e486f6c6f67726170682e504131442e6270000000000000006020820152603981018390526000906001906059016127bf565b60006020828403121561283a57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461112757600080fd5b60006020828403121561287c57600080fd5b5035919050565b600081518084526020808501945080840160005b838110156128b357815187529582019590820190600101612897565b509495945050505050565b6020815260006111276020830184612883565b73ffffffffffffffffffffffffffffffffffffffff81168114610b1857600080fd5b60006020828403121561290557600080fd5b8135611127816128d1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561298657612986612910565b604052919050565b600067ffffffffffffffff8211156129a8576129a8612910565b5060051b60200190565b600060208083850312156129c557600080fd5b823567ffffffffffffffff8111156129dc57600080fd5b8301601f810185136129ed57600080fd5b8035612a006129fb8261298e565b61293f565b81815260059190911b82018301908381019087831115612a1f57600080fd5b928401925b82841015612a46578335612a37816128d1565b82529284019290840190612a24565b979650505050505050565b60008060408385031215612a6457600080fd5b50508035926020909101359150565b600082601f830112612a8457600080fd5b81356020612a946129fb8361298e565b82815260059290921b84018101918181019086841115612ab357600080fd5b8286015b84811015612ace5780358352918301918301612ab7565b509695505050505050565b60008060408385031215612aec57600080fd5b823567ffffffffffffffff80821115612b0457600080fd5b818501915085601f830112612b1857600080fd5b81356020612b286129fb8361298e565b82815260059290921b84018101918181019089841115612b4757600080fd5b948201945b83861015612b6e578535612b5f816128d1565b82529482019490820190612b4c565b96505086013592505080821115612b8457600080fd5b50612b9185828601612a73565b9150509250929050565b600067ffffffffffffffff831115612bb557612bb5612910565b612be660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8601160161293f565b9050828152838383011115612bfa57600080fd5b828260208301376000602084830101529392505050565b600060208284031215612c2357600080fd5b813567ffffffffffffffff811115612c3a57600080fd5b8201601f81018413612c4b57600080fd5b612c5a84823560208401612b9b565b949350505050565b600080600060608486031215612c7757600080fd5b8335612c82816128d1565b95602085013595506040909401359392505050565b600081518084526020808501945080840160005b838110156128b357815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101612cab565b604081526000612cf06040830185612c97565b8281036020840152612d028185612883565b95945050505050565b60008060408385031215612d1e57600080fd5b8235612d29816128d1565b946020939093013593505050565b6020815260006111276020830184612c97565b600080600060408486031215612d5f57600080fd5b8335612d6a816128d1565b9250602084013567ffffffffffffffff80821115612d8757600080fd5b818601915086601f830112612d9b57600080fd5b813581811115612daa57600080fd5b876020828501011115612dbc57600080fd5b6020830194508093505050509250925092565b600080600060608486031215612de457600080fd5b833592506020840135612df6816128d1565b929592945050506040919091013590565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612e9d57612e9d612e36565b500290565b600082612ed8577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008219821115612ef057612ef0612e36565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612f2657612f26612e36565b5060010190565b60008060408385031215612f4057600080fd5b8251612f4b816128d1565b6020939093015192949293505050565b6000606082018583526020606081850152818651808452608086019150828801935060005b81811015612fb257845173ffffffffffffffffffffffffffffffffffffffff1683529383019391830191600101612f80565b50508481036040860152612fc68187612883565b98975050505050505050565b600082821015612fe457612fe4612e36565b500390565b600060208284031215612ffb57600080fd5b8151611127816128d1565b60006020828403121561301857600080fd5b5051919050565b60006020828403121561303157600080fd5b8151801515811461112757600080fd5b7f656970313936372e486f6c6f67726170682e504131442e746f6b656e416464728152600060207f657373000000000000000000000000000000000000000000000000000000000081840152835160005b818110156130ae57858101830151858201602301528201613092565b818111156130c0576000602383870101525b5092909201602301939250505056fea164736f6c634300080d000a

Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
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.