ETH Price: $3,684.46 (+3.23%)

Contract

0x3B612a5B49e025a6e4bA4eE4FB1EF46D13588059
 
Transaction Hash
Method
Block
From
To
Create Collectio...201449532024-06-22 4:46:35161 days ago1719031595IN
Foundation: Collection Factory
0 ETH0.000335152
Create Collectio...181953012023-09-23 1:39:11434 days ago1695433151IN
Foundation: Collection Factory
0 ETH0.001106256.6
Create Collectio...181518952023-09-16 23:18:11440 days ago1694906291IN
Foundation: Collection Factory
0 ETH0.001178787.03424336
Create Collectio...175763902023-06-28 7:39:59521 days ago1687937999IN
Foundation: Collection Factory
0 ETH0.0029569117.63239803
Transfer174929552023-06-16 14:21:11532 days ago1686925271IN
Foundation: Collection Factory
0.05984398 ETH0.0004545421.64521916
Transfer170805072023-04-19 11:59:35590 days ago1681905575IN
Foundation: Collection Factory
0.00496993 ETH0.0012875661.31279139
Transfer169895592023-04-06 12:26:35603 days ago1680783995IN
Foundation: Collection Factory
0.09315027 ETH0.0005164824.59461721
Transfer169895542023-04-06 12:25:35603 days ago1680783935IN
Foundation: Collection Factory
0.09369681 ETH0.0005361125.52941942
Transfer165908372023-02-09 11:16:11659 days ago1675941371IN
Foundation: Collection Factory
0.0015 ETH0.0005172224.6299917
Create Collectio...165694712023-02-06 11:32:59662 days ago1675683179IN
Foundation: Collection Factory
0 ETH0.0027030916.11922144
Transfer163200392023-01-02 15:38:59697 days ago1672673939IN
Foundation: Collection Factory
0.018 ETH0.0003958318.84917246
Transfer163200102023-01-02 15:33:11697 days ago1672673591IN
Foundation: Collection Factory
0.018 ETH0.0003574917.02348605
Transfer163199952023-01-02 15:30:11697 days ago1672673411IN
Foundation: Collection Factory
0.018 ETH0.0003203215.25347173
Transfer163199892023-01-02 15:28:59697 days ago1672673339IN
Foundation: Collection Factory
0.018 ETH0.0003236615.41281235
Transfer159822652022-11-16 11:23:11744 days ago1668597791IN
Foundation: Collection Factory
0.03 ETH0.000299414.25736812
Transfer159822612022-11-16 11:22:23744 days ago1668597743IN
Foundation: Collection Factory
0.04 ETH0.0002821713.43711032
Transfer159712232022-11-14 22:20:23746 days ago1668464423IN
Foundation: Collection Factory
0.04049463 ETH0.0003590217.09633332
Transfer159712192022-11-14 22:19:35746 days ago1668464375IN
Foundation: Collection Factory
0.0408145 ETH0.0002957214.08200774
Transfer159712152022-11-14 22:18:47746 days ago1668464327IN
Foundation: Collection Factory
0.04 ETH0.0003154715.02275825
Transfer159563022022-11-12 20:23:23748 days ago1668284603IN
Foundation: Collection Factory
0.00711529 ETH0.0002500411.90706019
Transfer159562952022-11-12 20:21:59748 days ago1668284519IN
Foundation: Collection Factory
0.00474353 ETH0.0002669312.71107172
Create Collectio...158600022022-10-30 9:32:47761 days ago1667122367IN
Foundation: Collection Factory
0 ETH0.000885455.28284174
Create Collectio...157999002022-10-21 23:56:11770 days ago1666396571IN
Foundation: Collection Factory
0 ETH0.0031542318.80408123
Create Collectio...157997812022-10-21 23:31:59770 days ago1666395119IN
Foundation: Collection Factory
0 ETH0.0031873219
Create Collectio...156913412022-10-06 20:07:11785 days ago1665086831IN
Foundation: Collection Factory
0 ETH0.0020913312.47378902
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
201449532024-06-22 4:46:35161 days ago1719031595
Foundation: Collection Factory
 Contract Creation0 ETH
181953012023-09-23 1:39:11434 days ago1695433151
Foundation: Collection Factory
 Contract Creation0 ETH
181518952023-09-16 23:18:11440 days ago1694906291
Foundation: Collection Factory
 Contract Creation0 ETH
175763902023-06-28 7:39:59521 days ago1687937999
Foundation: Collection Factory
 Contract Creation0 ETH
165694712023-02-06 11:32:59662 days ago1675683179
Foundation: Collection Factory
 Contract Creation0 ETH
158600022022-10-30 9:32:47761 days ago1667122367
Foundation: Collection Factory
 Contract Creation0 ETH
157999002022-10-21 23:56:11770 days ago1666396571
Foundation: Collection Factory
 Contract Creation0 ETH
157997812022-10-21 23:31:59770 days ago1666395119
Foundation: Collection Factory
 Contract Creation0 ETH
156913412022-10-06 20:07:11785 days ago1665086831
Foundation: Collection Factory
 Contract Creation0 ETH
156069392022-09-25 0:56:23797 days ago1664067383
Foundation: Collection Factory
 Contract Creation0 ETH
156026752022-09-24 10:39:23797 days ago1664015963
Foundation: Collection Factory
 Contract Creation0 ETH
155972592022-09-23 16:32:35798 days ago1663950755
Foundation: Collection Factory
 Contract Creation0 ETH
155956732022-09-23 11:13:11798 days ago1663931591
Foundation: Collection Factory
 Contract Creation0 ETH
155871382022-09-22 6:37:23800 days ago1663828643
Foundation: Collection Factory
 Contract Creation0 ETH
155793982022-09-21 4:16:47801 days ago1663733807
Foundation: Collection Factory
 Contract Creation0 ETH
155793982022-09-21 4:16:47801 days ago1663733807
Foundation: Collection Factory
 Contract Creation0 ETH
155793982022-09-21 4:16:47801 days ago1663733807
Foundation: Collection Factory
 Contract Creation0 ETH
155793982022-09-21 4:16:47801 days ago1663733807
Foundation: Collection Factory
 Contract Creation0 ETH
155793982022-09-21 4:16:47801 days ago1663733807
Foundation: Collection Factory
 Contract Creation0 ETH
155793982022-09-21 4:16:47801 days ago1663733807
Foundation: Collection Factory
 Contract Creation0 ETH
155793982022-09-21 4:16:47801 days ago1663733807
Foundation: Collection Factory
 Contract Creation0 ETH
155793982022-09-21 4:16:47801 days ago1663733807
Foundation: Collection Factory
 Contract Creation0 ETH
155793982022-09-21 4:16:47801 days ago1663733807
Foundation: Collection Factory
 Contract Creation0 ETH
155793982022-09-21 4:16:47801 days ago1663733807
Foundation: Collection Factory
 Contract Creation0 ETH
155793982022-09-21 4:16:47801 days ago1663733807
Foundation: Collection Factory
 Contract Creation0 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FNDCollectionFactory

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 1337 runs

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

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

pragma solidity ^0.8.0;

import "@openzeppelin/contracts-solc-8/proxy/Clones.sol";
import "@openzeppelin/contracts-solc-8/utils/Address.sol";
import "@openzeppelin/contracts-solc-8/utils/Strings.sol";

import "./interfaces/solc8/ICollectionContractInitializer.sol";
import "./interfaces/solc8/IRoles.sol";
import "./interfaces/solc8/ICollectionFactory.sol";
import "./interfaces/solc8/IProxyCall.sol";

/**
 * @title A factory to create NFT collections.
 * @notice Call this factory to create and initialize a minimal proxy pointing to the NFT collection contract.
 */
contract FNDCollectionFactory is ICollectionFactory {
  using Address for address;
  using Address for address payable;
  using Clones for address;
  using Strings for uint256;

  /**
   * @notice The contract address which manages common roles.
   * @dev Used by the collections for a shared operator definition.
   */
  IRoles public rolesContract;

  /**
   * @notice The address of the template all new collections will leverage.
   */
  address public implementation;

  /**
   * @notice The address of the proxy call contract implementation.
   * @dev Used by the collections to safely call another contract with arbitrary call data.
   */
  IProxyCall public proxyCallContract;

  /**
   * @notice The implementation version new collections will use.
   * @dev This is auto-incremented each time the implementation is changed.
   */
  uint256 public version;

  event RolesContractUpdated(address indexed rolesContract);
  event CollectionCreated(
    address indexed collectionContract,
    address indexed creator,
    uint256 indexed version,
    string name,
    string symbol,
    uint256 nonce
  );
  event ImplementationUpdated(address indexed implementation, uint256 indexed version);
  event ProxyCallContractUpdated(address indexed proxyCallContract);

  modifier onlyAdmin() {
    require(rolesContract.isAdmin(msg.sender), "FNDCollectionFactory: Caller does not have the Admin role");
    _;
  }

  constructor(address _proxyCallContract, address _rolesContract) {
    _updateRolesContract(_rolesContract);
    _updateProxyCallContract(_proxyCallContract);
  }

  /**
   * @notice Create a new collection contract.
   * @param nonce An arbitrary value used to allow a creator to mint multiple collections.
   * @dev The nonce is required and must be unique for the msg.sender + implementation version,
   * otherwise this call will revert.
   */
  function createCollection(
    string calldata name,
    string calldata symbol,
    uint256 nonce
  ) external returns (address) {
    require(bytes(symbol).length > 0, "FNDCollectionFactory: Symbol is required");

    // This reverts if the NFT was previously created using this implementation version + msg.sender + nonce
    address proxy = implementation.cloneDeterministic(_getSalt(msg.sender, nonce));

    ICollectionContractInitializer(proxy).initialize(payable(msg.sender), name, symbol);

    emit CollectionCreated(proxy, msg.sender, version, name, symbol, nonce);

    // Returning the address created allows other contracts to integrate with this call
    return address(proxy);
  }

  /**
   * @notice Allows Foundation to change the admin role contract address.
   */
  function adminUpdateRolesContract(address _rolesContract) external onlyAdmin {
    _updateRolesContract(_rolesContract);
  }

  /**
   * @notice Allows Foundation to change the collection implementation used for future collections.
   * This call will auto-increment the version.
   * Existing collections are not impacted.
   */
  function adminUpdateImplementation(address _implementation) external onlyAdmin {
    _updateImplementation(_implementation);
  }

  /**
   * @notice Allows Foundation to change the proxy call contract address.
   */
  function adminUpdateProxyCallContract(address _proxyCallContract) external onlyAdmin {
    _updateProxyCallContract(_proxyCallContract);
  }

  /**
   * @notice Returns the address of a collection given the current implementation version, creator, and nonce.
   * This will return the same address whether the collection has already been created or not.
   * @param nonce An arbitrary value used to allow a creator to mint multiple collections.
   */
  function predictCollectionAddress(address creator, uint256 nonce) external view returns (address) {
    return implementation.predictDeterministicAddress(_getSalt(creator, nonce));
  }

  function _updateRolesContract(address _rolesContract) private {
    require(_rolesContract.isContract(), "FNDCollectionFactory: RolesContract is not a contract");
    rolesContract = IRoles(_rolesContract);

    emit RolesContractUpdated(_rolesContract);
  }

  /**
   * @dev Updates the implementation address, increments the version, and initializes the template.
   * Since the template is initialized when set, implementations cannot be re-used.
   * To downgrade the implementation, deploy the same bytecode again and then update to that.
   */
  function _updateImplementation(address _implementation) private {
    require(_implementation.isContract(), "FNDCollectionFactory: Implementation is not a contract");
    implementation = _implementation;
    version++;

    // The implementation is initialized when assigned so that others may not claim it as their own.
    ICollectionContractInitializer(_implementation).initialize(
      payable(address(rolesContract)),
      string(abi.encodePacked("Foundation Collection Template v", version.toString())),
      string(abi.encodePacked("FCTv", version.toString()))
    );

    emit ImplementationUpdated(_implementation, version);
  }

  function _updateProxyCallContract(address _proxyCallContract) private {
    require(_proxyCallContract.isContract(), "FNDCollectionFactory: Proxy call address is not a contract");
    proxyCallContract = IProxyCall(_proxyCallContract);

    emit ProxyCallContractUpdated(_proxyCallContract);
  }

  function _getSalt(address creator, uint256 nonce) private pure returns (bytes32) {
    return keccak256(abi.encodePacked(creator, nonce));
  }
}

File 2 of 8 : Clones.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev https://eips.ethereum.org/EIPS/eip-1167[EIP 1167] is a standard for
 * deploying minimal proxy contracts, also known as "clones".
 *
 * > To simply and cheaply clone contract functionality in an immutable way, this standard specifies
 * > a minimal bytecode implementation that delegates all calls to a known, fixed address.
 *
 * The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2`
 * (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the
 * deterministic method.
 *
 * _Available since v3.4._
 */
library Clones {
    /**
     * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
     *
     * This function uses the create opcode, which should never revert.
     */
    function clone(address implementation) internal returns (address instance) {
        assembly {
            let ptr := mload(0x40)
            mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(ptr, 0x14), shl(0x60, implementation))
            mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
            instance := create(0, ptr, 0x37)
        }
        require(instance != address(0), "ERC1167: create failed");
    }

    /**
     * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
     *
     * This function uses the create2 opcode and a `salt` to deterministically deploy
     * the clone. Using the same `implementation` and `salt` multiple time will revert, since
     * the clones cannot be deployed twice at the same address.
     */
    function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) {
        assembly {
            let ptr := mload(0x40)
            mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(ptr, 0x14), shl(0x60, implementation))
            mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
            instance := create2(0, ptr, 0x37, salt)
        }
        require(instance != address(0), "ERC1167: create2 failed");
    }

    /**
     * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
     */
    function predictDeterministicAddress(
        address implementation,
        bytes32 salt,
        address deployer
    ) internal pure returns (address predicted) {
        assembly {
            let ptr := mload(0x40)
            mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(ptr, 0x14), shl(0x60, implementation))
            mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf3ff00000000000000000000000000000000)
            mstore(add(ptr, 0x38), shl(0x60, deployer))
            mstore(add(ptr, 0x4c), salt)
            mstore(add(ptr, 0x6c), keccak256(ptr, 0x37))
            predicted := keccak256(add(ptr, 0x37), 0x55)
        }
    }

    /**
     * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
     */
    function predictDeterministicAddress(address implementation, bytes32 salt)
        internal
        view
        returns (address predicted)
    {
        return predictDeterministicAddress(implementation, salt, address(this));
    }
}

File 3 of 8 : Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 4 of 8 : Strings.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

File 5 of 8 : ICollectionContractInitializer.sol
// SPDX-License-Identifier: MIT OR Apache-2.0

pragma solidity ^0.8.0;

interface ICollectionContractInitializer {
  function initialize(
    address payable _creator,
    string memory _name,
    string memory _symbol
  ) external;
}

File 6 of 8 : IRoles.sol
// SPDX-License-Identifier: MIT OR Apache-2.0

pragma solidity ^0.8.0;

/**
 * @notice Interface for a contract which implements admin roles.
 */
interface IRoles {
  function isAdmin(address account) external view returns (bool);

  function isOperator(address account) external view returns (bool);
}

File 7 of 8 : ICollectionFactory.sol
// SPDX-License-Identifier: MIT OR Apache-2.0

pragma solidity ^0.8.0;

import "./IRoles.sol";
import "./IProxyCall.sol";

interface ICollectionFactory {
  function rolesContract() external returns (IRoles);

  function proxyCallContract() external returns (IProxyCall);
}

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

pragma solidity ^0.8.0;

interface IProxyCall {
  function proxyCallAndReturnAddress(address externalContract, bytes calldata callData)
    external
    returns (address payable result);
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_proxyCallContract","type":"address"},{"internalType":"address","name":"_rolesContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collectionContract","type":"address"},{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":true,"internalType":"uint256","name":"version","type":"uint256"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"CollectionCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"},{"indexed":true,"internalType":"uint256","name":"version","type":"uint256"}],"name":"ImplementationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"proxyCallContract","type":"address"}],"name":"ProxyCallContractUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rolesContract","type":"address"}],"name":"RolesContractUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"_implementation","type":"address"}],"name":"adminUpdateImplementation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_proxyCallContract","type":"address"}],"name":"adminUpdateProxyCallContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rolesContract","type":"address"}],"name":"adminUpdateRolesContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"createCollection","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"predictCollectionAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyCallContract","outputs":[{"internalType":"contract IProxyCall","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rolesContract","outputs":[{"internalType":"contract IRoles","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50604051620012cf380380620012cf833981016040819052620000349162000231565b6200003f8162000052565b6200004a8262000131565b505062000269565b62000071816001600160a01b03166200020e60201b6200067a1760201c565b620000e95760405162461bcd60e51b815260206004820152603560248201527f464e44436f6c6c656374696f6e466163746f72793a20526f6c6573436f6e747260448201527f616374206973206e6f74206120636f6e7472616374000000000000000000000060648201526084015b60405180910390fd5b600080546001600160a01b0319166001600160a01b038316908117825560405190917f2cff90ef548ed2e2f7b9815b7089188bc1e96989b6346ac05a58750d92607d4b91a250565b62000150816001600160a01b03166200020e60201b6200067a1760201c565b620001c45760405162461bcd60e51b815260206004820152603a60248201527f464e44436f6c6c656374696f6e466163746f72793a2050726f78792063616c6c60448201527f2061646472657373206973206e6f74206120636f6e74726163740000000000006064820152608401620000e0565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f7213e3d637e4ef4968f947d5f602103307355f708bfd5bfce9d87da7c78f852190600090a250565b3b151590565b80516001600160a01b03811681146200022c57600080fd5b919050565b600080604083850312156200024557600080fd5b620002508362000214565b9150620002606020840162000214565b90509250929050565b61105680620002796000396000f3fe608060405234801561001057600080fd5b50600436106100a25760003560e01c806354fd4d5011610076578063a17bb1991161005b578063a17bb1991461013c578063bb7e36481461014f578063ca53b3911461016257600080fd5b806354fd4d50146101125780635c60da1b1461012957600080fd5b80629dfb89146100a75780631b8c9c4b146100bc5780634197ed74146100ec5780634b263865146100ff575b600080fd5b6100ba6100b5366004610c62565b610175565b005b6100cf6100ca366004610c7d565b610273565b6040516001600160a01b0390911681526020015b60405180910390f35b6100cf6100fa366004610cf0565b6102df565b6100ba61010d366004610c62565b61048e565b61011b60035481565b6040519081526020016100e3565b6001546100cf906001600160a01b031681565b6100ba61014a366004610c62565b610584565b6002546100cf906001600160a01b031681565b6000546100cf906001600160a01b031681565b600054604051630935e01b60e21b81523360048201526001600160a01b03909116906324d7806c9060240160206040518083038186803b1580156101b857600080fd5b505afa1580156101cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f09190610d64565b6102675760405162461bcd60e51b815260206004820152603960248201527f464e44436f6c6c656374696f6e466163746f72793a2043616c6c657220646f6560448201527f73206e6f742068617665207468652041646d696e20726f6c650000000000000060648201526084015b60405180910390fd5b61027081610680565b50565b60006102d66102c484846040516bffffffffffffffffffffffff19606084901b1660208201526034810182905260009060540160405160208183030381529060405280519060200120905092915050565b6001546001600160a01b031690610833565b90505b92915050565b6000826103545760405162461bcd60e51b815260206004820152602860248201527f464e44436f6c6c656374696f6e466163746f72793a2053796d626f6c2069732060448201527f7265717569726564000000000000000000000000000000000000000000000000606482015260840161025e565b604080513360601b6bffffffffffffffffffffffff1916602080830191909152603480830186905283518084039091018152605490920190925280519101206000906103ac906001546001600160a01b0316906108af565b6040517f906571470000000000000000000000000000000000000000000000000000000081529091506001600160a01b038216906390657147906103fc9033908b908b908b908b90600401610db6565b600060405180830381600087803b15801561041657600080fd5b505af115801561042a573d6000803e3d6000fd5b50505050600354336001600160a01b0316826001600160a01b03167fd3cbcb86b6ae20e08baf6a5fbaf0c922acff26cdc663bdf06744f5023bbcd2548a8a8a8a8a60405161047c959493929190610df8565b60405180910390a49695505050505050565b600054604051630935e01b60e21b81523360048201526001600160a01b03909116906324d7806c9060240160206040518083038186803b1580156104d157600080fd5b505afa1580156104e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105099190610d64565b61057b5760405162461bcd60e51b815260206004820152603960248201527f464e44436f6c6c656374696f6e466163746f72793a2043616c6c657220646f6560448201527f73206e6f742068617665207468652041646d696e20726f6c6500000000000000606482015260840161025e565b61027081610966565b600054604051630935e01b60e21b81523360048201526001600160a01b03909116906324d7806c9060240160206040518083038186803b1580156105c757600080fd5b505afa1580156105db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ff9190610d64565b6106715760405162461bcd60e51b815260206004820152603960248201527f464e44436f6c6c656374696f6e466163746f72793a2043616c6c657220646f6560448201527f73206e6f742068617665207468652041646d696e20726f6c6500000000000000606482015260840161025e565b61027081610a38565b3b151590565b6001600160a01b0381163b6106fd5760405162461bcd60e51b815260206004820152603660248201527f464e44436f6c6c656374696f6e466163746f72793a20496d706c656d656e746160448201527f74696f6e206973206e6f74206120636f6e747261637400000000000000000000606482015260840161025e565b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383161790556003805490600061073583610e48565b90915550506000546003546001600160a01b038084169263906571479291169061075e90610b0c565b60405160200161076e9190610e93565b604051602081830303815290604052610788600354610b0c565b6040516020016107989190610ed8565b6040516020818303038152906040526040518463ffffffff1660e01b81526004016107c593929190610f49565b600060405180830381600087803b1580156107df57600080fd5b505af11580156107f3573d6000803e3d6000fd5b50505050600354816001600160a01b03167f5678af47993f4856157dd819bee3183b87c10ee1b3575a5128fe25896c073a2860405160405180910390a350565b60006102d68383306040517f3d602d80600a3d3981f3363d3d373d3d3d363d730000000000000000000000008152606093841b60148201527f5af43d82803e903d91602b57fd5bf3ff000000000000000000000000000000006028820152921b6038830152604c8201526037808220606c830152605591012090565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528360601b60148201527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006028820152826037826000f59150506001600160a01b0381166102d95760405162461bcd60e51b815260206004820152601760248201527f455243313136373a2063726561746532206661696c6564000000000000000000604482015260640161025e565b6001600160a01b0381163b6109e35760405162461bcd60e51b815260206004820152603560248201527f464e44436f6c6c656374696f6e466163746f72793a20526f6c6573436f6e747260448201527f616374206973206e6f74206120636f6e74726163740000000000000000000000606482015260840161025e565b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038316908117825560405190917f2cff90ef548ed2e2f7b9815b7089188bc1e96989b6346ac05a58750d92607d4b91a250565b6001600160a01b0381163b610ab55760405162461bcd60e51b815260206004820152603a60248201527f464e44436f6c6c656374696f6e466163746f72793a2050726f78792063616c6c60448201527f2061646472657373206973206e6f74206120636f6e7472616374000000000000606482015260840161025e565b6002805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f7213e3d637e4ef4968f947d5f602103307355f708bfd5bfce9d87da7c78f852190600090a250565b606081610b4c57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115610b765780610b6081610e48565b9150610b6f9050600a83610f9d565b9150610b50565b60008167ffffffffffffffff811115610b9157610b91610fb1565b6040519080825280601f01601f191660200182016040528015610bbb576020820181803683370190505b5090505b8415610c3e57610bd0600183610fc7565b9150610bdd600a86610fde565b610be8906030610ff2565b60f81b818381518110610bfd57610bfd61100a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610c37600a86610f9d565b9450610bbf565b949350505050565b80356001600160a01b0381168114610c5d57600080fd5b919050565b600060208284031215610c7457600080fd5b6102d682610c46565b60008060408385031215610c9057600080fd5b610c9983610c46565b946020939093013593505050565b60008083601f840112610cb957600080fd5b50813567ffffffffffffffff811115610cd157600080fd5b602083019150836020828501011115610ce957600080fd5b9250929050565b600080600080600060608688031215610d0857600080fd5b853567ffffffffffffffff80821115610d2057600080fd5b610d2c89838a01610ca7565b90975095506020880135915080821115610d4557600080fd5b50610d5288828901610ca7565b96999598509660400135949350505050565b600060208284031215610d7657600080fd5b81518015158114610d8657600080fd5b9392505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0386168152606060208201526000610dd9606083018688610d8d565b8281036040840152610dec818587610d8d565b98975050505050505050565b606081526000610e0c606083018789610d8d565b8281036020840152610e1f818688610d8d565b9150508260408301529695505050505050565b634e487b7160e01b600052601160045260246000fd5b6000600019821415610e5c57610e5c610e32565b5060010190565b60005b83811015610e7e578181015183820152602001610e66565b83811115610e8d576000848401525b50505050565b7f466f756e646174696f6e20436f6c6c656374696f6e2054656d706c6174652076815260008251610ecb816020850160208701610e63565b9190910160200192915050565b7f4643547600000000000000000000000000000000000000000000000000000000815260008251610f10816004850160208701610e63565b9190910160040192915050565b60008151808452610f35816020860160208601610e63565b601f01601f19169290920160200192915050565b6001600160a01b0384168152606060208201526000610f6b6060830185610f1d565b8281036040840152610f7d8185610f1d565b9695505050505050565b634e487b7160e01b600052601260045260246000fd5b600082610fac57610fac610f87565b500490565b634e487b7160e01b600052604160045260246000fd5b600082821015610fd957610fd9610e32565b500390565b600082610fed57610fed610f87565b500690565b6000821982111561100557611005610e32565b500190565b634e487b7160e01b600052603260045260246000fdfea264697066735822122089ab8df97a80645c40f65cb3d89a1a11b1d0049c0440eb6c76027b1216d1be0b64736f6c63430008090033000000000000000000000000461aa494426e04fb2449068bad5948a0d720aef200000000000000000000000067df244584b67e8c51b10ad610aaffa9a402fdb6

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100a25760003560e01c806354fd4d5011610076578063a17bb1991161005b578063a17bb1991461013c578063bb7e36481461014f578063ca53b3911461016257600080fd5b806354fd4d50146101125780635c60da1b1461012957600080fd5b80629dfb89146100a75780631b8c9c4b146100bc5780634197ed74146100ec5780634b263865146100ff575b600080fd5b6100ba6100b5366004610c62565b610175565b005b6100cf6100ca366004610c7d565b610273565b6040516001600160a01b0390911681526020015b60405180910390f35b6100cf6100fa366004610cf0565b6102df565b6100ba61010d366004610c62565b61048e565b61011b60035481565b6040519081526020016100e3565b6001546100cf906001600160a01b031681565b6100ba61014a366004610c62565b610584565b6002546100cf906001600160a01b031681565b6000546100cf906001600160a01b031681565b600054604051630935e01b60e21b81523360048201526001600160a01b03909116906324d7806c9060240160206040518083038186803b1580156101b857600080fd5b505afa1580156101cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f09190610d64565b6102675760405162461bcd60e51b815260206004820152603960248201527f464e44436f6c6c656374696f6e466163746f72793a2043616c6c657220646f6560448201527f73206e6f742068617665207468652041646d696e20726f6c650000000000000060648201526084015b60405180910390fd5b61027081610680565b50565b60006102d66102c484846040516bffffffffffffffffffffffff19606084901b1660208201526034810182905260009060540160405160208183030381529060405280519060200120905092915050565b6001546001600160a01b031690610833565b90505b92915050565b6000826103545760405162461bcd60e51b815260206004820152602860248201527f464e44436f6c6c656374696f6e466163746f72793a2053796d626f6c2069732060448201527f7265717569726564000000000000000000000000000000000000000000000000606482015260840161025e565b604080513360601b6bffffffffffffffffffffffff1916602080830191909152603480830186905283518084039091018152605490920190925280519101206000906103ac906001546001600160a01b0316906108af565b6040517f906571470000000000000000000000000000000000000000000000000000000081529091506001600160a01b038216906390657147906103fc9033908b908b908b908b90600401610db6565b600060405180830381600087803b15801561041657600080fd5b505af115801561042a573d6000803e3d6000fd5b50505050600354336001600160a01b0316826001600160a01b03167fd3cbcb86b6ae20e08baf6a5fbaf0c922acff26cdc663bdf06744f5023bbcd2548a8a8a8a8a60405161047c959493929190610df8565b60405180910390a49695505050505050565b600054604051630935e01b60e21b81523360048201526001600160a01b03909116906324d7806c9060240160206040518083038186803b1580156104d157600080fd5b505afa1580156104e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105099190610d64565b61057b5760405162461bcd60e51b815260206004820152603960248201527f464e44436f6c6c656374696f6e466163746f72793a2043616c6c657220646f6560448201527f73206e6f742068617665207468652041646d696e20726f6c6500000000000000606482015260840161025e565b61027081610966565b600054604051630935e01b60e21b81523360048201526001600160a01b03909116906324d7806c9060240160206040518083038186803b1580156105c757600080fd5b505afa1580156105db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ff9190610d64565b6106715760405162461bcd60e51b815260206004820152603960248201527f464e44436f6c6c656374696f6e466163746f72793a2043616c6c657220646f6560448201527f73206e6f742068617665207468652041646d696e20726f6c6500000000000000606482015260840161025e565b61027081610a38565b3b151590565b6001600160a01b0381163b6106fd5760405162461bcd60e51b815260206004820152603660248201527f464e44436f6c6c656374696f6e466163746f72793a20496d706c656d656e746160448201527f74696f6e206973206e6f74206120636f6e747261637400000000000000000000606482015260840161025e565b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383161790556003805490600061073583610e48565b90915550506000546003546001600160a01b038084169263906571479291169061075e90610b0c565b60405160200161076e9190610e93565b604051602081830303815290604052610788600354610b0c565b6040516020016107989190610ed8565b6040516020818303038152906040526040518463ffffffff1660e01b81526004016107c593929190610f49565b600060405180830381600087803b1580156107df57600080fd5b505af11580156107f3573d6000803e3d6000fd5b50505050600354816001600160a01b03167f5678af47993f4856157dd819bee3183b87c10ee1b3575a5128fe25896c073a2860405160405180910390a350565b60006102d68383306040517f3d602d80600a3d3981f3363d3d373d3d3d363d730000000000000000000000008152606093841b60148201527f5af43d82803e903d91602b57fd5bf3ff000000000000000000000000000000006028820152921b6038830152604c8201526037808220606c830152605591012090565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528360601b60148201527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006028820152826037826000f59150506001600160a01b0381166102d95760405162461bcd60e51b815260206004820152601760248201527f455243313136373a2063726561746532206661696c6564000000000000000000604482015260640161025e565b6001600160a01b0381163b6109e35760405162461bcd60e51b815260206004820152603560248201527f464e44436f6c6c656374696f6e466163746f72793a20526f6c6573436f6e747260448201527f616374206973206e6f74206120636f6e74726163740000000000000000000000606482015260840161025e565b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038316908117825560405190917f2cff90ef548ed2e2f7b9815b7089188bc1e96989b6346ac05a58750d92607d4b91a250565b6001600160a01b0381163b610ab55760405162461bcd60e51b815260206004820152603a60248201527f464e44436f6c6c656374696f6e466163746f72793a2050726f78792063616c6c60448201527f2061646472657373206973206e6f74206120636f6e7472616374000000000000606482015260840161025e565b6002805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f7213e3d637e4ef4968f947d5f602103307355f708bfd5bfce9d87da7c78f852190600090a250565b606081610b4c57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115610b765780610b6081610e48565b9150610b6f9050600a83610f9d565b9150610b50565b60008167ffffffffffffffff811115610b9157610b91610fb1565b6040519080825280601f01601f191660200182016040528015610bbb576020820181803683370190505b5090505b8415610c3e57610bd0600183610fc7565b9150610bdd600a86610fde565b610be8906030610ff2565b60f81b818381518110610bfd57610bfd61100a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610c37600a86610f9d565b9450610bbf565b949350505050565b80356001600160a01b0381168114610c5d57600080fd5b919050565b600060208284031215610c7457600080fd5b6102d682610c46565b60008060408385031215610c9057600080fd5b610c9983610c46565b946020939093013593505050565b60008083601f840112610cb957600080fd5b50813567ffffffffffffffff811115610cd157600080fd5b602083019150836020828501011115610ce957600080fd5b9250929050565b600080600080600060608688031215610d0857600080fd5b853567ffffffffffffffff80821115610d2057600080fd5b610d2c89838a01610ca7565b90975095506020880135915080821115610d4557600080fd5b50610d5288828901610ca7565b96999598509660400135949350505050565b600060208284031215610d7657600080fd5b81518015158114610d8657600080fd5b9392505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0386168152606060208201526000610dd9606083018688610d8d565b8281036040840152610dec818587610d8d565b98975050505050505050565b606081526000610e0c606083018789610d8d565b8281036020840152610e1f818688610d8d565b9150508260408301529695505050505050565b634e487b7160e01b600052601160045260246000fd5b6000600019821415610e5c57610e5c610e32565b5060010190565b60005b83811015610e7e578181015183820152602001610e66565b83811115610e8d576000848401525b50505050565b7f466f756e646174696f6e20436f6c6c656374696f6e2054656d706c6174652076815260008251610ecb816020850160208701610e63565b9190910160200192915050565b7f4643547600000000000000000000000000000000000000000000000000000000815260008251610f10816004850160208701610e63565b9190910160040192915050565b60008151808452610f35816020860160208601610e63565b601f01601f19169290920160200192915050565b6001600160a01b0384168152606060208201526000610f6b6060830185610f1d565b8281036040840152610f7d8185610f1d565b9695505050505050565b634e487b7160e01b600052601260045260246000fd5b600082610fac57610fac610f87565b500490565b634e487b7160e01b600052604160045260246000fd5b600082821015610fd957610fd9610e32565b500390565b600082610fed57610fed610f87565b500690565b6000821982111561100557611005610e32565b500190565b634e487b7160e01b600052603260045260246000fdfea264697066735822122089ab8df97a80645c40f65cb3d89a1a11b1d0049c0440eb6c76027b1216d1be0b64736f6c63430008090033

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

000000000000000000000000461aa494426e04fb2449068bad5948a0d720aef200000000000000000000000067df244584b67e8c51b10ad610aaffa9a402fdb6

-----Decoded View---------------
Arg [0] : _proxyCallContract (address): 0x461AA494426e04fB2449068BaD5948a0d720aEf2
Arg [1] : _rolesContract (address): 0x67Df244584b67E8C51B10aD610aAfFa9a402FdB6

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000461aa494426e04fb2449068bad5948a0d720aef2
Arg [1] : 00000000000000000000000067df244584b67e8c51b10ad610aaffa9a402fdb6


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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