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:
ERC1155ProxyFactory
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 IERC1155 { 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, address signerAddress, address feeRecipient, uint256[] memory availableTokens, DTOs.Recipient[] memory recipients, address erc1155Address ) external; } interface IMetadataResolver { function setBaseURI(address _address, string memory _baseURI) external; } contract ERC1155ProxyFactory is Ownable, SignatureProtected { address public paymentRecipient; address public erc1155Address; 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 _erc1155Address, string memory _metadataBaseUrl, address _metadataResolverAddress, address _signerAddress, address _paymentRecipient ) { paymentRecipient = _paymentRecipient; erc1155Address = _erc1155Address; metadataBaseUrl = _metadataBaseUrl; metadataResolver = IMetadataResolver(_metadataResolverAddress); initSignatureProtected(_signerAddress); } // Only Owner function setERC721Address(address _erc1155Address) external onlyOwner { erc1155Address = _erc1155Address; } 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.Create1155ContractDto calldata _createDto ) external payable { validateSignature( abi.encodePacked( keccak256(abi.encodePacked(_createDto.uuid)), _createDto.paymentAmount, _createDto.extras ), _createDto.signature ); handlePayment(_createDto.paymentAmount); address cloneErc1155Address = Clones.clone(erc1155Address); IERC1155 erc1155 = IERC1155(cloneErc1155Address); erc1155.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.signer, paymentRecipient, _createDto.availableTokens, _createDto.recipients, cloneErc1155Address ); erc1155.addMinter(cloneMinterAddress); erc1155.transferOwnership(_createDto.owner); metadataResolver.setBaseURI( cloneErc1155Address, string(abi.encodePacked(metadataBaseUrl, _createDto.uuid, "/")) ); emit NewContract( _createDto.uuid, _createDto.uuid, cloneErc1155Address, 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" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_erc1155Address","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":"availableTokens","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.Create1155ContractDto","name":"_createDto","type":"tuple"}],"name":"create","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"erc1155Address","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":"_erc1155Address","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
60806040523480156200001157600080fd5b506040516200326c3803806200326c8339818101604052810190620000379190620004b0565b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000ad5760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620000a4919062000568565b60405180910390fd5b620000be81620001b060201b60201c565b5080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508360059081620001529190620007d0565b5082600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620001a5826200027460201b60201c565b5050505050620008b7565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002f982620002cc565b9050919050565b6200030b81620002ec565b81146200031757600080fd5b50565b6000815190506200032b8162000300565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000386826200033b565b810181811067ffffffffffffffff82111715620003a857620003a76200034c565b5b80604052505050565b6000620003bd620002b8565b9050620003cb82826200037b565b919050565b600067ffffffffffffffff821115620003ee57620003ed6200034c565b5b620003f9826200033b565b9050602081019050919050565b60005b838110156200042657808201518184015260208101905062000409565b60008484015250505050565b6000620004496200044384620003d0565b620003b1565b90508281526020810184848401111562000468576200046762000336565b5b6200047584828562000406565b509392505050565b600082601f83011262000495576200049462000331565b5b8151620004a784826020860162000432565b91505092915050565b600080600080600060a08688031215620004cf57620004ce620002c2565b5b6000620004df888289016200031a565b955050602086015167ffffffffffffffff811115620005035762000502620002c7565b5b62000511888289016200047d565b945050604062000524888289016200031a565b935050606062000537888289016200031a565b92505060806200054a888289016200031a565b9150509295509295909350565b6200056281620002ec565b82525050565b60006020820190506200057f600083018462000557565b92915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620005d857607f821691505b602082108103620005ee57620005ed62000590565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620006587fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000619565b62000664868362000619565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620006b1620006ab620006a5846200067c565b62000686565b6200067c565b9050919050565b6000819050919050565b620006cd8362000690565b620006e5620006dc82620006b8565b84845462000626565b825550505050565b600090565b620006fc620006ed565b62000709818484620006c2565b505050565b5b81811015620007315762000725600082620006f2565b6001810190506200070f565b5050565b601f82111562000780576200074a81620005f4565b620007558462000609565b8101602085101562000765578190505b6200077d620007748562000609565b8301826200070e565b50505b505050565b600082821c905092915050565b6000620007a56000198460080262000785565b1980831691505092915050565b6000620007c0838362000792565b9150826002028217905092915050565b620007db8262000585565b67ffffffffffffffff811115620007f757620007f66200034c565b5b620008038254620005bf565b6200081082828562000735565b600060209050601f83116001811462000848576000841562000833578287015190505b6200083f8582620007b2565b865550620008af565b601f1984166200085886620005f4565b60005b8281101562000882578489015182556001820191506020850194506020810190506200085b565b86831015620008a257848901516200089e601f89168262000792565b8355505b6001600288020188555050505b505050505050565b6129a580620008c76000396000f3fe6080604052600436106100fe5760003560e01c806349f3f1a611610095578063984817241161006457806398481724146102fb5780639a03d9a314610317578063a0c76f6214610340578063e1a8fd8e1461036b578063f2fde38b14610394576100fe565b806349f3f1a6146102635780635b7633d01461028e578063715018a6146102b95780638da5cb5b146102d0576100fe565b80632d76119d116100d15780632d76119d146101ab578063320fbc42146101d457806333d7b176146101fd5780634793a2b714610226576100fe565b8063046dc16614610103578063051420021461012c5780632983c4b8146101575780632b1eaf2914610180575b600080fd5b34801561010f57600080fd5b5061012a600480360381019061012591906115b2565b6103bd565b005b34801561013857600080fd5b50610141610409565b60405161014e91906115ee565b60405180910390f35b34801561016357600080fd5b5061017e600480360381019061017991906115b2565b61042f565b005b34801561018c57600080fd5b5061019561047b565b6040516101a291906115ee565b60405180910390f35b3480156101b757600080fd5b506101d260048036038101906101cd919061174f565b6104a1565b005b3480156101e057600080fd5b506101fb60048036038101906101f6919061174f565b6104bc565b005b34801561020957600080fd5b50610224600480360381019061021f91906115b2565b610508565b005b34801561023257600080fd5b5061024d6004803603810190610248919061174f565b610554565b60405161025a91906115ee565b60405180910390f35b34801561026f57600080fd5b50610278610648565b6040516102859190611817565b60405180910390f35b34801561029a57600080fd5b506102a36106d6565b6040516102b091906115ee565b60405180910390f35b3480156102c557600080fd5b506102ce6106fc565b005b3480156102dc57600080fd5b506102e5610710565b6040516102f291906115ee565b60405180910390f35b6103156004803603810190610310919061185e565b610739565b005b34801561032357600080fd5b5061033e600480360381019061033991906115b2565b610c6e565b005b34801561034c57600080fd5b50610355610cba565b6040516103629190611906565b60405180910390f35b34801561037757600080fd5b50610392600480360381019061038d9190611921565b610ce0565b005b3480156103a057600080fd5b506103bb60048036038101906103b691906115b2565b610d49565b005b6103c5610dcf565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610437610dcf565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6104a9610dcf565b80600590816104b89190611b89565b5050565b6104c4610dcf565b6004816040516104d49190611c97565b908152602001604051809103902060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550565b610510610dcf565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff1660048360405161057d9190611c97565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f990611d20565b60405180910390fd5b6004826040516106129190611c97565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60058054610655906119ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610681906119ac565b80156106ce5780601f106106a3576101008083540402835291602001916106ce565b820191906000526020600020905b8154815290600101906020018083116106b157829003601f168201915b505050505081565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610704610dcf565b61070e6000610e56565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6107c281806020019061074c9190611d4f565b60405160200161075d929190611dd7565b604051602081830303815290604052805190602001208261012001358380610160019061078a9190611df0565b60405160200161079d9493929190611f14565b604051602081830303815290604052828061018001906107bd9190611f4f565b610f1a565b6107d0816101200135611004565b60006107fd600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611123565b905060008190508073ffffffffffffffffffffffffffffffffffffffff16634b700fc384600001602081019061083391906115b2565b8560a00160208101906108469190611ff6565b8680604001906108569190611d4f565b8880606001906108669190611d4f565b8a6080016020810190610879919061205b565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518963ffffffff1660e01b81526004016108bf9897969594939291906120d3565b600060405180830381600087803b1580156108d957600080fd5b505af11580156108ed573d6000803e3d6000fd5b5050505060006109576109528580610140019061090a9190611d4f565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050610554565b611123565b905060008190508073ffffffffffffffffffffffffffffffffffffffff1663128a3abf86600001602081019061098d91906115b2565b8760e00160208101906109a091906115b2565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16898060c001906109d39190611df0565b8b8061010001906109e49190612146565b8c6040518963ffffffff1660e01b8152600401610a08989796959493929190612375565b600060405180830381600087803b158015610a2257600080fd5b505af1158015610a36573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff1663983b2d56836040518263ffffffff1660e01b8152600401610a7391906115ee565b600060405180830381600087803b158015610a8d57600080fd5b505af1158015610aa1573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff1663f2fde38b866000016020810190610ad491906115b2565b6040518263ffffffff1660e01b8152600401610af091906115ee565b600060405180830381600087803b158015610b0a57600080fd5b505af1158015610b1e573d6000803e3d6000fd5b50505050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166388433651856005888060200190610b739190611d4f565b604051602001610b85939291906124b7565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610bb19291906124e8565b600060405180830381600087803b158015610bcb57600080fd5b505af1158015610bdf573d6000803e3d6000fd5b50505050848060200190610bf39190611d4f565b604051610c01929190611dd7565b60405180910390207f33cbc8d9bff712d6199a0f3dc8bd053690efd03287805defdbee7a53a52f3660868060200190610c3a9190611d4f565b87868a806101600190610c4d9190611df0565b604051610c5f96959493929190612518565b60405180910390a25050505050565b610c76610dcf565b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610ce8610dcf565b80600483604051610cf99190611c97565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b610d51610dcf565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610dc35760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610dba91906115ee565b60405180910390fd5b610dcc81610e56565b50565b610dd76111d4565b73ffffffffffffffffffffffffffffffffffffffff16610df5610710565b73ffffffffffffffffffffffffffffffffffffffff1614610e5457610e186111d4565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610e4b91906115ee565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610fa9610f5f856111dc565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611260565b73ffffffffffffffffffffffffffffffffffffffff1614610fff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff6906125e1565b60405180910390fd5b505050565b60008103156111205780341015611050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104790612673565b60405180910390fd5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1634604051611098906126c4565b60006040518083038185875af1925050503d80600081146110d5576040519150601f19603f3d011682016040523d82523d6000602084013e6110da565b606091505b505090508061111e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111590612725565b60405180910390fd5b505b50565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008260601b60e81c176000526e5af43d82803e903d91602b57fd5bf38260781b17602052603760096000f09050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111cf576040517fc2f868f400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b60008030336040516020016111f292919061278d565b604051602081830303815290604052836040516020016112139291906127f5565b60405160208183030381529060405280519060200120905060008160405160200161123e9190612865565b6040516020818303038152906040529050808051906020012092505050919050565b600080600080611270868661128c565b92509250925061128082826112e8565b82935050505092915050565b600080600060418451036112d15760008060006020870151925060408701519150606087015160001a90506112c38882858561144c565b9550955095505050506112e1565b60006002855160001b9250925092505b9250925092565b600060038111156112fc576112fb61288b565b5b82600381111561130f5761130e61288b565b5b031561144857600160038111156113295761132861288b565b5b82600381111561133c5761133b61288b565b5b03611373576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260038111156113875761138661288b565b5b82600381111561139a5761139961288b565b5b036113df578060001c6040517ffce698f70000000000000000000000000000000000000000000000000000000081526004016113d691906128c9565b60405180910390fd5b6003808111156113f2576113f161288b565b5b8260038111156114055761140461288b565b5b0361144757806040517fd78bce0c00000000000000000000000000000000000000000000000000000000815260040161143e91906128f3565b60405180910390fd5b5b5050565b60008060007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08460001c111561148c576000600385925092509250611536565b6000600188888888604051600081526020016040526040516114b1949392919061292a565b6020604051602081039080840390855afa1580156114d3573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361152757600060016000801b93509350935050611536565b8060008060001b935093509350505b9450945094915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061157f82611554565b9050919050565b61158f81611574565b811461159a57600080fd5b50565b6000813590506115ac81611586565b92915050565b6000602082840312156115c8576115c761154a565b5b60006115d68482850161159d565b91505092915050565b6115e881611574565b82525050565b600060208201905061160360008301846115df565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61165c82611613565b810181811067ffffffffffffffff8211171561167b5761167a611624565b5b80604052505050565b600061168e611540565b905061169a8282611653565b919050565b600067ffffffffffffffff8211156116ba576116b9611624565b5b6116c382611613565b9050602081019050919050565b82818337600083830152505050565b60006116f26116ed8461169f565b611684565b90508281526020810184848401111561170e5761170d61160e565b5b6117198482856116d0565b509392505050565b600082601f83011261173657611735611609565b5b81356117468482602086016116df565b91505092915050565b6000602082840312156117655761176461154a565b5b600082013567ffffffffffffffff8111156117835761178261154f565b5b61178f84828501611721565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156117d25780820151818401526020810190506117b7565b60008484015250505050565b60006117e982611798565b6117f381856117a3565b93506118038185602086016117b4565b61180c81611613565b840191505092915050565b6000602082019050818103600083015261183181846117de565b905092915050565b600080fd5b60006101a0828403121561185557611854611839565b5b81905092915050565b6000602082840312156118745761187361154a565b5b600082013567ffffffffffffffff8111156118925761189161154f565b5b61189e8482850161183e565b91505092915050565b6000819050919050565b60006118cc6118c76118c284611554565b6118a7565b611554565b9050919050565b60006118de826118b1565b9050919050565b60006118f0826118d3565b9050919050565b611900816118e5565b82525050565b600060208201905061191b60008301846118f7565b92915050565b600080604083850312156119385761193761154a565b5b600083013567ffffffffffffffff8111156119565761195561154f565b5b61196285828601611721565b92505060206119738582860161159d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806119c457607f821691505b6020821081036119d7576119d661197d565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302611a3f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611a02565b611a498683611a02565b95508019841693508086168417925050509392505050565b6000819050919050565b6000611a86611a81611a7c84611a61565b6118a7565b611a61565b9050919050565b6000819050919050565b611aa083611a6b565b611ab4611aac82611a8d565b848454611a0f565b825550505050565b600090565b611ac9611abc565b611ad4818484611a97565b505050565b5b81811015611af857611aed600082611ac1565b600181019050611ada565b5050565b601f821115611b3d57611b0e816119dd565b611b17846119f2565b81016020851015611b26578190505b611b3a611b32856119f2565b830182611ad9565b50505b505050565b600082821c905092915050565b6000611b6060001984600802611b42565b1980831691505092915050565b6000611b798383611b4f565b9150826002028217905092915050565b611b9282611798565b67ffffffffffffffff811115611bab57611baa611624565b5b611bb582546119ac565b611bc0828285611afc565b600060209050601f831160018114611bf35760008415611be1578287015190505b611beb8582611b6d565b865550611c53565b601f198416611c01866119dd565b60005b82811015611c2957848901518255600182019150602085019450602081019050611c04565b86831015611c465784890151611c42601f891682611b4f565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b6000611c7182611798565b611c7b8185611c5b565b9350611c8b8185602086016117b4565b80840191505092915050565b6000611ca38284611c66565b915081905092915050565b7f4e6f20636f6e747261637420666f756e6420666f722074686520676976656e2060008201527f6b696e6400000000000000000000000000000000000000000000000000000000602082015250565b6000611d0a6024836117a3565b9150611d1582611cae565b604082019050919050565b60006020820190508181036000830152611d3981611cfd565b9050919050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112611d6c57611d6b611d40565b5b80840192508235915067ffffffffffffffff821115611d8e57611d8d611d45565b5b602083019250600182023603831315611daa57611da9611d4a565b5b509250929050565b6000611dbe8385611c5b565b9350611dcb8385846116d0565b82840190509392505050565b6000611de4828486611db2565b91508190509392505050565b60008083356001602003843603038112611e0d57611e0c611d40565b5b80840192508235915067ffffffffffffffff821115611e2f57611e2e611d45565b5b602083019250602082023603831315611e4b57611e4a611d4a565b5b509250929050565b6000819050919050565b6000819050919050565b611e78611e7382611e53565b611e5d565b82525050565b6000819050919050565b611e99611e9482611a61565b611e7e565b82525050565b600081905092915050565b600080fd5b82818337505050565b6000611ec48385611e9f565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115611ef757611ef6611eaa565b5b602083029250611f08838584611eaf565b82840190509392505050565b6000611f208287611e67565b602082019150611f308286611e88565b602082019150611f41828486611eb8565b915081905095945050505050565b60008083356001602003843603038112611f6c57611f6b611d40565b5b80840192508235915067ffffffffffffffff821115611f8e57611f8d611d45565b5b602083019250600182023603831315611faa57611fa9611d4a565b5b509250929050565b60006bffffffffffffffffffffffff82169050919050565b611fd381611fb2565b8114611fde57600080fd5b50565b600081359050611ff081611fca565b92915050565b60006020828403121561200c5761200b61154a565b5b600061201a84828501611fe1565b91505092915050565b60008115159050919050565b61203881612023565b811461204357600080fd5b50565b6000813590506120558161202f565b92915050565b6000602082840312156120715761207061154a565b5b600061207f84828501612046565b91505092915050565b61209181611fb2565b82525050565b60006120a383856117a3565b93506120b08385846116d0565b6120b983611613565b840190509392505050565b6120cd81612023565b82525050565b600060c0820190506120e8600083018b6115df565b6120f5602083018a612088565b818103604083015261210881888a612097565b9050818103606083015261211d818688612097565b905061212c60808301856120c4565b61213960a08301846115df565b9998505050505050505050565b6000808335600160200384360303811261216357612162611d40565b5b80840192508235915067ffffffffffffffff82111561218557612184611d45565b5b6020830192506040820236038313156121a1576121a0611d4a565b5b509250929050565b600082825260208201905092915050565b60006121c683856121a9565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156121f9576121f8611eaa565b5b60208302925061220a838584611eaf565b82840190509392505050565b600082825260208201905092915050565b6000819050919050565b6000612240602084018461159d565b905092915050565b61225181611574565b82525050565b61226081611a61565b811461226b57600080fd5b50565b60008135905061227d81612257565b92915050565b6000612292602084018461226e565b905092915050565b6122a381611a61565b82525050565b604082016122ba6000830183612231565b6122c76000850182612248565b506122d56020830183612283565b6122e2602085018261229a565b50505050565b60006122f483836122a9565b60408301905092915050565b600082905092915050565b6000604082019050919050565b60006123248385612216565b935061232f82612227565b8060005b85811015612368576123458284612300565b61234f88826122e8565b975061235a8361230b565b925050600181019050612333565b5085925050509392505050565b600060c08201905061238a600083018b6115df565b612397602083018a6115df565b6123a460408301896115df565b81810360608301526123b78187896121ba565b905081810360808301526123cc818587612318565b90506123db60a08301846115df565b9998505050505050505050565b600081546123f5816119ac565b6123ff8186611c5b565b9450600182166000811461241a576001811461242f57612462565b60ff1983168652811515820286019350612462565b612438856119dd565b60005b8381101561245a5781548189015260018201915060208101905061243b565b838801955050505b50505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b60006124a1600183611c5b565b91506124ac8261246b565b600182019050919050565b60006124c382866123e8565b91506124d0828486611db2565b91506124db82612494565b9150819050949350505050565b60006040820190506124fd60008301856115df565b818103602083015261250f81846117de565b90509392505050565b6000608082019050818103600083015261253381888a612097565b905061254260208301876115df565b61254f60408301866115df565b81810360608301526125628184866121ba565b9050979650505050505050565b7f5369676e617475726550726f7465637465643a20496e76616c6964207369676e60008201527f617475726520666f72207468652063616c6c6572000000000000000000000000602082015250565b60006125cb6034836117a3565b91506125d68261256f565b604082019050919050565b600060208201905081810360008301526125fa816125be565b9050919050565b7f546865207061796d656e7420616d6f756e7420686173206e6f74206265656e2060008201527f7361746973666965640000000000000000000000000000000000000000000000602082015250565b600061265d6029836117a3565b915061266882612601565b604082019050919050565b6000602082019050818103600083015261268c81612650565b9050919050565b600081905092915050565b50565b60006126ae600083612693565b91506126b98261269e565b600082019050919050565b60006126cf826126a1565b9150819050919050565b7f50617961626c653a205472616e73666572206661696c65640000000000000000600082015250565b600061270f6018836117a3565b915061271a826126d9565b602082019050919050565b6000602082019050818103600083015261273e81612702565b9050919050565b60008160601b9050919050565b600061275d82612745565b9050919050565b600061276f82612752565b9050919050565b61278761278282611574565b612764565b82525050565b60006127998285612776565b6014820191506127a98284612776565b6014820191508190509392505050565b600081519050919050565b60006127cf826127b9565b6127d98185612693565b93506127e98185602086016117b4565b80840191505092915050565b600061280182856127c4565b915061280d82846127c4565b91508190509392505050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b600061284f601c83611c5b565b915061285a82612819565b601c82019050919050565b600061287082612842565b915061287c8284611e67565b60208201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6128c381611a61565b82525050565b60006020820190506128de60008301846128ba565b92915050565b6128ed81611e53565b82525050565b600060208201905061290860008301846128e4565b92915050565b600060ff82169050919050565b6129248161290e565b82525050565b600060808201905061293f60008301876128e4565b61294c602083018661291b565b61295960408301856128e4565b61296660608301846128e4565b9594505050505056fea2646970667358221220f839e04c60b767d2035793025144f66395af8e80c0b3361392cf3b33483db5f264736f6c634300081800330000000000000000000000005d65ba3ccba554ceb300971b5396eb6ae7398fcd00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000006ca81d6c500d8201dd46edd2f974caab533ef497000000000000000000000000e16c1623c1aa7d919cd2241d8b36d9e79c1be2a20000000000000000000000004e3cc25298325b95d916486fe87a2e813144c49a000000000000000000000000000000000000000000000000000000000000002f68747470733a2f2f636c6f7564666c6172652e6275696c64747265652e73657276696365732f6d657461646174612f0000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106100fe5760003560e01c806349f3f1a611610095578063984817241161006457806398481724146102fb5780639a03d9a314610317578063a0c76f6214610340578063e1a8fd8e1461036b578063f2fde38b14610394576100fe565b806349f3f1a6146102635780635b7633d01461028e578063715018a6146102b95780638da5cb5b146102d0576100fe565b80632d76119d116100d15780632d76119d146101ab578063320fbc42146101d457806333d7b176146101fd5780634793a2b714610226576100fe565b8063046dc16614610103578063051420021461012c5780632983c4b8146101575780632b1eaf2914610180575b600080fd5b34801561010f57600080fd5b5061012a600480360381019061012591906115b2565b6103bd565b005b34801561013857600080fd5b50610141610409565b60405161014e91906115ee565b60405180910390f35b34801561016357600080fd5b5061017e600480360381019061017991906115b2565b61042f565b005b34801561018c57600080fd5b5061019561047b565b6040516101a291906115ee565b60405180910390f35b3480156101b757600080fd5b506101d260048036038101906101cd919061174f565b6104a1565b005b3480156101e057600080fd5b506101fb60048036038101906101f6919061174f565b6104bc565b005b34801561020957600080fd5b50610224600480360381019061021f91906115b2565b610508565b005b34801561023257600080fd5b5061024d6004803603810190610248919061174f565b610554565b60405161025a91906115ee565b60405180910390f35b34801561026f57600080fd5b50610278610648565b6040516102859190611817565b60405180910390f35b34801561029a57600080fd5b506102a36106d6565b6040516102b091906115ee565b60405180910390f35b3480156102c557600080fd5b506102ce6106fc565b005b3480156102dc57600080fd5b506102e5610710565b6040516102f291906115ee565b60405180910390f35b6103156004803603810190610310919061185e565b610739565b005b34801561032357600080fd5b5061033e600480360381019061033991906115b2565b610c6e565b005b34801561034c57600080fd5b50610355610cba565b6040516103629190611906565b60405180910390f35b34801561037757600080fd5b50610392600480360381019061038d9190611921565b610ce0565b005b3480156103a057600080fd5b506103bb60048036038101906103b691906115b2565b610d49565b005b6103c5610dcf565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610437610dcf565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6104a9610dcf565b80600590816104b89190611b89565b5050565b6104c4610dcf565b6004816040516104d49190611c97565b908152602001604051809103902060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550565b610510610dcf565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff1660048360405161057d9190611c97565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f990611d20565b60405180910390fd5b6004826040516106129190611c97565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60058054610655906119ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610681906119ac565b80156106ce5780601f106106a3576101008083540402835291602001916106ce565b820191906000526020600020905b8154815290600101906020018083116106b157829003601f168201915b505050505081565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610704610dcf565b61070e6000610e56565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6107c281806020019061074c9190611d4f565b60405160200161075d929190611dd7565b604051602081830303815290604052805190602001208261012001358380610160019061078a9190611df0565b60405160200161079d9493929190611f14565b604051602081830303815290604052828061018001906107bd9190611f4f565b610f1a565b6107d0816101200135611004565b60006107fd600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611123565b905060008190508073ffffffffffffffffffffffffffffffffffffffff16634b700fc384600001602081019061083391906115b2565b8560a00160208101906108469190611ff6565b8680604001906108569190611d4f565b8880606001906108669190611d4f565b8a6080016020810190610879919061205b565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518963ffffffff1660e01b81526004016108bf9897969594939291906120d3565b600060405180830381600087803b1580156108d957600080fd5b505af11580156108ed573d6000803e3d6000fd5b5050505060006109576109528580610140019061090a9190611d4f565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050610554565b611123565b905060008190508073ffffffffffffffffffffffffffffffffffffffff1663128a3abf86600001602081019061098d91906115b2565b8760e00160208101906109a091906115b2565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16898060c001906109d39190611df0565b8b8061010001906109e49190612146565b8c6040518963ffffffff1660e01b8152600401610a08989796959493929190612375565b600060405180830381600087803b158015610a2257600080fd5b505af1158015610a36573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff1663983b2d56836040518263ffffffff1660e01b8152600401610a7391906115ee565b600060405180830381600087803b158015610a8d57600080fd5b505af1158015610aa1573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff1663f2fde38b866000016020810190610ad491906115b2565b6040518263ffffffff1660e01b8152600401610af091906115ee565b600060405180830381600087803b158015610b0a57600080fd5b505af1158015610b1e573d6000803e3d6000fd5b50505050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166388433651856005888060200190610b739190611d4f565b604051602001610b85939291906124b7565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610bb19291906124e8565b600060405180830381600087803b158015610bcb57600080fd5b505af1158015610bdf573d6000803e3d6000fd5b50505050848060200190610bf39190611d4f565b604051610c01929190611dd7565b60405180910390207f33cbc8d9bff712d6199a0f3dc8bd053690efd03287805defdbee7a53a52f3660868060200190610c3a9190611d4f565b87868a806101600190610c4d9190611df0565b604051610c5f96959493929190612518565b60405180910390a25050505050565b610c76610dcf565b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610ce8610dcf565b80600483604051610cf99190611c97565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b610d51610dcf565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610dc35760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610dba91906115ee565b60405180910390fd5b610dcc81610e56565b50565b610dd76111d4565b73ffffffffffffffffffffffffffffffffffffffff16610df5610710565b73ffffffffffffffffffffffffffffffffffffffff1614610e5457610e186111d4565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610e4b91906115ee565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610fa9610f5f856111dc565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611260565b73ffffffffffffffffffffffffffffffffffffffff1614610fff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff6906125e1565b60405180910390fd5b505050565b60008103156111205780341015611050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104790612673565b60405180910390fd5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1634604051611098906126c4565b60006040518083038185875af1925050503d80600081146110d5576040519150601f19603f3d011682016040523d82523d6000602084013e6110da565b606091505b505090508061111e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111590612725565b60405180910390fd5b505b50565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008260601b60e81c176000526e5af43d82803e903d91602b57fd5bf38260781b17602052603760096000f09050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111cf576040517fc2f868f400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b60008030336040516020016111f292919061278d565b604051602081830303815290604052836040516020016112139291906127f5565b60405160208183030381529060405280519060200120905060008160405160200161123e9190612865565b6040516020818303038152906040529050808051906020012092505050919050565b600080600080611270868661128c565b92509250925061128082826112e8565b82935050505092915050565b600080600060418451036112d15760008060006020870151925060408701519150606087015160001a90506112c38882858561144c565b9550955095505050506112e1565b60006002855160001b9250925092505b9250925092565b600060038111156112fc576112fb61288b565b5b82600381111561130f5761130e61288b565b5b031561144857600160038111156113295761132861288b565b5b82600381111561133c5761133b61288b565b5b03611373576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260038111156113875761138661288b565b5b82600381111561139a5761139961288b565b5b036113df578060001c6040517ffce698f70000000000000000000000000000000000000000000000000000000081526004016113d691906128c9565b60405180910390fd5b6003808111156113f2576113f161288b565b5b8260038111156114055761140461288b565b5b0361144757806040517fd78bce0c00000000000000000000000000000000000000000000000000000000815260040161143e91906128f3565b60405180910390fd5b5b5050565b60008060007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08460001c111561148c576000600385925092509250611536565b6000600188888888604051600081526020016040526040516114b1949392919061292a565b6020604051602081039080840390855afa1580156114d3573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361152757600060016000801b93509350935050611536565b8060008060001b935093509350505b9450945094915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061157f82611554565b9050919050565b61158f81611574565b811461159a57600080fd5b50565b6000813590506115ac81611586565b92915050565b6000602082840312156115c8576115c761154a565b5b60006115d68482850161159d565b91505092915050565b6115e881611574565b82525050565b600060208201905061160360008301846115df565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61165c82611613565b810181811067ffffffffffffffff8211171561167b5761167a611624565b5b80604052505050565b600061168e611540565b905061169a8282611653565b919050565b600067ffffffffffffffff8211156116ba576116b9611624565b5b6116c382611613565b9050602081019050919050565b82818337600083830152505050565b60006116f26116ed8461169f565b611684565b90508281526020810184848401111561170e5761170d61160e565b5b6117198482856116d0565b509392505050565b600082601f83011261173657611735611609565b5b81356117468482602086016116df565b91505092915050565b6000602082840312156117655761176461154a565b5b600082013567ffffffffffffffff8111156117835761178261154f565b5b61178f84828501611721565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156117d25780820151818401526020810190506117b7565b60008484015250505050565b60006117e982611798565b6117f381856117a3565b93506118038185602086016117b4565b61180c81611613565b840191505092915050565b6000602082019050818103600083015261183181846117de565b905092915050565b600080fd5b60006101a0828403121561185557611854611839565b5b81905092915050565b6000602082840312156118745761187361154a565b5b600082013567ffffffffffffffff8111156118925761189161154f565b5b61189e8482850161183e565b91505092915050565b6000819050919050565b60006118cc6118c76118c284611554565b6118a7565b611554565b9050919050565b60006118de826118b1565b9050919050565b60006118f0826118d3565b9050919050565b611900816118e5565b82525050565b600060208201905061191b60008301846118f7565b92915050565b600080604083850312156119385761193761154a565b5b600083013567ffffffffffffffff8111156119565761195561154f565b5b61196285828601611721565b92505060206119738582860161159d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806119c457607f821691505b6020821081036119d7576119d661197d565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302611a3f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611a02565b611a498683611a02565b95508019841693508086168417925050509392505050565b6000819050919050565b6000611a86611a81611a7c84611a61565b6118a7565b611a61565b9050919050565b6000819050919050565b611aa083611a6b565b611ab4611aac82611a8d565b848454611a0f565b825550505050565b600090565b611ac9611abc565b611ad4818484611a97565b505050565b5b81811015611af857611aed600082611ac1565b600181019050611ada565b5050565b601f821115611b3d57611b0e816119dd565b611b17846119f2565b81016020851015611b26578190505b611b3a611b32856119f2565b830182611ad9565b50505b505050565b600082821c905092915050565b6000611b6060001984600802611b42565b1980831691505092915050565b6000611b798383611b4f565b9150826002028217905092915050565b611b9282611798565b67ffffffffffffffff811115611bab57611baa611624565b5b611bb582546119ac565b611bc0828285611afc565b600060209050601f831160018114611bf35760008415611be1578287015190505b611beb8582611b6d565b865550611c53565b601f198416611c01866119dd565b60005b82811015611c2957848901518255600182019150602085019450602081019050611c04565b86831015611c465784890151611c42601f891682611b4f565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b6000611c7182611798565b611c7b8185611c5b565b9350611c8b8185602086016117b4565b80840191505092915050565b6000611ca38284611c66565b915081905092915050565b7f4e6f20636f6e747261637420666f756e6420666f722074686520676976656e2060008201527f6b696e6400000000000000000000000000000000000000000000000000000000602082015250565b6000611d0a6024836117a3565b9150611d1582611cae565b604082019050919050565b60006020820190508181036000830152611d3981611cfd565b9050919050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112611d6c57611d6b611d40565b5b80840192508235915067ffffffffffffffff821115611d8e57611d8d611d45565b5b602083019250600182023603831315611daa57611da9611d4a565b5b509250929050565b6000611dbe8385611c5b565b9350611dcb8385846116d0565b82840190509392505050565b6000611de4828486611db2565b91508190509392505050565b60008083356001602003843603038112611e0d57611e0c611d40565b5b80840192508235915067ffffffffffffffff821115611e2f57611e2e611d45565b5b602083019250602082023603831315611e4b57611e4a611d4a565b5b509250929050565b6000819050919050565b6000819050919050565b611e78611e7382611e53565b611e5d565b82525050565b6000819050919050565b611e99611e9482611a61565b611e7e565b82525050565b600081905092915050565b600080fd5b82818337505050565b6000611ec48385611e9f565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115611ef757611ef6611eaa565b5b602083029250611f08838584611eaf565b82840190509392505050565b6000611f208287611e67565b602082019150611f308286611e88565b602082019150611f41828486611eb8565b915081905095945050505050565b60008083356001602003843603038112611f6c57611f6b611d40565b5b80840192508235915067ffffffffffffffff821115611f8e57611f8d611d45565b5b602083019250600182023603831315611faa57611fa9611d4a565b5b509250929050565b60006bffffffffffffffffffffffff82169050919050565b611fd381611fb2565b8114611fde57600080fd5b50565b600081359050611ff081611fca565b92915050565b60006020828403121561200c5761200b61154a565b5b600061201a84828501611fe1565b91505092915050565b60008115159050919050565b61203881612023565b811461204357600080fd5b50565b6000813590506120558161202f565b92915050565b6000602082840312156120715761207061154a565b5b600061207f84828501612046565b91505092915050565b61209181611fb2565b82525050565b60006120a383856117a3565b93506120b08385846116d0565b6120b983611613565b840190509392505050565b6120cd81612023565b82525050565b600060c0820190506120e8600083018b6115df565b6120f5602083018a612088565b818103604083015261210881888a612097565b9050818103606083015261211d818688612097565b905061212c60808301856120c4565b61213960a08301846115df565b9998505050505050505050565b6000808335600160200384360303811261216357612162611d40565b5b80840192508235915067ffffffffffffffff82111561218557612184611d45565b5b6020830192506040820236038313156121a1576121a0611d4a565b5b509250929050565b600082825260208201905092915050565b60006121c683856121a9565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156121f9576121f8611eaa565b5b60208302925061220a838584611eaf565b82840190509392505050565b600082825260208201905092915050565b6000819050919050565b6000612240602084018461159d565b905092915050565b61225181611574565b82525050565b61226081611a61565b811461226b57600080fd5b50565b60008135905061227d81612257565b92915050565b6000612292602084018461226e565b905092915050565b6122a381611a61565b82525050565b604082016122ba6000830183612231565b6122c76000850182612248565b506122d56020830183612283565b6122e2602085018261229a565b50505050565b60006122f483836122a9565b60408301905092915050565b600082905092915050565b6000604082019050919050565b60006123248385612216565b935061232f82612227565b8060005b85811015612368576123458284612300565b61234f88826122e8565b975061235a8361230b565b925050600181019050612333565b5085925050509392505050565b600060c08201905061238a600083018b6115df565b612397602083018a6115df565b6123a460408301896115df565b81810360608301526123b78187896121ba565b905081810360808301526123cc818587612318565b90506123db60a08301846115df565b9998505050505050505050565b600081546123f5816119ac565b6123ff8186611c5b565b9450600182166000811461241a576001811461242f57612462565b60ff1983168652811515820286019350612462565b612438856119dd565b60005b8381101561245a5781548189015260018201915060208101905061243b565b838801955050505b50505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b60006124a1600183611c5b565b91506124ac8261246b565b600182019050919050565b60006124c382866123e8565b91506124d0828486611db2565b91506124db82612494565b9150819050949350505050565b60006040820190506124fd60008301856115df565b818103602083015261250f81846117de565b90509392505050565b6000608082019050818103600083015261253381888a612097565b905061254260208301876115df565b61254f60408301866115df565b81810360608301526125628184866121ba565b9050979650505050505050565b7f5369676e617475726550726f7465637465643a20496e76616c6964207369676e60008201527f617475726520666f72207468652063616c6c6572000000000000000000000000602082015250565b60006125cb6034836117a3565b91506125d68261256f565b604082019050919050565b600060208201905081810360008301526125fa816125be565b9050919050565b7f546865207061796d656e7420616d6f756e7420686173206e6f74206265656e2060008201527f7361746973666965640000000000000000000000000000000000000000000000602082015250565b600061265d6029836117a3565b915061266882612601565b604082019050919050565b6000602082019050818103600083015261268c81612650565b9050919050565b600081905092915050565b50565b60006126ae600083612693565b91506126b98261269e565b600082019050919050565b60006126cf826126a1565b9150819050919050565b7f50617961626c653a205472616e73666572206661696c65640000000000000000600082015250565b600061270f6018836117a3565b915061271a826126d9565b602082019050919050565b6000602082019050818103600083015261273e81612702565b9050919050565b60008160601b9050919050565b600061275d82612745565b9050919050565b600061276f82612752565b9050919050565b61278761278282611574565b612764565b82525050565b60006127998285612776565b6014820191506127a98284612776565b6014820191508190509392505050565b600081519050919050565b60006127cf826127b9565b6127d98185612693565b93506127e98185602086016117b4565b80840191505092915050565b600061280182856127c4565b915061280d82846127c4565b91508190509392505050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b600061284f601c83611c5b565b915061285a82612819565b601c82019050919050565b600061287082612842565b915061287c8284611e67565b60208201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6128c381611a61565b82525050565b60006020820190506128de60008301846128ba565b92915050565b6128ed81611e53565b82525050565b600060208201905061290860008301846128e4565b92915050565b600060ff82169050919050565b6129248161290e565b82525050565b600060808201905061293f60008301876128e4565b61294c602083018661291b565b61295960408301856128e4565b61296660608301846128e4565b9594505050505056fea2646970667358221220f839e04c60b767d2035793025144f66395af8e80c0b3361392cf3b33483db5f264736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005d65ba3ccba554ceb300971b5396eb6ae7398fcd00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000006ca81d6c500d8201dd46edd2f974caab533ef497000000000000000000000000e16c1623c1aa7d919cd2241d8b36d9e79c1be2a20000000000000000000000004e3cc25298325b95d916486fe87a2e813144c49a000000000000000000000000000000000000000000000000000000000000002f68747470733a2f2f636c6f7564666c6172652e6275696c64747265652e73657276696365732f6d657461646174612f0000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _erc1155Address (address): 0x5D65Ba3cCbA554CEb300971b5396eB6ae7398FcD
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] : 0000000000000000000000005d65ba3ccba554ceb300971b5396eb6ae7398fcd
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.