Overview
APE Balance
0 APE
APE Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
ERC721ProxyFactory
Compiler Version
v0.8.24+commit.e11b9ed9
Optimization Enabled:
No with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT // @author: Buildtree - Powered by NFT Studios pragma solidity ^0.8.18; import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol"; import {DTOs} from "./../libraries/dtos.sol"; import {SignatureProtected} from "./../libraries/SignatureProtected.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; interface IERC721 { function init( address owner, uint96 royalty, string memory name, string memory symbol, bool transferLocked, address metadataResolver ) external; function addMinter(address minter) external; function transferOwnership(address owner) external; function owner() external returns (address); } interface IMinter { function init( address owner, uint256 maxSupply, address signerAddress, address feeRecipient, DTOs.Recipient[] memory recipients, address erc721Address ) external; } interface IMetadataResolver { function setBaseURI(address _address, string memory _baseURI) external; } contract ERC721ProxyFactory is Ownable, SignatureProtected { address public paymentRecipient; address public erc721Address; mapping(string => address) allowedMinters; string public metadataBaseUrl; IMetadataResolver public metadataResolver; event NewContract( string indexed iuuid, string uuid, address token, address minter, uint256[] extras ); constructor( address _erc721Address, string memory _metadataBaseUrl, address _metadataResolverAddress, address _signerAddress, address _paymentRecipient ) { paymentRecipient = _paymentRecipient; erc721Address = _erc721Address; metadataBaseUrl = _metadataBaseUrl; metadataResolver = IMetadataResolver(_metadataResolverAddress); initSignatureProtected(_signerAddress); } // Only Owner function setERC721Address(address _erc721Address) external onlyOwner { erc721Address = _erc721Address; } function addAllowedMinter( string memory _type, address _address ) external onlyOwner { allowedMinters[_type] = _address; } function removeAllowedMinter(string memory _type) external onlyOwner { delete allowedMinters[_type]; } function getAllowedMinterByKind( string memory kind ) public view returns (address) { require( allowedMinters[kind] != address(0), "No contract found for the given kind" ); return allowedMinters[kind]; } function setMetadataResolverAddress( address _metadataResolverAddress ) external onlyOwner { metadataResolver = IMetadataResolver(_metadataResolverAddress); } function setMetadataBaseUrl( string memory _metadataBaseUrl ) external onlyOwner { metadataBaseUrl = _metadataBaseUrl; } function setPaymentRecipient(address _paymentRecipient) external onlyOwner { paymentRecipient = _paymentRecipient; } // Public function create( DTOs.Create721ContractDto calldata _createDto ) external payable { validateSignature( abi.encodePacked( keccak256(abi.encodePacked(_createDto.uuid)), _createDto.paymentAmount, _createDto.extras ), _createDto.signature ); handlePayment(_createDto.paymentAmount); address cloneErc721Address = Clones.clone(erc721Address); IERC721 erc721 = IERC721(cloneErc721Address); erc721.init( _createDto.owner, _createDto.royaltyPercentage, _createDto.name, _createDto.symbol, _createDto.transferLocked, address(metadataResolver) ); address cloneMinterAddress = Clones.clone( getAllowedMinterByKind(_createDto.minterKind) ); IMinter minter = IMinter(cloneMinterAddress); minter.init( _createDto.owner, _createDto.maxSupply, _createDto.signer, paymentRecipient, _createDto.recipients, cloneErc721Address ); erc721.addMinter(cloneMinterAddress); erc721.transferOwnership(_createDto.owner); metadataResolver.setBaseURI( cloneErc721Address, string(abi.encodePacked(metadataBaseUrl, _createDto.uuid, "/")) ); emit NewContract( _createDto.uuid, _createDto.uuid, cloneErc721Address, cloneMinterAddress, _createDto.extras ); } function handlePayment(uint256 paymentAmount) internal { if (paymentAmount == 0) { return; } require( msg.value >= paymentAmount, "The payment amount has not been satisfied" ); (bool success, ) = address(paymentRecipient).call{value: msg.value}(""); require(success, "Payable: Transfer failed"); } function encodeBytes32String( string memory source ) private pure returns (bytes32 result) { bytes memory tempBytes = bytes(source); if (tempBytes.length == 0) { return 0x0; } assembly { result := mload(add(tempBytes, 32)) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol) pragma solidity ^0.8.20; import {IAccessControl} from "./IAccessControl.sol"; import {Context} from "../utils/Context.sol"; import {ERC165} from "../utils/introspection/ERC165.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ```solidity * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ```solidity * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules} * to enforce additional security measures for this role. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address account => bool) hasRole; bytes32 adminRole; } mapping(bytes32 role => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with an {AccessControlUnauthorizedAccount} error including the required role. */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual returns (bool) { return _roles[role].hasRole[account]; } /** * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()` * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier. */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account` * is missing `role`. */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert AccessControlUnauthorizedAccount(account, role); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `callerConfirmation`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address callerConfirmation) public virtual { if (callerConfirmation != _msgSender()) { revert AccessControlBadConfirmation(); } _revokeRole(role, callerConfirmation); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual returns (bool) { if (!hasRole(role, account)) { _roles[role].hasRole[account] = true; emit RoleGranted(role, account, _msgSender()); return true; } else { return false; } } /** * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual returns (bool) { if (hasRole(role, account)) { _roles[role].hasRole[account] = false; emit RoleRevoked(role, account, _msgSender()); return true; } else { return false; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol) pragma solidity ^0.8.20; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev The `account` is missing a role. */ error AccessControlUnauthorizedAccount(address account, bytes32 neededRole); /** * @dev The caller of a function is not the expected one. * * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}. */ error AccessControlBadConfirmation(); /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `callerConfirmation`. */ function renounceRole(bytes32 role, address callerConfirmation) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; import {Context} from "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (proxy/Clones.sol) pragma solidity ^0.8.20; /** * @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. */ library Clones { /** * @dev A clone instance deployment failed. */ error ERC1167FailedCreateClone(); /** * @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) { /// @solidity memory-safe-assembly assembly { // Cleans the upper 96 bits of the `implementation` word, then packs the first 3 bytes // of the `implementation` address with the bytecode before the address. mstore(0x00, or(shr(0xe8, shl(0x60, implementation)), 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000)) // Packs the remaining 17 bytes of `implementation` with the bytecode after the address. mstore(0x20, or(shl(0x78, implementation), 0x5af43d82803e903d91602b57fd5bf3)) instance := create(0, 0x09, 0x37) } if (instance == address(0)) { revert ERC1167FailedCreateClone(); } } /** * @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) { /// @solidity memory-safe-assembly assembly { // Cleans the upper 96 bits of the `implementation` word, then packs the first 3 bytes // of the `implementation` address with the bytecode before the address. mstore(0x00, or(shr(0xe8, shl(0x60, implementation)), 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000)) // Packs the remaining 17 bytes of `implementation` with the bytecode after the address. mstore(0x20, or(shl(0x78, implementation), 0x5af43d82803e903d91602b57fd5bf3)) instance := create2(0, 0x09, 0x37, salt) } if (instance == address(0)) { revert ERC1167FailedCreateClone(); } } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress( address implementation, bytes32 salt, address deployer ) internal pure returns (address predicted) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(add(ptr, 0x38), deployer) mstore(add(ptr, 0x24), 0x5af43d82803e903d91602b57fd5bf3ff) mstore(add(ptr, 0x14), implementation) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73) mstore(add(ptr, 0x58), salt) mstore(add(ptr, 0x78), keccak256(add(ptr, 0x0c), 0x37)) predicted := keccak256(add(ptr, 0x43), 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)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.20; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS } /** * @dev The signature derives the `address(0)`. */ error ECDSAInvalidSignature(); /** * @dev The signature has an invalid length. */ error ECDSAInvalidSignatureLength(uint256 length); /** * @dev The signature has an S value that is in the upper half order. */ error ECDSAInvalidSignatureS(bytes32 s); /** * @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not * return address(0) without also returning an error description. Errors are documented using an enum (error type) * and a bytes32 providing additional information about the error. * * If no error is returned, then the address can be used for verification purposes. * * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError, bytes32) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength, bytes32(signature.length)); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, signature); _throwError(error, errorArg); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] */ function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError, bytes32) { unchecked { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); // We do not check for an overflow here since the shift operation results in 0 or 1. uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. */ function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) { (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, r, vs); _throwError(error, errorArg); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError, bytes32) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS, s); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature, bytes32(0)); } return (signer, RecoverError.NoError, bytes32(0)); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, v, r, s); _throwError(error, errorArg); return recovered; } /** * @dev Optionally reverts with the corresponding custom error according to the `error` argument provided. */ function _throwError(RecoverError error, bytes32 errorArg) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert ECDSAInvalidSignature(); } else if (error == RecoverError.InvalidSignatureLength) { revert ECDSAInvalidSignatureLength(uint256(errorArg)); } else if (error == RecoverError.InvalidSignatureS) { revert ECDSAInvalidSignatureS(errorArg); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol) pragma solidity ^0.8.20; import {IERC165} from "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; library DTOs { struct Recipient { address addr; uint256 percentage; } struct Create721ContractDto { address owner; string uuid; string name; string symbol; bool transferLocked; uint96 royaltyPercentage; uint256 maxSupply; address signer; Recipient[] recipients; uint256 paymentAmount; string minterKind; uint256[] extras; bytes signature; } struct Create1155ContractDto { address owner; string uuid; string name; string symbol; bool transferLocked; uint96 royaltyPercentage; uint256[] availableTokens; address signer; Recipient[] recipients; uint256 paymentAmount; string minterKind; uint256[] extras; bytes signature; } }
// SPDX-License-Identifier: MIT // @author: Buildtree - Powered by NFT Studios pragma solidity ^0.8.18; import "@openzeppelin/contracts/access/Ownable.sol"; import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol"; abstract contract SignatureProtected is Ownable { address public signerAddress; constructor() Ownable(msg.sender) {} function initSignatureProtected(address _signerAddress) internal { signerAddress = _signerAddress; } function setSignerAddress(address _signerAddress) external onlyOwner { signerAddress = _signerAddress; } function validateSignature( bytes memory packedParams, bytes calldata signature ) internal view { require( ECDSA.recover(generateHash(packedParams), signature) == signerAddress, "SignatureProtected: Invalid signature for the caller" ); } function generateHash( bytes memory packedParams ) private view returns (bytes32) { bytes32 _hash = keccak256( bytes.concat( abi.encodePacked(address(this), msg.sender), packedParams ) ); bytes memory result = abi.encodePacked( "\x19Ethereum Signed Message:\n32", _hash ); return keccak256(result); } }
{ "evmVersion": "paris", "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_erc721Address","type":"address"},{"internalType":"string","name":"_metadataBaseUrl","type":"string"},{"internalType":"address","name":"_metadataResolverAddress","type":"address"},{"internalType":"address","name":"_signerAddress","type":"address"},{"internalType":"address","name":"_paymentRecipient","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ECDSAInvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"name":"ECDSAInvalidSignatureLength","type":"error"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"ECDSAInvalidSignatureS","type":"error"},{"inputs":[],"name":"ERC1167FailedCreateClone","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"iuuid","type":"string"},{"indexed":false,"internalType":"string","name":"uuid","type":"string"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"extras","type":"uint256[]"}],"name":"NewContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"string","name":"_type","type":"string"},{"internalType":"address","name":"_address","type":"address"}],"name":"addAllowedMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"string","name":"uuid","type":"string"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"bool","name":"transferLocked","type":"bool"},{"internalType":"uint96","name":"royaltyPercentage","type":"uint96"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"address","name":"signer","type":"address"},{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"percentage","type":"uint256"}],"internalType":"struct DTOs.Recipient[]","name":"recipients","type":"tuple[]"},{"internalType":"uint256","name":"paymentAmount","type":"uint256"},{"internalType":"string","name":"minterKind","type":"string"},{"internalType":"uint256[]","name":"extras","type":"uint256[]"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct DTOs.Create721ContractDto","name":"_createDto","type":"tuple"}],"name":"create","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"erc721Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"kind","type":"string"}],"name":"getAllowedMinterByKind","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataBaseUrl","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataResolver","outputs":[{"internalType":"contract IMetadataResolver","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_type","type":"string"}],"name":"removeAllowedMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_erc721Address","type":"address"}],"name":"setERC721Address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_metadataBaseUrl","type":"string"}],"name":"setMetadataBaseUrl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_metadataResolverAddress","type":"address"}],"name":"setMetadataResolverAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_paymentRecipient","type":"address"}],"name":"setPaymentRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signerAddress","type":"address"}],"name":"setSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162003257380380620032578339818101604052810190620000379190620004b0565b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000ad5760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620000a4919062000568565b60405180910390fd5b620000be81620001b060201b60201c565b5080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508360059081620001529190620007d0565b5082600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620001a5826200027460201b60201c565b5050505050620008b7565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002f982620002cc565b9050919050565b6200030b81620002ec565b81146200031757600080fd5b50565b6000815190506200032b8162000300565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000386826200033b565b810181811067ffffffffffffffff82111715620003a857620003a76200034c565b5b80604052505050565b6000620003bd620002b8565b9050620003cb82826200037b565b919050565b600067ffffffffffffffff821115620003ee57620003ed6200034c565b5b620003f9826200033b565b9050602081019050919050565b60005b838110156200042657808201518184015260208101905062000409565b60008484015250505050565b6000620004496200044384620003d0565b620003b1565b90508281526020810184848401111562000468576200046762000336565b5b6200047584828562000406565b509392505050565b600082601f83011262000495576200049462000331565b5b8151620004a784826020860162000432565b91505092915050565b600080600080600060a08688031215620004cf57620004ce620002c2565b5b6000620004df888289016200031a565b955050602086015167ffffffffffffffff811115620005035762000502620002c7565b5b62000511888289016200047d565b945050604062000524888289016200031a565b935050606062000537888289016200031a565b92505060806200054a888289016200031a565b9150509295509295909350565b6200056281620002ec565b82525050565b60006020820190506200057f600083018462000557565b92915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620005d857607f821691505b602082108103620005ee57620005ed62000590565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620006587fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000619565b62000664868362000619565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620006b1620006ab620006a5846200067c565b62000686565b6200067c565b9050919050565b6000819050919050565b620006cd8362000690565b620006e5620006dc82620006b8565b84845462000626565b825550505050565b600090565b620006fc620006ed565b62000709818484620006c2565b505050565b5b81811015620007315762000725600082620006f2565b6001810190506200070f565b5050565b601f82111562000780576200074a81620005f4565b620007558462000609565b8101602085101562000765578190505b6200077d620007748562000609565b8301826200070e565b50505b505050565b600082821c905092915050565b6000620007a56000198460080262000785565b1980831691505092915050565b6000620007c0838362000792565b9150826002028217905092915050565b620007db8262000585565b67ffffffffffffffff811115620007f757620007f66200034c565b5b620008038254620005bf565b6200081082828562000735565b600060209050601f83116001811462000848576000841562000833578287015190505b6200083f8582620007b2565b865550620008af565b601f1984166200085886620005f4565b60005b8281101562000882578489015182556001820191506020850194506020810190506200085b565b86831015620008a257848901516200089e601f89168262000792565b8355505b6001600288020188555050505b505050505050565b61299080620008c76000396000f3fe6080604052600436106100fe5760003560e01c806349850822116100955780638da5cb5b116100645780638da5cb5b146102ec5780639a03d9a314610317578063a0c76f6214610340578063e1a8fd8e1461036b578063f2fde38b14610394576100fe565b8063498508221461026357806349f3f1a61461027f5780635b7633d0146102aa578063715018a6146102d5576100fe565b80632d76119d116100d15780632d76119d146101ab578063320fbc42146101d457806333d7b176146101fd5780634793a2b714610226576100fe565b8063046dc166146101035780632352a8641461012c5780632983c4b8146101575780632b1eaf2914610180575b600080fd5b34801561010f57600080fd5b5061012a600480360381019061012591906115a6565b6103bd565b005b34801561013857600080fd5b50610141610409565b60405161014e91906115e2565b60405180910390f35b34801561016357600080fd5b5061017e600480360381019061017991906115a6565b61042f565b005b34801561018c57600080fd5b5061019561047b565b6040516101a291906115e2565b60405180910390f35b3480156101b757600080fd5b506101d260048036038101906101cd9190611743565b6104a1565b005b3480156101e057600080fd5b506101fb60048036038101906101f69190611743565b6104bc565b005b34801561020957600080fd5b50610224600480360381019061021f91906115a6565b610508565b005b34801561023257600080fd5b5061024d60048036038101906102489190611743565b610554565b60405161025a91906115e2565b60405180910390f35b61027d600480360381019061027891906117b1565b610648565b005b34801561028b57600080fd5b50610294610b71565b6040516102a19190611879565b60405180910390f35b3480156102b657600080fd5b506102bf610bff565b6040516102cc91906115e2565b60405180910390f35b3480156102e157600080fd5b506102ea610c25565b005b3480156102f857600080fd5b50610301610c39565b60405161030e91906115e2565b60405180910390f35b34801561032357600080fd5b5061033e600480360381019061033991906115a6565b610c62565b005b34801561034c57600080fd5b50610355610cae565b60405161036291906118fa565b60405180910390f35b34801561037757600080fd5b50610392600480360381019061038d9190611915565b610cd4565b005b3480156103a057600080fd5b506103bb60048036038101906103b691906115a6565b610d3d565b005b6103c5610dc3565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610437610dc3565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6104a9610dc3565b80600590816104b89190611b7d565b5050565b6104c4610dc3565b6004816040516104d49190611c8b565b908152602001604051809103902060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550565b610510610dc3565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff1660048360405161057d9190611c8b565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f990611d14565b60405180910390fd5b6004826040516106129190611c8b565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6106d181806020019061065b9190611d43565b60405160200161066c929190611dcb565b60405160208183030381529060405280519060200120826101200135838061016001906106999190611de4565b6040516020016106ac9493929190611f08565b604051602081830303815290604052828061018001906106cc9190611f43565b610e4a565b6106df816101200135610f34565b600061070c600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611053565b905060008190508073ffffffffffffffffffffffffffffffffffffffff16634b700fc384600001602081019061074291906115a6565b8560a00160208101906107559190611fea565b8680604001906107659190611d43565b8880606001906107759190611d43565b8a6080016020810190610788919061204f565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518963ffffffff1660e01b81526004016107ce9897969594939291906120c7565b600060405180830381600087803b1580156107e857600080fd5b505af11580156107fc573d6000803e3d6000fd5b505050506000610866610861858061014001906108199190611d43565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050610554565b611053565b905060008190508073ffffffffffffffffffffffffffffffffffffffff1663d638aefb86600001602081019061089c91906115a6565b8760c001358860e00160208101906108b491906115a6565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168a8061010001906108e8919061213a565b8b6040518863ffffffff1660e01b815260040161090b979695949392919061230b565b600060405180830381600087803b15801561092557600080fd5b505af1158015610939573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff1663983b2d56836040518263ffffffff1660e01b815260040161097691906115e2565b600060405180830381600087803b15801561099057600080fd5b505af11580156109a4573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff1663f2fde38b8660000160208101906109d791906115a6565b6040518263ffffffff1660e01b81526004016109f391906115e2565b600060405180830381600087803b158015610a0d57600080fd5b505af1158015610a21573d6000803e3d6000fd5b50505050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166388433651856005888060200190610a769190611d43565b604051602001610a8893929190612444565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610ab4929190612475565b600060405180830381600087803b158015610ace57600080fd5b505af1158015610ae2573d6000803e3d6000fd5b50505050848060200190610af69190611d43565b604051610b04929190611dcb565b60405180910390207f33cbc8d9bff712d6199a0f3dc8bd053690efd03287805defdbee7a53a52f3660868060200190610b3d9190611d43565b87868a806101600190610b509190611de4565b604051610b6296959493929190612512565b60405180910390a25050505050565b60058054610b7e906119a0565b80601f0160208091040260200160405190810160405280929190818152602001828054610baa906119a0565b8015610bf75780601f10610bcc57610100808354040283529160200191610bf7565b820191906000526020600020905b815481529060010190602001808311610bda57829003601f168201915b505050505081565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610c2d610dc3565b610c376000611104565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610c6a610dc3565b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610cdc610dc3565b80600483604051610ced9190611c8b565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b610d45610dc3565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610db75760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610dae91906115e2565b60405180910390fd5b610dc081611104565b50565b610dcb6111c8565b73ffffffffffffffffffffffffffffffffffffffff16610de9610c39565b73ffffffffffffffffffffffffffffffffffffffff1614610e4857610e0c6111c8565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610e3f91906115e2565b60405180910390fd5b565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610ed9610e8f856111d0565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611254565b73ffffffffffffffffffffffffffffffffffffffff1614610f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f26906125db565b60405180910390fd5b505050565b60008103156110505780341015610f80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f779061266d565b60405180910390fd5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1634604051610fc8906126be565b60006040518083038185875af1925050503d8060008114611005576040519150601f19603f3d011682016040523d82523d6000602084013e61100a565b606091505b505090508061104e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110459061271f565b60405180910390fd5b505b50565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008260601b60e81c176000526e5af43d82803e903d91602b57fd5bf38260781b17602052603760096000f09050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110ff576040517fc2f868f400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b60008030336040516020016111e6929190612787565b604051602081830303815290604052836040516020016112079291906127ef565b604051602081830303815290604052805190602001209050600081604051602001611232919061285f565b6040516020818303038152906040529050808051906020012092505050919050565b6000806000806112648686611280565b92509250925061127482826112dc565b82935050505092915050565b600080600060418451036112c55760008060006020870151925060408701519150606087015160001a90506112b788828585611440565b9550955095505050506112d5565b60006002855160001b9250925092505b9250925092565b600060038111156112f0576112ef612885565b5b82600381111561130357611302612885565b5b031561143c576001600381111561131d5761131c612885565b5b8260038111156113305761132f612885565b5b03611367576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600381111561137b5761137a612885565b5b82600381111561138e5761138d612885565b5b036113d3578060001c6040517ffce698f70000000000000000000000000000000000000000000000000000000081526004016113ca91906128b4565b60405180910390fd5b6003808111156113e6576113e5612885565b5b8260038111156113f9576113f8612885565b5b0361143b57806040517fd78bce0c00000000000000000000000000000000000000000000000000000000815260040161143291906128de565b60405180910390fd5b5b5050565b60008060007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08460001c111561148057600060038592509250925061152a565b6000600188888888604051600081526020016040526040516114a59493929190612915565b6020604051602081039080840390855afa1580156114c7573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361151b57600060016000801b9350935093505061152a565b8060008060001b935093509350505b9450945094915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061157382611548565b9050919050565b61158381611568565b811461158e57600080fd5b50565b6000813590506115a08161157a565b92915050565b6000602082840312156115bc576115bb61153e565b5b60006115ca84828501611591565b91505092915050565b6115dc81611568565b82525050565b60006020820190506115f760008301846115d3565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61165082611607565b810181811067ffffffffffffffff8211171561166f5761166e611618565b5b80604052505050565b6000611682611534565b905061168e8282611647565b919050565b600067ffffffffffffffff8211156116ae576116ad611618565b5b6116b782611607565b9050602081019050919050565b82818337600083830152505050565b60006116e66116e184611693565b611678565b90508281526020810184848401111561170257611701611602565b5b61170d8482856116c4565b509392505050565b600082601f83011261172a576117296115fd565b5b813561173a8482602086016116d3565b91505092915050565b6000602082840312156117595761175861153e565b5b600082013567ffffffffffffffff81111561177757611776611543565b5b61178384828501611715565b91505092915050565b600080fd5b60006101a082840312156117a8576117a761178c565b5b81905092915050565b6000602082840312156117c7576117c661153e565b5b600082013567ffffffffffffffff8111156117e5576117e4611543565b5b6117f184828501611791565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611834578082015181840152602081019050611819565b60008484015250505050565b600061184b826117fa565b6118558185611805565b9350611865818560208601611816565b61186e81611607565b840191505092915050565b600060208201905081810360008301526118938184611840565b905092915050565b6000819050919050565b60006118c06118bb6118b684611548565b61189b565b611548565b9050919050565b60006118d2826118a5565b9050919050565b60006118e4826118c7565b9050919050565b6118f4816118d9565b82525050565b600060208201905061190f60008301846118eb565b92915050565b6000806040838503121561192c5761192b61153e565b5b600083013567ffffffffffffffff81111561194a57611949611543565b5b61195685828601611715565b925050602061196785828601611591565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806119b857607f821691505b6020821081036119cb576119ca611971565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302611a337fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826119f6565b611a3d86836119f6565b95508019841693508086168417925050509392505050565b6000819050919050565b6000611a7a611a75611a7084611a55565b61189b565b611a55565b9050919050565b6000819050919050565b611a9483611a5f565b611aa8611aa082611a81565b848454611a03565b825550505050565b600090565b611abd611ab0565b611ac8818484611a8b565b505050565b5b81811015611aec57611ae1600082611ab5565b600181019050611ace565b5050565b601f821115611b3157611b02816119d1565b611b0b846119e6565b81016020851015611b1a578190505b611b2e611b26856119e6565b830182611acd565b50505b505050565b600082821c905092915050565b6000611b5460001984600802611b36565b1980831691505092915050565b6000611b6d8383611b43565b9150826002028217905092915050565b611b86826117fa565b67ffffffffffffffff811115611b9f57611b9e611618565b5b611ba982546119a0565b611bb4828285611af0565b600060209050601f831160018114611be75760008415611bd5578287015190505b611bdf8582611b61565b865550611c47565b601f198416611bf5866119d1565b60005b82811015611c1d57848901518255600182019150602085019450602081019050611bf8565b86831015611c3a5784890151611c36601f891682611b43565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b6000611c65826117fa565b611c6f8185611c4f565b9350611c7f818560208601611816565b80840191505092915050565b6000611c978284611c5a565b915081905092915050565b7f4e6f20636f6e747261637420666f756e6420666f722074686520676976656e2060008201527f6b696e6400000000000000000000000000000000000000000000000000000000602082015250565b6000611cfe602483611805565b9150611d0982611ca2565b604082019050919050565b60006020820190508181036000830152611d2d81611cf1565b9050919050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112611d6057611d5f611d34565b5b80840192508235915067ffffffffffffffff821115611d8257611d81611d39565b5b602083019250600182023603831315611d9e57611d9d611d3e565b5b509250929050565b6000611db28385611c4f565b9350611dbf8385846116c4565b82840190509392505050565b6000611dd8828486611da6565b91508190509392505050565b60008083356001602003843603038112611e0157611e00611d34565b5b80840192508235915067ffffffffffffffff821115611e2357611e22611d39565b5b602083019250602082023603831315611e3f57611e3e611d3e565b5b509250929050565b6000819050919050565b6000819050919050565b611e6c611e6782611e47565b611e51565b82525050565b6000819050919050565b611e8d611e8882611a55565b611e72565b82525050565b600081905092915050565b600080fd5b82818337505050565b6000611eb88385611e93565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115611eeb57611eea611e9e565b5b602083029250611efc838584611ea3565b82840190509392505050565b6000611f148287611e5b565b602082019150611f248286611e7c565b602082019150611f35828486611eac565b915081905095945050505050565b60008083356001602003843603038112611f6057611f5f611d34565b5b80840192508235915067ffffffffffffffff821115611f8257611f81611d39565b5b602083019250600182023603831315611f9e57611f9d611d3e565b5b509250929050565b60006bffffffffffffffffffffffff82169050919050565b611fc781611fa6565b8114611fd257600080fd5b50565b600081359050611fe481611fbe565b92915050565b60006020828403121561200057611fff61153e565b5b600061200e84828501611fd5565b91505092915050565b60008115159050919050565b61202c81612017565b811461203757600080fd5b50565b60008135905061204981612023565b92915050565b6000602082840312156120655761206461153e565b5b60006120738482850161203a565b91505092915050565b61208581611fa6565b82525050565b60006120978385611805565b93506120a48385846116c4565b6120ad83611607565b840190509392505050565b6120c181612017565b82525050565b600060c0820190506120dc600083018b6115d3565b6120e9602083018a61207c565b81810360408301526120fc81888a61208b565b9050818103606083015261211181868861208b565b905061212060808301856120b8565b61212d60a08301846115d3565b9998505050505050505050565b6000808335600160200384360303811261215757612156611d34565b5b80840192508235915067ffffffffffffffff82111561217957612178611d39565b5b60208301925060408202360383131561219557612194611d3e565b5b509250929050565b6121a681611a55565b82525050565b600082825260208201905092915050565b6000819050919050565b60006121d66020840184611591565b905092915050565b6121e781611568565b82525050565b6121f681611a55565b811461220157600080fd5b50565b600081359050612213816121ed565b92915050565b60006122286020840184612204565b905092915050565b61223981611a55565b82525050565b6040820161225060008301836121c7565b61225d60008501826121de565b5061226b6020830183612219565b6122786020850182612230565b50505050565b600061228a838361223f565b60408301905092915050565b600082905092915050565b6000604082019050919050565b60006122ba83856121ac565b93506122c5826121bd565b8060005b858110156122fe576122db8284612296565b6122e5888261227e565b97506122f0836122a1565b9250506001810190506122c9565b5085925050509392505050565b600060c082019050612320600083018a6115d3565b61232d602083018961219d565b61233a60408301886115d3565b61234760608301876115d3565b818103608083015261235a8185876122ae565b905061236960a08301846115d3565b98975050505050505050565b60008154612382816119a0565b61238c8186611c4f565b945060018216600081146123a757600181146123bc576123ef565b60ff19831686528115158202860193506123ef565b6123c5856119d1565b60005b838110156123e7578154818901526001820191506020810190506123c8565b838801955050505b50505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b600061242e600183611c4f565b9150612439826123f8565b600182019050919050565b60006124508286612375565b915061245d828486611da6565b915061246882612421565b9150819050949350505050565b600060408201905061248a60008301856115d3565b818103602083015261249c8184611840565b90509392505050565b600082825260208201905092915050565b60006124c283856124a5565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156124f5576124f4611e9e565b5b602083029250612506838584611ea3565b82840190509392505050565b6000608082019050818103600083015261252d81888a61208b565b905061253c60208301876115d3565b61254960408301866115d3565b818103606083015261255c8184866124b6565b9050979650505050505050565b7f5369676e617475726550726f7465637465643a20496e76616c6964207369676e60008201527f617475726520666f72207468652063616c6c6572000000000000000000000000602082015250565b60006125c5603483611805565b91506125d082612569565b604082019050919050565b600060208201905081810360008301526125f4816125b8565b9050919050565b7f546865207061796d656e7420616d6f756e7420686173206e6f74206265656e2060008201527f7361746973666965640000000000000000000000000000000000000000000000602082015250565b6000612657602983611805565b9150612662826125fb565b604082019050919050565b600060208201905081810360008301526126868161264a565b9050919050565b600081905092915050565b50565b60006126a860008361268d565b91506126b382612698565b600082019050919050565b60006126c98261269b565b9150819050919050565b7f50617961626c653a205472616e73666572206661696c65640000000000000000600082015250565b6000612709601883611805565b9150612714826126d3565b602082019050919050565b60006020820190508181036000830152612738816126fc565b9050919050565b60008160601b9050919050565b60006127578261273f565b9050919050565b60006127698261274c565b9050919050565b61278161277c82611568565b61275e565b82525050565b60006127938285612770565b6014820191506127a38284612770565b6014820191508190509392505050565b600081519050919050565b60006127c9826127b3565b6127d3818561268d565b93506127e3818560208601611816565b80840191505092915050565b60006127fb82856127be565b915061280782846127be565b91508190509392505050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000612849601c83611c4f565b915061285482612813565b601c82019050919050565b600061286a8261283c565b91506128768284611e5b565b60208201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60006020820190506128c9600083018461219d565b92915050565b6128d881611e47565b82525050565b60006020820190506128f360008301846128cf565b92915050565b600060ff82169050919050565b61290f816128f9565b82525050565b600060808201905061292a60008301876128cf565b6129376020830186612906565b61294460408301856128cf565b61295160608301846128cf565b9594505050505056fea264697066735822122040f717bd313e5075173879fd0b6bae496c9395829f0b471b07ccc6592b7d131164736f6c63430008180033000000000000000000000000f05a81a18113f4ebfed9c3fa78bca7ec135dacc500000000000000000000000000000000000000000000000000000000000000a00000000000000000000000006ca81d6c500d8201dd46edd2f974caab533ef497000000000000000000000000e16c1623c1aa7d919cd2241d8b36d9e79c1be2a20000000000000000000000004e3cc25298325b95d916486fe87a2e813144c49a000000000000000000000000000000000000000000000000000000000000002f68747470733a2f2f636c6f7564666c6172652e6275696c64747265652e73657276696365732f6d657461646174612f0000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106100fe5760003560e01c806349850822116100955780638da5cb5b116100645780638da5cb5b146102ec5780639a03d9a314610317578063a0c76f6214610340578063e1a8fd8e1461036b578063f2fde38b14610394576100fe565b8063498508221461026357806349f3f1a61461027f5780635b7633d0146102aa578063715018a6146102d5576100fe565b80632d76119d116100d15780632d76119d146101ab578063320fbc42146101d457806333d7b176146101fd5780634793a2b714610226576100fe565b8063046dc166146101035780632352a8641461012c5780632983c4b8146101575780632b1eaf2914610180575b600080fd5b34801561010f57600080fd5b5061012a600480360381019061012591906115a6565b6103bd565b005b34801561013857600080fd5b50610141610409565b60405161014e91906115e2565b60405180910390f35b34801561016357600080fd5b5061017e600480360381019061017991906115a6565b61042f565b005b34801561018c57600080fd5b5061019561047b565b6040516101a291906115e2565b60405180910390f35b3480156101b757600080fd5b506101d260048036038101906101cd9190611743565b6104a1565b005b3480156101e057600080fd5b506101fb60048036038101906101f69190611743565b6104bc565b005b34801561020957600080fd5b50610224600480360381019061021f91906115a6565b610508565b005b34801561023257600080fd5b5061024d60048036038101906102489190611743565b610554565b60405161025a91906115e2565b60405180910390f35b61027d600480360381019061027891906117b1565b610648565b005b34801561028b57600080fd5b50610294610b71565b6040516102a19190611879565b60405180910390f35b3480156102b657600080fd5b506102bf610bff565b6040516102cc91906115e2565b60405180910390f35b3480156102e157600080fd5b506102ea610c25565b005b3480156102f857600080fd5b50610301610c39565b60405161030e91906115e2565b60405180910390f35b34801561032357600080fd5b5061033e600480360381019061033991906115a6565b610c62565b005b34801561034c57600080fd5b50610355610cae565b60405161036291906118fa565b60405180910390f35b34801561037757600080fd5b50610392600480360381019061038d9190611915565b610cd4565b005b3480156103a057600080fd5b506103bb60048036038101906103b691906115a6565b610d3d565b005b6103c5610dc3565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610437610dc3565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6104a9610dc3565b80600590816104b89190611b7d565b5050565b6104c4610dc3565b6004816040516104d49190611c8b565b908152602001604051809103902060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550565b610510610dc3565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff1660048360405161057d9190611c8b565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f990611d14565b60405180910390fd5b6004826040516106129190611c8b565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6106d181806020019061065b9190611d43565b60405160200161066c929190611dcb565b60405160208183030381529060405280519060200120826101200135838061016001906106999190611de4565b6040516020016106ac9493929190611f08565b604051602081830303815290604052828061018001906106cc9190611f43565b610e4a565b6106df816101200135610f34565b600061070c600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611053565b905060008190508073ffffffffffffffffffffffffffffffffffffffff16634b700fc384600001602081019061074291906115a6565b8560a00160208101906107559190611fea565b8680604001906107659190611d43565b8880606001906107759190611d43565b8a6080016020810190610788919061204f565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518963ffffffff1660e01b81526004016107ce9897969594939291906120c7565b600060405180830381600087803b1580156107e857600080fd5b505af11580156107fc573d6000803e3d6000fd5b505050506000610866610861858061014001906108199190611d43565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050610554565b611053565b905060008190508073ffffffffffffffffffffffffffffffffffffffff1663d638aefb86600001602081019061089c91906115a6565b8760c001358860e00160208101906108b491906115a6565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168a8061010001906108e8919061213a565b8b6040518863ffffffff1660e01b815260040161090b979695949392919061230b565b600060405180830381600087803b15801561092557600080fd5b505af1158015610939573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff1663983b2d56836040518263ffffffff1660e01b815260040161097691906115e2565b600060405180830381600087803b15801561099057600080fd5b505af11580156109a4573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff1663f2fde38b8660000160208101906109d791906115a6565b6040518263ffffffff1660e01b81526004016109f391906115e2565b600060405180830381600087803b158015610a0d57600080fd5b505af1158015610a21573d6000803e3d6000fd5b50505050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166388433651856005888060200190610a769190611d43565b604051602001610a8893929190612444565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610ab4929190612475565b600060405180830381600087803b158015610ace57600080fd5b505af1158015610ae2573d6000803e3d6000fd5b50505050848060200190610af69190611d43565b604051610b04929190611dcb565b60405180910390207f33cbc8d9bff712d6199a0f3dc8bd053690efd03287805defdbee7a53a52f3660868060200190610b3d9190611d43565b87868a806101600190610b509190611de4565b604051610b6296959493929190612512565b60405180910390a25050505050565b60058054610b7e906119a0565b80601f0160208091040260200160405190810160405280929190818152602001828054610baa906119a0565b8015610bf75780601f10610bcc57610100808354040283529160200191610bf7565b820191906000526020600020905b815481529060010190602001808311610bda57829003601f168201915b505050505081565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610c2d610dc3565b610c376000611104565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610c6a610dc3565b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610cdc610dc3565b80600483604051610ced9190611c8b565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b610d45610dc3565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610db75760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610dae91906115e2565b60405180910390fd5b610dc081611104565b50565b610dcb6111c8565b73ffffffffffffffffffffffffffffffffffffffff16610de9610c39565b73ffffffffffffffffffffffffffffffffffffffff1614610e4857610e0c6111c8565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610e3f91906115e2565b60405180910390fd5b565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610ed9610e8f856111d0565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611254565b73ffffffffffffffffffffffffffffffffffffffff1614610f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f26906125db565b60405180910390fd5b505050565b60008103156110505780341015610f80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f779061266d565b60405180910390fd5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1634604051610fc8906126be565b60006040518083038185875af1925050503d8060008114611005576040519150601f19603f3d011682016040523d82523d6000602084013e61100a565b606091505b505090508061104e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110459061271f565b60405180910390fd5b505b50565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008260601b60e81c176000526e5af43d82803e903d91602b57fd5bf38260781b17602052603760096000f09050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110ff576040517fc2f868f400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b60008030336040516020016111e6929190612787565b604051602081830303815290604052836040516020016112079291906127ef565b604051602081830303815290604052805190602001209050600081604051602001611232919061285f565b6040516020818303038152906040529050808051906020012092505050919050565b6000806000806112648686611280565b92509250925061127482826112dc565b82935050505092915050565b600080600060418451036112c55760008060006020870151925060408701519150606087015160001a90506112b788828585611440565b9550955095505050506112d5565b60006002855160001b9250925092505b9250925092565b600060038111156112f0576112ef612885565b5b82600381111561130357611302612885565b5b031561143c576001600381111561131d5761131c612885565b5b8260038111156113305761132f612885565b5b03611367576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600381111561137b5761137a612885565b5b82600381111561138e5761138d612885565b5b036113d3578060001c6040517ffce698f70000000000000000000000000000000000000000000000000000000081526004016113ca91906128b4565b60405180910390fd5b6003808111156113e6576113e5612885565b5b8260038111156113f9576113f8612885565b5b0361143b57806040517fd78bce0c00000000000000000000000000000000000000000000000000000000815260040161143291906128de565b60405180910390fd5b5b5050565b60008060007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08460001c111561148057600060038592509250925061152a565b6000600188888888604051600081526020016040526040516114a59493929190612915565b6020604051602081039080840390855afa1580156114c7573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361151b57600060016000801b9350935093505061152a565b8060008060001b935093509350505b9450945094915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061157382611548565b9050919050565b61158381611568565b811461158e57600080fd5b50565b6000813590506115a08161157a565b92915050565b6000602082840312156115bc576115bb61153e565b5b60006115ca84828501611591565b91505092915050565b6115dc81611568565b82525050565b60006020820190506115f760008301846115d3565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61165082611607565b810181811067ffffffffffffffff8211171561166f5761166e611618565b5b80604052505050565b6000611682611534565b905061168e8282611647565b919050565b600067ffffffffffffffff8211156116ae576116ad611618565b5b6116b782611607565b9050602081019050919050565b82818337600083830152505050565b60006116e66116e184611693565b611678565b90508281526020810184848401111561170257611701611602565b5b61170d8482856116c4565b509392505050565b600082601f83011261172a576117296115fd565b5b813561173a8482602086016116d3565b91505092915050565b6000602082840312156117595761175861153e565b5b600082013567ffffffffffffffff81111561177757611776611543565b5b61178384828501611715565b91505092915050565b600080fd5b60006101a082840312156117a8576117a761178c565b5b81905092915050565b6000602082840312156117c7576117c661153e565b5b600082013567ffffffffffffffff8111156117e5576117e4611543565b5b6117f184828501611791565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611834578082015181840152602081019050611819565b60008484015250505050565b600061184b826117fa565b6118558185611805565b9350611865818560208601611816565b61186e81611607565b840191505092915050565b600060208201905081810360008301526118938184611840565b905092915050565b6000819050919050565b60006118c06118bb6118b684611548565b61189b565b611548565b9050919050565b60006118d2826118a5565b9050919050565b60006118e4826118c7565b9050919050565b6118f4816118d9565b82525050565b600060208201905061190f60008301846118eb565b92915050565b6000806040838503121561192c5761192b61153e565b5b600083013567ffffffffffffffff81111561194a57611949611543565b5b61195685828601611715565b925050602061196785828601611591565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806119b857607f821691505b6020821081036119cb576119ca611971565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302611a337fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826119f6565b611a3d86836119f6565b95508019841693508086168417925050509392505050565b6000819050919050565b6000611a7a611a75611a7084611a55565b61189b565b611a55565b9050919050565b6000819050919050565b611a9483611a5f565b611aa8611aa082611a81565b848454611a03565b825550505050565b600090565b611abd611ab0565b611ac8818484611a8b565b505050565b5b81811015611aec57611ae1600082611ab5565b600181019050611ace565b5050565b601f821115611b3157611b02816119d1565b611b0b846119e6565b81016020851015611b1a578190505b611b2e611b26856119e6565b830182611acd565b50505b505050565b600082821c905092915050565b6000611b5460001984600802611b36565b1980831691505092915050565b6000611b6d8383611b43565b9150826002028217905092915050565b611b86826117fa565b67ffffffffffffffff811115611b9f57611b9e611618565b5b611ba982546119a0565b611bb4828285611af0565b600060209050601f831160018114611be75760008415611bd5578287015190505b611bdf8582611b61565b865550611c47565b601f198416611bf5866119d1565b60005b82811015611c1d57848901518255600182019150602085019450602081019050611bf8565b86831015611c3a5784890151611c36601f891682611b43565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b6000611c65826117fa565b611c6f8185611c4f565b9350611c7f818560208601611816565b80840191505092915050565b6000611c978284611c5a565b915081905092915050565b7f4e6f20636f6e747261637420666f756e6420666f722074686520676976656e2060008201527f6b696e6400000000000000000000000000000000000000000000000000000000602082015250565b6000611cfe602483611805565b9150611d0982611ca2565b604082019050919050565b60006020820190508181036000830152611d2d81611cf1565b9050919050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112611d6057611d5f611d34565b5b80840192508235915067ffffffffffffffff821115611d8257611d81611d39565b5b602083019250600182023603831315611d9e57611d9d611d3e565b5b509250929050565b6000611db28385611c4f565b9350611dbf8385846116c4565b82840190509392505050565b6000611dd8828486611da6565b91508190509392505050565b60008083356001602003843603038112611e0157611e00611d34565b5b80840192508235915067ffffffffffffffff821115611e2357611e22611d39565b5b602083019250602082023603831315611e3f57611e3e611d3e565b5b509250929050565b6000819050919050565b6000819050919050565b611e6c611e6782611e47565b611e51565b82525050565b6000819050919050565b611e8d611e8882611a55565b611e72565b82525050565b600081905092915050565b600080fd5b82818337505050565b6000611eb88385611e93565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115611eeb57611eea611e9e565b5b602083029250611efc838584611ea3565b82840190509392505050565b6000611f148287611e5b565b602082019150611f248286611e7c565b602082019150611f35828486611eac565b915081905095945050505050565b60008083356001602003843603038112611f6057611f5f611d34565b5b80840192508235915067ffffffffffffffff821115611f8257611f81611d39565b5b602083019250600182023603831315611f9e57611f9d611d3e565b5b509250929050565b60006bffffffffffffffffffffffff82169050919050565b611fc781611fa6565b8114611fd257600080fd5b50565b600081359050611fe481611fbe565b92915050565b60006020828403121561200057611fff61153e565b5b600061200e84828501611fd5565b91505092915050565b60008115159050919050565b61202c81612017565b811461203757600080fd5b50565b60008135905061204981612023565b92915050565b6000602082840312156120655761206461153e565b5b60006120738482850161203a565b91505092915050565b61208581611fa6565b82525050565b60006120978385611805565b93506120a48385846116c4565b6120ad83611607565b840190509392505050565b6120c181612017565b82525050565b600060c0820190506120dc600083018b6115d3565b6120e9602083018a61207c565b81810360408301526120fc81888a61208b565b9050818103606083015261211181868861208b565b905061212060808301856120b8565b61212d60a08301846115d3565b9998505050505050505050565b6000808335600160200384360303811261215757612156611d34565b5b80840192508235915067ffffffffffffffff82111561217957612178611d39565b5b60208301925060408202360383131561219557612194611d3e565b5b509250929050565b6121a681611a55565b82525050565b600082825260208201905092915050565b6000819050919050565b60006121d66020840184611591565b905092915050565b6121e781611568565b82525050565b6121f681611a55565b811461220157600080fd5b50565b600081359050612213816121ed565b92915050565b60006122286020840184612204565b905092915050565b61223981611a55565b82525050565b6040820161225060008301836121c7565b61225d60008501826121de565b5061226b6020830183612219565b6122786020850182612230565b50505050565b600061228a838361223f565b60408301905092915050565b600082905092915050565b6000604082019050919050565b60006122ba83856121ac565b93506122c5826121bd565b8060005b858110156122fe576122db8284612296565b6122e5888261227e565b97506122f0836122a1565b9250506001810190506122c9565b5085925050509392505050565b600060c082019050612320600083018a6115d3565b61232d602083018961219d565b61233a60408301886115d3565b61234760608301876115d3565b818103608083015261235a8185876122ae565b905061236960a08301846115d3565b98975050505050505050565b60008154612382816119a0565b61238c8186611c4f565b945060018216600081146123a757600181146123bc576123ef565b60ff19831686528115158202860193506123ef565b6123c5856119d1565b60005b838110156123e7578154818901526001820191506020810190506123c8565b838801955050505b50505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b600061242e600183611c4f565b9150612439826123f8565b600182019050919050565b60006124508286612375565b915061245d828486611da6565b915061246882612421565b9150819050949350505050565b600060408201905061248a60008301856115d3565b818103602083015261249c8184611840565b90509392505050565b600082825260208201905092915050565b60006124c283856124a5565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156124f5576124f4611e9e565b5b602083029250612506838584611ea3565b82840190509392505050565b6000608082019050818103600083015261252d81888a61208b565b905061253c60208301876115d3565b61254960408301866115d3565b818103606083015261255c8184866124b6565b9050979650505050505050565b7f5369676e617475726550726f7465637465643a20496e76616c6964207369676e60008201527f617475726520666f72207468652063616c6c6572000000000000000000000000602082015250565b60006125c5603483611805565b91506125d082612569565b604082019050919050565b600060208201905081810360008301526125f4816125b8565b9050919050565b7f546865207061796d656e7420616d6f756e7420686173206e6f74206265656e2060008201527f7361746973666965640000000000000000000000000000000000000000000000602082015250565b6000612657602983611805565b9150612662826125fb565b604082019050919050565b600060208201905081810360008301526126868161264a565b9050919050565b600081905092915050565b50565b60006126a860008361268d565b91506126b382612698565b600082019050919050565b60006126c98261269b565b9150819050919050565b7f50617961626c653a205472616e73666572206661696c65640000000000000000600082015250565b6000612709601883611805565b9150612714826126d3565b602082019050919050565b60006020820190508181036000830152612738816126fc565b9050919050565b60008160601b9050919050565b60006127578261273f565b9050919050565b60006127698261274c565b9050919050565b61278161277c82611568565b61275e565b82525050565b60006127938285612770565b6014820191506127a38284612770565b6014820191508190509392505050565b600081519050919050565b60006127c9826127b3565b6127d3818561268d565b93506127e3818560208601611816565b80840191505092915050565b60006127fb82856127be565b915061280782846127be565b91508190509392505050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000612849601c83611c4f565b915061285482612813565b601c82019050919050565b600061286a8261283c565b91506128768284611e5b565b60208201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60006020820190506128c9600083018461219d565b92915050565b6128d881611e47565b82525050565b60006020820190506128f360008301846128cf565b92915050565b600060ff82169050919050565b61290f816128f9565b82525050565b600060808201905061292a60008301876128cf565b6129376020830186612906565b61294460408301856128cf565b61295160608301846128cf565b9594505050505056fea264697066735822122040f717bd313e5075173879fd0b6bae496c9395829f0b471b07ccc6592b7d131164736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f05a81a18113f4ebfed9c3fa78bca7ec135dacc500000000000000000000000000000000000000000000000000000000000000a00000000000000000000000006ca81d6c500d8201dd46edd2f974caab533ef497000000000000000000000000e16c1623c1aa7d919cd2241d8b36d9e79c1be2a20000000000000000000000004e3cc25298325b95d916486fe87a2e813144c49a000000000000000000000000000000000000000000000000000000000000002f68747470733a2f2f636c6f7564666c6172652e6275696c64747265652e73657276696365732f6d657461646174612f0000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _erc721Address (address): 0xF05A81a18113F4ebFED9C3fa78bCa7ec135dacC5
Arg [1] : _metadataBaseUrl (string): https://cloudflare.buildtree.services/metadata/
Arg [2] : _metadataResolverAddress (address): 0x6Ca81d6C500d8201dd46eDd2F974cAab533ef497
Arg [3] : _signerAddress (address): 0xe16C1623c1AA7D919cd2241d8b36d9E79C1Be2A2
Arg [4] : _paymentRecipient (address): 0x4E3cC25298325B95D916486fe87A2e813144c49a
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 000000000000000000000000f05a81a18113f4ebfed9c3fa78bca7ec135dacc5
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000006ca81d6c500d8201dd46edd2f974caab533ef497
Arg [3] : 000000000000000000000000e16c1623c1aa7d919cd2241d8b36d9e79c1be2a2
Arg [4] : 0000000000000000000000004e3cc25298325b95d916486fe87a2e813144c49a
Arg [5] : 000000000000000000000000000000000000000000000000000000000000002f
Arg [6] : 68747470733a2f2f636c6f7564666c6172652e6275696c64747265652e736572
Arg [7] : 76696365732f6d657461646174612f0000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.