Source Code
Contract Deployer
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 1,721 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Create | 17793413 | 947 days ago | IN | 0 ETH | 0.01738777 | ||||
| Create | 17459629 | 994 days ago | IN | 0 ETH | 0.00876474 | ||||
| Create | 17347092 | 1009 days ago | IN | 0 ETH | 0.0133171 | ||||
| Create | 17335278 | 1011 days ago | IN | 0 ETH | 0.01712536 | ||||
| Create | 17332923 | 1011 days ago | IN | 0 ETH | 0.01642333 | ||||
| Create | 17326600 | 1012 days ago | IN | 0 ETH | 0.01802906 | ||||
| Create | 17261712 | 1022 days ago | IN | 0 ETH | 0.02325021 | ||||
| Create | 17260360 | 1022 days ago | IN | 0 ETH | 0.05120222 | ||||
| Create | 17135657 | 1039 days ago | IN | 0 ETH | 0.0192494 | ||||
| Create | 17132596 | 1040 days ago | IN | 0 ETH | 0.04588674 | ||||
| Create | 17123092 | 1041 days ago | IN | 0 ETH | 0.02230375 | ||||
| Create | 17121316 | 1041 days ago | IN | 0 ETH | 0.02172212 | ||||
| Create | 17090056 | 1046 days ago | IN | 0 ETH | 0.03657616 | ||||
| Create | 17069610 | 1049 days ago | IN | 0 ETH | 0.02032584 | ||||
| Create | 17066369 | 1049 days ago | IN | 0 ETH | 0.01626842 | ||||
| Create | 17050615 | 1051 days ago | IN | 0 ETH | 0.01192127 | ||||
| Create | 17049590 | 1051 days ago | IN | 0 ETH | 0.01332554 | ||||
| Create | 17045479 | 1052 days ago | IN | 0 ETH | 0.01778468 | ||||
| Create | 17045453 | 1052 days ago | IN | 0 ETH | 0.01704662 | ||||
| Create | 17045007 | 1052 days ago | IN | 0 ETH | 0.0194167 | ||||
| Create | 17041437 | 1053 days ago | IN | 0 ETH | 0.01300336 | ||||
| Create | 17040841 | 1053 days ago | IN | 0 ETH | 0.02040811 | ||||
| Create | 17036273 | 1053 days ago | IN | 0 ETH | 0.01238619 | ||||
| Create | 17033254 | 1054 days ago | IN | 0 ETH | 0.01518042 | ||||
| Create | 17031988 | 1054 days ago | IN | 0 ETH | 0.01334754 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| 0x3d602d80 | 17793413 | 947 days ago | Contract Creation | 0 ETH | |||
| 0x3d602d80 | 17459629 | 994 days ago | Contract Creation | 0 ETH | |||
| 0x3d602d80 | 17347092 | 1009 days ago | Contract Creation | 0 ETH | |||
| 0x3d602d80 | 17335278 | 1011 days ago | Contract Creation | 0 ETH | |||
| 0x3d602d80 | 17332923 | 1011 days ago | Contract Creation | 0 ETH | |||
| 0x3d602d80 | 17326600 | 1012 days ago | Contract Creation | 0 ETH | |||
| 0x3d602d80 | 17319860 | 1013 days ago | Contract Creation | 0 ETH | |||
| 0x3d602d80 | 17261712 | 1022 days ago | Contract Creation | 0 ETH | |||
| 0x3d602d80 | 17260360 | 1022 days ago | Contract Creation | 0 ETH | |||
| 0x3d602d80 | 17135657 | 1039 days ago | Contract Creation | 0 ETH | |||
| 0x3d602d80 | 17132596 | 1040 days ago | Contract Creation | 0 ETH | |||
| 0x3d602d80 | 17123092 | 1041 days ago | Contract Creation | 0 ETH | |||
| 0x3d602d80 | 17121316 | 1041 days ago | Contract Creation | 0 ETH | |||
| 0x3d602d80 | 17090056 | 1046 days ago | Contract Creation | 0 ETH | |||
| 0x3d602d80 | 17069610 | 1049 days ago | Contract Creation | 0 ETH | |||
| 0x3d602d80 | 17066369 | 1049 days ago | Contract Creation | 0 ETH | |||
| 0x3d602d80 | 17050615 | 1051 days ago | Contract Creation | 0 ETH | |||
| 0x3d602d80 | 17049590 | 1051 days ago | Contract Creation | 0 ETH | |||
| 0x3d602d80 | 17045479 | 1052 days ago | Contract Creation | 0 ETH | |||
| 0x3d602d80 | 17045453 | 1052 days ago | Contract Creation | 0 ETH | |||
| 0x3d602d80 | 17045007 | 1052 days ago | Contract Creation | 0 ETH | |||
| 0x3d602d80 | 17041437 | 1053 days ago | Contract Creation | 0 ETH | |||
| 0x3d602d80 | 17040841 | 1053 days ago | Contract Creation | 0 ETH | |||
| 0x3d602d80 | 17036273 | 1053 days ago | Contract Creation | 0 ETH | |||
| 0x3d602d80 | 17033254 | 1054 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
ERC721CollectiveFactory
Compiler Version
v0.8.15+commit.e14f2714
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2022-11-22
*/
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.15;
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
/**
* @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;
}
}
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.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.
*
* By default, the owner account will be the one that deploys the contract. 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;
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @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 {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing 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 {
require(
newOwner != address(0),
"Ownable: new owner is the zero address"
);
_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);
}
}
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract Pausable is Context {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
constructor() {
_paused = false;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
_requireNotPaused();
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
_requirePaused();
_;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Throws if the contract is paused.
*/
function _requireNotPaused() internal view virtual {
require(!paused(), "Pausable: paused");
}
/**
* @dev Throws if the contract is not paused.
*/
function _requirePaused() internal view virtual {
require(paused(), "Pausable: not paused");
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}
// OpenZeppelin Contracts (last updated v4.7.0) (proxy/Clones.sol)
/**
* @dev https://eips.ethereum.org/EIPS/eip-1167[EIP 1167] is a standard for
* deploying minimal proxy contracts, also known as "clones".
*
* > To simply and cheaply clone contract functionality in an immutable way, this standard specifies
* > a minimal bytecode implementation that delegates all calls to a known, fixed address.
*
* The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2`
* (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the
* deterministic method.
*
* _Available since v3.4._
*/
library Clones {
/**
* @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
*
* This function uses the create opcode, which should never revert.
*/
function clone(address implementation) internal returns (address instance) {
/// @solidity memory-safe-assembly
assembly {
let ptr := mload(0x40)
mstore(
ptr,
0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000
)
mstore(add(ptr, 0x14), shl(0x60, implementation))
mstore(
add(ptr, 0x28),
0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000
)
instance := create(0, ptr, 0x37)
}
require(instance != address(0), "ERC1167: create failed");
}
/**
* @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
*
* This function uses the create2 opcode and a `salt` to deterministically deploy
* the clone. Using the same `implementation` and `salt` multiple time will revert, since
* the clones cannot be deployed twice at the same address.
*/
function cloneDeterministic(address implementation, bytes32 salt)
internal
returns (address instance)
{
/// @solidity memory-safe-assembly
assembly {
let ptr := mload(0x40)
mstore(
ptr,
0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000
)
mstore(add(ptr, 0x14), shl(0x60, implementation))
mstore(
add(ptr, 0x28),
0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000
)
instance := create2(0, ptr, 0x37, salt)
}
require(instance != address(0), "ERC1167: create2 failed");
}
/**
* @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
*/
function predictDeterministicAddress(
address implementation,
bytes32 salt,
address deployer
) internal pure returns (address predicted) {
/// @solidity memory-safe-assembly
assembly {
let ptr := mload(0x40)
mstore(
ptr,
0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000
)
mstore(add(ptr, 0x14), shl(0x60, implementation))
mstore(
add(ptr, 0x28),
0x5af43d82803e903d91602b57fd5bf3ff00000000000000000000000000000000
)
mstore(add(ptr, 0x38), shl(0x60, deployer))
mstore(add(ptr, 0x4c), salt)
mstore(add(ptr, 0x6c), keccak256(ptr, 0x37))
predicted := keccak256(add(ptr, 0x37), 0x55)
}
}
/**
* @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
*/
function predictDeterministicAddress(address implementation, bytes32 salt)
internal
view
returns (address predicted)
{
return predictDeterministicAddress(implementation, salt, address(this));
}
}
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
/**
* @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);
}
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165Checker.sol)
/**
* @dev Library used to query support of an interface declared via {IERC165}.
*
* Note that these functions return the actual result of the query: they do not
* `revert` if an interface is not supported. It is up to the caller to decide
* what to do in these cases.
*/
library ERC165Checker {
// As per the EIP-165 spec, no interface should ever match 0xffffffff
bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;
/**
* @dev Returns true if `account` supports the {IERC165} interface,
*/
function supportsERC165(address account) internal view returns (bool) {
// Any contract that implements ERC165 must explicitly indicate support of
// InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid
return
supportsERC165InterfaceUnchecked(
account,
type(IERC165).interfaceId
) &&
!supportsERC165InterfaceUnchecked(account, _INTERFACE_ID_INVALID);
}
/**
* @dev Returns true if `account` supports the interface defined by
* `interfaceId`. Support for {IERC165} itself is queried automatically.
*
* See {IERC165-supportsInterface}.
*/
function supportsInterface(address account, bytes4 interfaceId)
internal
view
returns (bool)
{
// query support of both ERC165 as per the spec and support of _interfaceId
return
supportsERC165(account) &&
supportsERC165InterfaceUnchecked(account, interfaceId);
}
/**
* @dev Returns a boolean array where each value corresponds to the
* interfaces passed in and whether they're supported or not. This allows
* you to batch check interfaces for a contract where your expectation
* is that some interfaces may not be supported.
*
* See {IERC165-supportsInterface}.
*
* _Available since v3.4._
*/
function getSupportedInterfaces(
address account,
bytes4[] memory interfaceIds
) internal view returns (bool[] memory) {
// an array of booleans corresponding to interfaceIds and whether they're supported or not
bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);
// query support of ERC165 itself
if (supportsERC165(account)) {
// query support of each interface in interfaceIds
for (uint256 i = 0; i < interfaceIds.length; i++) {
interfaceIdsSupported[i] = supportsERC165InterfaceUnchecked(
account,
interfaceIds[i]
);
}
}
return interfaceIdsSupported;
}
/**
* @dev Returns true if `account` supports all the interfaces defined in
* `interfaceIds`. Support for {IERC165} itself is queried automatically.
*
* Batch-querying can lead to gas savings by skipping repeated checks for
* {IERC165} support.
*
* See {IERC165-supportsInterface}.
*/
function supportsAllInterfaces(
address account,
bytes4[] memory interfaceIds
) internal view returns (bool) {
// query support of ERC165 itself
if (!supportsERC165(account)) {
return false;
}
// query support of each interface in _interfaceIds
for (uint256 i = 0; i < interfaceIds.length; i++) {
if (!supportsERC165InterfaceUnchecked(account, interfaceIds[i])) {
return false;
}
}
// all interfaces supported
return true;
}
/**
* @notice Query if a contract implements an interface, does not check ERC165 support
* @param account The address of the contract to query for support of an interface
* @param interfaceId The interface identifier, as specified in ERC-165
* @return true if the contract at account indicates support of the interface with
* identifier interfaceId, false otherwise
* @dev Assumes that account contains a contract that supports ERC165, otherwise
* the behavior of this method is undefined. This precondition can be checked
* with {supportsERC165}.
* Interface identification is specified in ERC-165.
*/
function supportsERC165InterfaceUnchecked(
address account,
bytes4 interfaceId
) internal view returns (bool) {
// prepare call
bytes memory encodedParams = abi.encodeWithSelector(
IERC165.supportsInterface.selector,
interfaceId
);
// perform static call
bool success;
uint256 returnSize;
uint256 returnValue;
assembly {
success := staticcall(
30000,
account,
add(encodedParams, 0x20),
mload(encodedParams),
0x00,
0x20
)
returnSize := returndatasize()
returnValue := mload(0x00)
}
return success && returnSize >= 0x20 && returnValue > 0;
}
}
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
/**
* @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 IERC165Upgradeable {
/**
* @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);
}
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721Upgradeable is IERC165Upgradeable {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(
address indexed from,
address indexed to,
uint256 indexed tokenId
);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(
address indexed owner,
address indexed approved,
uint256 indexed tokenId
);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(
address indexed owner,
address indexed operator,
bool approved
);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId)
external
view
returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator)
external
view
returns (bool);
}
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721MetadataUpgradeable is IERC721Upgradeable {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}
/**
* Interface for a Guard that governs whether a token can be minted, burned, or
* transferred by a particular operator, from a particular sender (`from` is
* address 0 iff the token is being minted), to a particular recipient (`to` is
* address 0 iff the token is being burned).
*/
interface IGuard {
/**
* @return True iff the transaction is allowed
* @param operator Transaction msg.sender
* @param from Token sender
* @param to Token recipient
* @param value Amount (ERC20) or token ID (ERC721)
*/
function isAllowed(
address operator,
address from,
address to,
uint256 value // amount (ERC20) or tokenId (ERC721)
) external view returns (bool);
}
interface ITokenEnforceable {
event ControlDisabled(address indexed controller);
event GuardLocked(
bool mintGuardLocked,
bool burnGuardLocked,
bool transferGuardLocked
);
event GuardUpdated(GuardType indexed guard, address indexed implementation);
event BatcherUpdated(address batcher);
/**
* @return The address of the transaction batcher used to batch calls over
* onlyOwner functions.
*/
function batcher() external view returns (address);
/**
* @return True iff the token contract owner is allowed to mint, burn, or
* transfer on behalf of arbitrary addresses.
*/
function isControllable() external view returns (bool);
/**
* @return The address of the Guard used to determine whether a mint is
* allowed. The contract at this address is assumed to implement the IGuard
* interface.
*/
function mintGuard() external view returns (IGuard);
/**
* @return The address of the Guard used to determine whether a burn is
* allowed. The contract at this address is assumed to implement the IGuard
* interface.
*/
function burnGuard() external view returns (IGuard);
/**
* @return The address of the Guard used to determine whether a transfer is
* allowed. The contract at this address is assumed to implement the IGuard
* interface.
*/
function transferGuard() external view returns (IGuard);
/**
* @return True iff the mint Guard cannot be changed.
*/
function mintGuardLocked() external view returns (bool);
/**
* @return True iff the burn Guard cannot be changed.
*/
function burnGuardLocked() external view returns (bool);
/**
* @return True iff the transfer Guard cannot be changed.
*/
function transferGuardLocked() external view returns (bool);
/**
* Irreversibly disables the token contract owner from minting, burning,
* and transferring on behalf of arbitrary addresses.
*
* Emits a `ControlDisabled` event.
*
* Requirements:
* - The caller must be the token contract owner.
*/
function disableControl() external;
/**
* Irreversibly prevents the token contract owner from changing the mint,
* burn, and/or transfer Guards.
*
* If at least one guard was requested to be locked, emits a `GuardLocked`
* event confirming whether each Guard is locked.
*
* Requirements:
* - The caller must be the owner.
* @param mintGuardLock If true, the mint Guard will be locked. If false,
* does nothing to the mint Guard.
* @param burnGuardLock If true, the mint Guard will be locked. If false,
* does nothing to the burn Guard.
* @param transferGuardLock If true, the mint Guard will be locked. If
* false, does nothing to the transfer Guard.
*/
function lockGuards(
bool mintGuardLock,
bool burnGuardLock,
bool transferGuardLock
) external;
/**
* Update the address of the batcher for batching calls over
* onlyOwner functions.
*
* Emits a `BatcherUpdated` event.
*
* Requirements:
* - The caller must be the token contract owner or the batcher.
* @param implementation Address of the batcher.
*/
function updateBatcher(address implementation) external;
/**
* Update the address of the Guard for minting. The contract at the
* passed-in address is assumed to implement the IGuard interface.
*
* Emits a `GuardUpdated` event with `GuardType.Mint`.
*
* Requirements:
* - The caller must be the token contract owner or the batcher.
* - The mint Guard must not be locked.
* @param implementation Address of mint Guard
*/
function updateMintGuard(address implementation) external;
/**
* Update the address of the Guard for burning. The contract at the
* passed-in address is assumed to implement the IGuard interface.
*
* Emits a `GuardUpdated` event with `GuardType.Burn`.
*
* Requirements:
* - The caller must be the token contract owner or the batcher.
* - The burn Guard must not be locked.
* @param implementation Address of new burn Guard
*/
function updateBurnGuard(address implementation) external;
/**
* Update the address of the Guard for transferring. The contract at the
* passed-in address is assumed to implement the IGuard interface.
*
* Emits a `GuardUpdated` event with `GuardType.Transfer`.
*
* Requirements:
* - The caller must be the token contract owner or the batcher.
* - The transfer Guard must not be locked.
* @param implementation Address of transfer Guard
*/
function updateTransferGuard(address implementation) external;
/**
* @return True iff a token can be minted, burned, or transferred by a
* particular operator, from a particular sender (`from` is address 0 iff
* the token is being minted), to a particular recipient (`to` is address 0
* iff the token is being burned).
* @param operator Transaction msg.sender
* @param from Token sender
* @param to Token recipient
* @param value Amount (ERC20) or token ID (ERC721)
*/
function isAllowed(
address operator,
address from,
address to,
uint256 value // amount (ERC20) or tokenId (ERC721)
) external view returns (bool);
/**
* @return owner The address of the token contract owner
*/
function owner() external view returns (address);
/**
* Transfers ownership of the contract to a new account (`newOwner`)
*
* Requirements:
* - The caller must be the current owner.
* @param newOwner Address that will become the owner
*/
function transferOwnership(address newOwner) external;
/**
* Leaves the contract without an owner. After calling this function, it
* will no longer be possible to call `onlyOwner` functions.
*
* Requirements:
* - The caller must be the current owner.
*/
function renounceOwnership() external;
}
enum GuardType {
Mint,
Burn,
Transfer
}
/**
* @title IERC1644 Controller Token Operation (part of the ERC1400 Security
* Token Standards)
*
* See https://github.com/ethereum/EIPs/issues/1644. Data and operatorData
* parameters were removed.
*/
interface IERC1644 {
event ControllerRedemption(
address account,
address indexed from,
uint256 value
);
event ControllerTransfer(
address controller,
address indexed from,
address indexed to,
uint256 value
);
/**
* Burns `tokenId` without checking whether the caller owns or is approved
* to spend the token.
*
* Requirements:
* - The caller must be the token contract owner.
* - `isControllable must be true.
* @param account The account whose token will be burned.
* @param value Amount (ERC20) or token ID (ERC721)
*/
function controllerRedeem(
address account,
uint256 value // amount (ERC20) or tokenId (ERC721))
) external;
/**
* Transfers `tokenId` token from `from` to `to`, without checking whether
* the caller owns or is approved to spend the token.
*
* Requirements:
* - The caller must be the token contract owner.
* - `isControllable` must be true.
* @param from The account sending the token.
* @param to The account to receive the token.
* @param value Amount (ERC20) or token ID (ERC721)
*/
function controllerTransfer(
address from,
address to,
uint256 value // amount (ERC20) or tokenId (ERC721)
) external;
}
/**
* Interface for functions defined in ERC721UpgradeableFork
*/
interface IERC721UpgradeableFork is IERC721MetadataUpgradeable {
/**
* @return ID of the next token that will be minted. Existing tokens are
* limited to IDs between `STARTING_TOKEN_ID` and `_nextTokenId` (including
* `STARTING_TOKEN_ID` and excluding `_nextTokenId`, though not all of these
* IDs may be in use if tokens have been burned).
*/
function nextTokenId() external view returns (uint256);
}
/**
* Interface for only functions defined in ERC721Collective (excludes inherited
* and overridden functions)
*/
interface IERC721CollectiveUnchained is IERC1644 {
event RendererUpdated(address indexed implementation);
event RendererLocked();
/**
* Initializes ERC721Collective.
* @param name_ Name of token
* @param symbol_ Symbol of token
* @param mintGuard_ Address of mint guard
* @param burnGuard_ Address of burn guard
* @param transferGuard_ Address of transfer guard
* @param renderer_ Address of renderer
*/
function __ERC721Collective_init(
string memory name_,
string memory symbol_,
address mintGuard_,
address burnGuard_,
address transferGuard_,
address renderer_
) external;
/**
* @return Number of currently-existing tokens (tokens that have been
* minted and that have not been burned).
*/
function totalSupply() external view returns (uint256);
// name(), symbol(), and tokenURI() overriding ERC721UpgradeableFork
// declared in IERC721Fork
/**
* @return The address of the token Renderer. The contract at this address
* is assumed to implement the IRenderer interface.
*/
function renderer() external view returns (address);
/**
* @return True iff the Renderer cannot be changed.
*/
function rendererLocked() external view returns (bool);
/**
* Update the address of the token Renderer. The contract at the passed-in
* address is assumed to implement the IRenderer interface.
*
* Emits a `RendererUpdated` event.
*
* Requirements:
* - The caller must be the token contract owner.
* - Renderer must not be locked.
* @param implementation Address of new Renderer
*/
function updateRenderer(address implementation) external;
/**
* Irreversibly prevents the token contract owner from changing the token
* Renderer.
*
* Emits a `RendererLocked` event.
*
* Requirements:
* - The caller must be the token contract owner.
*/
function lockRenderer() external;
// supportsInterface(bytes4 interfaceId) overriding ERC1644 declared in
// IERC1644
/**
* @return True after successfully executing mint and transfer of
* `nextTokenId` to `account`.
*
* Emits a `Transfer` event with `address(0)` as `from`.
*
* Requirements:
* - `account` cannot be the zero address.
* @param account The account to receive the minted token.
*/
function mintTo(address account) external returns (bool);
/**
* @return True after successfully bulk minting and transferring the
* `nextTokenId` through `nextTokenId + amount` tokens to `account`.
*
* Emits a `Transfer` event (with `address(0)` as `from`) for each token
* that is minted.
*
* Requirements:
* - `account` cannot be the zero address.
* @param account The account to receive the minted tokens.
* @param amount The number of tokens to be minted.
*/
function bulkMintToOneAddress(address account, uint256 amount)
external
returns (bool);
/**
* @return True after successfully bulk minting and transferring one of the
* `nextTokenId` through `nextTokenId + accounts.length` tokens to each of
* the addresses in `accounts`.
*
* Emits a `Transfer` event (with `address(0)` as `from`) for each token
* that is minted.
*
* Requirements:
* - `accounts` cannot have length 0.
* - None of the addresses in `accounts` can be the zero address.
* @param accounts The accounts to receive the minted tokens.
*/
function bulkMintToNAddresses(address[] calldata accounts)
external
returns (bool);
/**
* @return True after successfully burning `tokenId`.
*
* Emits a `Transfer` event with `address(0)` as `to`.
*
* Requirements:
* - The caller must either own or be approved to spend the `tokenId` token.
* - `tokenId` must exist.
* @param tokenId The tokenId to be burned.
*/
function redeem(uint256 tokenId) external returns (bool);
// controllerRedeem() and controllerTransfer() declared in IERC1644
}
/**
* Interface for all functions in ERC721Collective, including inherited and
* overridden functions
*/
interface IERC721Collective is
ITokenEnforceable,
IERC721UpgradeableFork,
IERC721CollectiveUnchained
{
}
/// Mixin can be used by any module using an address that should be an
/// ERC721Collective and needs to check if it indeed is one.
abstract contract ERC165CheckerERC721Collective {
/// Only proceed if collective implements IERC721Collective interface
/// @param collective collective to check
modifier onlyCollectiveInterface(address collective) {
_checkCollectiveInterface(collective);
_;
}
function _checkCollectiveInterface(address collective) internal view {
require(
ERC165Checker.supportsInterface(
collective,
type(IERC721Collective).interfaceId
),
"ERC165CheckerERC721Collective: collective address does not implement proper interface"
);
}
}
/**
* Factory for creating new Syndicate Collectives. The Collective token is
* cloned from a default Collective address and implements default guards
* and renderer.
*
* Copyright (c) 2021-present Syndicate Inc. All rights reserved.
*/
contract ERC721CollectiveFactory is
Ownable,
Pausable,
ERC165CheckerERC721Collective
{
address public collective;
address public mintGuard;
address public burnGuard;
address public transferGuard;
address public renderer;
uint256 public creationFee;
event ERC721CollectiveCreated(
address indexed collective,
string name,
string symbol,
bytes32 salt
);
event ERC721CollectiveFactoryImplementationsSet(
address indexed collective,
address mintGuard,
address burnGuard,
address transferGuard,
address renderer
);
event CreationFeeUpdated(uint256 indexed creationFee);
/**
* Configure factory with owner and set default guard contracts
* @param owner_ Address to make the factory owner
* @param collective_ Address of the deployed ERC721Collective
* token to be cloned
* @param mintGuard_ Address of mint guard contract
* @param burnGuard_ Address of burn guard contract
* @param transferGuard_ Address of transfer guard contract
* @param renderer_ Address of token renderer contract
*/
constructor(
address owner_,
address collective_,
address mintGuard_,
address burnGuard_,
address transferGuard_,
address renderer_
) Ownable() Pausable() {
setImplementations(
collective_,
mintGuard_,
burnGuard_,
transferGuard_,
renderer_
);
transferOwnership(owner_);
}
/// Set creation fee
/// @notice only the owner of the factory can set this
/// @param creationFee_ creation fee in wei
function setCreationFee(uint256 creationFee_) external onlyOwner {
creationFee = creationFee_;
emit CreationFeeUpdated(creationFee_);
}
/// Predict collective token address for given salt
/// @param salt Salt for determinisitic clone
/// @return token Address of token created with salt
function predictAddress(bytes32 salt) external view returns (address) {
return Clones.predictDeterministicAddress(collective, salt);
}
/**
* Create a new Collective via Clone
* @return token Address of new token
* @param name Name of token
* @param symbol Symbol of token
* @param salt random salt for deterministic token creation
* @param setupContracts array of contracts to setup
* @param data array of bytes for setup contract calls
*/
function create(
string memory name,
string memory symbol,
bytes32 salt,
address[] calldata setupContracts,
bytes[] calldata data
) external payable whenNotPaused returns (address token) {
if (creationFee > 0) {
require(
msg.value == creationFee,
"ERC721CollectiveFactory: Must send correct amount for creation fee"
);
(bool sent, ) = payable(this.owner()).call{value: msg.value}("");
require(
sent,
"ERC721CollectiveFactory: Failed to collect creation fee"
);
}
token = _clone(name, symbol, salt);
uint256 length = setupContracts.length;
for (uint256 i; i < length; ) {
// solhint-disable-next-line avoid-low-level-calls
(bool sent, ) = setupContracts[i].call(data[i]);
require(sent, "ERC721CollectiveFactory: Error making setup calls");
unchecked {
++i;
}
}
Ownable(token).transferOwnership(msg.sender);
}
/**
* Clone new CollectiveERC721 token
* @return token Address of new token
* @param name Name of token
* @param symbol Symbol of token
* @param salt random salt for deterministic token creation
*/
function _clone(
string memory name,
string memory symbol,
bytes32 salt
) internal whenNotPaused returns (address token) {
token = Clones.cloneDeterministic(collective, salt);
IERC721Collective(token).__ERC721Collective_init(
name,
symbol,
mintGuard,
burnGuard,
transferGuard,
renderer
);
emit ERC721CollectiveCreated(
token,
name,
string(abi.encodePacked(unicode"✺", symbol)),
salt
);
}
/**
* Set implementation addresses.
*
* Requirements:
* - Only the owner can call this function.
* - The `collective_` to clone must implement IERC721Collective.
* - The guards and renderer cannot be address 0.
* @param collective_ Address of the deployed ERC721Collective
* implementation to be cloned
* @param mintGuard_ Address of mint guard contract
* @param burnGuard_ Address of burn guard contract
* @param transferGuard_ Address of transfer guard contract
* @param renderer_ Address of token renderer contract
*/
function setImplementations(
address collective_,
address mintGuard_,
address burnGuard_,
address transferGuard_,
address renderer_
) public onlyOwner onlyCollectiveInterface(collective_) {
require(
mintGuard_ != address(0) &&
burnGuard_ != address(0) &&
transferGuard_ != address(0) &&
renderer_ != address(0),
"ERC721CollectiveFactory: implementations cannot be address(0)"
);
collective = collective_;
mintGuard = mintGuard_;
burnGuard = burnGuard_;
transferGuard = transferGuard_;
renderer = renderer_;
emit ERC721CollectiveFactoryImplementationsSet(
collective,
mintGuard,
burnGuard,
transferGuard,
renderer
);
}
/**
* Triggers paused state. Only accessible by the club owner.
*/
function pause() external onlyOwner {
_pause();
}
/**
* Returns to normal state. Only accessible by the club owner.
*/
function unpause() external onlyOwner {
_unpause();
}
/**
* This function is called for all messages sent to this contract (there
* are no other functions). Sending Ether to this contract will cause an
* exception, because the fallback function does not have the `payable`
* modifier.
* Source: https://docs.soliditylang.org/en/v0.8.9/contracts.html?highlight=fallback#fallback-function
*/
fallback() external {
revert("ERC721CollectiveFactory: non-existent function");
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"collective_","type":"address"},{"internalType":"address","name":"mintGuard_","type":"address"},{"internalType":"address","name":"burnGuard_","type":"address"},{"internalType":"address","name":"transferGuard_","type":"address"},{"internalType":"address","name":"renderer_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"creationFee","type":"uint256"}],"name":"CreationFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collective","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"bytes32","name":"salt","type":"bytes32"}],"name":"ERC721CollectiveCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collective","type":"address"},{"indexed":false,"internalType":"address","name":"mintGuard","type":"address"},{"indexed":false,"internalType":"address","name":"burnGuard","type":"address"},{"indexed":false,"internalType":"address","name":"transferGuard","type":"address"},{"indexed":false,"internalType":"address","name":"renderer","type":"address"}],"name":"ERC721CollectiveFactoryImplementationsSet","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"stateMutability":"nonpayable","type":"fallback"},{"inputs":[],"name":"burnGuard","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collective","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"address[]","name":"setupContracts","type":"address[]"},{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"create","outputs":[{"internalType":"address","name":"token","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"creationFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintGuard","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"salt","type":"bytes32"}],"name":"predictAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renderer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"creationFee_","type":"uint256"}],"name":"setCreationFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collective_","type":"address"},{"internalType":"address","name":"mintGuard_","type":"address"},{"internalType":"address","name":"burnGuard_","type":"address"},{"internalType":"address","name":"transferGuard_","type":"address"},{"internalType":"address","name":"renderer_","type":"address"}],"name":"setImplementations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferGuard","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b5060405162001856380380620018568339810160408190526200003491620004df565b6200003f3362000072565b6000805460ff60a01b191690556200005b8585858585620000c2565b620000668662000247565b50505050505062000560565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b620000cc620002c6565b84620000d88162000324565b6001600160a01b03851615801590620000f957506001600160a01b03841615155b80156200010e57506001600160a01b03831615155b80156200012357506001600160a01b03821615155b6200019b5760405162461bcd60e51b815260206004820152603d60248201527f455243373231436f6c6c656374697665466163746f72793a20696d706c656d6560448201527f6e746174696f6e732063616e6e6f74206265206164647265737328302900000060648201526084015b60405180910390fd5b600180546001600160a01b038881166001600160a01b031992831681179093556002805489831690841681179091556003805489841690851681179091556004805489851690861681179091556005805494891694909516841790945560408051928352602083019190915281019290925260608201527f7d6700c1aa484999dc3340d18a3279e5b3472afa0c5fb8f3b2c8d0c5fdf11fd19060800160405180910390a2505050505050565b62000251620002c6565b6001600160a01b038116620002b85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000192565b620002c38162000072565b50565b6000546001600160a01b03163314620003225760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000192565b565b6200033c816000620003d660201b620009391760201c565b620002c35760405162461bcd60e51b815260206004820152605560248201527f455243313635436865636b6572455243373231436f6c6c6563746976653a206360448201527f6f6c6c656374697665206164647265737320646f6573206e6f7420696d706c6560648201527f6d656e742070726f70657220696e746572666163650000000000000000000000608482015260a40162000192565b6000620003e383620003fe565b8015620003f75750620003f7838362000437565b9392505050565b600062000413826301ffc9a760e01b62000437565b80156200043157506200042f826001600160e01b031962000437565b155b92915050565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180516001600160e01b03166301ffc9a760e01b178152825160009392849283928392918391908a617530fa92503d91506000519050828015620004aa575060208210155b8015620004b75750600081115b979650505050505050565b80516001600160a01b0381168114620004da57600080fd5b919050565b60008060008060008060c08789031215620004f957600080fd5b6200050487620004c2565b95506200051460208801620004c2565b94506200052460408801620004c2565b93506200053460608801620004c2565b92506200054460808801620004c2565b91506200055460a08801620004c2565b90509295509295509295565b6112e680620005706000396000f3fe6080604052600436106100f35760003560e01c80638610292c1161008a578063b7d8622511610059578063b7d86225146102dd578063dce0b4e4146102fd578063f2fde38b14610321578063fa4a389b14610341576100f3565b80638610292c1461025f5780638ada6b0f1461027f5780638da5cb5b1461029f5780639c76b654146102bd576100f3565b80635c975abb116100c65780635c975abb146101f8578063715018a61461022257806377881972146102375780638456cb591461024a576100f3565b80630479734f14610164578063319fc415146101a15780633f4ba83a146101c15780634a3f42b2146101d8575b3480156100ff57600080fd5b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231436f6c6c656374697665466163746f72793a206e6f6e2d65786960448201526d39ba32b73a10333ab731ba34b7b760911b60648201526084015b60405180910390fd5b34801561017057600080fd5b50600154610184906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101ad57600080fd5b50600254610184906001600160a01b031681565b3480156101cd57600080fd5b506101d6610361565b005b3480156101e457600080fd5b50600354610184906001600160a01b031681565b34801561020457600080fd5b50600054600160a01b900460ff166040519015158152602001610198565b34801561022e57600080fd5b506101d6610373565b610184610245366004610f90565b610385565b34801561025657600080fd5b506101d66106de565b34801561026b57600080fd5b506101d661027a366004611068565b6106ee565b34801561028b57600080fd5b50600554610184906001600160a01b031681565b3480156102ab57600080fd5b506000546001600160a01b0316610184565b3480156102c957600080fd5b506101846102d83660046110d9565b610866565b3480156102e957600080fd5b506101d66102f83660046110d9565b610885565b34801561030957600080fd5b5061031360065481565b604051908152602001610198565b34801561032d57600080fd5b506101d661033c3660046110f2565b6108c0565b34801561034d57600080fd5b50600454610184906001600160a01b031681565b61036961095c565b6103716109b6565b565b61037b61095c565b6103716000610a0b565b600061038f610a5b565b600654156105455760065434146104195760405162461bcd60e51b815260206004820152604260248201527f455243373231436f6c6c656374697665466163746f72793a204d75737420736560448201527f6e6420636f727265637420616d6f756e7420666f72206372656174696f6e2066606482015261656560f01b608482015260a40161015b565b6000306001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610459573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061047d919061110f565b6001600160a01b03163460405160006040518083038185875af1925050503d80600081146104c7576040519150601f19603f3d011682016040523d82523d6000602084013e6104cc565b606091505b50509050806105435760405162461bcd60e51b815260206004820152603760248201527f455243373231436f6c6c656374697665466163746f72793a204661696c65642060448201527f746f20636f6c6c656374206372656174696f6e20666565000000000000000000606482015260840161015b565b505b610550888888610aa8565b90508360005b818110156106785760008787838181106105725761057261112c565b905060200201602081019061058791906110f2565b6001600160a01b03168686848181106105a2576105a261112c565b90506020028101906105b49190611142565b6040516105c2929190611189565b6000604051808303816000865af19150503d80600081146105ff576040519150601f19603f3d011682016040523d82523d6000602084013e610604565b606091505b505090508061066f5760405162461bcd60e51b815260206004820152603160248201527f455243373231436f6c6c656374697665466163746f72793a204572726f72206d604482015270616b696e672073657475702063616c6c7360781b606482015260840161015b565b50600101610556565b5060405163f2fde38b60e01b81523360048201526001600160a01b0383169063f2fde38b90602401600060405180830381600087803b1580156106ba57600080fd5b505af11580156106ce573d6000803e3d6000fd5b5050505050979650505050505050565b6106e661095c565b610371610bb1565b6106f661095c565b8461070081610bf4565b6001600160a01b0385161580159061072057506001600160a01b03841615155b801561073457506001600160a01b03831615155b801561074857506001600160a01b03821615155b6107ba5760405162461bcd60e51b815260206004820152603d60248201527f455243373231436f6c6c656374697665466163746f72793a20696d706c656d6560448201527f6e746174696f6e732063616e6e6f742062652061646472657373283029000000606482015260840161015b565b600180546001600160a01b038881166001600160a01b031992831681179093556002805489831690841681179091556003805489841690851681179091556004805489851690861681179091556005805494891694909516841790945560408051928352602083019190915281019290925260608201527f7d6700c1aa484999dc3340d18a3279e5b3472afa0c5fb8f3b2c8d0c5fdf11fd19060800160405180910390a2505050505050565b60015460009061087f906001600160a01b031683610c8f565b92915050565b61088d61095c565b600681905560405181907f88a973fd5506071e0cf878b30898776c47d5250a7ee1e6ee0b36df3b03c7c16a90600090a250565b6108c861095c565b6001600160a01b03811661092d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161015b565b61093681610a0b565b50565b600061094483610cf5565b801561095557506109558383610d28565b9392505050565b6000546001600160a01b031633146103715760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161015b565b6109be610db1565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600054600160a01b900460ff16156103715760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161015b565b6000610ab2610a5b565b600154610ac8906001600160a01b031683610e01565b60025460035460048054600554604051630a7a8eef60e01b81529596506001600160a01b0380881696630a7a8eef96610b16968d968d969285169591851694928316939190921691016111f5565b600060405180830381600087803b158015610b3057600080fd5b505af1158015610b44573d6000803e3d6000fd5b50505050806001600160a01b03167f8df221cbe6176f9849aba9effa58b764f046ef045824b7c8cc52b5a01e93605f8585604051602001610b85919061124e565b60408051601f1981840301815290829052610ba29291879061127a565b60405180910390a29392505050565b610bb9610a5b565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586109ee3390565b610bff816000610939565b6109365760405162461bcd60e51b815260206004820152605560248201527f455243313635436865636b6572455243373231436f6c6c6563746976653a206360448201527f6f6c6c656374697665206164647265737320646f6573206e6f7420696d706c656064820152746d656e742070726f70657220696e7465726661636560581b608482015260a40161015b565b6000610955838330604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b8152606093841b60148201526f5af43d82803e903d91602b57fd5bf3ff60801b6028820152921b6038830152604c8201526037808220606c830152605591012090565b6000610d08826301ffc9a760e01b610d28565b801561087f5750610d21826001600160e01b0319610d28565b1592915050565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180516001600160e01b03166301ffc9a760e01b178152825160009392849283928392918391908a617530fa92503d91506000519050828015610d9a575060208210155b8015610da65750600081115b979650505050505050565b600054600160a01b900460ff166103715760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161015b565b6000604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528360601b60148201526e5af43d82803e903d91602b57fd5bf360881b6028820152826037826000f59150506001600160a01b03811661087f5760405162461bcd60e51b815260206004820152601760248201527f455243313136373a2063726561746532206661696c6564000000000000000000604482015260640161015b565b634e487b7160e01b600052604160045260246000fd5b600082601f830112610ec857600080fd5b813567ffffffffffffffff80821115610ee357610ee3610ea1565b604051601f8301601f19908116603f01168101908282118183101715610f0b57610f0b610ea1565b81604052838152866020858801011115610f2457600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008083601f840112610f5657600080fd5b50813567ffffffffffffffff811115610f6e57600080fd5b6020830191508360208260051b8501011115610f8957600080fd5b9250929050565b600080600080600080600060a0888a031215610fab57600080fd5b873567ffffffffffffffff80821115610fc357600080fd5b610fcf8b838c01610eb7565b985060208a0135915080821115610fe557600080fd5b610ff18b838c01610eb7565b975060408a0135965060608a013591508082111561100e57600080fd5b61101a8b838c01610f44565b909650945060808a013591508082111561103357600080fd5b506110408a828b01610f44565b989b979a50959850939692959293505050565b6001600160a01b038116811461093657600080fd5b600080600080600060a0868803121561108057600080fd5b853561108b81611053565b9450602086013561109b81611053565b935060408601356110ab81611053565b925060608601356110bb81611053565b915060808601356110cb81611053565b809150509295509295909350565b6000602082840312156110eb57600080fd5b5035919050565b60006020828403121561110457600080fd5b813561095581611053565b60006020828403121561112157600080fd5b815161095581611053565b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261115957600080fd5b83018035915067ffffffffffffffff82111561117457600080fd5b602001915036819003821315610f8957600080fd5b8183823760009101908152919050565b60005b838110156111b457818101518382015260200161119c565b838111156111c3576000848401525b50505050565b600081518084526111e1816020860160208601611199565b601f01601f19169290920160200192915050565b60c08152600061120860c08301896111c9565b828103602084015261121a81896111c9565b6001600160a01b03978816604085015295871660608401525050918416608083015290921660a09092019190915292915050565b62714e5d60e91b8152815160009061126d816003850160208701611199565b9190910160030192915050565b60608152600061128d60608301866111c9565b828103602084015261129f81866111c9565b91505082604083015294935050505056fea2646970667358221220a6036462decf367a2e310f7e4736fc24282327651b16fc7e49434d6e6eecd77664736f6c634300080f003300000000000000000000000040db79f7f18c468c6552538b488c58b5e72bf4d90000000000000000000000004d66954dc81b13314c90a5e87464248813b7742200000000000000000000000019cf03a6f1190062eeafd70c42cbc5f7ecff05a800000000000000000000000054b2b5a9835704ebecc9ae13feb937f89fffe12400000000000000000000000000c327dbd884662080a8ed3fd84f0e9bc39ccbf4000000000000000000000000f90d2d41b769c2d45e3904c35fd107e7f3c89d3c
Deployed Bytecode
0x6080604052600436106100f35760003560e01c80638610292c1161008a578063b7d8622511610059578063b7d86225146102dd578063dce0b4e4146102fd578063f2fde38b14610321578063fa4a389b14610341576100f3565b80638610292c1461025f5780638ada6b0f1461027f5780638da5cb5b1461029f5780639c76b654146102bd576100f3565b80635c975abb116100c65780635c975abb146101f8578063715018a61461022257806377881972146102375780638456cb591461024a576100f3565b80630479734f14610164578063319fc415146101a15780633f4ba83a146101c15780634a3f42b2146101d8575b3480156100ff57600080fd5b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231436f6c6c656374697665466163746f72793a206e6f6e2d65786960448201526d39ba32b73a10333ab731ba34b7b760911b60648201526084015b60405180910390fd5b34801561017057600080fd5b50600154610184906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101ad57600080fd5b50600254610184906001600160a01b031681565b3480156101cd57600080fd5b506101d6610361565b005b3480156101e457600080fd5b50600354610184906001600160a01b031681565b34801561020457600080fd5b50600054600160a01b900460ff166040519015158152602001610198565b34801561022e57600080fd5b506101d6610373565b610184610245366004610f90565b610385565b34801561025657600080fd5b506101d66106de565b34801561026b57600080fd5b506101d661027a366004611068565b6106ee565b34801561028b57600080fd5b50600554610184906001600160a01b031681565b3480156102ab57600080fd5b506000546001600160a01b0316610184565b3480156102c957600080fd5b506101846102d83660046110d9565b610866565b3480156102e957600080fd5b506101d66102f83660046110d9565b610885565b34801561030957600080fd5b5061031360065481565b604051908152602001610198565b34801561032d57600080fd5b506101d661033c3660046110f2565b6108c0565b34801561034d57600080fd5b50600454610184906001600160a01b031681565b61036961095c565b6103716109b6565b565b61037b61095c565b6103716000610a0b565b600061038f610a5b565b600654156105455760065434146104195760405162461bcd60e51b815260206004820152604260248201527f455243373231436f6c6c656374697665466163746f72793a204d75737420736560448201527f6e6420636f727265637420616d6f756e7420666f72206372656174696f6e2066606482015261656560f01b608482015260a40161015b565b6000306001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610459573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061047d919061110f565b6001600160a01b03163460405160006040518083038185875af1925050503d80600081146104c7576040519150601f19603f3d011682016040523d82523d6000602084013e6104cc565b606091505b50509050806105435760405162461bcd60e51b815260206004820152603760248201527f455243373231436f6c6c656374697665466163746f72793a204661696c65642060448201527f746f20636f6c6c656374206372656174696f6e20666565000000000000000000606482015260840161015b565b505b610550888888610aa8565b90508360005b818110156106785760008787838181106105725761057261112c565b905060200201602081019061058791906110f2565b6001600160a01b03168686848181106105a2576105a261112c565b90506020028101906105b49190611142565b6040516105c2929190611189565b6000604051808303816000865af19150503d80600081146105ff576040519150601f19603f3d011682016040523d82523d6000602084013e610604565b606091505b505090508061066f5760405162461bcd60e51b815260206004820152603160248201527f455243373231436f6c6c656374697665466163746f72793a204572726f72206d604482015270616b696e672073657475702063616c6c7360781b606482015260840161015b565b50600101610556565b5060405163f2fde38b60e01b81523360048201526001600160a01b0383169063f2fde38b90602401600060405180830381600087803b1580156106ba57600080fd5b505af11580156106ce573d6000803e3d6000fd5b5050505050979650505050505050565b6106e661095c565b610371610bb1565b6106f661095c565b8461070081610bf4565b6001600160a01b0385161580159061072057506001600160a01b03841615155b801561073457506001600160a01b03831615155b801561074857506001600160a01b03821615155b6107ba5760405162461bcd60e51b815260206004820152603d60248201527f455243373231436f6c6c656374697665466163746f72793a20696d706c656d6560448201527f6e746174696f6e732063616e6e6f742062652061646472657373283029000000606482015260840161015b565b600180546001600160a01b038881166001600160a01b031992831681179093556002805489831690841681179091556003805489841690851681179091556004805489851690861681179091556005805494891694909516841790945560408051928352602083019190915281019290925260608201527f7d6700c1aa484999dc3340d18a3279e5b3472afa0c5fb8f3b2c8d0c5fdf11fd19060800160405180910390a2505050505050565b60015460009061087f906001600160a01b031683610c8f565b92915050565b61088d61095c565b600681905560405181907f88a973fd5506071e0cf878b30898776c47d5250a7ee1e6ee0b36df3b03c7c16a90600090a250565b6108c861095c565b6001600160a01b03811661092d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161015b565b61093681610a0b565b50565b600061094483610cf5565b801561095557506109558383610d28565b9392505050565b6000546001600160a01b031633146103715760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161015b565b6109be610db1565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600054600160a01b900460ff16156103715760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161015b565b6000610ab2610a5b565b600154610ac8906001600160a01b031683610e01565b60025460035460048054600554604051630a7a8eef60e01b81529596506001600160a01b0380881696630a7a8eef96610b16968d968d969285169591851694928316939190921691016111f5565b600060405180830381600087803b158015610b3057600080fd5b505af1158015610b44573d6000803e3d6000fd5b50505050806001600160a01b03167f8df221cbe6176f9849aba9effa58b764f046ef045824b7c8cc52b5a01e93605f8585604051602001610b85919061124e565b60408051601f1981840301815290829052610ba29291879061127a565b60405180910390a29392505050565b610bb9610a5b565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586109ee3390565b610bff816000610939565b6109365760405162461bcd60e51b815260206004820152605560248201527f455243313635436865636b6572455243373231436f6c6c6563746976653a206360448201527f6f6c6c656374697665206164647265737320646f6573206e6f7420696d706c656064820152746d656e742070726f70657220696e7465726661636560581b608482015260a40161015b565b6000610955838330604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b8152606093841b60148201526f5af43d82803e903d91602b57fd5bf3ff60801b6028820152921b6038830152604c8201526037808220606c830152605591012090565b6000610d08826301ffc9a760e01b610d28565b801561087f5750610d21826001600160e01b0319610d28565b1592915050565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180516001600160e01b03166301ffc9a760e01b178152825160009392849283928392918391908a617530fa92503d91506000519050828015610d9a575060208210155b8015610da65750600081115b979650505050505050565b600054600160a01b900460ff166103715760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161015b565b6000604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528360601b60148201526e5af43d82803e903d91602b57fd5bf360881b6028820152826037826000f59150506001600160a01b03811661087f5760405162461bcd60e51b815260206004820152601760248201527f455243313136373a2063726561746532206661696c6564000000000000000000604482015260640161015b565b634e487b7160e01b600052604160045260246000fd5b600082601f830112610ec857600080fd5b813567ffffffffffffffff80821115610ee357610ee3610ea1565b604051601f8301601f19908116603f01168101908282118183101715610f0b57610f0b610ea1565b81604052838152866020858801011115610f2457600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008083601f840112610f5657600080fd5b50813567ffffffffffffffff811115610f6e57600080fd5b6020830191508360208260051b8501011115610f8957600080fd5b9250929050565b600080600080600080600060a0888a031215610fab57600080fd5b873567ffffffffffffffff80821115610fc357600080fd5b610fcf8b838c01610eb7565b985060208a0135915080821115610fe557600080fd5b610ff18b838c01610eb7565b975060408a0135965060608a013591508082111561100e57600080fd5b61101a8b838c01610f44565b909650945060808a013591508082111561103357600080fd5b506110408a828b01610f44565b989b979a50959850939692959293505050565b6001600160a01b038116811461093657600080fd5b600080600080600060a0868803121561108057600080fd5b853561108b81611053565b9450602086013561109b81611053565b935060408601356110ab81611053565b925060608601356110bb81611053565b915060808601356110cb81611053565b809150509295509295909350565b6000602082840312156110eb57600080fd5b5035919050565b60006020828403121561110457600080fd5b813561095581611053565b60006020828403121561112157600080fd5b815161095581611053565b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261115957600080fd5b83018035915067ffffffffffffffff82111561117457600080fd5b602001915036819003821315610f8957600080fd5b8183823760009101908152919050565b60005b838110156111b457818101518382015260200161119c565b838111156111c3576000848401525b50505050565b600081518084526111e1816020860160208601611199565b601f01601f19169290920160200192915050565b60c08152600061120860c08301896111c9565b828103602084015261121a81896111c9565b6001600160a01b03978816604085015295871660608401525050918416608083015290921660a09092019190915292915050565b62714e5d60e91b8152815160009061126d816003850160208701611199565b9190910160030192915050565b60608152600061128d60608301866111c9565b828103602084015261129f81866111c9565b91505082604083015294935050505056fea2646970667358221220a6036462decf367a2e310f7e4736fc24282327651b16fc7e49434d6e6eecd77664736f6c634300080f0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000040db79f7f18c468c6552538b488c58b5e72bf4d90000000000000000000000004d66954dc81b13314c90a5e87464248813b7742200000000000000000000000019cf03a6f1190062eeafd70c42cbc5f7ecff05a800000000000000000000000054b2b5a9835704ebecc9ae13feb937f89fffe12400000000000000000000000000c327dbd884662080a8ed3fd84f0e9bc39ccbf4000000000000000000000000f90d2d41b769c2d45e3904c35fd107e7f3c89d3c
-----Decoded View---------------
Arg [0] : owner_ (address): 0x40dB79f7f18C468c6552538b488c58B5E72bf4D9
Arg [1] : collective_ (address): 0x4d66954dC81B13314c90a5E87464248813B77422
Arg [2] : mintGuard_ (address): 0x19cF03a6f1190062eEafD70C42cBc5f7EcFF05a8
Arg [3] : burnGuard_ (address): 0x54B2b5A9835704EBEcc9AE13Feb937F89fffE124
Arg [4] : transferGuard_ (address): 0x00C327dBd884662080A8eD3FD84f0e9bc39ccbF4
Arg [5] : renderer_ (address): 0xf90D2d41b769C2d45e3904c35fD107e7F3c89d3C
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 00000000000000000000000040db79f7f18c468c6552538b488c58b5e72bf4d9
Arg [1] : 0000000000000000000000004d66954dc81b13314c90a5e87464248813b77422
Arg [2] : 00000000000000000000000019cf03a6f1190062eeafd70c42cbc5f7ecff05a8
Arg [3] : 00000000000000000000000054b2b5a9835704ebecc9ae13feb937f89fffe124
Arg [4] : 00000000000000000000000000c327dbd884662080a8ed3fd84f0e9bc39ccbf4
Arg [5] : 000000000000000000000000f90d2d41b769c2d45e3904c35fd107e7f3c89d3c
Deployed Bytecode Sourcemap
37893:6933:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44759:56:0;;-1:-1:-1;;;44759:56:0;;216:2:1;44759:56:0;;;198:21:1;255:2;235:18;;;228:30;294:34;274:18;;;267:62;-1:-1:-1;;;345:18:1;;;338:44;399:19;;44759:56:0;;;;;;;;38001:25;;;;;;;;;;-1:-1:-1;38001:25:0;;;;-1:-1:-1;;;;;38001:25:0;;;;;;-1:-1:-1;;;;;593:32:1;;;575:51;;563:2;548:18;38001:25:0;;;;;;;;38033:24;;;;;;;;;;-1:-1:-1;38033:24:0;;;;-1:-1:-1;;;;;38033:24:0;;;44276:67;;;;;;;;;;;;;:::i;:::-;;38064:24;;;;;;;;;;-1:-1:-1;38064:24:0;;;;-1:-1:-1;;;;;38064:24:0;;;5139:86;;;;;;;;;;-1:-1:-1;5186:4:0;5210:7;-1:-1:-1;;;5210:7:0;;;;5139:86;;802:14:1;;795:22;777:41;;765:2;750:18;5139:86:0;637:187:1;2701:103:0;;;;;;;;;;;;;:::i;40518:1146::-;;;;;;:::i;:::-;;:::i;44119:63::-;;;;;;;;;;;;;:::i;43128:899::-;;;;;;;;;;-1:-1:-1;43128:899:0;;;;;:::i;:::-;;:::i;38130:23::-;;;;;;;;;;-1:-1:-1;38130:23:0;;;;-1:-1:-1;;;;;38130:23:0;;;2053:87;;;;;;;;;;-1:-1:-1;2099:7:0;2126:6;-1:-1:-1;;;;;2126:6:0;2053:87;;40004:148;;;;;;;;;;-1:-1:-1;40004:148:0;;;;;:::i;:::-;;:::i;39672:158::-;;;;;;;;;;-1:-1:-1;39672:158:0;;;;;:::i;:::-;;:::i;38162:26::-;;;;;;;;;;;;;;;;;;;4786:25:1;;;4774:2;4759:18;38162:26:0;4640:177:1;2959:238:0;;;;;;;;;;-1:-1:-1;2959:238:0;;;;;:::i;:::-;;:::i;38095:28::-;;;;;;;;;;-1:-1:-1;38095:28:0;;;;-1:-1:-1;;;;;38095:28:0;;;44276:67;1939:13;:11;:13::i;:::-;44325:10:::1;:8;:10::i;:::-;44276:67::o:0;2701:103::-;1939:13;:11;:13::i;:::-;2766:30:::1;2793:1;2766:18;:30::i;40518:1146::-:0;40740:13;4744:19;:17;:19::i;:::-;40770:11:::1;::::0;:15;40766:415:::1;;40841:11;;40828:9;:24;40802:152;;;::::0;-1:-1:-1;;;40802:152:0;;5276:2:1;40802:152:0::1;::::0;::::1;5258:21:1::0;5315:2;5295:18;;;5288:30;5354:34;5334:18;;;5327:62;5425:34;5405:18;;;5398:62;-1:-1:-1;;;5476:19:1;;;5469:33;5519:19;;40802:152:0::1;5074:470:1::0;40802:152:0::1;40970:9;40993:4;-1:-1:-1::0;;;;;40993:10:0::1;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;40985:26:0::1;41019:9;40985:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40969:64;;;41074:4;41048:121;;;::::0;-1:-1:-1;;;41048:121:0;;6217:2:1;41048:121:0::1;::::0;::::1;6199:21:1::0;6256:2;6236:18;;;6229:30;6295:34;6275:18;;;6268:62;6366:25;6346:18;;;6339:53;6409:19;;41048:121:0::1;6015:419:1::0;41048:121:0::1;40787:394;40766:415;41201:26;41208:4;41214:6;41222:4;41201:6;:26::i;:::-;41193:34:::0;-1:-1:-1;41257:14:0;41240::::1;41289:311;41309:6;41305:1;:10;41289:311;;;41399:9;41414:14;;41429:1;41414:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;41414:22:0::1;41437:4;;41442:1;41437:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;41414:31;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41398:47;;;41468:4;41460:66;;;::::0;-1:-1:-1;;;41460:66:0;;7575:2:1;41460:66:0::1;::::0;::::1;7557:21:1::0;7614:2;7594:18;;;7587:30;7653:34;7633:18;;;7626:62;-1:-1:-1;;;7704:18:1;;;7697:47;7761:19;;41460:66:0::1;7373:413:1::0;41460:66:0::1;-1:-1:-1::0;41570:3:0::1;;41289:311;;;-1:-1:-1::0;41612:44:0::1;::::0;-1:-1:-1;;;41612:44:0;;41645:10:::1;41612:44;::::0;::::1;575:51:1::0;-1:-1:-1;;;;;41612:32:0;::::1;::::0;::::1;::::0;548:18:1;;41612:44:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;40755:909;40518:1146:::0;;;;;;;;;:::o;44119:63::-;1939:13;:11;:13::i;:::-;44166:8:::1;:6;:8::i;43128:899::-:0;1939:13;:11;:13::i;:::-;43353:11:::1;37219:37;37245:10;37219:25;:37::i;:::-;-1:-1:-1::0;;;;;43399:24:0;::::2;::::0;;::::2;::::0;:69:::2;;-1:-1:-1::0;;;;;;43444:24:0;::::2;::::0;::::2;43399:69;:118;;;;-1:-1:-1::0;;;;;;43489:28:0;::::2;::::0;::::2;43399:118;:162;;;;-1:-1:-1::0;;;;;;43538:23:0;::::2;::::0;::::2;43399:162;43377:273;;;::::0;-1:-1:-1;;;43377:273:0;;7993:2:1;43377:273:0::2;::::0;::::2;7975:21:1::0;8032:2;8012:18;;;8005:30;8071:34;8051:18;;;8044:62;8142:31;8122:18;;;8115:59;8191:19;;43377:273:0::2;7791:425:1::0;43377:273:0::2;43663:10;:24:::0;;-1:-1:-1;;;;;43663:24:0;;::::2;-1:-1:-1::0;;;;;;43663:24:0;;::::2;::::0;::::2;::::0;;;43698:9:::2;:22:::0;;;;::::2;::::0;;::::2;::::0;::::2;::::0;;;43731:9:::2;:22:::0;;;;::::2;::::0;;::::2;::::0;::::2;::::0;;;43764:13:::2;:30:::0;;;;::::2;::::0;;::::2;::::0;::::2;::::0;;;43805:8:::2;:20:::0;;;;::::2;::::0;;;::::2;::::0;::::2;::::0;;;43843:176:::2;::::0;;8490:34:1;;;8555:2;8540:18;;8533:43;;;;8592:18;;8585:43;;;;8659:2;8644:18;;8637:43;43843:176:0::2;::::0;8439:3:1;8424:19;43843:176:0::2;;;;;;;1963:1:::1;43128:899:::0;;;;;:::o;40004:148::-;40127:10;;40065:7;;40092:52;;-1:-1:-1;;;;;40127:10:0;40139:4;40092:34;:52::i;:::-;40085:59;40004:148;-1:-1:-1;;40004:148:0:o;39672:158::-;1939:13;:11;:13::i;:::-;39748:11:::1;:26:::0;;;39790:32:::1;::::0;39762:12;;39790:32:::1;::::0;;;::::1;39672:158:::0;:::o;2959:238::-;1939:13;:11;:13::i;:::-;-1:-1:-1;;;;;3062:22:0;::::1;3040:110;;;::::0;-1:-1:-1;;;3040:110:0;;8893:2:1;3040:110:0::1;::::0;::::1;8875:21:1::0;8932:2;8912:18;;;8905:30;8971:34;8951:18;;;8944:62;-1:-1:-1;;;9022:18:1;;;9015:36;9068:19;;3040:110:0::1;8691:402:1::0;3040:110:0::1;3161:28;3180:8;3161:18;:28::i;:::-;2959:238:::0;:::o;12320:343::-;12434:4;12561:23;12576:7;12561:14;:23::i;:::-;:94;;;;;12601:54;12634:7;12643:11;12601:32;:54::i;:::-;12541:114;12320:343;-1:-1:-1;;;12320:343:0:o;2218:132::-;2099:7;2126:6;-1:-1:-1;;;;;2126:6:0;745:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;9300:2:1;2274:68:0;;;9282:21:1;;;9319:18;;;9312:30;9378:34;9358:18;;;9351:62;9430:18;;2274:68:0;9098:356:1;5994:120:0;5003:16;:14;:16::i;:::-;6063:5:::1;6053:15:::0;;-1:-1:-1;;;;6053:15:0::1;::::0;;6084:22:::1;745:10:::0;6093:12:::1;6084:22;::::0;-1:-1:-1;;;;;593:32:1;;;575:51;;563:2;548:18;6084:22:0::1;;;;;;;5994:120::o:0;3357:191::-;3431:16;3450:6;;-1:-1:-1;;;;;3467:17:0;;;-1:-1:-1;;;;;;3467:17:0;;;;;;3500:40;;3450:6;;;;;;;3500:40;;3431:16;3500:40;3420:128;3357:191;:::o;5298:108::-;5186:4;5210:7;-1:-1:-1;;;5210:7:0;;;;5368:9;5360:38;;;;-1:-1:-1;;;5360:38:0;;9661:2:1;5360:38:0;;;9643:21:1;9700:2;9680:18;;;9673:30;-1:-1:-1;;;9719:18:1;;;9712:46;9775:18;;5360:38:0;9459:340:1;41911:605:0;42049:13;4744:19;:17;:19::i;:::-;42109:10:::1;::::0;42083:43:::1;::::0;-1:-1:-1;;;;;42109:10:0::1;42121:4:::0;42083:25:::1;:43::i;:::-;42242:9;::::0;42266::::1;::::0;42290:13:::1;::::0;;42318:8:::1;::::0;42139:198:::1;::::0;-1:-1:-1;;;42139:198:0;;42075:51;;-1:-1:-1;;;;;;42139:48:0;;::::1;::::0;::::1;::::0;:198:::1;::::0;42202:4;;42221:6;;42242:9;;::::1;::::0;42266;;::::1;::::0;42290:13;;::::1;::::0;42318:8;;;::::1;::::0;42139:198:::1;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;42393:5;-1:-1:-1::0;;;;;42355:153:0::1;;42413:4;42470:6;42439:38;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;42439:38:0;;::::1;::::0;;;;;;;42355:153:::1;::::0;;42493:4;;42355:153:::1;:::i;:::-;;;;;;;;41911:605:::0;;;;;:::o;5735:118::-;4744:19;:17;:19::i;:::-;5795:7:::1;:14:::0;;-1:-1:-1;;;;5795:14:0::1;-1:-1:-1::0;;;5795:14:0::1;::::0;;5825:20:::1;5832:12;745:10:::0;;665:98;37284:352;37386:129;37436:10;37465:35;37386:31;:129::i;:::-;37364:264;;;;-1:-1:-1;;;37364:264:0;;12178:2:1;37364:264:0;;;12160:21:1;12217:2;12197:18;;;12190:30;12256:34;12236:18;;;12229:62;12327:34;12307:18;;;12300:62;-1:-1:-1;;;12378:19:1;;;12371:52;12440:19;;37364:264:0;11976:489:1;9923:239:0;10048:17;10090:64;10118:14;10134:4;10148;9212;9206:11;-1:-1:-1;;;9231:128:0;;9400:4;9396:25;;;9389:4;9380:14;;9373:49;-1:-1:-1;;;9470:4:0;9461:14;;9436:139;9612:19;;9605:4;9596:14;;9589:43;9662:4;9653:14;;9646:28;9726:4;9711:20;;;9704:4;9695:14;;9688:44;9785:4;9769:14;;9759:31;;8947:861;11612:482;11676:4;11887:117;11938:7;-1:-1:-1;;;11887:32:0;:117::i;:::-;:199;;;;-1:-1:-1;12022:64:0;12055:7;-1:-1:-1;;;;;;12022:32:0;:64::i;:::-;12021:65;11867:219;11612:482;-1:-1:-1;;11612:482:0:o;15442:841::-;15640:108;;;-1:-1:-1;;;;;;12632:33:1;;15640:108:0;;;;12614:52:1;;;;15640:108:0;;;;;;;;;;12587:18:1;;;;15640:108:0;;;;;;;;;-1:-1:-1;;;;;15640:108:0;-1:-1:-1;;;15640:108:0;;;16032:20;;15569:4;;15640:108;15569:4;;;;;;15640:108;15569:4;;16032:20;15963:7;15939:5;15910:203;15899:214;;16141:16;16127:30;;16192:4;16186:11;16171:26;;16227:7;:29;;;;;16252:4;16238:10;:18;;16227:29;:48;;;;;16274:1;16260:11;:15;16227:48;16220:55;15442:841;-1:-1:-1;;;;;;;15442:841:0:o;5483:108::-;5186:4;5210:7;-1:-1:-1;;;5210:7:0;;;;5542:41;;;;-1:-1:-1;;;5542:41:0;;12879:2:1;5542:41:0;;;12861:21:1;12918:2;12898:18;;;12891:30;-1:-1:-1;;;12937:18:1;;;12930:50;12997:18;;5542:41:0;12677:344:1;8108:724:0;8210:16;8329:4;8323:11;-1:-1:-1;;;8373:3:0;8348:128;8523:14;8517:4;8513:25;8506:4;8501:3;8497:14;8490:49;-1:-1:-1;;;8587:4:0;8582:3;8578:14;8553:139;8740:4;8734;8729:3;8726:1;8718:27;8706:39;-1:-1:-1;;;;;;;8774:22:0;;8766:58;;;;-1:-1:-1;;;8766:58:0;;13228:2:1;8766:58:0;;;13210:21:1;13267:2;13247:18;;;13240:30;13306:25;13286:18;;;13279:53;13349:18;;8766:58:0;13026:347:1;829:127;890:10;885:3;881:20;878:1;871:31;921:4;918:1;911:15;945:4;942:1;935:15;961:719;1004:5;1057:3;1050:4;1042:6;1038:17;1034:27;1024:55;;1075:1;1072;1065:12;1024:55;1111:6;1098:20;1137:18;1174:2;1170;1167:10;1164:36;;;1180:18;;:::i;:::-;1255:2;1249:9;1223:2;1309:13;;-1:-1:-1;;1305:22:1;;;1329:2;1301:31;1297:40;1285:53;;;1353:18;;;1373:22;;;1350:46;1347:72;;;1399:18;;:::i;:::-;1439:10;1435:2;1428:22;1474:2;1466:6;1459:18;1520:3;1513:4;1508:2;1500:6;1496:15;1492:26;1489:35;1486:55;;;1537:1;1534;1527:12;1486:55;1601:2;1594:4;1586:6;1582:17;1575:4;1567:6;1563:17;1550:54;1648:1;1641:4;1636:2;1628:6;1624:15;1620:26;1613:37;1668:6;1659:15;;;;;;961:719;;;;:::o;1685:367::-;1748:8;1758:6;1812:3;1805:4;1797:6;1793:17;1789:27;1779:55;;1830:1;1827;1820:12;1779:55;-1:-1:-1;1853:20:1;;1896:18;1885:30;;1882:50;;;1928:1;1925;1918:12;1882:50;1965:4;1957:6;1953:17;1941:29;;2025:3;2018:4;2008:6;2005:1;2001:14;1993:6;1989:27;1985:38;1982:47;1979:67;;;2042:1;2039;2032:12;1979:67;1685:367;;;;;:::o;2057:1254::-;2237:6;2245;2253;2261;2269;2277;2285;2338:3;2326:9;2317:7;2313:23;2309:33;2306:53;;;2355:1;2352;2345:12;2306:53;2395:9;2382:23;2424:18;2465:2;2457:6;2454:14;2451:34;;;2481:1;2478;2471:12;2451:34;2504:50;2546:7;2537:6;2526:9;2522:22;2504:50;:::i;:::-;2494:60;;2607:2;2596:9;2592:18;2579:32;2563:48;;2636:2;2626:8;2623:16;2620:36;;;2652:1;2649;2642:12;2620:36;2675:52;2719:7;2708:8;2697:9;2693:24;2675:52;:::i;:::-;2665:62;;2774:2;2763:9;2759:18;2746:32;2736:42;;2831:2;2820:9;2816:18;2803:32;2787:48;;2860:2;2850:8;2847:16;2844:36;;;2876:1;2873;2866:12;2844:36;2915:72;2979:7;2968:8;2957:9;2953:24;2915:72;:::i;:::-;3006:8;;-1:-1:-1;2889:98:1;-1:-1:-1;3094:3:1;3079:19;;3066:33;;-1:-1:-1;3111:16:1;;;3108:36;;;3140:1;3137;3130:12;3108:36;;3179:72;3243:7;3232:8;3221:9;3217:24;3179:72;:::i;:::-;2057:1254;;;;-1:-1:-1;2057:1254:1;;-1:-1:-1;2057:1254:1;;;;3153:98;;-1:-1:-1;;;2057:1254:1:o;3316:131::-;-1:-1:-1;;;;;3391:31:1;;3381:42;;3371:70;;3437:1;3434;3427:12;3452:813;3547:6;3555;3563;3571;3579;3632:3;3620:9;3611:7;3607:23;3603:33;3600:53;;;3649:1;3646;3639:12;3600:53;3688:9;3675:23;3707:31;3732:5;3707:31;:::i;:::-;3757:5;-1:-1:-1;3814:2:1;3799:18;;3786:32;3827:33;3786:32;3827:33;:::i;:::-;3879:7;-1:-1:-1;3938:2:1;3923:18;;3910:32;3951:33;3910:32;3951:33;:::i;:::-;4003:7;-1:-1:-1;4062:2:1;4047:18;;4034:32;4075:33;4034:32;4075:33;:::i;:::-;4127:7;-1:-1:-1;4186:3:1;4171:19;;4158:33;4200;4158;4200;:::i;:::-;4252:7;4242:17;;;3452:813;;;;;;;;:::o;4270:180::-;4329:6;4382:2;4370:9;4361:7;4357:23;4353:32;4350:52;;;4398:1;4395;4388:12;4350:52;-1:-1:-1;4421:23:1;;4270:180;-1:-1:-1;4270:180:1:o;4822:247::-;4881:6;4934:2;4922:9;4913:7;4909:23;4905:32;4902:52;;;4950:1;4947;4940:12;4902:52;4989:9;4976:23;5008:31;5033:5;5008:31;:::i;5549:251::-;5619:6;5672:2;5660:9;5651:7;5647:23;5643:32;5640:52;;;5688:1;5685;5678:12;5640:52;5720:9;5714:16;5739:31;5764:5;5739:31;:::i;6439:127::-;6500:10;6495:3;6491:20;6488:1;6481:31;6531:4;6528:1;6521:15;6555:4;6552:1;6545:15;6571:521;6648:4;6654:6;6714:11;6701:25;6808:2;6804:7;6793:8;6777:14;6773:29;6769:43;6749:18;6745:68;6735:96;;6827:1;6824;6817:12;6735:96;6854:33;;6906:20;;;-1:-1:-1;6949:18:1;6938:30;;6935:50;;;6981:1;6978;6971:12;6935:50;7014:4;7002:17;;-1:-1:-1;7045:14:1;7041:27;;;7031:38;;7028:58;;;7082:1;7079;7072:12;7097:271;7280:6;7272;7267:3;7254:33;7236:3;7306:16;;7331:13;;;7306:16;7097:271;-1:-1:-1;7097:271:1:o;9804:258::-;9876:1;9886:113;9900:6;9897:1;9894:13;9886:113;;;9976:11;;;9970:18;9957:11;;;9950:39;9922:2;9915:10;9886:113;;;10017:6;10014:1;10011:13;10008:48;;;10052:1;10043:6;10038:3;10034:16;10027:27;10008:48;;9804:258;;;:::o;10067:::-;10109:3;10147:5;10141:12;10174:6;10169:3;10162:19;10190:63;10246:6;10239:4;10234:3;10230:14;10223:4;10216:5;10212:16;10190:63;:::i;:::-;10307:2;10286:15;-1:-1:-1;;10282:29:1;10273:39;;;;10314:4;10269:50;;10067:258;-1:-1:-1;;10067:258:1:o;10330:745::-;10639:3;10628:9;10621:22;10602:4;10666:46;10707:3;10696:9;10692:19;10684:6;10666:46;:::i;:::-;10760:9;10752:6;10748:22;10743:2;10732:9;10728:18;10721:50;10788:33;10814:6;10806;10788:33;:::i;:::-;-1:-1:-1;;;;;10895:15:1;;;10890:2;10875:18;;10868:43;10947:15;;;10942:2;10927:18;;10920:43;-1:-1:-1;;11000:15:1;;;10994:3;10979:19;;10972:44;11053:15;;;10848:3;11032:19;;;11025:44;;;;10947:15;10780:41;-1:-1:-1;;10330:745:1:o;11080:432::-;-1:-1:-1;;;11330:30:1;;11383:13;;11312:3;;11405:61;11383:13;11455:1;11446:11;;11439:4;11427:17;;11405:61;:::i;:::-;11486:16;;;;11504:1;11482:24;;11080:432;-1:-1:-1;;11080:432:1:o;11517:454::-;11742:2;11731:9;11724:21;11705:4;11768:45;11809:2;11798:9;11794:18;11786:6;11768:45;:::i;:::-;11861:9;11853:6;11849:22;11844:2;11833:9;11829:18;11822:50;11889:33;11915:6;11907;11889:33;:::i;:::-;11881:41;;;11958:6;11953:2;11942:9;11938:18;11931:34;11517:454;;;;;;:::o
Swarm Source
ipfs://a6036462decf367a2e310f7e4736fc24282327651b16fc7e49434d6e6eecd776
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.