Latest 8 from a total of 8 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Create | 38086039 | 41 hrs ago | IN | 0.00000027 ETH | 0.00000836 | ||||
| Create | 30314679 | 181 days ago | IN | 0 ETH | 0.00000176 | ||||
| Create | 30313265 | 181 days ago | IN | 0 ETH | 0.00000352 | ||||
| Create | 30309014 | 181 days ago | IN | 0 ETH | 0.00000957 | ||||
| Create | 30284951 | 182 days ago | IN | 0 ETH | 0.00176427 | ||||
| Add Allowed Mint... | 30124036 | 186 days ago | IN | 0 ETH | 0.00000046 | ||||
| Add Allowed Mint... | 30124035 | 186 days ago | IN | 0 ETH | 0.00000046 | ||||
| Add Allowed Mint... | 30124034 | 186 days ago | IN | 0 ETH | 0.00000046 |
Latest 11 internal transactions
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 38086039 | 41 hrs ago | Contract Creation | 0 ETH | |||
| 38086039 | 41 hrs ago | Contract Creation | 0 ETH | |||
| 38086039 | 41 hrs ago | 0.00000027 ETH | ||||
| 30314679 | 181 days ago | Contract Creation | 0 ETH | |||
| 30314679 | 181 days ago | Contract Creation | 0 ETH | |||
| 30313265 | 181 days ago | Contract Creation | 0 ETH | |||
| 30313265 | 181 days ago | Contract Creation | 0 ETH | |||
| 30309014 | 181 days ago | Contract Creation | 0 ETH | |||
| 30309014 | 181 days ago | Contract Creation | 0 ETH | |||
| 30284951 | 182 days ago | Contract Creation | 0 ETH | |||
| 30284951 | 182 days ago | Contract Creation | 0 ETH |
Cross-Chain Transactions
Contract Source Code Verified (Exact Match)
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
// @author: Buildtree - Powered by NFT Studios
pragma solidity ^0.8.18;
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol";
import {DTOs} from "./../libraries/dtos.sol";
import {SignatureProtected} from "./../libraries/SignatureProtected.sol";
import {EventEmitter} from "./../eventEmitter/EventEmitter.sol";
interface IERC721 {
function init(
address owner,
uint96 royalty,
string memory name,
string memory symbol,
bool transferLocked,
address metadataResolver,
address eventEmitter
) external;
function addMinter(address minter) external;
function transferOwnership(address owner) external;
function owner() external returns (address);
function addToBlacklist(address blockedAddress) external;
}
interface IMinter {
function init(
address owner,
uint256 maxSupply,
address signerAddress,
address feeRecipient,
DTOs.Recipient[] memory recipients,
address erc721Address
) external;
}
interface IMetadataResolver {
function setBaseURI(address _address, string memory _baseURI) external;
}
contract ERC721ProxyFactory is Ownable, SignatureProtected {
address public paymentRecipient;
address public erc721Address;
mapping(string => address) allowedMinters;
string public metadataBaseUrl;
IMetadataResolver public metadataResolver;
EventEmitter public eventEmitter;
event NewContract(
string indexed iuuid,
string uuid,
address token,
address minter,
uint256[] extras
);
constructor(
address _erc721Address,
string memory _metadataBaseUrl,
address _metadataResolverAddress,
address _signerAddress,
address _paymentRecipient,
address _eventEmitter
) {
paymentRecipient = _paymentRecipient;
erc721Address = _erc721Address;
metadataBaseUrl = _metadataBaseUrl;
metadataResolver = IMetadataResolver(_metadataResolverAddress);
eventEmitter = EventEmitter(_eventEmitter);
initSignatureProtected(_signerAddress);
}
// Only Owner
function setERC721Address(address _erc721Address) external onlyOwner {
erc721Address = _erc721Address;
}
function addAllowedMinter(
string memory _type,
address _address
) external onlyOwner {
allowedMinters[_type] = _address;
}
function removeAllowedMinter(string memory _type) external onlyOwner {
delete allowedMinters[_type];
}
function getAllowedMinterByKind(
string memory kind
) public view returns (address) {
require(
allowedMinters[kind] != address(0),
"No contract found for the given kind"
);
return allowedMinters[kind];
}
function setMetadataResolverAddress(
address _metadataResolverAddress
) external onlyOwner {
metadataResolver = IMetadataResolver(_metadataResolverAddress);
}
function setMetadataBaseUrl(
string memory _metadataBaseUrl
) external onlyOwner {
metadataBaseUrl = _metadataBaseUrl;
}
function setPaymentRecipient(address _paymentRecipient) external onlyOwner {
paymentRecipient = _paymentRecipient;
}
function setEventEmitter(address _eventEmitter) external onlyOwner {
eventEmitter = EventEmitter(_eventEmitter);
}
// 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(eventEmitter)
);
address cloneMinterAddress = Clones.clone(
getAllowedMinterByKind(_createDto.minterKind)
);
IMinter minter = IMinter(cloneMinterAddress);
minter.init(
_createDto.owner,
_createDto.maxSupply,
_createDto.signer,
paymentRecipient,
_createDto.recipients,
cloneErc721Address
);
erc721.addMinter(cloneMinterAddress);
for (uint256 i; i < _createDto.transferBlockedAddresses.length; i++) {
erc721.addToBlacklist(_createDto.transferBlockedAddresses[i]);
}
erc721.transferOwnership(_createDto.owner);
metadataResolver.setBaseURI(
cloneErc721Address,
string(abi.encodePacked(metadataBaseUrl, _createDto.uuid, "/"))
);
eventEmitter.addEmitter(cloneErc721Address);
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
// @author: Buildtree - Powered by NFT Studios
pragma solidity ^0.8.0;
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
contract EventEmitter is Ownable {
event Transfer(
address indexed emitter,
address indexed from,
address indexed to,
uint256 id
);
event BatchTransfer(
address indexed emitter,
address indexed from,
address indexed to,
uint256[] ids,
uint256[] values
);
mapping(address => bool) _allowedSubscribers;
mapping(address => bool) _allowedEmitters;
modifier onlySubscriber() {
require(
_allowedSubscribers[msg.sender],
"Caller is not an allowed subcriber"
);
_;
}
modifier onlyEmitter() {
require(
_allowedEmitters[msg.sender],
"Caller is not an allowed emitter"
);
_;
}
constructor() Ownable(msg.sender) {}
function emitTransfer(
address from,
address to,
uint256 id
) external onlyEmitter {
emit Transfer(msg.sender, from, to, id);
}
function emitBatchTransfer(
address from,
address to,
uint256[] calldata ids,
uint256[] calldata values
) external onlyEmitter {
emit BatchTransfer(msg.sender, from, to, ids, values);
}
function addSubscriber(address subscriber) external onlyOwner {
_allowedSubscribers[subscriber] = true;
}
function removeSubscriber(address subscriber) external onlyOwner {
_allowedSubscribers[subscriber] = false;
}
function addEmitter(address emitter) external onlySubscriber {
_allowedEmitters[emitter] = true;
}
function removeEmitter(address emitter) external onlySubscriber {
_allowedEmitters[emitter] = false;
}
}// 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[] transferBlockedAddresses;
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[] transferBlockedAddresses;
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 {Ownable} from "@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":"string","name":"_metadataBaseUrl","type":"string"},{"internalType":"address","name":"_metadataResolverAddress","type":"address"},{"internalType":"address","name":"_signerAddress","type":"address"},{"internalType":"address","name":"_paymentRecipient","type":"address"},{"internalType":"address","name":"_eventEmitter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ECDSAInvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"name":"ECDSAInvalidSignatureLength","type":"error"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"ECDSAInvalidSignatureS","type":"error"},{"inputs":[],"name":"ERC1167FailedCreateClone","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"iuuid","type":"string"},{"indexed":false,"internalType":"string","name":"uuid","type":"string"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"extras","type":"uint256[]"}],"name":"NewContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"string","name":"_type","type":"string"},{"internalType":"address","name":"_address","type":"address"}],"name":"addAllowedMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"string","name":"uuid","type":"string"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"bool","name":"transferLocked","type":"bool"},{"internalType":"uint96","name":"royaltyPercentage","type":"uint96"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"address[]","name":"transferBlockedAddresses","type":"address[]"},{"internalType":"address","name":"signer","type":"address"},{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"percentage","type":"uint256"}],"internalType":"struct DTOs.Recipient[]","name":"recipients","type":"tuple[]"},{"internalType":"uint256","name":"paymentAmount","type":"uint256"},{"internalType":"string","name":"minterKind","type":"string"},{"internalType":"uint256[]","name":"extras","type":"uint256[]"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct DTOs.Create721ContractDto","name":"_createDto","type":"tuple"}],"name":"create","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"erc721Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eventEmitter","outputs":[{"internalType":"contract EventEmitter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"kind","type":"string"}],"name":"getAllowedMinterByKind","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataBaseUrl","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataResolver","outputs":[{"internalType":"contract IMetadataResolver","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_type","type":"string"}],"name":"removeAllowedMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_erc721Address","type":"address"}],"name":"setERC721Address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_eventEmitter","type":"address"}],"name":"setEventEmitter","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
60806040523480156200001157600080fd5b50604051620035e1380380620035e18339818101604052810190620000379190620004f2565b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000ad5760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620000a49190620005be565b60405180910390fd5b620000be81620001f260201b60201c565b5081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550846005908162000152919062000826565b5083600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620001e683620002b660201b60201c565b5050505050506200090d565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200033b826200030e565b9050919050565b6200034d816200032e565b81146200035957600080fd5b50565b6000815190506200036d8162000342565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620003c8826200037d565b810181811067ffffffffffffffff82111715620003ea57620003e96200038e565b5b80604052505050565b6000620003ff620002fa565b90506200040d8282620003bd565b919050565b600067ffffffffffffffff82111562000430576200042f6200038e565b5b6200043b826200037d565b9050602081019050919050565b60005b83811015620004685780820151818401526020810190506200044b565b60008484015250505050565b60006200048b620004858462000412565b620003f3565b905082815260208101848484011115620004aa57620004a962000378565b5b620004b784828562000448565b509392505050565b600082601f830112620004d757620004d662000373565b5b8151620004e984826020860162000474565b91505092915050565b60008060008060008060c0878903121562000512576200051162000304565b5b60006200052289828a016200035c565b965050602087015167ffffffffffffffff81111562000546576200054562000309565b5b6200055489828a01620004bf565b95505060406200056789828a016200035c565b94505060606200057a89828a016200035c565b93505060806200058d89828a016200035c565b92505060a0620005a089828a016200035c565b9150509295509295509295565b620005b8816200032e565b82525050565b6000602082019050620005d56000830184620005ad565b92915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200062e57607f821691505b602082108103620006445762000643620005e6565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620006ae7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200066f565b620006ba86836200066f565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200070762000701620006fb84620006d2565b620006dc565b620006d2565b9050919050565b6000819050919050565b6200072383620006e6565b6200073b62000732826200070e565b8484546200067c565b825550505050565b600090565b6200075262000743565b6200075f81848462000718565b505050565b5b8181101562000787576200077b60008262000748565b60018101905062000765565b5050565b601f821115620007d657620007a0816200064a565b620007ab846200065f565b81016020851015620007bb578190505b620007d3620007ca856200065f565b83018262000764565b50505b505050565b600082821c905092915050565b6000620007fb60001984600802620007db565b1980831691505092915050565b6000620008168383620007e8565b9150826002028217905092915050565b6200083182620005db565b67ffffffffffffffff8111156200084d576200084c6200038e565b5b62000859825462000615565b620008668282856200078b565b600060209050601f8311600181146200089e576000841562000889578287015190505b62000895858262000808565b86555062000905565b601f198416620008ae866200064a565b60005b82811015620008d857848901518255600182019150602085019450602081019050620008b1565b86831015620008f85784890151620008f4601f891682620007e8565b8355505b6001600288020188555050505b505050505050565b612cc4806200091d6000396000f3fe6080604052600436106101145760003560e01c80634793a2b7116100a05780639a03d9a3116100645780639a03d9a3146103565780639ff78c301461037f578063a0c76f62146103aa578063e1a8fd8e146103d5578063f2fde38b146103fe57610114565b80634793a2b71461028157806349f3f1a6146102be5780635b7633d0146102e9578063715018a6146103145780638da5cb5b1461032b57610114565b80632983c4b8116100e75780632983c4b8146101b25780632b1eaf29146101db5780632d76119d14610206578063320fbc421461022f57806333d7b1761461025857610114565b8063046dc1661461011957806321b139c1146101425780632352a8641461016b578063243edd4314610196575b600080fd5b34801561012557600080fd5b50610140600480360381019061013b91906117fe565b610427565b005b34801561014e57600080fd5b50610169600480360381019061016491906117fe565b610473565b005b34801561017757600080fd5b506101806104bf565b60405161018d919061183a565b60405180910390f35b6101b060048036038101906101ab919061187a565b6104e5565b005b3480156101be57600080fd5b506101d960048036038101906101d491906117fe565b610b8a565b005b3480156101e757600080fd5b506101f0610bd6565b6040516101fd919061183a565b60405180910390f35b34801561021257600080fd5b5061022d60048036038101906102289190611a09565b610bfc565b005b34801561023b57600080fd5b5061025660048036038101906102519190611a09565b610c17565b005b34801561026457600080fd5b5061027f600480360381019061027a91906117fe565b610c63565b005b34801561028d57600080fd5b506102a860048036038101906102a39190611a09565b610caf565b6040516102b5919061183a565b60405180910390f35b3480156102ca57600080fd5b506102d3610da3565b6040516102e09190611ad1565b60405180910390f35b3480156102f557600080fd5b506102fe610e31565b60405161030b919061183a565b60405180910390f35b34801561032057600080fd5b50610329610e57565b005b34801561033757600080fd5b50610340610e6b565b60405161034d919061183a565b60405180910390f35b34801561036257600080fd5b5061037d600480360381019061037891906117fe565b610e94565b005b34801561038b57600080fd5b50610394610ee0565b6040516103a19190611b52565b60405180910390f35b3480156103b657600080fd5b506103bf610f06565b6040516103cc9190611b8e565b60405180910390f35b3480156103e157600080fd5b506103fc60048036038101906103f79190611ba9565b610f2c565b005b34801561040a57600080fd5b50610425600480360381019061042091906117fe565b610f95565b005b61042f61101b565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61047b61101b565b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61056e8180602001906104f89190611c14565b604051602001610509929190611ca7565b60405160208183030381529060405280519060200120826101400135838061018001906105369190611cc0565b6040516020016105499493929190611dee565b60405160208183030381529060405282806101a001906105699190611e29565b6110a2565b61057c81610140013561118c565b60006105a9600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166112ab565b905060008190508073ffffffffffffffffffffffffffffffffffffffff166359f145a88460000160208101906105df91906117fe565b8560a00160208101906105f29190611ed0565b8680604001906106029190611c14565b8880606001906106129190611c14565b8a60800160208101906106259190611f35565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518a63ffffffff1660e01b815260040161068f99989796959493929190611fad565b600060405180830381600087803b1580156106a957600080fd5b505af11580156106bd573d6000803e3d6000fd5b505050506000610727610722858061016001906106da9190611c14565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050610caf565b6112ab565b905060008190508073ffffffffffffffffffffffffffffffffffffffff1663d638aefb86600001602081019061075d91906117fe565b8760c001358861010001602081019061077691906117fe565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168a8061012001906107aa919061202e565b8b6040518863ffffffff1660e01b81526004016107cd97969594939291906121ff565b600060405180830381600087803b1580156107e757600080fd5b505af11580156107fb573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff1663983b2d56836040518263ffffffff1660e01b8152600401610838919061183a565b600060405180830381600087803b15801561085257600080fd5b505af1158015610866573d6000803e3d6000fd5b5050505060005b858060e0019061087d9190612269565b9050811015610933578373ffffffffffffffffffffffffffffffffffffffff166344337ea1878060e001906108b29190612269565b848181106108c3576108c26122cc565b5b90506020020160208101906108d891906117fe565b6040518263ffffffff1660e01b81526004016108f4919061183a565b600060405180830381600087803b15801561090e57600080fd5b505af1158015610922573d6000803e3d6000fd5b50505050808060010191505061086d565b508273ffffffffffffffffffffffffffffffffffffffff1663f2fde38b86600001602081019061096391906117fe565b6040518263ffffffff1660e01b815260040161097f919061183a565b600060405180830381600087803b15801561099957600080fd5b505af11580156109ad573d6000803e3d6000fd5b50505050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166388433651856005888060200190610a029190611c14565b604051602001610a149392919061243f565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610a40929190612470565b600060405180830381600087803b158015610a5a57600080fd5b505af1158015610a6e573d6000803e3d6000fd5b50505050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663235c279f856040518263ffffffff1660e01b8152600401610acd919061183a565b600060405180830381600087803b158015610ae757600080fd5b505af1158015610afb573d6000803e3d6000fd5b50505050848060200190610b0f9190611c14565b604051610b1d929190611ca7565b60405180910390207f33cbc8d9bff712d6199a0f3dc8bd053690efd03287805defdbee7a53a52f3660868060200190610b569190611c14565b87868a806101800190610b699190611cc0565b604051610b7b9695949392919061250d565b60405180910390a25050505050565b610b9261101b565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610c0461101b565b8060059081610c1391906126f1565b5050565b610c1f61101b565b600481604051610c2f91906127f4565b908152602001604051809103902060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550565b610c6b61101b565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff16600483604051610cd891906127f4565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610d5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d549061287d565b60405180910390fd5b600482604051610d6d91906127f4565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60058054610db09061232a565b80601f0160208091040260200160405190810160405280929190818152602001828054610ddc9061232a565b8015610e295780601f10610dfe57610100808354040283529160200191610e29565b820191906000526020600020905b815481529060010190602001808311610e0c57829003601f168201915b505050505081565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610e5f61101b565b610e69600061135c565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610e9c61101b565b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610f3461101b565b80600483604051610f4591906127f4565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b610f9d61101b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361100f5760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611006919061183a565b60405180910390fd5b6110188161135c565b50565b611023611420565b73ffffffffffffffffffffffffffffffffffffffff16611041610e6b565b73ffffffffffffffffffffffffffffffffffffffff16146110a057611064611420565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611097919061183a565b60405180910390fd5b565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166111316110e785611428565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506114ac565b73ffffffffffffffffffffffffffffffffffffffff1614611187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117e9061290f565b60405180910390fd5b505050565b60008103156112a857803410156111d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cf906129a1565b60405180910390fd5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1634604051611220906129f2565b60006040518083038185875af1925050503d806000811461125d576040519150601f19603f3d011682016040523d82523d6000602084013e611262565b606091505b50509050806112a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129d90612a53565b60405180910390fd5b505b50565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008260601b60e81c176000526e5af43d82803e903d91602b57fd5bf38260781b17602052603760096000f09050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611357576040517fc2f868f400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b600080303360405160200161143e929190612abb565b6040516020818303038152906040528360405160200161145f929190612b23565b60405160208183030381529060405280519060200120905060008160405160200161148a9190612b93565b6040516020818303038152906040529050808051906020012092505050919050565b6000806000806114bc86866114d8565b9250925092506114cc8282611534565b82935050505092915050565b6000806000604184510361151d5760008060006020870151925060408701519150606087015160001a905061150f88828585611698565b95509550955050505061152d565b60006002855160001b9250925092505b9250925092565b6000600381111561154857611547612bb9565b5b82600381111561155b5761155a612bb9565b5b0315611694576001600381111561157557611574612bb9565b5b82600381111561158857611587612bb9565b5b036115bf576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260038111156115d3576115d2612bb9565b5b8260038111156115e6576115e5612bb9565b5b0361162b578060001c6040517ffce698f70000000000000000000000000000000000000000000000000000000081526004016116229190612be8565b60405180910390fd5b60038081111561163e5761163d612bb9565b5b82600381111561165157611650612bb9565b5b0361169357806040517fd78bce0c00000000000000000000000000000000000000000000000000000000815260040161168a9190612c12565b60405180910390fd5b5b5050565b60008060007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08460001c11156116d8576000600385925092509250611782565b6000600188888888604051600081526020016040526040516116fd9493929190612c49565b6020604051602081039080840390855afa15801561171f573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361177357600060016000801b93509350935050611782565b8060008060001b935093509350505b9450945094915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006117cb826117a0565b9050919050565b6117db816117c0565b81146117e657600080fd5b50565b6000813590506117f8816117d2565b92915050565b60006020828403121561181457611813611796565b5b6000611822848285016117e9565b91505092915050565b611834816117c0565b82525050565b600060208201905061184f600083018461182b565b92915050565b600080fd5b60006101c0828403121561187157611870611855565b5b81905092915050565b6000602082840312156118905761188f611796565b5b600082013567ffffffffffffffff8111156118ae576118ad61179b565b5b6118ba8482850161185a565b91505092915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611916826118cd565b810181811067ffffffffffffffff82111715611935576119346118de565b5b80604052505050565b600061194861178c565b9050611954828261190d565b919050565b600067ffffffffffffffff821115611974576119736118de565b5b61197d826118cd565b9050602081019050919050565b82818337600083830152505050565b60006119ac6119a784611959565b61193e565b9050828152602081018484840111156119c8576119c76118c8565b5b6119d384828561198a565b509392505050565b600082601f8301126119f0576119ef6118c3565b5b8135611a00848260208601611999565b91505092915050565b600060208284031215611a1f57611a1e611796565b5b600082013567ffffffffffffffff811115611a3d57611a3c61179b565b5b611a49848285016119db565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611a8c578082015181840152602081019050611a71565b60008484015250505050565b6000611aa382611a52565b611aad8185611a5d565b9350611abd818560208601611a6e565b611ac6816118cd565b840191505092915050565b60006020820190508181036000830152611aeb8184611a98565b905092915050565b6000819050919050565b6000611b18611b13611b0e846117a0565b611af3565b6117a0565b9050919050565b6000611b2a82611afd565b9050919050565b6000611b3c82611b1f565b9050919050565b611b4c81611b31565b82525050565b6000602082019050611b676000830184611b43565b92915050565b6000611b7882611b1f565b9050919050565b611b8881611b6d565b82525050565b6000602082019050611ba36000830184611b7f565b92915050565b60008060408385031215611bc057611bbf611796565b5b600083013567ffffffffffffffff811115611bde57611bdd61179b565b5b611bea858286016119db565b9250506020611bfb858286016117e9565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112611c3157611c30611c05565b5b80840192508235915067ffffffffffffffff821115611c5357611c52611c0a565b5b602083019250600182023603831315611c6f57611c6e611c0f565b5b509250929050565b600081905092915050565b6000611c8e8385611c77565b9350611c9b83858461198a565b82840190509392505050565b6000611cb4828486611c82565b91508190509392505050565b60008083356001602003843603038112611cdd57611cdc611c05565b5b80840192508235915067ffffffffffffffff821115611cff57611cfe611c0a565b5b602083019250602082023603831315611d1b57611d1a611c0f565b5b509250929050565b6000819050919050565b6000819050919050565b611d48611d4382611d23565b611d2d565b82525050565b6000819050919050565b6000819050919050565b611d73611d6e82611d4e565b611d58565b82525050565b600081905092915050565b600080fd5b82818337505050565b6000611d9e8385611d79565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115611dd157611dd0611d84565b5b602083029250611de2838584611d89565b82840190509392505050565b6000611dfa8287611d37565b602082019150611e0a8286611d62565b602082019150611e1b828486611d92565b915081905095945050505050565b60008083356001602003843603038112611e4657611e45611c05565b5b80840192508235915067ffffffffffffffff821115611e6857611e67611c0a565b5b602083019250600182023603831315611e8457611e83611c0f565b5b509250929050565b60006bffffffffffffffffffffffff82169050919050565b611ead81611e8c565b8114611eb857600080fd5b50565b600081359050611eca81611ea4565b92915050565b600060208284031215611ee657611ee5611796565b5b6000611ef484828501611ebb565b91505092915050565b60008115159050919050565b611f1281611efd565b8114611f1d57600080fd5b50565b600081359050611f2f81611f09565b92915050565b600060208284031215611f4b57611f4a611796565b5b6000611f5984828501611f20565b91505092915050565b611f6b81611e8c565b82525050565b6000611f7d8385611a5d565b9350611f8a83858461198a565b611f93836118cd565b840190509392505050565b611fa781611efd565b82525050565b600060e082019050611fc2600083018c61182b565b611fcf602083018b611f62565b8181036040830152611fe281898b611f71565b90508181036060830152611ff7818789611f71565b90506120066080830186611f9e565b61201360a083018561182b565b61202060c083018461182b565b9a9950505050505050505050565b6000808335600160200384360303811261204b5761204a611c05565b5b80840192508235915067ffffffffffffffff82111561206d5761206c611c0a565b5b60208301925060408202360383131561208957612088611c0f565b5b509250929050565b61209a81611d4e565b82525050565b600082825260208201905092915050565b6000819050919050565b60006120ca60208401846117e9565b905092915050565b6120db816117c0565b82525050565b6120ea81611d4e565b81146120f557600080fd5b50565b600081359050612107816120e1565b92915050565b600061211c60208401846120f8565b905092915050565b61212d81611d4e565b82525050565b6040820161214460008301836120bb565b61215160008501826120d2565b5061215f602083018361210d565b61216c6020850182612124565b50505050565b600061217e8383612133565b60408301905092915050565b600082905092915050565b6000604082019050919050565b60006121ae83856120a0565b93506121b9826120b1565b8060005b858110156121f2576121cf828461218a565b6121d98882612172565b97506121e483612195565b9250506001810190506121bd565b5085925050509392505050565b600060c082019050612214600083018a61182b565b6122216020830189612091565b61222e604083018861182b565b61223b606083018761182b565b818103608083015261224e8185876121a2565b905061225d60a083018461182b565b98975050505050505050565b6000808335600160200384360303811261228657612285611c05565b5b80840192508235915067ffffffffffffffff8211156122a8576122a7611c0a565b5b6020830192506020820236038313156122c4576122c3611c0f565b5b509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061234257607f821691505b602082108103612355576123546122fb565b5b50919050565b60008190508160005260206000209050919050565b6000815461237d8161232a565b6123878186611c77565b945060018216600081146123a257600181146123b7576123ea565b60ff19831686528115158202860193506123ea565b6123c08561235b565b60005b838110156123e2578154818901526001820191506020810190506123c3565b838801955050505b50505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b6000612429600183611c77565b9150612434826123f3565b600182019050919050565b600061244b8286612370565b9150612458828486611c82565b91506124638261241c565b9150819050949350505050565b6000604082019050612485600083018561182b565b81810360208301526124978184611a98565b90509392505050565b600082825260208201905092915050565b60006124bd83856124a0565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156124f0576124ef611d84565b5b602083029250612501838584611d89565b82840190509392505050565b6000608082019050818103600083015261252881888a611f71565b9050612537602083018761182b565b612544604083018661182b565b81810360608301526125578184866124b1565b9050979650505050505050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026125b17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612574565b6125bb8683612574565b95508019841693508086168417925050509392505050565b60006125ee6125e96125e484611d4e565b611af3565b611d4e565b9050919050565b6000819050919050565b612608836125d3565b61261c612614826125f5565b848454612581565b825550505050565b600090565b612631612624565b61263c8184846125ff565b505050565b5b8181101561266057612655600082612629565b600181019050612642565b5050565b601f8211156126a5576126768161235b565b61267f84612564565b8101602085101561268e578190505b6126a261269a85612564565b830182612641565b50505b505050565b600082821c905092915050565b60006126c8600019846008026126aa565b1980831691505092915050565b60006126e183836126b7565b9150826002028217905092915050565b6126fa82611a52565b67ffffffffffffffff811115612713576127126118de565b5b61271d825461232a565b612728828285612664565b600060209050601f83116001811461275b5760008415612749578287015190505b61275385826126d5565b8655506127bb565b601f1984166127698661235b565b60005b828110156127915784890151825560018201915060208501945060208101905061276c565b868310156127ae57848901516127aa601f8916826126b7565b8355505b6001600288020188555050505b505050505050565b60006127ce82611a52565b6127d88185611c77565b93506127e8818560208601611a6e565b80840191505092915050565b600061280082846127c3565b915081905092915050565b7f4e6f20636f6e747261637420666f756e6420666f722074686520676976656e2060008201527f6b696e6400000000000000000000000000000000000000000000000000000000602082015250565b6000612867602483611a5d565b91506128728261280b565b604082019050919050565b600060208201905081810360008301526128968161285a565b9050919050565b7f5369676e617475726550726f7465637465643a20496e76616c6964207369676e60008201527f617475726520666f72207468652063616c6c6572000000000000000000000000602082015250565b60006128f9603483611a5d565b91506129048261289d565b604082019050919050565b60006020820190508181036000830152612928816128ec565b9050919050565b7f546865207061796d656e7420616d6f756e7420686173206e6f74206265656e2060008201527f7361746973666965640000000000000000000000000000000000000000000000602082015250565b600061298b602983611a5d565b91506129968261292f565b604082019050919050565b600060208201905081810360008301526129ba8161297e565b9050919050565b600081905092915050565b50565b60006129dc6000836129c1565b91506129e7826129cc565b600082019050919050565b60006129fd826129cf565b9150819050919050565b7f50617961626c653a205472616e73666572206661696c65640000000000000000600082015250565b6000612a3d601883611a5d565b9150612a4882612a07565b602082019050919050565b60006020820190508181036000830152612a6c81612a30565b9050919050565b60008160601b9050919050565b6000612a8b82612a73565b9050919050565b6000612a9d82612a80565b9050919050565b612ab5612ab0826117c0565b612a92565b82525050565b6000612ac78285612aa4565b601482019150612ad78284612aa4565b6014820191508190509392505050565b600081519050919050565b6000612afd82612ae7565b612b0781856129c1565b9350612b17818560208601611a6e565b80840191505092915050565b6000612b2f8285612af2565b9150612b3b8284612af2565b91508190509392505050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000612b7d601c83611c77565b9150612b8882612b47565b601c82019050919050565b6000612b9e82612b70565b9150612baa8284611d37565b60208201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6000602082019050612bfd6000830184612091565b92915050565b612c0c81611d23565b82525050565b6000602082019050612c276000830184612c03565b92915050565b600060ff82169050919050565b612c4381612c2d565b82525050565b6000608082019050612c5e6000830187612c03565b612c6b6020830186612c3a565b612c786040830185612c03565b612c856060830184612c03565b9594505050505056fea26469706673582212208e7f01ad39ebe9eafc02868e44268e5828754d2cc0672bb3d42a846598aeac3864736f6c634300081800330000000000000000000000007814e9347069375d0291f2a97c9af1c9affd53e200000000000000000000000000000000000000000000000000000000000000c000000000000000000000000048ef56d7b682cca24e104707c507e5bc0791baff000000000000000000000000e16c1623c1aa7d919cd2241d8b36d9e79c1be2a20000000000000000000000004e3cc25298325b95d916486fe87a2e813144c49a00000000000000000000000075cfb64305acc6741c90e04363e38ca5c0e9b7fb000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f6275696c64747265652d636c6f7564666c6172652d776f726b65722e6e667473747564696f732e776f726b6572732e6465762f6d657461646174612f00000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106101145760003560e01c80634793a2b7116100a05780639a03d9a3116100645780639a03d9a3146103565780639ff78c301461037f578063a0c76f62146103aa578063e1a8fd8e146103d5578063f2fde38b146103fe57610114565b80634793a2b71461028157806349f3f1a6146102be5780635b7633d0146102e9578063715018a6146103145780638da5cb5b1461032b57610114565b80632983c4b8116100e75780632983c4b8146101b25780632b1eaf29146101db5780632d76119d14610206578063320fbc421461022f57806333d7b1761461025857610114565b8063046dc1661461011957806321b139c1146101425780632352a8641461016b578063243edd4314610196575b600080fd5b34801561012557600080fd5b50610140600480360381019061013b91906117fe565b610427565b005b34801561014e57600080fd5b50610169600480360381019061016491906117fe565b610473565b005b34801561017757600080fd5b506101806104bf565b60405161018d919061183a565b60405180910390f35b6101b060048036038101906101ab919061187a565b6104e5565b005b3480156101be57600080fd5b506101d960048036038101906101d491906117fe565b610b8a565b005b3480156101e757600080fd5b506101f0610bd6565b6040516101fd919061183a565b60405180910390f35b34801561021257600080fd5b5061022d60048036038101906102289190611a09565b610bfc565b005b34801561023b57600080fd5b5061025660048036038101906102519190611a09565b610c17565b005b34801561026457600080fd5b5061027f600480360381019061027a91906117fe565b610c63565b005b34801561028d57600080fd5b506102a860048036038101906102a39190611a09565b610caf565b6040516102b5919061183a565b60405180910390f35b3480156102ca57600080fd5b506102d3610da3565b6040516102e09190611ad1565b60405180910390f35b3480156102f557600080fd5b506102fe610e31565b60405161030b919061183a565b60405180910390f35b34801561032057600080fd5b50610329610e57565b005b34801561033757600080fd5b50610340610e6b565b60405161034d919061183a565b60405180910390f35b34801561036257600080fd5b5061037d600480360381019061037891906117fe565b610e94565b005b34801561038b57600080fd5b50610394610ee0565b6040516103a19190611b52565b60405180910390f35b3480156103b657600080fd5b506103bf610f06565b6040516103cc9190611b8e565b60405180910390f35b3480156103e157600080fd5b506103fc60048036038101906103f79190611ba9565b610f2c565b005b34801561040a57600080fd5b50610425600480360381019061042091906117fe565b610f95565b005b61042f61101b565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61047b61101b565b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61056e8180602001906104f89190611c14565b604051602001610509929190611ca7565b60405160208183030381529060405280519060200120826101400135838061018001906105369190611cc0565b6040516020016105499493929190611dee565b60405160208183030381529060405282806101a001906105699190611e29565b6110a2565b61057c81610140013561118c565b60006105a9600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166112ab565b905060008190508073ffffffffffffffffffffffffffffffffffffffff166359f145a88460000160208101906105df91906117fe565b8560a00160208101906105f29190611ed0565b8680604001906106029190611c14565b8880606001906106129190611c14565b8a60800160208101906106259190611f35565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518a63ffffffff1660e01b815260040161068f99989796959493929190611fad565b600060405180830381600087803b1580156106a957600080fd5b505af11580156106bd573d6000803e3d6000fd5b505050506000610727610722858061016001906106da9190611c14565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050610caf565b6112ab565b905060008190508073ffffffffffffffffffffffffffffffffffffffff1663d638aefb86600001602081019061075d91906117fe565b8760c001358861010001602081019061077691906117fe565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168a8061012001906107aa919061202e565b8b6040518863ffffffff1660e01b81526004016107cd97969594939291906121ff565b600060405180830381600087803b1580156107e757600080fd5b505af11580156107fb573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff1663983b2d56836040518263ffffffff1660e01b8152600401610838919061183a565b600060405180830381600087803b15801561085257600080fd5b505af1158015610866573d6000803e3d6000fd5b5050505060005b858060e0019061087d9190612269565b9050811015610933578373ffffffffffffffffffffffffffffffffffffffff166344337ea1878060e001906108b29190612269565b848181106108c3576108c26122cc565b5b90506020020160208101906108d891906117fe565b6040518263ffffffff1660e01b81526004016108f4919061183a565b600060405180830381600087803b15801561090e57600080fd5b505af1158015610922573d6000803e3d6000fd5b50505050808060010191505061086d565b508273ffffffffffffffffffffffffffffffffffffffff1663f2fde38b86600001602081019061096391906117fe565b6040518263ffffffff1660e01b815260040161097f919061183a565b600060405180830381600087803b15801561099957600080fd5b505af11580156109ad573d6000803e3d6000fd5b50505050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166388433651856005888060200190610a029190611c14565b604051602001610a149392919061243f565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610a40929190612470565b600060405180830381600087803b158015610a5a57600080fd5b505af1158015610a6e573d6000803e3d6000fd5b50505050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663235c279f856040518263ffffffff1660e01b8152600401610acd919061183a565b600060405180830381600087803b158015610ae757600080fd5b505af1158015610afb573d6000803e3d6000fd5b50505050848060200190610b0f9190611c14565b604051610b1d929190611ca7565b60405180910390207f33cbc8d9bff712d6199a0f3dc8bd053690efd03287805defdbee7a53a52f3660868060200190610b569190611c14565b87868a806101800190610b699190611cc0565b604051610b7b9695949392919061250d565b60405180910390a25050505050565b610b9261101b565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610c0461101b565b8060059081610c1391906126f1565b5050565b610c1f61101b565b600481604051610c2f91906127f4565b908152602001604051809103902060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550565b610c6b61101b565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff16600483604051610cd891906127f4565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610d5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d549061287d565b60405180910390fd5b600482604051610d6d91906127f4565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60058054610db09061232a565b80601f0160208091040260200160405190810160405280929190818152602001828054610ddc9061232a565b8015610e295780601f10610dfe57610100808354040283529160200191610e29565b820191906000526020600020905b815481529060010190602001808311610e0c57829003601f168201915b505050505081565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610e5f61101b565b610e69600061135c565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610e9c61101b565b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610f3461101b565b80600483604051610f4591906127f4565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b610f9d61101b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361100f5760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611006919061183a565b60405180910390fd5b6110188161135c565b50565b611023611420565b73ffffffffffffffffffffffffffffffffffffffff16611041610e6b565b73ffffffffffffffffffffffffffffffffffffffff16146110a057611064611420565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611097919061183a565b60405180910390fd5b565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166111316110e785611428565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506114ac565b73ffffffffffffffffffffffffffffffffffffffff1614611187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117e9061290f565b60405180910390fd5b505050565b60008103156112a857803410156111d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cf906129a1565b60405180910390fd5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1634604051611220906129f2565b60006040518083038185875af1925050503d806000811461125d576040519150601f19603f3d011682016040523d82523d6000602084013e611262565b606091505b50509050806112a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129d90612a53565b60405180910390fd5b505b50565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008260601b60e81c176000526e5af43d82803e903d91602b57fd5bf38260781b17602052603760096000f09050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611357576040517fc2f868f400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b600080303360405160200161143e929190612abb565b6040516020818303038152906040528360405160200161145f929190612b23565b60405160208183030381529060405280519060200120905060008160405160200161148a9190612b93565b6040516020818303038152906040529050808051906020012092505050919050565b6000806000806114bc86866114d8565b9250925092506114cc8282611534565b82935050505092915050565b6000806000604184510361151d5760008060006020870151925060408701519150606087015160001a905061150f88828585611698565b95509550955050505061152d565b60006002855160001b9250925092505b9250925092565b6000600381111561154857611547612bb9565b5b82600381111561155b5761155a612bb9565b5b0315611694576001600381111561157557611574612bb9565b5b82600381111561158857611587612bb9565b5b036115bf576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260038111156115d3576115d2612bb9565b5b8260038111156115e6576115e5612bb9565b5b0361162b578060001c6040517ffce698f70000000000000000000000000000000000000000000000000000000081526004016116229190612be8565b60405180910390fd5b60038081111561163e5761163d612bb9565b5b82600381111561165157611650612bb9565b5b0361169357806040517fd78bce0c00000000000000000000000000000000000000000000000000000000815260040161168a9190612c12565b60405180910390fd5b5b5050565b60008060007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08460001c11156116d8576000600385925092509250611782565b6000600188888888604051600081526020016040526040516116fd9493929190612c49565b6020604051602081039080840390855afa15801561171f573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361177357600060016000801b93509350935050611782565b8060008060001b935093509350505b9450945094915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006117cb826117a0565b9050919050565b6117db816117c0565b81146117e657600080fd5b50565b6000813590506117f8816117d2565b92915050565b60006020828403121561181457611813611796565b5b6000611822848285016117e9565b91505092915050565b611834816117c0565b82525050565b600060208201905061184f600083018461182b565b92915050565b600080fd5b60006101c0828403121561187157611870611855565b5b81905092915050565b6000602082840312156118905761188f611796565b5b600082013567ffffffffffffffff8111156118ae576118ad61179b565b5b6118ba8482850161185a565b91505092915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611916826118cd565b810181811067ffffffffffffffff82111715611935576119346118de565b5b80604052505050565b600061194861178c565b9050611954828261190d565b919050565b600067ffffffffffffffff821115611974576119736118de565b5b61197d826118cd565b9050602081019050919050565b82818337600083830152505050565b60006119ac6119a784611959565b61193e565b9050828152602081018484840111156119c8576119c76118c8565b5b6119d384828561198a565b509392505050565b600082601f8301126119f0576119ef6118c3565b5b8135611a00848260208601611999565b91505092915050565b600060208284031215611a1f57611a1e611796565b5b600082013567ffffffffffffffff811115611a3d57611a3c61179b565b5b611a49848285016119db565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611a8c578082015181840152602081019050611a71565b60008484015250505050565b6000611aa382611a52565b611aad8185611a5d565b9350611abd818560208601611a6e565b611ac6816118cd565b840191505092915050565b60006020820190508181036000830152611aeb8184611a98565b905092915050565b6000819050919050565b6000611b18611b13611b0e846117a0565b611af3565b6117a0565b9050919050565b6000611b2a82611afd565b9050919050565b6000611b3c82611b1f565b9050919050565b611b4c81611b31565b82525050565b6000602082019050611b676000830184611b43565b92915050565b6000611b7882611b1f565b9050919050565b611b8881611b6d565b82525050565b6000602082019050611ba36000830184611b7f565b92915050565b60008060408385031215611bc057611bbf611796565b5b600083013567ffffffffffffffff811115611bde57611bdd61179b565b5b611bea858286016119db565b9250506020611bfb858286016117e9565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112611c3157611c30611c05565b5b80840192508235915067ffffffffffffffff821115611c5357611c52611c0a565b5b602083019250600182023603831315611c6f57611c6e611c0f565b5b509250929050565b600081905092915050565b6000611c8e8385611c77565b9350611c9b83858461198a565b82840190509392505050565b6000611cb4828486611c82565b91508190509392505050565b60008083356001602003843603038112611cdd57611cdc611c05565b5b80840192508235915067ffffffffffffffff821115611cff57611cfe611c0a565b5b602083019250602082023603831315611d1b57611d1a611c0f565b5b509250929050565b6000819050919050565b6000819050919050565b611d48611d4382611d23565b611d2d565b82525050565b6000819050919050565b6000819050919050565b611d73611d6e82611d4e565b611d58565b82525050565b600081905092915050565b600080fd5b82818337505050565b6000611d9e8385611d79565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115611dd157611dd0611d84565b5b602083029250611de2838584611d89565b82840190509392505050565b6000611dfa8287611d37565b602082019150611e0a8286611d62565b602082019150611e1b828486611d92565b915081905095945050505050565b60008083356001602003843603038112611e4657611e45611c05565b5b80840192508235915067ffffffffffffffff821115611e6857611e67611c0a565b5b602083019250600182023603831315611e8457611e83611c0f565b5b509250929050565b60006bffffffffffffffffffffffff82169050919050565b611ead81611e8c565b8114611eb857600080fd5b50565b600081359050611eca81611ea4565b92915050565b600060208284031215611ee657611ee5611796565b5b6000611ef484828501611ebb565b91505092915050565b60008115159050919050565b611f1281611efd565b8114611f1d57600080fd5b50565b600081359050611f2f81611f09565b92915050565b600060208284031215611f4b57611f4a611796565b5b6000611f5984828501611f20565b91505092915050565b611f6b81611e8c565b82525050565b6000611f7d8385611a5d565b9350611f8a83858461198a565b611f93836118cd565b840190509392505050565b611fa781611efd565b82525050565b600060e082019050611fc2600083018c61182b565b611fcf602083018b611f62565b8181036040830152611fe281898b611f71565b90508181036060830152611ff7818789611f71565b90506120066080830186611f9e565b61201360a083018561182b565b61202060c083018461182b565b9a9950505050505050505050565b6000808335600160200384360303811261204b5761204a611c05565b5b80840192508235915067ffffffffffffffff82111561206d5761206c611c0a565b5b60208301925060408202360383131561208957612088611c0f565b5b509250929050565b61209a81611d4e565b82525050565b600082825260208201905092915050565b6000819050919050565b60006120ca60208401846117e9565b905092915050565b6120db816117c0565b82525050565b6120ea81611d4e565b81146120f557600080fd5b50565b600081359050612107816120e1565b92915050565b600061211c60208401846120f8565b905092915050565b61212d81611d4e565b82525050565b6040820161214460008301836120bb565b61215160008501826120d2565b5061215f602083018361210d565b61216c6020850182612124565b50505050565b600061217e8383612133565b60408301905092915050565b600082905092915050565b6000604082019050919050565b60006121ae83856120a0565b93506121b9826120b1565b8060005b858110156121f2576121cf828461218a565b6121d98882612172565b97506121e483612195565b9250506001810190506121bd565b5085925050509392505050565b600060c082019050612214600083018a61182b565b6122216020830189612091565b61222e604083018861182b565b61223b606083018761182b565b818103608083015261224e8185876121a2565b905061225d60a083018461182b565b98975050505050505050565b6000808335600160200384360303811261228657612285611c05565b5b80840192508235915067ffffffffffffffff8211156122a8576122a7611c0a565b5b6020830192506020820236038313156122c4576122c3611c0f565b5b509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061234257607f821691505b602082108103612355576123546122fb565b5b50919050565b60008190508160005260206000209050919050565b6000815461237d8161232a565b6123878186611c77565b945060018216600081146123a257600181146123b7576123ea565b60ff19831686528115158202860193506123ea565b6123c08561235b565b60005b838110156123e2578154818901526001820191506020810190506123c3565b838801955050505b50505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b6000612429600183611c77565b9150612434826123f3565b600182019050919050565b600061244b8286612370565b9150612458828486611c82565b91506124638261241c565b9150819050949350505050565b6000604082019050612485600083018561182b565b81810360208301526124978184611a98565b90509392505050565b600082825260208201905092915050565b60006124bd83856124a0565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156124f0576124ef611d84565b5b602083029250612501838584611d89565b82840190509392505050565b6000608082019050818103600083015261252881888a611f71565b9050612537602083018761182b565b612544604083018661182b565b81810360608301526125578184866124b1565b9050979650505050505050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026125b17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612574565b6125bb8683612574565b95508019841693508086168417925050509392505050565b60006125ee6125e96125e484611d4e565b611af3565b611d4e565b9050919050565b6000819050919050565b612608836125d3565b61261c612614826125f5565b848454612581565b825550505050565b600090565b612631612624565b61263c8184846125ff565b505050565b5b8181101561266057612655600082612629565b600181019050612642565b5050565b601f8211156126a5576126768161235b565b61267f84612564565b8101602085101561268e578190505b6126a261269a85612564565b830182612641565b50505b505050565b600082821c905092915050565b60006126c8600019846008026126aa565b1980831691505092915050565b60006126e183836126b7565b9150826002028217905092915050565b6126fa82611a52565b67ffffffffffffffff811115612713576127126118de565b5b61271d825461232a565b612728828285612664565b600060209050601f83116001811461275b5760008415612749578287015190505b61275385826126d5565b8655506127bb565b601f1984166127698661235b565b60005b828110156127915784890151825560018201915060208501945060208101905061276c565b868310156127ae57848901516127aa601f8916826126b7565b8355505b6001600288020188555050505b505050505050565b60006127ce82611a52565b6127d88185611c77565b93506127e8818560208601611a6e565b80840191505092915050565b600061280082846127c3565b915081905092915050565b7f4e6f20636f6e747261637420666f756e6420666f722074686520676976656e2060008201527f6b696e6400000000000000000000000000000000000000000000000000000000602082015250565b6000612867602483611a5d565b91506128728261280b565b604082019050919050565b600060208201905081810360008301526128968161285a565b9050919050565b7f5369676e617475726550726f7465637465643a20496e76616c6964207369676e60008201527f617475726520666f72207468652063616c6c6572000000000000000000000000602082015250565b60006128f9603483611a5d565b91506129048261289d565b604082019050919050565b60006020820190508181036000830152612928816128ec565b9050919050565b7f546865207061796d656e7420616d6f756e7420686173206e6f74206265656e2060008201527f7361746973666965640000000000000000000000000000000000000000000000602082015250565b600061298b602983611a5d565b91506129968261292f565b604082019050919050565b600060208201905081810360008301526129ba8161297e565b9050919050565b600081905092915050565b50565b60006129dc6000836129c1565b91506129e7826129cc565b600082019050919050565b60006129fd826129cf565b9150819050919050565b7f50617961626c653a205472616e73666572206661696c65640000000000000000600082015250565b6000612a3d601883611a5d565b9150612a4882612a07565b602082019050919050565b60006020820190508181036000830152612a6c81612a30565b9050919050565b60008160601b9050919050565b6000612a8b82612a73565b9050919050565b6000612a9d82612a80565b9050919050565b612ab5612ab0826117c0565b612a92565b82525050565b6000612ac78285612aa4565b601482019150612ad78284612aa4565b6014820191508190509392505050565b600081519050919050565b6000612afd82612ae7565b612b0781856129c1565b9350612b17818560208601611a6e565b80840191505092915050565b6000612b2f8285612af2565b9150612b3b8284612af2565b91508190509392505050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000612b7d601c83611c77565b9150612b8882612b47565b601c82019050919050565b6000612b9e82612b70565b9150612baa8284611d37565b60208201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6000602082019050612bfd6000830184612091565b92915050565b612c0c81611d23565b82525050565b6000602082019050612c276000830184612c03565b92915050565b600060ff82169050919050565b612c4381612c2d565b82525050565b6000608082019050612c5e6000830187612c03565b612c6b6020830186612c3a565b612c786040830185612c03565b612c856060830184612c03565b9594505050505056fea26469706673582212208e7f01ad39ebe9eafc02868e44268e5828754d2cc0672bb3d42a846598aeac3864736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000007814e9347069375d0291f2a97c9af1c9affd53e200000000000000000000000000000000000000000000000000000000000000c000000000000000000000000048ef56d7b682cca24e104707c507e5bc0791baff000000000000000000000000e16c1623c1aa7d919cd2241d8b36d9e79c1be2a20000000000000000000000004e3cc25298325b95d916486fe87a2e813144c49a00000000000000000000000075cfb64305acc6741c90e04363e38ca5c0e9b7fb000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f6275696c64747265652d636c6f7564666c6172652d776f726b65722e6e667473747564696f732e776f726b6572732e6465762f6d657461646174612f00000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _erc721Address (address): 0x7814e9347069375d0291F2A97C9aF1C9AFfD53E2
Arg [1] : _metadataBaseUrl (string): https://buildtree-cloudflare-worker.nftstudios.workers.dev/metadata/
Arg [2] : _metadataResolverAddress (address): 0x48ef56d7b682cCA24e104707C507e5BC0791BAff
Arg [3] : _signerAddress (address): 0xe16C1623c1AA7D919cd2241d8b36d9E79C1Be2A2
Arg [4] : _paymentRecipient (address): 0x4E3cC25298325B95D916486fe87A2e813144c49a
Arg [5] : _eventEmitter (address): 0x75cfb64305Acc6741C90E04363e38cA5c0E9B7Fb
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000007814e9347069375d0291f2a97c9af1c9affd53e2
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 00000000000000000000000048ef56d7b682cca24e104707c507e5bc0791baff
Arg [3] : 000000000000000000000000e16c1623c1aa7d919cd2241d8b36d9e79c1be2a2
Arg [4] : 0000000000000000000000004e3cc25298325b95d916486fe87a2e813144c49a
Arg [5] : 00000000000000000000000075cfb64305acc6741c90e04363e38ca5c0e9b7fb
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000044
Arg [7] : 68747470733a2f2f6275696c64747265652d636c6f7564666c6172652d776f72
Arg [8] : 6b65722e6e667473747564696f732e776f726b6572732e6465762f6d65746164
Arg [9] : 6174612f00000000000000000000000000000000000000000000000000000000
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.