Overview
ETH Balance
ETH Value
$0.00Latest 21 from a total of 21 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Create | 21766143 | 376 days ago | IN | 0.00022263 ETH | 0.00153718 | ||||
| Create | 21750213 | 376 days ago | IN | 0 ETH | 0.00150972 | ||||
| Create | 21526971 | 382 days ago | IN | 0 ETH | 0.00150867 | ||||
| Create | 21489210 | 382 days ago | IN | 0 ETH | 0.00150887 | ||||
| Create | 21045162 | 393 days ago | IN | 0.00008321 ETH | 0.00153852 | ||||
| Create | 20878536 | 397 days ago | IN | 0.00001082 ETH | 0.00153561 | ||||
| Create | 20860574 | 397 days ago | IN | 0.00010302 ETH | 0.00153465 | ||||
| Create | 20528319 | 405 days ago | IN | 0 ETH | 0.00150926 | ||||
| Create | 20526418 | 405 days ago | IN | 0 ETH | 0.00150961 | ||||
| Create | 20524781 | 405 days ago | IN | 0 ETH | 0.0015096 | ||||
| Create | 20506090 | 405 days ago | IN | 0 ETH | 0.00151628 | ||||
| Create | 20504778 | 405 days ago | IN | 0 ETH | 0.00151428 | ||||
| Create | 20463222 | 406 days ago | IN | 0 ETH | 0.00151269 | ||||
| Create | 20430899 | 407 days ago | IN | 0.00000087 ETH | 0.00148382 | ||||
| Create | 20356674 | 409 days ago | IN | 0 ETH | 0.00150863 | ||||
| Create | 20350271 | 409 days ago | IN | 0 ETH | 0.00150837 | ||||
| Create | 20348043 | 409 days ago | IN | 0 ETH | 0.00150867 | ||||
| Create | 19900620 | 419 days ago | IN | 0.00000011 ETH | 0.00000456 | ||||
| Create | 19558442 | 427 days ago | IN | 0.00000003 ETH | 0.0015978 | ||||
| Set Metadata Bas... | 19214269 | 435 days ago | IN | 0 ETH | 0.00000019 | ||||
| Set Payment Reci... | 19120198 | 437 days ago | IN | 0 ETH | 0.00000044 |
Latest 25 internal transactions (View All)
Cross-Chain Transactions
Contract Source Code Verified (Exact Match)
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
// @author: 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;
address public minterAddress;
string public metadataBaseUrl;
IMetadataResolver public metadataResolver;
event NewContract(
string indexed iuuid,
string uuid,
address token,
address minter,
uint256[] extras
);
constructor(
address _erc721Address,
address _minterAddress,
string memory _metadataBaseUrl,
address _metadataResolverAddress,
address _signerAddress,
address _paymentRecipient
) {
paymentRecipient = _paymentRecipient;
erc721Address = _erc721Address;
minterAddress = _minterAddress;
metadataBaseUrl = _metadataBaseUrl;
metadataResolver = IMetadataResolver(_metadataResolverAddress);
initSignatureProtected(_signerAddress);
}
// Only Owner
function setERC721Address(address _erc721Address) external onlyOwner {
erc721Address = _erc721Address;
}
function setMinterAddress(address _minterAddress) external onlyOwner {
minterAddress = _minterAddress;
}
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(minterAddress);
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;
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;
uint256[] extras;
bytes signature;
}
}// SPDX-License-Identifier: MIT
// @author: 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
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_erc721Address","type":"address"},{"internalType":"address","name":"_minterAddress","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":[{"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":"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":[],"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":"minterAddress","outputs":[{"internalType":"address","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":[],"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":"_minterAddress","type":"address"}],"name":"setMinterAddress","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
60806040523480156200001157600080fd5b5060405162002fc138038062002fc18339818101604052810190620000379190620004f2565b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000ad5760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620000a49190620005be565b60405180910390fd5b620000be81620001f260201b60201c565b5080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550836005908162000193919062000826565b5082600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620001e682620002b660201b60201c565b5050505050506200090d565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200033b826200030e565b9050919050565b6200034d816200032e565b81146200035957600080fd5b50565b6000815190506200036d8162000342565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620003c8826200037d565b810181811067ffffffffffffffff82111715620003ea57620003e96200038e565b5b80604052505050565b6000620003ff620002fa565b90506200040d8282620003bd565b919050565b600067ffffffffffffffff82111562000430576200042f6200038e565b5b6200043b826200037d565b9050602081019050919050565b60005b83811015620004685780820151818401526020810190506200044b565b60008484015250505050565b60006200048b620004858462000412565b620003f3565b905082815260208101848484011115620004aa57620004a962000378565b5b620004b784828562000448565b509392505050565b600082601f830112620004d757620004d662000373565b5b8151620004e984826020860162000474565b91505092915050565b60008060008060008060c0878903121562000512576200051162000304565b5b60006200052289828a016200035c565b96505060206200053589828a016200035c565b955050604087015167ffffffffffffffff81111562000559576200055862000309565b5b6200056789828a01620004bf565b94505060606200057a89828a016200035c565b93505060806200058d89828a016200035c565b92505060a0620005a089828a016200035c565b9150509295509295509295565b620005b8816200032e565b82525050565b6000602082019050620005d56000830184620005ad565b92915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200062e57607f821691505b602082108103620006445762000643620005e6565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620006ae7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200066f565b620006ba86836200066f565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200070762000701620006fb84620006d2565b620006dc565b620006d2565b9050919050565b6000819050919050565b6200072383620006e6565b6200073b62000732826200070e565b8484546200067c565b825550505050565b600090565b6200075262000743565b6200075f81848462000718565b505050565b5b8181101562000787576200077b60008262000748565b60018101905062000765565b5050565b601f821115620007d657620007a0816200064a565b620007ab846200065f565b81016020851015620007bb578190505b620007d3620007ca856200065f565b83018262000764565b50505b505050565b600082821c905092915050565b6000620007fb60001984600802620007db565b1980831691505092915050565b6000620008168383620007e8565b9150826002028217905092915050565b6200083182620005db565b67ffffffffffffffff8111156200084d576200084c6200038e565b5b62000859825462000615565b620008668282856200078b565b600060209050601f8311600181146200089e576000841562000889578287015190505b62000895858262000808565b86555062000905565b601f198416620008ae866200064a565b60005b82811015620008d857848901518255600182019150602085019450602081019050620008b1565b86831015620008f85784890151620008f4601f891682620007e8565b8355505b6001600288020188555050505b505050505050565b6126a4806200091d6000396000f3fe6080604052600436106100f35760003560e01c80635b7633d01161008a578063a0c76f6211610059578063a0c76f62146102de578063a3106b9514610309578063e10a02aa14610332578063f2fde38b1461034e576100f3565b80635b7633d014610248578063715018a6146102735780638da5cb5b1461028a5780639a03d9a3146102b5576100f3565b80632d76119d116100c65780632d76119d146101a057806333d7b176146101c957806334d722c9146101f257806349f3f1a61461021d576100f3565b8063046dc166146100f85780632352a864146101215780632983c4b81461014c5780632b1eaf2914610175575b600080fd5b34801561010457600080fd5b5061011f600480360381019061011a91906113f0565b610377565b005b34801561012d57600080fd5b506101366103c3565b604051610143919061142c565b60405180910390f35b34801561015857600080fd5b50610173600480360381019061016e91906113f0565b6103e9565b005b34801561018157600080fd5b5061018a610435565b604051610197919061142c565b60405180910390f35b3480156101ac57600080fd5b506101c760048036038101906101c2919061158d565b61045b565b005b3480156101d557600080fd5b506101f060048036038101906101eb91906113f0565b610476565b005b3480156101fe57600080fd5b506102076104c2565b604051610214919061142c565b60405180910390f35b34801561022957600080fd5b506102326104e8565b60405161023f9190611655565b60405180910390f35b34801561025457600080fd5b5061025d610576565b60405161026a919061142c565b60405180910390f35b34801561027f57600080fd5b5061028861059c565b005b34801561029657600080fd5b5061029f6105b0565b6040516102ac919061142c565b60405180910390f35b3480156102c157600080fd5b506102dc60048036038101906102d791906113f0565b6105d9565b005b3480156102ea57600080fd5b506102f3610625565b60405161030091906116d6565b60405180910390f35b34801561031557600080fd5b50610330600480360381019061032b91906113f0565b61064b565b005b61034c60048036038101906103479190611716565b610697565b005b34801561035a57600080fd5b50610375600480360381019061037091906113f0565b610b87565b005b61037f610c0d565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6103f1610c0d565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610463610c0d565b8060059081610472919061196b565b5050565b61047e610c0d565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600580546104f59061178e565b80601f01602080910402602001604051908101604052809291908181526020018280546105219061178e565b801561056e5780601f106105435761010080835404028352916020019161056e565b820191906000526020600020905b81548152906001019060200180831161055157829003601f168201915b505050505081565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6105a4610c0d565b6105ae6000610c94565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6105e1610c0d565b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610653610c0d565b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6107208180602001906106aa9190611a4c565b6040516020016106bb929190611adf565b60405160208183030381529060405280519060200120826101200135838061014001906106e89190611af8565b6040516020016106fb9493929190611c1c565b6040516020818303038152906040528280610160019061071b9190611c57565b610d58565b61072e816101200135610e42565b600061075b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610f61565b905060008190508073ffffffffffffffffffffffffffffffffffffffff16634b700fc384600001602081019061079191906113f0565b8560a00160208101906107a49190611cfe565b8680604001906107b49190611a4c565b8880606001906107c49190611a4c565b8a60800160208101906107d79190611d63565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518963ffffffff1660e01b815260040161081d989796959493929190611ddb565b600060405180830381600087803b15801561083757600080fd5b505af115801561084b573d6000803e3d6000fd5b50505050600061087c600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610f61565b905060008190508073ffffffffffffffffffffffffffffffffffffffff1663d638aefb8660000160208101906108b291906113f0565b8760c001358860e00160208101906108ca91906113f0565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168a8061010001906108fe9190611e4e565b8b6040518863ffffffff1660e01b8152600401610921979695949392919061201f565b600060405180830381600087803b15801561093b57600080fd5b505af115801561094f573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff1663983b2d56836040518263ffffffff1660e01b815260040161098c919061142c565b600060405180830381600087803b1580156109a657600080fd5b505af11580156109ba573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff1663f2fde38b8660000160208101906109ed91906113f0565b6040518263ffffffff1660e01b8152600401610a09919061142c565b600060405180830381600087803b158015610a2357600080fd5b505af1158015610a37573d6000803e3d6000fd5b50505050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166388433651856005888060200190610a8c9190611a4c565b604051602001610a9e93929190612158565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610aca929190612189565b600060405180830381600087803b158015610ae457600080fd5b505af1158015610af8573d6000803e3d6000fd5b50505050848060200190610b0c9190611a4c565b604051610b1a929190611adf565b60405180910390207f33cbc8d9bff712d6199a0f3dc8bd053690efd03287805defdbee7a53a52f3660868060200190610b539190611a4c565b87868a806101400190610b669190611af8565b604051610b7896959493929190612226565b60405180910390a25050505050565b610b8f610c0d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c015760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610bf8919061142c565b60405180910390fd5b610c0a81610c94565b50565b610c15611012565b73ffffffffffffffffffffffffffffffffffffffff16610c336105b0565b73ffffffffffffffffffffffffffffffffffffffff1614610c9257610c56611012565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610c89919061142c565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610de7610d9d8561101a565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061109e565b73ffffffffffffffffffffffffffffffffffffffff1614610e3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e34906122ef565b60405180910390fd5b505050565b6000810315610f5e5780341015610e8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8590612381565b60405180910390fd5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1634604051610ed6906123d2565b60006040518083038185875af1925050503d8060008114610f13576040519150601f19603f3d011682016040523d82523d6000602084013e610f18565b606091505b5050905080610f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5390612433565b60405180910390fd5b505b50565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008260601b60e81c176000526e5af43d82803e903d91602b57fd5bf38260781b17602052603760096000f09050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361100d576040517fc2f868f400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600080303360405160200161103092919061249b565b60405160208183030381529060405283604051602001611051929190612503565b60405160208183030381529060405280519060200120905060008160405160200161107c9190612573565b6040516020818303038152906040529050808051906020012092505050919050565b6000806000806110ae86866110ca565b9250925092506110be8282611126565b82935050505092915050565b6000806000604184510361110f5760008060006020870151925060408701519150606087015160001a90506111018882858561128a565b95509550955050505061111f565b60006002855160001b9250925092505b9250925092565b6000600381111561113a57611139612599565b5b82600381111561114d5761114c612599565b5b0315611286576001600381111561116757611166612599565b5b82600381111561117a57611179612599565b5b036111b1576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260038111156111c5576111c4612599565b5b8260038111156111d8576111d7612599565b5b0361121d578060001c6040517ffce698f700000000000000000000000000000000000000000000000000000000815260040161121491906125c8565b60405180910390fd5b6003808111156112305761122f612599565b5b82600381111561124357611242612599565b5b0361128557806040517fd78bce0c00000000000000000000000000000000000000000000000000000000815260040161127c91906125f2565b60405180910390fd5b5b5050565b60008060007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08460001c11156112ca576000600385925092509250611374565b6000600188888888604051600081526020016040526040516112ef9493929190612629565b6020604051602081039080840390855afa158015611311573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361136557600060016000801b93509350935050611374565b8060008060001b935093509350505b9450945094915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006113bd82611392565b9050919050565b6113cd816113b2565b81146113d857600080fd5b50565b6000813590506113ea816113c4565b92915050565b60006020828403121561140657611405611388565b5b6000611414848285016113db565b91505092915050565b611426816113b2565b82525050565b6000602082019050611441600083018461141d565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61149a82611451565b810181811067ffffffffffffffff821117156114b9576114b8611462565b5b80604052505050565b60006114cc61137e565b90506114d88282611491565b919050565b600067ffffffffffffffff8211156114f8576114f7611462565b5b61150182611451565b9050602081019050919050565b82818337600083830152505050565b600061153061152b846114dd565b6114c2565b90508281526020810184848401111561154c5761154b61144c565b5b61155784828561150e565b509392505050565b600082601f83011261157457611573611447565b5b813561158484826020860161151d565b91505092915050565b6000602082840312156115a3576115a2611388565b5b600082013567ffffffffffffffff8111156115c1576115c061138d565b5b6115cd8482850161155f565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156116105780820151818401526020810190506115f5565b60008484015250505050565b6000611627826115d6565b61163181856115e1565b93506116418185602086016115f2565b61164a81611451565b840191505092915050565b6000602082019050818103600083015261166f818461161c565b905092915050565b6000819050919050565b600061169c61169761169284611392565b611677565b611392565b9050919050565b60006116ae82611681565b9050919050565b60006116c0826116a3565b9050919050565b6116d0816116b5565b82525050565b60006020820190506116eb60008301846116c7565b92915050565b600080fd5b6000610180828403121561170d5761170c6116f1565b5b81905092915050565b60006020828403121561172c5761172b611388565b5b600082013567ffffffffffffffff81111561174a5761174961138d565b5b611756848285016116f6565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806117a657607f821691505b6020821081036117b9576117b861175f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026118217fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826117e4565b61182b86836117e4565b95508019841693508086168417925050509392505050565b6000819050919050565b600061186861186361185e84611843565b611677565b611843565b9050919050565b6000819050919050565b6118828361184d565b61189661188e8261186f565b8484546117f1565b825550505050565b600090565b6118ab61189e565b6118b6818484611879565b505050565b5b818110156118da576118cf6000826118a3565b6001810190506118bc565b5050565b601f82111561191f576118f0816117bf565b6118f9846117d4565b81016020851015611908578190505b61191c611914856117d4565b8301826118bb565b50505b505050565b600082821c905092915050565b600061194260001984600802611924565b1980831691505092915050565b600061195b8383611931565b9150826002028217905092915050565b611974826115d6565b67ffffffffffffffff81111561198d5761198c611462565b5b611997825461178e565b6119a28282856118de565b600060209050601f8311600181146119d557600084156119c3578287015190505b6119cd858261194f565b865550611a35565b601f1984166119e3866117bf565b60005b82811015611a0b578489015182556001820191506020850194506020810190506119e6565b86831015611a285784890151611a24601f891682611931565b8355505b6001600288020188555050505b505050505050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112611a6957611a68611a3d565b5b80840192508235915067ffffffffffffffff821115611a8b57611a8a611a42565b5b602083019250600182023603831315611aa757611aa6611a47565b5b509250929050565b600081905092915050565b6000611ac68385611aaf565b9350611ad383858461150e565b82840190509392505050565b6000611aec828486611aba565b91508190509392505050565b60008083356001602003843603038112611b1557611b14611a3d565b5b80840192508235915067ffffffffffffffff821115611b3757611b36611a42565b5b602083019250602082023603831315611b5357611b52611a47565b5b509250929050565b6000819050919050565b6000819050919050565b611b80611b7b82611b5b565b611b65565b82525050565b6000819050919050565b611ba1611b9c82611843565b611b86565b82525050565b600081905092915050565b600080fd5b82818337505050565b6000611bcc8385611ba7565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115611bff57611bfe611bb2565b5b602083029250611c10838584611bb7565b82840190509392505050565b6000611c288287611b6f565b602082019150611c388286611b90565b602082019150611c49828486611bc0565b915081905095945050505050565b60008083356001602003843603038112611c7457611c73611a3d565b5b80840192508235915067ffffffffffffffff821115611c9657611c95611a42565b5b602083019250600182023603831315611cb257611cb1611a47565b5b509250929050565b60006bffffffffffffffffffffffff82169050919050565b611cdb81611cba565b8114611ce657600080fd5b50565b600081359050611cf881611cd2565b92915050565b600060208284031215611d1457611d13611388565b5b6000611d2284828501611ce9565b91505092915050565b60008115159050919050565b611d4081611d2b565b8114611d4b57600080fd5b50565b600081359050611d5d81611d37565b92915050565b600060208284031215611d7957611d78611388565b5b6000611d8784828501611d4e565b91505092915050565b611d9981611cba565b82525050565b6000611dab83856115e1565b9350611db883858461150e565b611dc183611451565b840190509392505050565b611dd581611d2b565b82525050565b600060c082019050611df0600083018b61141d565b611dfd602083018a611d90565b8181036040830152611e1081888a611d9f565b90508181036060830152611e25818688611d9f565b9050611e346080830185611dcc565b611e4160a083018461141d565b9998505050505050505050565b60008083356001602003843603038112611e6b57611e6a611a3d565b5b80840192508235915067ffffffffffffffff821115611e8d57611e8c611a42565b5b602083019250604082023603831315611ea957611ea8611a47565b5b509250929050565b611eba81611843565b82525050565b600082825260208201905092915050565b6000819050919050565b6000611eea60208401846113db565b905092915050565b611efb816113b2565b82525050565b611f0a81611843565b8114611f1557600080fd5b50565b600081359050611f2781611f01565b92915050565b6000611f3c6020840184611f18565b905092915050565b611f4d81611843565b82525050565b60408201611f646000830183611edb565b611f716000850182611ef2565b50611f7f6020830183611f2d565b611f8c6020850182611f44565b50505050565b6000611f9e8383611f53565b60408301905092915050565b600082905092915050565b6000604082019050919050565b6000611fce8385611ec0565b9350611fd982611ed1565b8060005b8581101561201257611fef8284611faa565b611ff98882611f92565b975061200483611fb5565b925050600181019050611fdd565b5085925050509392505050565b600060c082019050612034600083018a61141d565b6120416020830189611eb1565b61204e604083018861141d565b61205b606083018761141d565b818103608083015261206e818587611fc2565b905061207d60a083018461141d565b98975050505050505050565b600081546120968161178e565b6120a08186611aaf565b945060018216600081146120bb57600181146120d057612103565b60ff1983168652811515820286019350612103565b6120d9856117bf565b60005b838110156120fb578154818901526001820191506020810190506120dc565b838801955050505b50505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b6000612142600183611aaf565b915061214d8261210c565b600182019050919050565b60006121648286612089565b9150612171828486611aba565b915061217c82612135565b9150819050949350505050565b600060408201905061219e600083018561141d565b81810360208301526121b0818461161c565b90509392505050565b600082825260208201905092915050565b60006121d683856121b9565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561220957612208611bb2565b5b60208302925061221a838584611bb7565b82840190509392505050565b6000608082019050818103600083015261224181888a611d9f565b9050612250602083018761141d565b61225d604083018661141d565b81810360608301526122708184866121ca565b9050979650505050505050565b7f5369676e617475726550726f7465637465643a20496e76616c6964207369676e60008201527f617475726520666f72207468652063616c6c6572000000000000000000000000602082015250565b60006122d96034836115e1565b91506122e48261227d565b604082019050919050565b60006020820190508181036000830152612308816122cc565b9050919050565b7f546865207061796d656e7420616d6f756e7420686173206e6f74206265656e2060008201527f7361746973666965640000000000000000000000000000000000000000000000602082015250565b600061236b6029836115e1565b91506123768261230f565b604082019050919050565b6000602082019050818103600083015261239a8161235e565b9050919050565b600081905092915050565b50565b60006123bc6000836123a1565b91506123c7826123ac565b600082019050919050565b60006123dd826123af565b9150819050919050565b7f50617961626c653a205472616e73666572206661696c65640000000000000000600082015250565b600061241d6018836115e1565b9150612428826123e7565b602082019050919050565b6000602082019050818103600083015261244c81612410565b9050919050565b60008160601b9050919050565b600061246b82612453565b9050919050565b600061247d82612460565b9050919050565b612495612490826113b2565b612472565b82525050565b60006124a78285612484565b6014820191506124b78284612484565b6014820191508190509392505050565b600081519050919050565b60006124dd826124c7565b6124e781856123a1565b93506124f78185602086016115f2565b80840191505092915050565b600061250f82856124d2565b915061251b82846124d2565b91508190509392505050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b600061255d601c83611aaf565b915061256882612527565b601c82019050919050565b600061257e82612550565b915061258a8284611b6f565b60208201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60006020820190506125dd6000830184611eb1565b92915050565b6125ec81611b5b565b82525050565b600060208201905061260760008301846125e3565b92915050565b600060ff82169050919050565b6126238161260d565b82525050565b600060808201905061263e60008301876125e3565b61264b602083018661261a565b61265860408301856125e3565b61266560608301846125e3565b9594505050505056fea26469706673582212201d060d35772b05c902508efaee2083bc40c0e9c17ed196e4724be80dff1a13aa64736f6c63430008180033000000000000000000000000f05a81a18113f4ebfed9c3fa78bca7ec135dacc5000000000000000000000000d66bd1016df96a061e09afaab7072557f792ab1600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000006ca81d6c500d8201dd46edd2f974caab533ef497000000000000000000000000e16c1623c1aa7d919cd2241d8b36d9e79c1be2a20000000000000000000000007df748c0587ffe7e30bb10d5e28d611d408591e4000000000000000000000000000000000000000000000000000000000000004c68747470733a2f2f6275696c64747265652d636c6f7564666c6172652d776f726b65722d73746167696e672e6e667473747564696f732e776f726b6572732e6465762f6d657461646174612f0000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106100f35760003560e01c80635b7633d01161008a578063a0c76f6211610059578063a0c76f62146102de578063a3106b9514610309578063e10a02aa14610332578063f2fde38b1461034e576100f3565b80635b7633d014610248578063715018a6146102735780638da5cb5b1461028a5780639a03d9a3146102b5576100f3565b80632d76119d116100c65780632d76119d146101a057806333d7b176146101c957806334d722c9146101f257806349f3f1a61461021d576100f3565b8063046dc166146100f85780632352a864146101215780632983c4b81461014c5780632b1eaf2914610175575b600080fd5b34801561010457600080fd5b5061011f600480360381019061011a91906113f0565b610377565b005b34801561012d57600080fd5b506101366103c3565b604051610143919061142c565b60405180910390f35b34801561015857600080fd5b50610173600480360381019061016e91906113f0565b6103e9565b005b34801561018157600080fd5b5061018a610435565b604051610197919061142c565b60405180910390f35b3480156101ac57600080fd5b506101c760048036038101906101c2919061158d565b61045b565b005b3480156101d557600080fd5b506101f060048036038101906101eb91906113f0565b610476565b005b3480156101fe57600080fd5b506102076104c2565b604051610214919061142c565b60405180910390f35b34801561022957600080fd5b506102326104e8565b60405161023f9190611655565b60405180910390f35b34801561025457600080fd5b5061025d610576565b60405161026a919061142c565b60405180910390f35b34801561027f57600080fd5b5061028861059c565b005b34801561029657600080fd5b5061029f6105b0565b6040516102ac919061142c565b60405180910390f35b3480156102c157600080fd5b506102dc60048036038101906102d791906113f0565b6105d9565b005b3480156102ea57600080fd5b506102f3610625565b60405161030091906116d6565b60405180910390f35b34801561031557600080fd5b50610330600480360381019061032b91906113f0565b61064b565b005b61034c60048036038101906103479190611716565b610697565b005b34801561035a57600080fd5b50610375600480360381019061037091906113f0565b610b87565b005b61037f610c0d565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6103f1610c0d565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610463610c0d565b8060059081610472919061196b565b5050565b61047e610c0d565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600580546104f59061178e565b80601f01602080910402602001604051908101604052809291908181526020018280546105219061178e565b801561056e5780601f106105435761010080835404028352916020019161056e565b820191906000526020600020905b81548152906001019060200180831161055157829003601f168201915b505050505081565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6105a4610c0d565b6105ae6000610c94565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6105e1610c0d565b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610653610c0d565b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6107208180602001906106aa9190611a4c565b6040516020016106bb929190611adf565b60405160208183030381529060405280519060200120826101200135838061014001906106e89190611af8565b6040516020016106fb9493929190611c1c565b6040516020818303038152906040528280610160019061071b9190611c57565b610d58565b61072e816101200135610e42565b600061075b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610f61565b905060008190508073ffffffffffffffffffffffffffffffffffffffff16634b700fc384600001602081019061079191906113f0565b8560a00160208101906107a49190611cfe565b8680604001906107b49190611a4c565b8880606001906107c49190611a4c565b8a60800160208101906107d79190611d63565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518963ffffffff1660e01b815260040161081d989796959493929190611ddb565b600060405180830381600087803b15801561083757600080fd5b505af115801561084b573d6000803e3d6000fd5b50505050600061087c600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610f61565b905060008190508073ffffffffffffffffffffffffffffffffffffffff1663d638aefb8660000160208101906108b291906113f0565b8760c001358860e00160208101906108ca91906113f0565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168a8061010001906108fe9190611e4e565b8b6040518863ffffffff1660e01b8152600401610921979695949392919061201f565b600060405180830381600087803b15801561093b57600080fd5b505af115801561094f573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff1663983b2d56836040518263ffffffff1660e01b815260040161098c919061142c565b600060405180830381600087803b1580156109a657600080fd5b505af11580156109ba573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff1663f2fde38b8660000160208101906109ed91906113f0565b6040518263ffffffff1660e01b8152600401610a09919061142c565b600060405180830381600087803b158015610a2357600080fd5b505af1158015610a37573d6000803e3d6000fd5b50505050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166388433651856005888060200190610a8c9190611a4c565b604051602001610a9e93929190612158565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610aca929190612189565b600060405180830381600087803b158015610ae457600080fd5b505af1158015610af8573d6000803e3d6000fd5b50505050848060200190610b0c9190611a4c565b604051610b1a929190611adf565b60405180910390207f33cbc8d9bff712d6199a0f3dc8bd053690efd03287805defdbee7a53a52f3660868060200190610b539190611a4c565b87868a806101400190610b669190611af8565b604051610b7896959493929190612226565b60405180910390a25050505050565b610b8f610c0d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c015760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610bf8919061142c565b60405180910390fd5b610c0a81610c94565b50565b610c15611012565b73ffffffffffffffffffffffffffffffffffffffff16610c336105b0565b73ffffffffffffffffffffffffffffffffffffffff1614610c9257610c56611012565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610c89919061142c565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610de7610d9d8561101a565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061109e565b73ffffffffffffffffffffffffffffffffffffffff1614610e3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e34906122ef565b60405180910390fd5b505050565b6000810315610f5e5780341015610e8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8590612381565b60405180910390fd5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1634604051610ed6906123d2565b60006040518083038185875af1925050503d8060008114610f13576040519150601f19603f3d011682016040523d82523d6000602084013e610f18565b606091505b5050905080610f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5390612433565b60405180910390fd5b505b50565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008260601b60e81c176000526e5af43d82803e903d91602b57fd5bf38260781b17602052603760096000f09050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361100d576040517fc2f868f400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600080303360405160200161103092919061249b565b60405160208183030381529060405283604051602001611051929190612503565b60405160208183030381529060405280519060200120905060008160405160200161107c9190612573565b6040516020818303038152906040529050808051906020012092505050919050565b6000806000806110ae86866110ca565b9250925092506110be8282611126565b82935050505092915050565b6000806000604184510361110f5760008060006020870151925060408701519150606087015160001a90506111018882858561128a565b95509550955050505061111f565b60006002855160001b9250925092505b9250925092565b6000600381111561113a57611139612599565b5b82600381111561114d5761114c612599565b5b0315611286576001600381111561116757611166612599565b5b82600381111561117a57611179612599565b5b036111b1576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260038111156111c5576111c4612599565b5b8260038111156111d8576111d7612599565b5b0361121d578060001c6040517ffce698f700000000000000000000000000000000000000000000000000000000815260040161121491906125c8565b60405180910390fd5b6003808111156112305761122f612599565b5b82600381111561124357611242612599565b5b0361128557806040517fd78bce0c00000000000000000000000000000000000000000000000000000000815260040161127c91906125f2565b60405180910390fd5b5b5050565b60008060007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08460001c11156112ca576000600385925092509250611374565b6000600188888888604051600081526020016040526040516112ef9493929190612629565b6020604051602081039080840390855afa158015611311573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361136557600060016000801b93509350935050611374565b8060008060001b935093509350505b9450945094915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006113bd82611392565b9050919050565b6113cd816113b2565b81146113d857600080fd5b50565b6000813590506113ea816113c4565b92915050565b60006020828403121561140657611405611388565b5b6000611414848285016113db565b91505092915050565b611426816113b2565b82525050565b6000602082019050611441600083018461141d565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61149a82611451565b810181811067ffffffffffffffff821117156114b9576114b8611462565b5b80604052505050565b60006114cc61137e565b90506114d88282611491565b919050565b600067ffffffffffffffff8211156114f8576114f7611462565b5b61150182611451565b9050602081019050919050565b82818337600083830152505050565b600061153061152b846114dd565b6114c2565b90508281526020810184848401111561154c5761154b61144c565b5b61155784828561150e565b509392505050565b600082601f83011261157457611573611447565b5b813561158484826020860161151d565b91505092915050565b6000602082840312156115a3576115a2611388565b5b600082013567ffffffffffffffff8111156115c1576115c061138d565b5b6115cd8482850161155f565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156116105780820151818401526020810190506115f5565b60008484015250505050565b6000611627826115d6565b61163181856115e1565b93506116418185602086016115f2565b61164a81611451565b840191505092915050565b6000602082019050818103600083015261166f818461161c565b905092915050565b6000819050919050565b600061169c61169761169284611392565b611677565b611392565b9050919050565b60006116ae82611681565b9050919050565b60006116c0826116a3565b9050919050565b6116d0816116b5565b82525050565b60006020820190506116eb60008301846116c7565b92915050565b600080fd5b6000610180828403121561170d5761170c6116f1565b5b81905092915050565b60006020828403121561172c5761172b611388565b5b600082013567ffffffffffffffff81111561174a5761174961138d565b5b611756848285016116f6565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806117a657607f821691505b6020821081036117b9576117b861175f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026118217fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826117e4565b61182b86836117e4565b95508019841693508086168417925050509392505050565b6000819050919050565b600061186861186361185e84611843565b611677565b611843565b9050919050565b6000819050919050565b6118828361184d565b61189661188e8261186f565b8484546117f1565b825550505050565b600090565b6118ab61189e565b6118b6818484611879565b505050565b5b818110156118da576118cf6000826118a3565b6001810190506118bc565b5050565b601f82111561191f576118f0816117bf565b6118f9846117d4565b81016020851015611908578190505b61191c611914856117d4565b8301826118bb565b50505b505050565b600082821c905092915050565b600061194260001984600802611924565b1980831691505092915050565b600061195b8383611931565b9150826002028217905092915050565b611974826115d6565b67ffffffffffffffff81111561198d5761198c611462565b5b611997825461178e565b6119a28282856118de565b600060209050601f8311600181146119d557600084156119c3578287015190505b6119cd858261194f565b865550611a35565b601f1984166119e3866117bf565b60005b82811015611a0b578489015182556001820191506020850194506020810190506119e6565b86831015611a285784890151611a24601f891682611931565b8355505b6001600288020188555050505b505050505050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112611a6957611a68611a3d565b5b80840192508235915067ffffffffffffffff821115611a8b57611a8a611a42565b5b602083019250600182023603831315611aa757611aa6611a47565b5b509250929050565b600081905092915050565b6000611ac68385611aaf565b9350611ad383858461150e565b82840190509392505050565b6000611aec828486611aba565b91508190509392505050565b60008083356001602003843603038112611b1557611b14611a3d565b5b80840192508235915067ffffffffffffffff821115611b3757611b36611a42565b5b602083019250602082023603831315611b5357611b52611a47565b5b509250929050565b6000819050919050565b6000819050919050565b611b80611b7b82611b5b565b611b65565b82525050565b6000819050919050565b611ba1611b9c82611843565b611b86565b82525050565b600081905092915050565b600080fd5b82818337505050565b6000611bcc8385611ba7565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115611bff57611bfe611bb2565b5b602083029250611c10838584611bb7565b82840190509392505050565b6000611c288287611b6f565b602082019150611c388286611b90565b602082019150611c49828486611bc0565b915081905095945050505050565b60008083356001602003843603038112611c7457611c73611a3d565b5b80840192508235915067ffffffffffffffff821115611c9657611c95611a42565b5b602083019250600182023603831315611cb257611cb1611a47565b5b509250929050565b60006bffffffffffffffffffffffff82169050919050565b611cdb81611cba565b8114611ce657600080fd5b50565b600081359050611cf881611cd2565b92915050565b600060208284031215611d1457611d13611388565b5b6000611d2284828501611ce9565b91505092915050565b60008115159050919050565b611d4081611d2b565b8114611d4b57600080fd5b50565b600081359050611d5d81611d37565b92915050565b600060208284031215611d7957611d78611388565b5b6000611d8784828501611d4e565b91505092915050565b611d9981611cba565b82525050565b6000611dab83856115e1565b9350611db883858461150e565b611dc183611451565b840190509392505050565b611dd581611d2b565b82525050565b600060c082019050611df0600083018b61141d565b611dfd602083018a611d90565b8181036040830152611e1081888a611d9f565b90508181036060830152611e25818688611d9f565b9050611e346080830185611dcc565b611e4160a083018461141d565b9998505050505050505050565b60008083356001602003843603038112611e6b57611e6a611a3d565b5b80840192508235915067ffffffffffffffff821115611e8d57611e8c611a42565b5b602083019250604082023603831315611ea957611ea8611a47565b5b509250929050565b611eba81611843565b82525050565b600082825260208201905092915050565b6000819050919050565b6000611eea60208401846113db565b905092915050565b611efb816113b2565b82525050565b611f0a81611843565b8114611f1557600080fd5b50565b600081359050611f2781611f01565b92915050565b6000611f3c6020840184611f18565b905092915050565b611f4d81611843565b82525050565b60408201611f646000830183611edb565b611f716000850182611ef2565b50611f7f6020830183611f2d565b611f8c6020850182611f44565b50505050565b6000611f9e8383611f53565b60408301905092915050565b600082905092915050565b6000604082019050919050565b6000611fce8385611ec0565b9350611fd982611ed1565b8060005b8581101561201257611fef8284611faa565b611ff98882611f92565b975061200483611fb5565b925050600181019050611fdd565b5085925050509392505050565b600060c082019050612034600083018a61141d565b6120416020830189611eb1565b61204e604083018861141d565b61205b606083018761141d565b818103608083015261206e818587611fc2565b905061207d60a083018461141d565b98975050505050505050565b600081546120968161178e565b6120a08186611aaf565b945060018216600081146120bb57600181146120d057612103565b60ff1983168652811515820286019350612103565b6120d9856117bf565b60005b838110156120fb578154818901526001820191506020810190506120dc565b838801955050505b50505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b6000612142600183611aaf565b915061214d8261210c565b600182019050919050565b60006121648286612089565b9150612171828486611aba565b915061217c82612135565b9150819050949350505050565b600060408201905061219e600083018561141d565b81810360208301526121b0818461161c565b90509392505050565b600082825260208201905092915050565b60006121d683856121b9565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561220957612208611bb2565b5b60208302925061221a838584611bb7565b82840190509392505050565b6000608082019050818103600083015261224181888a611d9f565b9050612250602083018761141d565b61225d604083018661141d565b81810360608301526122708184866121ca565b9050979650505050505050565b7f5369676e617475726550726f7465637465643a20496e76616c6964207369676e60008201527f617475726520666f72207468652063616c6c6572000000000000000000000000602082015250565b60006122d96034836115e1565b91506122e48261227d565b604082019050919050565b60006020820190508181036000830152612308816122cc565b9050919050565b7f546865207061796d656e7420616d6f756e7420686173206e6f74206265656e2060008201527f7361746973666965640000000000000000000000000000000000000000000000602082015250565b600061236b6029836115e1565b91506123768261230f565b604082019050919050565b6000602082019050818103600083015261239a8161235e565b9050919050565b600081905092915050565b50565b60006123bc6000836123a1565b91506123c7826123ac565b600082019050919050565b60006123dd826123af565b9150819050919050565b7f50617961626c653a205472616e73666572206661696c65640000000000000000600082015250565b600061241d6018836115e1565b9150612428826123e7565b602082019050919050565b6000602082019050818103600083015261244c81612410565b9050919050565b60008160601b9050919050565b600061246b82612453565b9050919050565b600061247d82612460565b9050919050565b612495612490826113b2565b612472565b82525050565b60006124a78285612484565b6014820191506124b78284612484565b6014820191508190509392505050565b600081519050919050565b60006124dd826124c7565b6124e781856123a1565b93506124f78185602086016115f2565b80840191505092915050565b600061250f82856124d2565b915061251b82846124d2565b91508190509392505050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b600061255d601c83611aaf565b915061256882612527565b601c82019050919050565b600061257e82612550565b915061258a8284611b6f565b60208201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60006020820190506125dd6000830184611eb1565b92915050565b6125ec81611b5b565b82525050565b600060208201905061260760008301846125e3565b92915050565b600060ff82169050919050565b6126238161260d565b82525050565b600060808201905061263e60008301876125e3565b61264b602083018661261a565b61265860408301856125e3565b61266560608301846125e3565b9594505050505056fea26469706673582212201d060d35772b05c902508efaee2083bc40c0e9c17ed196e4724be80dff1a13aa64736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f05a81a18113f4ebfed9c3fa78bca7ec135dacc5000000000000000000000000d66bd1016df96a061e09afaab7072557f792ab1600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000006ca81d6c500d8201dd46edd2f974caab533ef497000000000000000000000000e16c1623c1aa7d919cd2241d8b36d9e79c1be2a20000000000000000000000007df748c0587ffe7e30bb10d5e28d611d408591e4000000000000000000000000000000000000000000000000000000000000004c68747470733a2f2f6275696c64747265652d636c6f7564666c6172652d776f726b65722d73746167696e672e6e667473747564696f732e776f726b6572732e6465762f6d657461646174612f0000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _erc721Address (address): 0xF05A81a18113F4ebFED9C3fa78bCa7ec135dacC5
Arg [1] : _minterAddress (address): 0xd66Bd1016DF96a061e09AFaaB7072557f792AB16
Arg [2] : _metadataBaseUrl (string): https://buildtree-cloudflare-worker-staging.nftstudios.workers.dev/metadata/
Arg [3] : _metadataResolverAddress (address): 0x6Ca81d6C500d8201dd46eDd2F974cAab533ef497
Arg [4] : _signerAddress (address): 0xe16C1623c1AA7D919cd2241d8b36d9E79C1Be2A2
Arg [5] : _paymentRecipient (address): 0x7df748C0587FfE7e30bB10D5E28d611D408591e4
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 000000000000000000000000f05a81a18113f4ebfed9c3fa78bca7ec135dacc5
Arg [1] : 000000000000000000000000d66bd1016df96a061e09afaab7072557f792ab16
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [3] : 0000000000000000000000006ca81d6c500d8201dd46edd2f974caab533ef497
Arg [4] : 000000000000000000000000e16c1623c1aa7d919cd2241d8b36d9e79c1be2a2
Arg [5] : 0000000000000000000000007df748c0587ffe7e30bb10d5e28d611d408591e4
Arg [6] : 000000000000000000000000000000000000000000000000000000000000004c
Arg [7] : 68747470733a2f2f6275696c64747265652d636c6f7564666c6172652d776f72
Arg [8] : 6b65722d73746167696e672e6e667473747564696f732e776f726b6572732e64
Arg [9] : 65762f6d657461646174612f0000000000000000000000000000000000000000
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.