Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60a06040 | 14869305 | 901 days ago | IN | 0 ETH | 0.1606335 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
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:
Land
Compiler Version
v0.8.14+commit.80d49f37
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.14; /// @author: upheaver.eth import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721BurnableUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155Upgradeable.sol"; import "@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/utils/structs/EnumerableSetUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; import "./AdminControlUpgradeable.sol"; import "./ILand.sol"; import "hardhat/console.sol"; /////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // // __ ______ __ __ _____ // // /\ \ /\ __ \ /\ "-.\ \ /\ __-. // // \ \ \____\ \ __ \\ \ \-. \\ \ \/\ \ // // \ \_____\\ \_\ \_\\ \_\\"\_\\ \____- // // \/_____/ \/_/\/_/ \/_/ \/_/ \/____/ // // // // By ForeverLands.xyz // // // /////////////////////////////////////////////////////////////////////////////////////////////////////////////// contract Land is Initializable, ReentrancyGuardUpgradeable, AdminControlUpgradeable, ERC721BurnableUpgradeable, UUPSUpgradeable, ILand { using EnumerableSetUpgradeable for EnumerableSetUpgradeable.AddressSet; using EnumerableSetUpgradeable for EnumerableSetUpgradeable.UintSet; using CountersUpgradeable for CountersUpgradeable.Counter; CountersUpgradeable.Counter private _tokenIdCounter; CountersUpgradeable.Counter private _burnedCounter; bytes4 private constant _INTERFACE_ID_ROYALTIES_CREATORCORE = 0xbb3bafd6; bytes4 private constant _INTERFACE_ID_ROYALTIES_EIP2981 = 0x2a55205a; bytes4 private constant _INTERFACE_ID_ROYALTIES_RARIBLE = 0xb7799584; string private _baseURIPrefix; address private _ERC721TokenAddress; address private _ERC1155TokenAddress; uint256 private _royaltyBps; address payable private _royaltyRecipient; address payable private _recovery; address private _signer; bytes32[] _colonized; bool public discoveryEnabled; bool public colonizationEnabled; bool public portalsEnabled; bool public explorationEnabled; bool public mergeEnabled; uint256 public availableLand; struct Colony { address founder; uint256 level; EnumerableSetUpgradeable.AddressSet settlers; EnumerableSetUpgradeable.UintSet portals; mapping (address => uint256) shares; } mapping(uint256 => uint256) private _explorationLevel; mapping(uint256 => Colony) private _colonies; /// @custom:oz-upgrades-unsafe-allow constructor constructor() { _disableInitializers(); } function initialize(uint256 _availableLand) initializer public { __ERC721_init("Land by ForeverLands", "LAND"); __ERC721Burnable_init(); __Ownable_init(); __UUPSUpgradeable_init(); _recovery = payable(owner()); _tokenIdCounter.increment(); availableLand = _availableLand; } function _baseURI() internal view override returns (string memory) { return _baseURIPrefix; } function _burn(uint256 tokenId) internal override(ERC721Upgradeable) { _burnedCounter.increment(); emit Burn(tokenId); super._burn(tokenId); } function setBaseURI(string calldata uri) external override adminRequired { _baseURIPrefix = uri; } function setAvailableLand(uint256 count) external override adminRequired { require(count >= 0, "Invalid count"); availableLand = count; } function setRecoveryAddress(address payable recovery) external override adminRequired { _recovery = recovery; } function setSignerAddress(address signer) external override adminRequired { _signer = signer; } function getSignerAddress() external view override returns (address) { return _signer; } function safeMint(address to) external override adminRequired { _mintLand(to); } function colonize(bytes memory signature, address _from, uint256 _tokenId, uint256 _action) external override { require(colonizationEnabled, "Colonization inactive"); require(_signer != address(0x0), "Signer not set"); require(hasColony(_tokenId) == false, "Colony exists"); require(_from == ownerOf(_tokenId), "Must be token owner"); bytes32 hash = getMessageHash(_from, _tokenId, _action); address recovered = recoverSigner(hash, signature); if(recovered == _signer && _action == 1) { _createColony(_tokenId, _from); } } function onERC1155Received( address, address from, uint256 id, uint256 value, bytes calldata data ) external override nonReentrant returns(bytes4) { _onERC1155Received(from, id, value, data); return this.onERC1155Received.selector; } function onERC1155BatchReceived( address, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external override nonReentrant returns(bytes4) { require(ids.length == 1 && ids.length == values.length, "Invalid input"); _onERC1155Received(from, ids[0], values[0], data); return this.onERC1155BatchReceived.selector; } // burn shard // burn other lands with variable failure rate to explore land, by default 20%. function _onERC1155Received(address from, uint256 id, uint256 value, bytes calldata data) private { require(msg.sender == _ERC1155TokenAddress && id == 1, "Invalid NFT"); uint256 action; uint256 tokenId; uint256 colonyId; if (data.length == 32) { (action) = abi.decode(data, (uint256)); } else if (data.length == 64) { (action, tokenId) = abi.decode(data, (uint256, uint256)); } else if (data.length == 96) { (action, tokenId, colonyId) = abi.decode(data, (uint256, uint256, uint256)); } else { revert("Invalid data"); } if (action == 0) { /** Discover Land by burning Explorers */ require(discoveryEnabled, "Discovery inactive"); require(availableLand >= value, "Not enough stock"); } else if (action == 1) { /** Explore Land by burning Explorers */ require(explorationEnabled, "Exploration inactive"); require(from == ownerOf(tokenId), "Must be token owner"); require((_explorationLevel[tokenId] + value) <= 7, "Exploration limit"); } else if (action == 2) { /** Colonize Land by burning Explorers */ require(colonizationEnabled, "Colonization inactive"); require(hasColony(tokenId), "No colony exists"); require(_explorationLevel[tokenId] == 7, "Land must be fully Explored"); } else if (action == 3) { /** Create Portals between any land and Colony */ require(portalsEnabled, "Portals inactive"); require(value == 1, "Can link one at a time"); require(from == ownerOf(tokenId), "Must be token owner"); require(hasColony(colonyId), "No colony exists"); require(hasPortal(colonyId, tokenId) == false, "Portal exists"); } else { revert("Invalid data"); } // Burn it try IERC1155Upgradeable(msg.sender).safeTransferFrom(address(this), address(0xdEaD), id, value, data) { } catch (bytes memory) { revert("Burn failure"); } if (action == 0) { availableLand -= value; for (uint i = 0; i < value; i++) { _mintLand(from); } } else if (action == 1) { _exploreLand(tokenId, value); } else if (action == 2) { _settleColony(from, tokenId, value); } else if (action == 3) { _createPortal(from, tokenId, colonyId); } else { revert("Invalid data"); } } function onERC721Received( address, address from, uint256 receivedTokenId, bytes calldata data ) external override nonReentrant returns (bytes4) { require(msg.sender == _ERC721TokenAddress, "Invalid NFT"); if (data.length != 64) revert("Invalid data"); (uint256 action, uint256 tokenId) = abi.decode(data, (uint256, uint256)); if (action != 10) revert("Invalid data"); require(mergeEnabled, "Merge inactive"); require(colonizationEnabled == false, "Colonization active"); require(from == ownerOf(tokenId), "Must be token owner"); // Burn it try IERC721Upgradeable(msg.sender).transferFrom(address(this), address(0xdEaD), receivedTokenId) { } catch (bytes memory) { revert("Burn failure"); } if (action == 10) { _mergeOne(receivedTokenId, tokenId); } return this.onERC721Received.selector; } function _mergeOne(uint256 tokenFrom, uint256 tokenTo) private { uint256 left = _explorationLevel[tokenFrom] + 1; uint256 right = _explorationLevel[tokenTo]; uint256 sum = left + right; if(sum < 7) { _explorationLevel[tokenTo] = sum; } else { _explorationLevel[tokenTo] = 7; } _burnedCounter.increment(); emit Merge(tokenFrom, tokenTo); emit Burn(tokenFrom); } function _mintLand(address to) private { uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); _safeMint(to, tokenId); emit Discover(tokenId); } function _exploreLand(uint256 tokenId, uint256 count) internal { _explorationLevel[tokenId] += count; emit Explore(tokenId, count); } function _settleColony(address from, uint256 tokenId, uint256 count) internal { _colonies[tokenId].level += count; _colonies[tokenId].settlers.add(from); _colonies[tokenId].shares[from] += count; emit Settle(from, tokenId, count); } function _createColony(uint256 tokenId, address founder) internal { Colony storage colony = _colonies[tokenId]; colony.founder = founder; emit Colonize(tokenId, founder); } function _createPortal(address from, uint256 tokenId, uint256 colonyId) internal { Colony storage colony = _colonies[colonyId]; colony.portals.add(tokenId); emit Portal(from, tokenId, colonyId); } function hasColony(uint256 tokenId) public view override returns(bool) { return _colonies[tokenId].founder != address(0x0); } function hasPortal(uint256 colonyId, uint256 tokenId) public view override returns(bool) { return _colonies[colonyId].portals.contains(tokenId); } function getColony(uint256 tokenId) external view override returns (uint256, address, address[] memory, uint256[] memory, uint256[] memory) { uint256 len = _colonies[tokenId].settlers.length(); uint256[] memory shares = new uint256[](len); address[] memory settlers = _colonies[tokenId].settlers.values(); uint256[] memory portals = _colonies[tokenId].portals.values(); for (uint i = 0; i < len; i++) { shares[i] = _colonies[tokenId].shares[settlers[i]]; } return (_colonies[tokenId].level, _colonies[tokenId].founder, settlers, shares, portals); } function getExplorationLevel(uint256 tokenId) external view override returns (uint256) { return _explorationLevel[tokenId]; } function getColonyLevel(uint256 tokenId) external view override returns(uint256) { return _colonies[tokenId].level; } function getColonyFounder(uint256 tokenId) external view override returns (address) { return _colonies[tokenId].founder; } function getOwnershipShare(uint256 tokenId, address owner) external view override returns(uint256) { return _colonies[tokenId].shares[owner]; } function getColonySettlers(uint256 tokenId) external view override returns (address[] memory) { return _colonies[tokenId].settlers.values(); } function getColonyPortals(uint256 tokenId) external view override returns (uint256[] memory) { return _colonies[tokenId].portals.values(); } function enableDiscovery() external override adminRequired { discoveryEnabled = true; emit ActivateDiscovery(); } function disableDiscovery() external override adminRequired { discoveryEnabled = false; emit DeactivateDiscovery(); } function enableExploration() external override adminRequired { explorationEnabled = true; emit ActivateExploration(); } function disableExploration() external override adminRequired { explorationEnabled = false; emit DeactivateExploration(); } function enablePortals() external override adminRequired { portalsEnabled = true; emit ActivatePortals(); } function disablePortals() external override adminRequired { portalsEnabled = false; emit DeactivatePortals(); } function enableColonization() external override adminRequired { colonizationEnabled = true; emit ActivateColonization(); } function disableColonization() external override adminRequired { colonizationEnabled = false; emit DeactivateColonization(); } function enableMerge() external override adminRequired { mergeEnabled = true; emit ActivateMerge(); } function disableMerge() external override adminRequired { mergeEnabled = false; emit DeactivateMerge(); } function updateERC1155Address(address erc1155address) external override adminRequired { _ERC1155TokenAddress = erc1155address; } function updateERC721Address(address erc721address) external override adminRequired { _ERC721TokenAddress = erc721address; } function getERC721Address() external view override returns (address) { return _ERC721TokenAddress; } function getERC1155Address() external view override returns (address) { return _ERC1155TokenAddress; } function supportsInterface(bytes4 interfaceId) public view virtual override(AdminControlUpgradeable, ERC721Upgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == type(IERC1155ReceiverUpgradeable).interfaceId || ERC721Upgradeable.supportsInterface(interfaceId) || AdminControlUpgradeable.supportsInterface(interfaceId) || interfaceId == _INTERFACE_ID_ROYALTIES_CREATORCORE || interfaceId == _INTERFACE_ID_ROYALTIES_EIP2981 || interfaceId == _INTERFACE_ID_ROYALTIES_RARIBLE; } function updateRoyalties(address payable recipient, uint256 bps) external override adminRequired { _royaltyRecipient = recipient; _royaltyBps = bps; } function getRoyalties(uint256) external view override returns (address payable[] memory recipients, uint256[] memory bps) { if (_royaltyRecipient != address(0x0)) { recipients = new address payable[](1); recipients[0] = _royaltyRecipient; bps = new uint256[](1); bps[0] = _royaltyBps; } return (recipients, bps); } function getFeeRecipients(uint256) external view override returns (address payable[] memory recipients) { if (_royaltyRecipient != address(0x0)) { recipients = new address payable[](1); recipients[0] = _royaltyRecipient; } return recipients; } function getFeeBps(uint256) external view override returns (uint[] memory bps) { if (_royaltyRecipient != address(0x0)) { bps = new uint256[](1); bps[0] = _royaltyBps; } return bps; } function royaltyInfo(uint256, uint256 value) external view override returns (address, uint256) { return (_royaltyRecipient, value*_royaltyBps/10000); } function getEthBalance() external view override returns (uint256) { return address(this).balance; } function totalSupply() external view override returns (uint256) { return _tokenIdCounter.current() - _burnedCounter.current() - 1; } function withdraw(uint256 amount) external override adminRequired { _recovery.transfer(amount); } function recoverERC20(address tokenAddress, uint256 tokenAmount) external virtual override adminRequired { IERC20Upgradeable(tokenAddress).transferFrom(address(this), _recovery, tokenAmount); } function recoverERC721(address tokenAddress, uint256 tokenId) external virtual override adminRequired { IERC721Upgradeable(tokenAddress).transferFrom(address(this), _recovery, tokenId); } function recoverERC1155(address tokenAddress, uint256 tokenId, uint256 amount) external virtual override adminRequired { IERC1155Upgradeable(tokenAddress).safeTransferFrom(address(this), _recovery, tokenId, amount, ""); } function recoverSigner(bytes32 hash, bytes memory signature) public pure returns (address) { bytes32 messageDigest = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); return ECDSAUpgradeable.recover(messageDigest, signature); } function getMessageHash(address _from, uint256 _tokenId, uint256 _action) public pure returns (bytes32) { return keccak256(abi.encodePacked(_from, _tokenId, _action)); } function _authorizeUpgrade(address newImplementation) internal adminRequired override {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; import "../../utils/AddressUpgradeable.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`. */ modifier initializer() { bool isTopLevelCall = _setInitializedVersion(1); if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original * initialization step. This is essential to configure modules that are added through upgrades and that require * initialization. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. */ modifier reinitializer(uint8 version) { bool isTopLevelCall = _setInitializedVersion(version); if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(version); } } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. */ function _disableInitializers() internal virtual { _setInitializedVersion(type(uint8).max); } function _setInitializedVersion(uint8 version) private returns (bool) { // If the contract is initializing we ignore whether _initialized is set in order to support multiple // inheritance patterns, but we only do this in the context of a constructor, and for the lowest level // of initializers, because in other contexts the contract may have been reentered. if (_initializing) { require( version == 1 && !AddressUpgradeable.isContract(address(this)), "Initializable: contract is already initialized" ); return false; } else { require(_initialized < version, "Initializable: contract is already initialized"); _initialized = version; return true; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (proxy/utils/UUPSUpgradeable.sol) pragma solidity ^0.8.0; import "../../interfaces/draft-IERC1822Upgradeable.sol"; import "../ERC1967/ERC1967UpgradeUpgradeable.sol"; import "./Initializable.sol"; /** * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy. * * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing * `UUPSUpgradeable` with a custom implementation of upgrades. * * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism. * * _Available since v4.1._ */ abstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable { function __UUPSUpgradeable_init() internal onlyInitializing { } function __UUPSUpgradeable_init_unchained() internal onlyInitializing { } /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment address private immutable __self = address(this); /** * @dev Check that the execution is being performed through a delegatecall call and that the execution context is * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to * fail. */ modifier onlyProxy() { require(address(this) != __self, "Function must be called through delegatecall"); require(_getImplementation() == __self, "Function must be called through active proxy"); _; } /** * @dev Check that the execution is not being performed through a delegate call. This allows a function to be * callable on the implementing contract but not through proxies. */ modifier notDelegated() { require(address(this) == __self, "UUPSUpgradeable: must not be called through delegatecall"); _; } /** * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the * implementation. It is used to validate that the this implementation remains valid after an upgrade. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier. */ function proxiableUUID() external view virtual override notDelegated returns (bytes32) { return _IMPLEMENTATION_SLOT; } /** * @dev Upgrade the implementation of the proxy to `newImplementation`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. */ function upgradeTo(address newImplementation) external virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, new bytes(0), false); } /** * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call * encoded in `data`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. */ function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, data, true); } /** * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by * {upgradeTo} and {upgradeToAndCall}. * * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}. * * ```solidity * function _authorizeUpgrade(address) internal override onlyOwner {} * ``` */ function _authorizeUpgrade(address newImplementation) internal virtual; /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721Upgradeable.sol"; import "./IERC721ReceiverUpgradeable.sol"; import "./extensions/IERC721MetadataUpgradeable.sol"; import "../../utils/AddressUpgradeable.sol"; import "../../utils/ContextUpgradeable.sol"; import "../../utils/StringsUpgradeable.sol"; import "../../utils/introspection/ERC165Upgradeable.sol"; import "../../proxy/utils/Initializable.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable { using AddressUpgradeable for address; using StringsUpgradeable for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ function __ERC721_init(string memory name_, string memory symbol_) internal onlyInitializing { __ERC721_init_unchained(name_, symbol_); } function __ERC721_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == type(IERC721Upgradeable).interfaceId || interfaceId == type(IERC721MetadataUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721Upgradeable.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @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. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721Upgradeable.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721Upgradeable.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721Upgradeable.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721Upgradeable.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721ReceiverUpgradeable(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721ReceiverUpgradeable.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[44] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165Upgradeable.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 be 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Burnable.sol) pragma solidity ^0.8.0; import "../ERC721Upgradeable.sol"; import "../../../utils/ContextUpgradeable.sol"; import "../../../proxy/utils/Initializable.sol"; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ abstract contract ERC721BurnableUpgradeable is Initializable, ContextUpgradeable, ERC721Upgradeable { function __ERC721Burnable_init() internal onlyInitializing { } function __ERC721Burnable_init_unchained() internal onlyInitializing { } /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165Upgradeable.sol"; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155Upgradeable is IERC165Upgradeable { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library CountersUpgradeable { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library MathUpgradeable { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a / b + (a % b == 0 ? 0 : 1); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/EnumerableSet.sol) pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSetUpgradeable { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly { result := store } return result; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; import "../StringsUpgradeable.sol"; /** * @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 ECDSAUpgradeable { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode 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 {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] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ 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. 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 if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode 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 {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); 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] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); 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. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // 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); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // 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); } return (signer, RecoverError.NoError); } /** * @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) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", StringsUpgradeable.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuardUpgradeable is Initializable { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; function __ReentrancyGuard_init() internal onlyInitializing { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal onlyInitializing { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.14; /// @author: manifold.xyz import "@openzeppelin/contracts-upgradeable/utils/structs/EnumerableSetUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol"; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "./IAdminControl.sol"; abstract contract AdminControlUpgradeable is OwnableUpgradeable, IAdminControl, ERC165Upgradeable { using EnumerableSetUpgradeable for EnumerableSetUpgradeable.AddressSet; // Track registered admins EnumerableSetUpgradeable.AddressSet private _admins; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == type(IAdminControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Only allows approved admins to call the specified function */ modifier adminRequired() { require(owner() == msg.sender || _admins.contains(msg.sender), "AC: Must be owner or admin"); _; } /** * @dev See {IAdminControl-getAdmins}. */ function getAdmins() external view override returns (address[] memory admins) { admins = new address[](_admins.length()); for (uint i = 0; i < _admins.length(); i++) { admins[i] = _admins.at(i); } return admins; } /** * @dev See {IAdminControl-approveAdmin}. */ function approveAdmin(address admin) external override onlyOwner { if (!_admins.contains(admin)) { emit AdminApproved(admin, msg.sender); _admins.add(admin); } } /** * @dev See {IAdminControl-revokeAdmin}. */ function revokeAdmin(address admin) external override onlyOwner { if (_admins.contains(admin)) { emit AdminRevoked(admin, msg.sender); _admins.remove(admin); } } /** * @dev See {IAdminControl-isAdmin}. */ function isAdmin(address admin) public override view returns (bool) { return (owner() == admin || _admins.contains(admin)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.14; /// @author: upheaver.eth import "./IAdminControl.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155ReceiverUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol"; interface ILand is IAdminControl, IERC721Upgradeable, IERC721ReceiverUpgradeable, IERC1155ReceiverUpgradeable { event Discover(uint256 indexed tokenId); event Explore(uint256 indexed tokenId, uint256 count); event Colonize(uint256 indexed tokenId, address indexed founder); event Settle(address indexed from, uint256 indexed tokenId, uint256 count); event Portal(address indexed from, uint256 indexed tokenId, uint256 indexed colonyId); event Merge(uint256 indexed tokenFrom, uint256 indexed tokenTo ); event Burn(uint256 indexed tokenId); event ActivateExploration(); event DeactivateExploration(); event ActivateDiscovery(); event DeactivateDiscovery(); event ActivatePortals(); event DeactivatePortals(); event ActivateColonization(); event DeactivateColonization(); event ActivateMerge(); event DeactivateMerge(); /** * @dev Conjure one token */ function safeMint(address to) external; /** * @dev Set the image base uri */ function colonize(bytes memory signature, address _from, uint256 _tokenId, uint256 _action) external; function getSignerAddress() external returns (address); function setSignerAddress(address signer) external; function setRecoveryAddress(address payable recovery) external; function setBaseURI(string calldata uri) external; function setAvailableLand(uint256 count) external; function hasColony(uint256 tokenId) external view returns(bool); function hasPortal(uint256 colonyId, uint256 tokenId) external view returns(bool); function getColony(uint256 tokenId) external view returns (uint256, address, address[] memory, uint256[] memory, uint256[] memory); function getExplorationLevel(uint256 tokenId) external view returns (uint256); function getColonyLevel(uint256 tokenId) external view returns(uint256); function getColonyFounder(uint256 tokenId) external view returns (address); function getOwnershipShare(uint256 tokenId, address owner) external view returns(uint256); function getColonySettlers(uint256 tokenId) external view returns (address[] memory); function totalSupply() external view returns (uint256); /** * @dev Return list of lands linked via portals */ function getColonyPortals(uint256 tokenId) external view returns (uint256[] memory); /** * @dev Enable burn to mint land */ function enableDiscovery() external; /** * @dev Disable burn to mint land */ function disableDiscovery() external; /** * @dev Enable burn to explore land */ function enableExploration() external; /** * @dev Disable burn to explore land */ function disableExploration() external; /** * @dev Enable burn to link portals */ function enablePortals() external; /** * @dev Disable burn to link portals */ function disablePortals() external; /** * @dev Enable burn to colonize */ function enableColonization() external; /** * @dev Disable burn to colonize */ function disableColonization() external; /** * @dev Enable land merge */ function enableMerge() external; /** * @dev Disable land merge */ function disableMerge() external; /** * @dev Update ERC1155 token address */ function updateERC1155Address(address erc1155address) external; /** * @dev Update ERC721 token address */ function updateERC721Address(address erc721address) external; /** * @dev Get ERC721 token address */ function getERC721Address() external view returns (address); /** * @dev Get ERC1155 token address */ function getERC1155Address() external view returns (address); /** * @dev Get eth balance of the contract */ function getEthBalance() external view returns (uint256); /** * @dev Recover any ETH tokens accidentally sent in */ function withdraw(uint256 amount) external; /** * @dev Recover any ERC20 tokens accidentally sent in */ function recoverERC20(address tokenAddress, uint256 tokenAmount) external; /** * @dev Recover any ERC721 tokens accidentally sent in */ function recoverERC721(address tokenAddress, uint256 tokenId) external; /** * @dev Recover any ERC1155 tokens accidentally sent in */ function recoverERC1155(address tokenAddress, uint256 tokenId, uint256 amount) external; /** * @dev Update royalties */ function updateRoyalties(address payable recipient, uint256 bps) external; /** * ROYALTY FUNCTIONS */ function getRoyalties(uint256) external view returns (address payable[] memory recipients, uint256[] memory bps); function getFeeRecipients(uint256) external view returns (address payable[] memory recipients); function getFeeBps(uint256) external view returns (uint[] memory bps); function royaltyInfo(uint256, uint256 value) external view returns (address, uint256); }
// SPDX-License-Identifier: MIT pragma solidity >= 0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _sendLogPayload(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function log() internal view { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); } function logUint(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function logString(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function log(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1)); } function log(uint p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1)); } function log(uint p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1)); } function log(uint p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1)); } function log(string memory p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1)); } function log(string memory p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1)); } function log(bool p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1)); } function log(address p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2)); } function log(uint p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2)); } function log(uint p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2)); } function log(uint p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2)); } function log(uint p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2)); } function log(uint p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2)); } function log(uint p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2)); } function log(uint p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2)); } function log(uint p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2)); } function log(uint p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2)); } function log(uint p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2)); } function log(uint p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2)); } function log(uint p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2)); } function log(uint p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2)); } function log(uint p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2)); } function log(uint p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2)); } function log(string memory p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2)); } function log(string memory p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2)); } function log(string memory p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2)); } function log(string memory p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2)); } function log(bool p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2)); } function log(bool p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2)); } function log(bool p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2)); } function log(address p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2)); } function log(address p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2)); } function log(address p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol) pragma solidity ^0.8.0; /** * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified * proxy whose upgrades are fully controlled by the current implementation. */ interface IERC1822ProxiableUpgradeable { /** * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation * address. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. */ function proxiableUUID() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol) pragma solidity ^0.8.2; import "../beacon/IBeaconUpgradeable.sol"; import "../../interfaces/draft-IERC1822Upgradeable.sol"; import "../../utils/AddressUpgradeable.sol"; import "../../utils/StorageSlotUpgradeable.sol"; import "../utils/Initializable.sol"; /** * @dev This abstract contract provides getters and event emitting update functions for * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. * * _Available since v4.1._ * * @custom:oz-upgrades-unsafe-allow delegatecall */ abstract contract ERC1967UpgradeUpgradeable is Initializable { function __ERC1967Upgrade_init() internal onlyInitializing { } function __ERC1967Upgrade_init_unchained() internal onlyInitializing { } // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1 bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143; /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /** * @dev Emitted when the implementation is upgraded. */ event Upgraded(address indexed implementation); /** * @dev Returns the current implementation address. */ function _getImplementation() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value; } /** * @dev Stores a new address in the EIP1967 implementation slot. */ function _setImplementation(address newImplementation) private { require(AddressUpgradeable.isContract(newImplementation), "ERC1967: new implementation is not a contract"); StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } /** * @dev Perform implementation upgrade * * Emits an {Upgraded} event. */ function _upgradeTo(address newImplementation) internal { _setImplementation(newImplementation); emit Upgraded(newImplementation); } /** * @dev Perform implementation upgrade with additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCall( address newImplementation, bytes memory data, bool forceCall ) internal { _upgradeTo(newImplementation); if (data.length > 0 || forceCall) { _functionDelegateCall(newImplementation, data); } } /** * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCallUUPS( address newImplementation, bytes memory data, bool forceCall ) internal { // Upgrades from old implementations will perform a rollback test. This test requires the new // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing // this special case will break upgrade paths from old UUPS implementation to new ones. if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) { _setImplementation(newImplementation); } else { try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) { require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID"); } catch { revert("ERC1967Upgrade: new implementation is not UUPS"); } _upgradeToAndCall(newImplementation, data, forceCall); } } /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev Emitted when the admin account has changed. */ event AdminChanged(address previousAdmin, address newAdmin); /** * @dev Returns the current admin. */ function _getAdmin() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value; } /** * @dev Stores a new address in the EIP1967 admin slot. */ function _setAdmin(address newAdmin) private { require(newAdmin != address(0), "ERC1967: new admin is the zero address"); StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin; } /** * @dev Changes the admin of the proxy. * * Emits an {AdminChanged} event. */ function _changeAdmin(address newAdmin) internal { emit AdminChanged(_getAdmin(), newAdmin); _setAdmin(newAdmin); } /** * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor. */ bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; /** * @dev Emitted when the beacon is upgraded. */ event BeaconUpgraded(address indexed beacon); /** * @dev Returns the current beacon. */ function _getBeacon() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value; } /** * @dev Stores a new beacon in the EIP1967 beacon slot. */ function _setBeacon(address newBeacon) private { require(AddressUpgradeable.isContract(newBeacon), "ERC1967: new beacon is not a contract"); require( AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()), "ERC1967: beacon implementation is not a contract" ); StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon; } /** * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that). * * Emits a {BeaconUpgraded} event. */ function _upgradeBeaconToAndCall( address newBeacon, bytes memory data, bool forceCall ) internal { _setBeacon(newBeacon); emit BeaconUpgraded(newBeacon); if (data.length > 0 || forceCall) { _functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data); } } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function _functionDelegateCall(address target, bytes memory data) private returns (bytes memory) { require(AddressUpgradeable.isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return AddressUpgradeable.verifyCallResult(success, returndata, "Address: low-level delegate call failed"); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol) pragma solidity ^0.8.0; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeaconUpgradeable { /** * @dev Must return an address that can be used as a delegate call target. * * {BeaconProxy} will check that this address is a contract. */ function implementation() external view returns (address); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol) pragma solidity ^0.8.0; /** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC1967 implementation slot: * ``` * contract ERC1967 { * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._ */ library StorageSlotUpgradeable { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { assembly { r.slot := slot } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721ReceiverUpgradeable { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721Upgradeable.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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; import "../proxy/utils/Initializable.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 ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library StringsUpgradeable { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165Upgradeable.sol"; import "../../proxy/utils/Initializable.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); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable { function __ERC165_init() internal onlyInitializing { } function __ERC165_init_unchained() internal onlyInitializing { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.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 OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { 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); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.14; /// @author: manifold.xyz import "@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol"; /** * @dev Interface for admin control */ interface IAdminControl is IERC165Upgradeable { event AdminApproved(address indexed account, address indexed sender); event AdminRevoked(address indexed account, address indexed sender); /** * @dev gets address of all admins */ function getAdmins() external view returns (address[] memory); /** * @dev add an admin. Can only be called by contract owner. */ function approveAdmin(address admin) external; /** * @dev remove an admin. Can only be called by contract owner. */ function revokeAdmin(address admin) external; /** * @dev checks whether or not given address is an admin * Returns True if they are */ function isAdmin(address admin) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165Upgradeable.sol"; /** * @dev _Available since v3.1._ */ interface IERC1155ReceiverUpgradeable is IERC165Upgradeable { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"ActivateColonization","type":"event"},{"anonymous":false,"inputs":[],"name":"ActivateDiscovery","type":"event"},{"anonymous":false,"inputs":[],"name":"ActivateExploration","type":"event"},{"anonymous":false,"inputs":[],"name":"ActivateMerge","type":"event"},{"anonymous":false,"inputs":[],"name":"ActivatePortals","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"AdminApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"AdminRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"founder","type":"address"}],"name":"Colonize","type":"event"},{"anonymous":false,"inputs":[],"name":"DeactivateColonization","type":"event"},{"anonymous":false,"inputs":[],"name":"DeactivateDiscovery","type":"event"},{"anonymous":false,"inputs":[],"name":"DeactivateExploration","type":"event"},{"anonymous":false,"inputs":[],"name":"DeactivateMerge","type":"event"},{"anonymous":false,"inputs":[],"name":"DeactivatePortals","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Discover","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"}],"name":"Explore","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenFrom","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenTo","type":"uint256"}],"name":"Merge","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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"colonyId","type":"uint256"}],"name":"Portal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"}],"name":"Settle","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"approveAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"availableLand","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"colonizationEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_action","type":"uint256"}],"name":"colonize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableColonization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableDiscovery","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableExploration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableMerge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disablePortals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"discoveryEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableColonization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableDiscovery","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableExploration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableMerge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enablePortals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"explorationEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAdmins","outputs":[{"internalType":"address[]","name":"admins","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getColony","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getColonyFounder","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getColonyLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getColonyPortals","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getColonySettlers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getERC1155Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getERC721Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEthBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getExplorationLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getFeeBps","outputs":[{"internalType":"uint256[]","name":"bps","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getFeeRecipients","outputs":[{"internalType":"address payable[]","name":"recipients","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_action","type":"uint256"}],"name":"getMessageHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"getOwnershipShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getRoyalties","outputs":[{"internalType":"address payable[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"bps","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSignerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"hasColony","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"colonyId","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"hasPortal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_availableLand","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mergeEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"receivedTokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"portalsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverERC1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"recoverERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"recoverSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"revokeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"setAvailableLand","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"recovery","type":"address"}],"name":"setRecoveryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"setSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc1155address","type":"address"}],"name":"updateERC1155Address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc721address","type":"address"}],"name":"updateERC721Address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"bps","type":"uint256"}],"name":"updateRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a0604052306080523480156200001557600080fd5b506200002062000026565b62000156565b6200003260ff62000035565b50565b60008054610100900460ff1615620000ce578160ff1660011480156200006e57506200006c306200014760201b62002efa1760201c565b155b620000c65760405162461bcd60e51b815260206004820152602e602482015260008051602062005cb383398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b506000919050565b60005460ff8084169116106200012d5760405162461bcd60e51b815260206004820152602e602482015260008051602062005cb383398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401620000bd565b506000805460ff191660ff92909216919091179055600190565b6001600160a01b03163b151590565b608051615b256200018e60003960008181611a3701528181611a7701528181611c6501528181611ca50152611d340152615b256000f3fe6080604052600436106104515760003560e01c80636d73e6691161023f578063bc197c8111610139578063e33e4b49116100b6578063f00db69a1161007a578063f00db69a14610de1578063f23a6e6114610e01578063f2fde38b14610e21578063f43f7bf214610e41578063fe4b84df14610e5657600080fd5b8063e33e4b4914610d36578063e5dbbdcd14610d59578063e8ca160c14610d6e578063e985e9c514610d83578063ed9ba19414610dcc57600080fd5b8063cd8fbdd9116100fd578063cd8fbdd914610c88578063d2b0737b14610cc1578063d326d06214610ce1578063e21283a414610d02578063e27fa50414610d1757600080fd5b8063bc197c8114610bf6578063c1ffa35614610c16578063c87b56dd14610c31578063cb9a5edd14610c51578063cbaa1d9b14610c6857600080fd5b806390f30323116101c7578063a22cb4651161018b578063a22cb46514610b53578063b4871ec814610b73578063b88d4fde14610b88578063b9c4d9fb14610ba8578063bb3bafd614610bc857600080fd5b806390f3032314610ab057806392f06fd714610ade57806395d89b4114610afe57806397aba7f914610b135780639b99a6b414610b3357600080fd5b8063715018a61161020e578063715018a614610a1d5780637313215e14610a32578063819d4cc614610a525780638980f11f14610a725780638da5cb5b14610a9257600080fd5b80636d73e669146109995780636f92650d146109b957806370a08231146109ea57806370ed0ada14610a0a57600080fd5b80632d3456701161035057806349efe5ae116102d857806355f804b31161029c57806355f804b3146108ed5780636352211e1461090d57806364a1dc8e1461092d57806365c9ff9f146109425780636c2f5acd1461097957600080fd5b806349efe5ae146108705780634f1ef2861461089057806352d1902d146108a357806354ff127e146108b857806355047e32146108d857600080fd5b80633511ae331161031f5780633511ae33146107d05780633659cfe6146107f057806340d097c31461081057806342842e0e1461083057806342966c681461085057600080fd5b80632d3456701461074e5780632e1a7d4d1461076e57806331a6638f1461078e57806331ae450b146107ae57600080fd5b8063150b7a02116103de57806324609f61116103a257806324609f61146106a557806324d7806c146106ba57806328a71af3146106da5780632a55205a146106ef5780632d20f1d21461072e57600080fd5b8063150b7a02146105e757806318160ddd1461062057806319250d33146106355780631a296e021461066657806323b872dd1461068557600080fd5b806306fdde031161042557806306fdde0314610502578063081812fc14610524578063095ea7b3146105445780630ebd4c7f1461056457806310696e361461059157600080fd5b80627ffb781461045657806301ffc9a71461048e578063046dc166146104be57806304b76d9b146104e0575b600080fd5b34801561046257600080fd5b50610196546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b34801561049a57600080fd5b506104ae6104a9366004614d9d565b610e76565b6040519015158152602001610485565b3480156104ca57600080fd5b506104de6104d9366004614dcf565b610f01565b005b3480156104ec57600080fd5b5061019d546104ae906301000000900460ff1681565b34801561050e57600080fd5b50610517610f77565b6040516104859190614e44565b34801561053057600080fd5b5061047161053f366004614e57565b611009565b34801561055057600080fd5b506104de61055f366004614e70565b61109e565b34801561057057600080fd5b5061058461057f366004614e57565b6111b3565b6040516104859190614ed7565b34801561059d57600080fd5b506105d96105ac366004614eea565b60008281526101a0602090815260408083206001600160a01b038516845260060190915290205492915050565b604051908152602001610485565b3480156105f357600080fd5b50610607610602366004614f5b565b611211565b6040516001600160e01b03199091168152602001610485565b34801561062c57600080fd5b506105d9611497565b34801561064157600080fd5b506105d9610650366004614e57565b60009081526101a0602052604090206001015490565b34801561067257600080fd5b5061019b546001600160a01b0316610471565b34801561069157600080fd5b506104de6106a0366004614fcd565b6114c2565b3480156106b157600080fd5b506104de6114f4565b3480156106c657600080fd5b506104ae6106d5366004614dcf565b61157d565b3480156106e657600080fd5b506104de6115b6565b3480156106fb57600080fd5b5061070f61070a36600461500e565b611636565b604080516001600160a01b039093168352602083019190915201610485565b34801561073a57600080fd5b506104de6107493660046150d2565b611673565b34801561075a57600080fd5b506104de610769366004614dcf565b6117ef565b34801561077a57600080fd5b506104de610789366004614e57565b61186f565b34801561079a57600080fd5b506104de6107a9366004614dcf565b6118f4565b3480156107ba57600080fd5b506107c3611961565b6040516104859190615169565b3480156107dc57600080fd5b506105846107eb366004614e57565b611a0f565b3480156107fc57600080fd5b506104de61080b366004614dcf565b611a2d565b34801561081c57600080fd5b506104de61082b366004614dcf565b611b09565b34801561083c57600080fd5b506104de61084b366004614fcd565b611b5c565b34801561085c57600080fd5b506104de61086b366004614e57565b611b77565b34801561087c57600080fd5b506104de61088b366004614dcf565b611bee565b6104de61089e36600461517c565b611c5b565b3480156108af57600080fd5b506105d9611d27565b3480156108c457600080fd5b506104de6108d3366004614dcf565b611dda565b3480156108e457600080fd5b506104de611e47565b3480156108f957600080fd5b506104de6109083660046151cb565b611eca565b34801561091957600080fd5b50610471610928366004614e57565b611f21565b34801561093957600080fd5b506104de611f98565b34801561094e57600080fd5b5061047161095d366004614e57565b60009081526101a060205260409020546001600160a01b031690565b34801561098557600080fd5b506104de610994366004614e70565b61201f565b3480156109a557600080fd5b506104de6109b4366004614dcf565b612091565b3480156109c557600080fd5b506109d96109d4366004614e57565b61210b565b60405161048595949392919061520c565b3480156109f657600080fd5b506105d9610a05366004614dcf565b61227c565b348015610a1657600080fd5b50476105d9565b348015610a2957600080fd5b506104de612303565b348015610a3e57600080fd5b506104de610a4d366004614e57565b612339565b348015610a5e57600080fd5b506104de610a6d366004614e70565b612389565b348015610a7e57600080fd5b506104de610a8d366004614e70565b61243c565b348015610a9e57600080fd5b506065546001600160a01b0316610471565b348015610abc57600080fd5b506105d9610acb366004614e57565b600090815261019f602052604090205490565b348015610aea57600080fd5b506107c3610af9366004614e57565b612504565b348015610b0a57600080fd5b50610517612522565b348015610b1f57600080fd5b50610471610b2e366004615268565b612531565b348015610b3f57600080fd5b506104ae610b4e36600461500e565b612593565b348015610b5f57600080fd5b506104de610b6e3660046152a6565b6125b6565b348015610b7f57600080fd5b506104de6125c1565b348015610b9457600080fd5b506104de610ba33660046152d4565b612643565b348015610bb457600080fd5b506107c3610bc3366004614e57565b61267b565b348015610bd457600080fd5b50610be8610be3366004614e57565b6126f6565b60405161048592919061533f565b348015610c0257600080fd5b50610607610c113660046153a8565b6127ad565b348015610c2257600080fd5b5061019d546104ae9060ff1681565b348015610c3d57600080fd5b50610517610c4c366004614e57565b612879565b348015610c5d57600080fd5b506105d961019e5481565b348015610c7457600080fd5b506104de610c83366004615466565b612953565b348015610c9457600080fd5b506104ae610ca3366004614e57565b60009081526101a060205260409020546001600160a01b0316151590565b348015610ccd57600080fd5b506105d9610cdc366004615466565b612a24565b348015610ced57600080fd5b5061019d546104ae9062010000900460ff1681565b348015610d0e57600080fd5b506104de612a73565b348015610d2357600080fd5b50610197546001600160a01b0316610471565b348015610d4257600080fd5b5061019d546104ae90640100000000900460ff1681565b348015610d6557600080fd5b506104de612af4565b348015610d7a57600080fd5b506104de612b7f565b348015610d8f57600080fd5b506104ae610d9e36600461549b565b6001600160a01b03918216600090815260d06020908152604080832093909416825291909152205460ff1690565b348015610dd857600080fd5b506104de612c04565b348015610ded57600080fd5b5061019d546104ae90610100900460ff1681565b348015610e0d57600080fd5b50610607610e1c3660046154c9565b612c88565b348015610e2d57600080fd5b506104de610e3c366004614dcf565b612cd5565b348015610e4d57600080fd5b506104de612d6d565b348015610e6257600080fd5b506104de610e71366004614e57565b612df0565b60006001600160e01b03198216630271189760e51b1480610e9b5750610e9b82612f09565b80610eaa5750610eaa82612f45565b80610ec557506001600160e01b03198216635d9dd7eb60e11b145b80610ee057506001600160e01b0319821663152a902d60e11b145b80610efb57506001600160e01b03198216632dde656160e21b145b92915050565b33610f146065546001600160a01b031690565b6001600160a01b03161480610f2f5750610f2f60c933612f7a565b610f545760405162461bcd60e51b8152600401610f4b90615544565b60405180910390fd5b61019b80546001600160a01b0319166001600160a01b0392909216919091179055565b606060cb8054610f869061557b565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb29061557b565b8015610fff5780601f10610fd457610100808354040283529160200191610fff565b820191906000526020600020905b815481529060010190602001808311610fe257829003601f168201915b5050505050905090565b600081815260cd60205260408120546001600160a01b03166110825760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610f4b565b50600090815260cf60205260409020546001600160a01b031690565b60006110a982611f21565b9050806001600160a01b0316836001600160a01b0316036111165760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610f4b565b336001600160a01b038216148061113257506111328133610d9e565b6111a45760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610f4b565b6111ae8383612f9c565b505050565b610199546060906001600160a01b03161561120c57604080516001808252818301909252906020808301908036833701905050905061019854816000815181106111ff576111ff6155b5565b6020026020010181815250505b919050565b60006002600154036112355760405162461bcd60e51b8152600401610f4b906155cb565b6002600155610196546001600160a01b031633146112835760405162461bcd60e51b815260206004820152600b60248201526a125b9d985b1a590813919560aa1b6044820152606401610f4b565b604082146112a35760405162461bcd60e51b8152600401610f4b90615602565b6000806112b28486018661500e565b9150915081600a146112d65760405162461bcd60e51b8152600401610f4b90615602565b61019d54640100000000900460ff166113225760405162461bcd60e51b815260206004820152600e60248201526d4d6572676520696e61637469766560901b6044820152606401610f4b565b61019d54610100900460ff16156113715760405162461bcd60e51b8152602060048201526013602482015272436f6c6f6e697a6174696f6e2061637469766560681b6044820152606401610f4b565b61137a81611f21565b6001600160a01b0316876001600160a01b0316146113aa5760405162461bcd60e51b8152600401610f4b90615628565b6040516323b872dd60e01b815230600482015261dead60248201526044810187905233906323b872dd90606401600060405180830381600087803b1580156113f157600080fd5b505af1925050508015611402575060015b61146d573d808015611430576040519150601f19603f3d011682016040523d82523d6000602084013e611435565b606091505b5060405162461bcd60e51b815260206004820152600c60248201526b4275726e206661696c75726560a01b6044820152606401610f4b565b81600a0361147f5761147f868261300a565b50506001805550630a85bd0160e11b95945050505050565b600060016114a56101945490565b610193546114b3919061566b565b6114bd919061566b565b905090565b6114cd335b826130e6565b6114e95760405162461bcd60e51b8152600401610f4b90615682565b6111ae8383836131dc565b336115076065546001600160a01b031690565b6001600160a01b03161480611522575061152260c933612f7a565b61153e5760405162461bcd60e51b8152600401610f4b90615544565b61019d805463ff000000191663010000001790556040517ff1a4d60a5457b7534e6226e0700facf0c2e205db1552a87c522145178f680bf690600090a1565b6000816001600160a01b031661159b6065546001600160a01b031690565b6001600160a01b03161480610efb5750610efb60c983612f7a565b336115c96065546001600160a01b031690565b6001600160a01b031614806115e457506115e460c933612f7a565b6116005760405162461bcd60e51b8152600401610f4b90615544565b61019d805460ff191690556040517fe3a963bef07e506593be4006a248520df8ebbe653c15125a3f9eb576098d3d2890600090a1565b610199546101985460009182916001600160a01b03909116906127109061165d90866156d3565b6116679190615708565b915091505b9250929050565b61019d54610100900460ff166116c35760405162461bcd60e51b8152602060048201526015602482015274436f6c6f6e697a6174696f6e20696e61637469766560581b6044820152606401610f4b565b61019b546001600160a01b031661170d5760405162461bcd60e51b815260206004820152600e60248201526d14da59db995c881b9bdd081cd95d60921b6044820152606401610f4b565b60008281526101a060205260409020546001600160a01b0316156117635760405162461bcd60e51b815260206004820152600d60248201526c436f6c6f6e792065786973747360981b6044820152606401610f4b565b61176c82611f21565b6001600160a01b0316836001600160a01b03161461179c5760405162461bcd60e51b8152600401610f4b90615628565b60006117a9848484612a24565b905060006117b78287612531565b61019b549091506001600160a01b0380831691161480156117d85750826001145b156117e7576117e78486613378565b505050505050565b6065546001600160a01b031633146118195760405162461bcd60e51b8152600401610f4b9061571c565b61182460c982612f7a565b1561186c5760405133906001600160a01b038316907f7c0c3c84c67c85fcac635147348bfe374c24a1a93d0366d1cfe9d8853cbf89d590600090a361186a60c9826133d2565b505b50565b336118826065546001600160a01b031690565b6001600160a01b0316148061189d575061189d60c933612f7a565b6118b95760405162461bcd60e51b8152600401610f4b90615544565b61019a546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801561186a573d6000803e3d6000fd5b336119076065546001600160a01b031690565b6001600160a01b03161480611922575061192260c933612f7a565b61193e5760405162461bcd60e51b8152600401610f4b90615544565b61019680546001600160a01b0319166001600160a01b0392909216919091179055565b606061196d60c96133e7565b6001600160401b0381111561198457611984615030565b6040519080825280602002602001820160405280156119ad578160200160208202803683370190505b50905060005b6119bd60c96133e7565b811015611a0b576119cf60c9826133f1565b8282815181106119e1576119e16155b5565b6001600160a01b039092166020928302919091019091015280611a0381615751565b9150506119b3565b5090565b60008181526101a060205260409020606090610efb906004016133fd565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003611a755760405162461bcd60e51b8152600401610f4b9061576a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611abe600080516020615aa9833981519152546001600160a01b031690565b6001600160a01b031614611ae45760405162461bcd60e51b8152600401610f4b906157b6565b611aed8161340a565b6040805160008082526020820190925261186c91839190613454565b33611b1c6065546001600160a01b031690565b6001600160a01b03161480611b375750611b3760c933612f7a565b611b535760405162461bcd60e51b8152600401610f4b90615544565b61186c816135bf565b6111ae83838360405180602001604052806000815250612643565b611b80336114c7565b611be55760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b6064820152608401610f4b565b61186c81613615565b33611c016065546001600160a01b031690565b6001600160a01b03161480611c1c5750611c1c60c933612f7a565b611c385760405162461bcd60e51b8152600401610f4b90615544565b61019a80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003611ca35760405162461bcd60e51b8152600401610f4b9061576a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611cec600080516020615aa9833981519152546001600160a01b031690565b6001600160a01b031614611d125760405162461bcd60e51b8152600401610f4b906157b6565b611d1b8261340a565b61186a82826001613454565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611dc75760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610f4b565b50600080516020615aa983398151915290565b33611ded6065546001600160a01b031690565b6001600160a01b03161480611e085750611e0860c933612f7a565b611e245760405162461bcd60e51b8152600401610f4b90615544565b61019780546001600160a01b0319166001600160a01b0392909216919091179055565b33611e5a6065546001600160a01b031690565b6001600160a01b03161480611e755750611e7560c933612f7a565b611e915760405162461bcd60e51b8152600401610f4b90615544565b61019d805463ff000000191690556040517f0d010c1653abc58bfc99a7310db96184160842ea65341f23c6f7937f9240709c90600090a1565b33611edd6065546001600160a01b031690565b6001600160a01b03161480611ef85750611ef860c933612f7a565b611f145760405162461bcd60e51b8152600401610f4b90615544565b6111ae6101958383614c7e565b600081815260cd60205260408120546001600160a01b031680610efb5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610f4b565b33611fab6065546001600160a01b031690565b6001600160a01b03161480611fc65750611fc660c933612f7a565b611fe25760405162461bcd60e51b8152600401610f4b90615544565b61019d805462ff00001916620100001790556040517f984ce28ffab3b1381031d648a91d26db16ee2a760067ace2e918e877bb37e4ce90600090a1565b336120326065546001600160a01b031690565b6001600160a01b0316148061204d575061204d60c933612f7a565b6120695760405162461bcd60e51b8152600401610f4b90615544565b61019980546001600160a01b0319166001600160a01b03939093169290921790915561019855565b6065546001600160a01b031633146120bb5760405162461bcd60e51b8152600401610f4b9061571c565b6120c660c982612f7a565b61186c5760405133906001600160a01b038316907f7e1a1a08d52e4ba0e21554733d66165fd5151f99460116223d9e3a608eec5cb190600090a361186a60c982613658565b600080606080606060006121346101a060008981526020019081526020016000206002016133e7565b90506000816001600160401b0381111561215057612150615030565b604051908082528060200260200182016040528015612179578160200160208202803683370190505b5060008981526101a06020526040812091925090612199906002016133fd565b60008a81526101a060205260408120919250906121b8906004016133fd565b905060005b84811015612248576101a060008c815260200190815260200160002060060160008483815181106121f0576121f06155b5565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205484828151811061222b5761222b6155b5565b60209081029190910101528061224081615751565b9150506121bd565b506000998a526101a0602052604090992060018101549054909a6001600160a01b0390911699919850919650945092505050565b60006001600160a01b0382166122e75760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610f4b565b506001600160a01b0316600090815260ce602052604090205490565b6065546001600160a01b0316331461232d5760405162461bcd60e51b8152600401610f4b9061571c565b612337600061366d565b565b3361234c6065546001600160a01b031690565b6001600160a01b03161480612367575061236760c933612f7a565b6123835760405162461bcd60e51b8152600401610f4b90615544565b61019e55565b3361239c6065546001600160a01b031690565b6001600160a01b031614806123b757506123b760c933612f7a565b6123d35760405162461bcd60e51b8152600401610f4b90615544565b61019a546040516323b872dd60e01b81523060048201526001600160a01b03918216602482015260448101839052908316906323b872dd90606401600060405180830381600087803b15801561242857600080fd5b505af11580156117e7573d6000803e3d6000fd5b3361244f6065546001600160a01b031690565b6001600160a01b0316148061246a575061246a60c933612f7a565b6124865760405162461bcd60e51b8152600401610f4b90615544565b61019a546040516323b872dd60e01b81523060048201526001600160a01b03918216602482015260448101839052908316906323b872dd906064016020604051808303816000875af11580156124e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ae9190615802565b60008181526101a060205260409020606090610efb906002016133fd565b606060cc8054610f869061557b565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018390526000908190605c0160405160208183030381529060405280519060200120905061258b81846136bf565b949350505050565b60008281526101a0602052604081206125af90600401836136e3565b9392505050565b61186a3383836136fb565b336125d46065546001600160a01b031690565b6001600160a01b031614806125ef57506125ef60c933612f7a565b61260b5760405162461bcd60e51b8152600401610f4b90615544565b61019d805462ff0000191690556040517f783239dc75412cbf7e4b699d43fd740d484fa9a24b4717101437f4fc51b5c09090600090a1565b61264d33836130e6565b6126695760405162461bcd60e51b8152600401610f4b90615682565b612675848484846137ca565b50505050565b610199546060906001600160a01b03161561120c57604080516001808252818301909252906020808301908036833750506101995482519293506001600160a01b0316918391506000906126d1576126d16155b5565b60200260200101906001600160a01b031690816001600160a01b031681525050919050565b6101995460609081906001600160a01b0316156127a857604080516001808252818301909252906020808301908036833750506101995482519294506001600160a01b03169184915060009061274e5761274e6155b5565b6001600160a01b0392909216602092830291909101820152604080516001808252818301909252918281019080368337019050509050610198548160008151811061279b5761279b6155b5565b6020026020010181815250505b915091565b60006002600154036127d15760405162461bcd60e51b8152600401610f4b906155cb565b60026001908155861480156127e557508584145b6128215760405162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a59081a5b9c1d5d609a1b6044820152606401610f4b565b6128608888886000818110612838576128386155b5565b9050602002013587876000818110612852576128526155b5565b9050602002013586866137fd565b5063bc197c8160e01b6001805598975050505050505050565b600081815260cd60205260409020546060906001600160a01b03166128f85760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610f4b565b6000612902613df7565b9050600081511161292257604051806020016040528060008152506125af565b8061292c84613e07565b60405160200161293d92919061581f565b6040516020818303038152906040529392505050565b336129666065546001600160a01b031690565b6001600160a01b03161480612981575061298160c933612f7a565b61299d5760405162461bcd60e51b8152600401610f4b90615544565b61019a54604051637921219560e11b81523060048201526001600160a01b039182166024820152604481018490526064810183905260a06084820152600060a48201529084169063f242432a9060c401600060405180830381600087803b158015612a0757600080fd5b505af1158015612a1b573d6000803e3d6000fd5b50505050505050565b6040516bffffffffffffffffffffffff19606085901b16602082015260348101839052605481018290526000906074016040516020818303038152906040528051906020012090509392505050565b33612a866065546001600160a01b031690565b6001600160a01b03161480612aa15750612aa160c933612f7a565b612abd5760405162461bcd60e51b8152600401610f4b90615544565b61019d805461ff00191690556040517f21018f2958a6cca22f29b7ac4c69d3b59ca73253c674d75f185bc410aec09b6890600090a1565b33612b076065546001600160a01b031690565b6001600160a01b03161480612b225750612b2260c933612f7a565b612b3e5760405162461bcd60e51b8152600401610f4b90615544565b61019d805464ff0000000019166401000000001790556040517fce0af73f1569a468536669acb9fd89b4d56fc99c2df759ef91e9e7888c14ec7c90600090a1565b33612b926065546001600160a01b031690565b6001600160a01b03161480612bad5750612bad60c933612f7a565b612bc95760405162461bcd60e51b8152600401610f4b90615544565b61019d805461ff0019166101001790556040517f23a6a8bb4d7b2deba3f983e09212e9d336bf7701a5fe65af0915caf1aeda535790600090a1565b33612c176065546001600160a01b031690565b6001600160a01b03161480612c325750612c3260c933612f7a565b612c4e5760405162461bcd60e51b8152600401610f4b90615544565b61019d805464ff00000000191690556040517ff5b8ed2d5ddf6cc75e4a997f8d29fa4833f1012057e342ad0300a237a1925c5290600090a1565b6000600260015403612cac5760405162461bcd60e51b8152600401610f4b906155cb565b6002600155612cbe86868686866137fd565b5063f23a6e6160e01b600180559695505050505050565b6065546001600160a01b03163314612cff5760405162461bcd60e51b8152600401610f4b9061571c565b6001600160a01b038116612d645760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610f4b565b61186c8161366d565b33612d806065546001600160a01b031690565b6001600160a01b03161480612d9b5750612d9b60c933612f7a565b612db75760405162461bcd60e51b8152600401610f4b90615544565b61019d805460ff191660011790556040517f33bd661cf390c9eab45e883b23ed2c6aca761957770d11058e541d75386e06c490600090a1565b6000612dfc6001613f07565b90508015612e14576000805461ff0019166101001790555b612e66604051806040016040528060148152602001734c616e6420627920466f72657665724c616e647360601b815250604051806040016040528060048152602001631310539160e21b815250613f8f565b612e6e613fc0565b612e76613fe7565b612e7e613fc0565b60655461019a80546001600160a01b0319166001600160a01b039092169190911790556101938054600101905561019e829055801561186a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6001600160a01b03163b151590565b60006001600160e01b031982166380ac58cd60e01b1480612f3a57506001600160e01b03198216635b5e139f60e01b145b80610efb5750610efb825b60006001600160e01b03198216632a9f3abf60e11b1480610efb57506301ffc9a760e01b6001600160e01b0319831614610efb565b6001600160a01b038116600090815260018301602052604081205415156125af565b600081815260cf6020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612fd182611f21565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600082815261019f602052604081205461302590600161584e565b600083815261019f6020526040812054919250613042828461584e565b9050600781101561306457600084815261019f60205260409020819055613078565b600084815261019f60205260409020600790555b61308761019480546001019055565b604051849086907f78229c368fd1968ee0b5c695d7bf34d9fa963dd6dcd7c9b32b62fac9f443342490600090a360405185907fb90306ad06b2a6ff86ddc9327db583062895ef6540e62dc50add009db5b356eb90600090a25050505050565b600081815260cd60205260408120546001600160a01b031661315f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610f4b565b600061316a83611f21565b9050806001600160a01b0316846001600160a01b031614806131b157506001600160a01b03808216600090815260d0602090815260408083209388168352929052205460ff165b8061258b5750836001600160a01b03166131ca84611009565b6001600160a01b031614949350505050565b826001600160a01b03166131ef82611f21565b6001600160a01b0316146132535760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610f4b565b6001600160a01b0382166132b55760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610f4b565b6132c0600082612f9c565b6001600160a01b038316600090815260ce602052604081208054600192906132e990849061566b565b90915550506001600160a01b038216600090815260ce6020526040812080546001929061331790849061584e565b9091555050600081815260cd602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60008281526101a0602052604080822080546001600160a01b0319166001600160a01b03851690811782559151909285917f2f56fa49f427140ac966132d73f6b7878338d580951015c18f3c8205f3ee87599190a3505050565b60006125af836001600160a01b038416614016565b6000610efb825490565b60006125af8383614109565b606060006125af83614133565b3361341d6065546001600160a01b031690565b6001600160a01b03161480613438575061343860c933612f7a565b61186c5760405162461bcd60e51b8152600401610f4b90615544565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615613487576111ae8361418f565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156134e1575060408051601f3d908101601f191682019092526134de91810190615866565b60015b6135445760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610f4b565b600080516020615aa983398151915281146135b35760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610f4b565b506111ae83838361422b565b60006135cb6101935490565b90506135dc61019380546001019055565b6135e68282614250565b60405181907f61f36b0ed9629a1a8b0ebc34ff07af9c7e48f10762c5adc3f0a29b81d9059d1790600090a25050565b61362461019480546001019055565b60405181907fb90306ad06b2a6ff86ddc9327db583062895ef6540e62dc50add009db5b356eb90600090a261186c8161426a565b60006125af836001600160a01b038416614306565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008060006136ce8585614355565b915091506136db816143c0565b509392505050565b600081815260018301602052604081205415156125af565b816001600160a01b0316836001600160a01b03160361375c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610f4b565b6001600160a01b03838116600081815260d06020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191015b60405180910390a3505050565b6137d58484846131dc565b6137e184848484614576565b6126755760405162461bcd60e51b8152600401610f4b9061587f565b610197546001600160a01b0316331480156138185750836001145b6138525760405162461bcd60e51b815260206004820152600b60248201526a125b9d985b1a590813919560aa1b6044820152606401610f4b565b6000808060208490036138725761386b84860186614e57565b92506138ca565b6040849003613891576138878486018661500e565b90935091506138ca565b60608490036138b2576138a6848601866158d1565b919450925090506138ca565b60405162461bcd60e51b8152600401610f4b90615602565b826000036139655761019d5460ff1661391a5760405162461bcd60e51b8152602060048201526012602482015271446973636f7665727920696e61637469766560701b6044820152606401610f4b565b8561019e5410156139605760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f7567682073746f636b60801b6044820152606401610f4b565b613cdb565b82600103613a575761019d546301000000900460ff166139be5760405162461bcd60e51b81526020600482015260146024820152734578706c6f726174696f6e20696e61637469766560601b6044820152606401610f4b565b6139c782611f21565b6001600160a01b0316886001600160a01b0316146139f75760405162461bcd60e51b8152600401610f4b90615628565b600082815261019f6020526040902054600790613a1590889061584e565b11156139605760405162461bcd60e51b8152602060048201526011602482015270115e1c1b1bdc985d1a5bdb881b1a5b5a5d607a1b6044820152606401610f4b565b82600203613b665761019d54610100900460ff16613aaf5760405162461bcd60e51b8152602060048201526015602482015274436f6c6f6e697a6174696f6e20696e61637469766560581b6044820152606401610f4b565b60008281526101a060205260409020546001600160a01b0316613b075760405162461bcd60e51b815260206004820152601060248201526f4e6f20636f6c6f6e792065786973747360801b6044820152606401610f4b565b600082815261019f60205260409020546007146139605760405162461bcd60e51b815260206004820152601b60248201527f4c616e64206d7573742062652066756c6c79204578706c6f72656400000000006044820152606401610f4b565b826003036138b25761019d5462010000900460ff16613bba5760405162461bcd60e51b815260206004820152601060248201526f506f7274616c7320696e61637469766560801b6044820152606401610f4b565b85600114613c035760405162461bcd60e51b815260206004820152601660248201527543616e206c696e6b206f6e6520617420612074696d6560501b6044820152606401610f4b565b613c0c82611f21565b6001600160a01b0316886001600160a01b031614613c3c5760405162461bcd60e51b8152600401610f4b90615628565b60008181526101a060205260409020546001600160a01b0316613c945760405162461bcd60e51b815260206004820152601060248201526f4e6f20636f6c6f6e792065786973747360801b6044820152606401610f4b565b613c9e8183612593565b156139605760405162461bcd60e51b815260206004820152600d60248201526c506f7274616c2065786973747360981b6044820152606401610f4b565b604051637921219560e11b8152339063f242432a90613d0a90309061dead908c908c908c908c906004016158fd565b600060405180830381600087803b158015613d2457600080fd5b505af1925050508015613d35575060015b613d63573d808015611430576040519150601f19603f3d011682016040523d82523d6000602084013e611435565b82600003613db0578561019e6000828254613d7e919061566b565b90915550600090505b86811015613daa57613d98896135bf565b80613da281615751565b915050613d87565b50613ded565b82600103613dc757613dc28287614677565b613ded565b82600203613dda57613dc28883886146d4565b826003036138b257613dc2888383614790565b5050505050505050565b60606101958054610f869061557b565b606081600003613e2e5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613e585780613e4281615751565b9150613e519050600a83615708565b9150613e32565b6000816001600160401b03811115613e7257613e72615030565b6040519080825280601f01601f191660200182016040528015613e9c576020820181803683370190505b5090505b841561258b57613eb160018361566b565b9150613ebe600a86615959565b613ec990603061584e565b60f81b818381518110613ede57613ede6155b5565b60200101906001600160f81b031916908160001a905350613f00600a86615708565b9450613ea0565b60008054610100900460ff1615613f4e578160ff166001148015613f2a5750303b155b613f465760405162461bcd60e51b8152600401610f4b9061596d565b506000919050565b60005460ff808416911610613f755760405162461bcd60e51b8152600401610f4b9061596d565b506000805460ff191660ff92909216919091179055600190565b600054610100900460ff16613fb65760405162461bcd60e51b8152600401610f4b906159bb565b61186a82826147eb565b600054610100900460ff166123375760405162461bcd60e51b8152600401610f4b906159bb565b600054610100900460ff1661400e5760405162461bcd60e51b8152600401610f4b906159bb565b612337614839565b600081815260018301602052604081205480156140ff57600061403a60018361566b565b855490915060009061404e9060019061566b565b90508181146140b357600086600001828154811061406e5761406e6155b5565b9060005260206000200154905080876000018481548110614091576140916155b5565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806140c4576140c4615a06565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610efb565b6000915050610efb565b6000826000018281548110614120576141206155b5565b9060005260206000200154905092915050565b60608160000180548060200260200160405190810160405280929190818152602001828054801561418357602002820191906000526020600020905b81548152602001906001019080831161416f575b50505050509050919050565b6001600160a01b0381163b6141fc5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610f4b565b600080516020615aa983398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b61423483614869565b6000825111806142415750805b156111ae5761267583836148a9565b61186a82826040518060200160405280600081525061499d565b600061427582611f21565b9050614282600083612f9c565b6001600160a01b038116600090815260ce602052604081208054600192906142ab90849061566b565b9091555050600082815260cd602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a461186a565b600081815260018301602052604081205461434d57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610efb565b506000610efb565b600080825160410361438b5760208301516040840151606085015160001a61437f878285856149d0565b9450945050505061166c565b82516040036143b457602083015160408401516143a9868383614abd565b93509350505061166c565b5060009050600261166c565b60008160048111156143d4576143d4615a1c565b036143dc5750565b60018160048111156143f0576143f0615a1c565b0361443d5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610f4b565b600281600481111561445157614451615a1c565b0361449e5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610f4b565b60038160048111156144b2576144b2615a1c565b0361450a5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610f4b565b600481600481111561451e5761451e615a1c565b0361186c5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610f4b565b60006001600160a01b0384163b1561466c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906145ba903390899088908890600401615a32565b6020604051808303816000875af19250505080156145f5575060408051601f3d908101601f191682019092526145f291810190615a6f565b60015b614652573d808015614623576040519150601f19603f3d011682016040523d82523d6000602084013e614628565b606091505b50805160000361464a5760405162461bcd60e51b8152600401610f4b9061587f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061258b565b506001949350505050565b600082815261019f60205260408120805483929061469690849061584e565b909155505060405181815282907fc1ec9d40f0513225a2722d0559711f345f64052651cd25bc2079ea0db1ab72429060200160405180910390a25050565b60008281526101a06020526040812060010180548392906146f690849061584e565b909155505060008281526101a0602052604090206147179060020184613658565b5060008281526101a0602090815260408083206001600160a01b03871684526006019091528120805483929061474e90849061584e565b909155505060405181815282906001600160a01b038516907f4fbc32cd3e6036f5cb98e166f4396ae4cf37448523e3b9f8659759384d2b2a28906020016137bd565b60008181526101a0602052604090206147ac6004820184614af6565b508183856001600160a01b03167f478b738c75acd1abcfb92a05b2c7a7c56a10fff5ed8f634714247c3bba4624d560405160405180910390a450505050565b600054610100900460ff166148125760405162461bcd60e51b8152600401610f4b906159bb565b81516148259060cb906020850190614cfe565b5080516111ae9060cc906020840190614cfe565b600054610100900460ff166148605760405162461bcd60e51b8152600401610f4b906159bb565b6123373361366d565b6148728161418f565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b6149115760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610f4b565b600080846001600160a01b03168460405161492c9190615a8c565b600060405180830381855af49150503d8060008114614967576040519150601f19603f3d011682016040523d82523d6000602084013e61496c565b606091505b50915091506149948282604051806060016040528060278152602001615ac960279139614b02565b95945050505050565b6149a78383614b3b565b6149b46000848484614576565b6111ae5760405162461bcd60e51b8152600401610f4b9061587f565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115614a075750600090506003614ab4565b8460ff16601b14158015614a1f57508460ff16601c14155b15614a305750600090506004614ab4565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015614a84573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116614aad57600060019250925050614ab4565b9150600090505b94509492505050565b6000806001600160ff1b03831681614ada60ff86901c601b61584e565b9050614ae8878288856149d0565b935093505050935093915050565b60006125af8383614306565b60608315614b115750816125af565b825115614b215782518084602001fd5b8160405162461bcd60e51b8152600401610f4b9190614e44565b6001600160a01b038216614b915760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610f4b565b600081815260cd60205260409020546001600160a01b031615614bf65760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610f4b565b6001600160a01b038216600090815260ce60205260408120805460019290614c1f90849061584e565b9091555050600081815260cd602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461186a565b828054614c8a9061557b565b90600052602060002090601f016020900481019282614cac5760008555614cf2565b82601f10614cc55782800160ff19823516178555614cf2565b82800160010185558215614cf2579182015b82811115614cf2578235825591602001919060010190614cd7565b50611a0b929150614d72565b828054614d0a9061557b565b90600052602060002090601f016020900481019282614d2c5760008555614cf2565b82601f10614d4557805160ff1916838001178555614cf2565b82800160010185558215614cf2579182015b82811115614cf2578251825591602001919060010190614d57565b5b80821115611a0b5760008155600101614d73565b6001600160e01b03198116811461186c57600080fd5b600060208284031215614daf57600080fd5b81356125af81614d87565b6001600160a01b038116811461186c57600080fd5b600060208284031215614de157600080fd5b81356125af81614dba565b60005b83811015614e07578181015183820152602001614def565b838111156126755750506000910152565b60008151808452614e30816020860160208601614dec565b601f01601f19169290920160200192915050565b6020815260006125af6020830184614e18565b600060208284031215614e6957600080fd5b5035919050565b60008060408385031215614e8357600080fd5b8235614e8e81614dba565b946020939093013593505050565b600081518084526020808501945080840160005b83811015614ecc57815187529582019590820190600101614eb0565b509495945050505050565b6020815260006125af6020830184614e9c565b60008060408385031215614efd57600080fd5b823591506020830135614f0f81614dba565b809150509250929050565b60008083601f840112614f2c57600080fd5b5081356001600160401b03811115614f4357600080fd5b60208301915083602082850101111561166c57600080fd5b600080600080600060808688031215614f7357600080fd5b8535614f7e81614dba565b94506020860135614f8e81614dba565b93506040860135925060608601356001600160401b03811115614fb057600080fd5b614fbc88828901614f1a565b969995985093965092949392505050565b600080600060608486031215614fe257600080fd5b8335614fed81614dba565b92506020840135614ffd81614dba565b929592945050506040919091013590565b6000806040838503121561502157600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261505757600080fd5b81356001600160401b038082111561507157615071615030565b604051601f8301601f19908116603f0116810190828211818310171561509957615099615030565b816040528381528660208588010111156150b257600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080608085870312156150e857600080fd5b84356001600160401b038111156150fe57600080fd5b61510a87828801615046565b945050602085013561511b81614dba565b93969395505050506040820135916060013590565b600081518084526020808501945080840160005b83811015614ecc5781516001600160a01b031687529582019590820190600101615144565b6020815260006125af6020830184615130565b6000806040838503121561518f57600080fd5b823561519a81614dba565b915060208301356001600160401b038111156151b557600080fd5b6151c185828601615046565b9150509250929050565b600080602083850312156151de57600080fd5b82356001600160401b038111156151f457600080fd5b61520085828601614f1a565b90969095509350505050565b8581526001600160a01b038516602082015260a06040820181905260009061523690830186615130565b82810360608401526152488186614e9c565b9050828103608084015261525c8185614e9c565b98975050505050505050565b6000806040838503121561527b57600080fd5b8235915060208301356001600160401b038111156151b557600080fd5b801515811461186c57600080fd5b600080604083850312156152b957600080fd5b82356152c481614dba565b91506020830135614f0f81615298565b600080600080608085870312156152ea57600080fd5b84356152f581614dba565b9350602085013561530581614dba565b92506040850135915060608501356001600160401b0381111561532757600080fd5b61533387828801615046565b91505092959194509250565b6040815260006153526040830185615130565b82810360208401526149948185614e9c565b60008083601f84011261537657600080fd5b5081356001600160401b0381111561538d57600080fd5b6020830191508360208260051b850101111561166c57600080fd5b60008060008060008060008060a0898b0312156153c457600080fd5b88356153cf81614dba565b975060208901356153df81614dba565b965060408901356001600160401b03808211156153fb57600080fd5b6154078c838d01615364565b909850965060608b013591508082111561542057600080fd5b61542c8c838d01615364565b909650945060808b013591508082111561544557600080fd5b506154528b828c01614f1a565b999c989b5096995094979396929594505050565b60008060006060848603121561547b57600080fd5b833561548681614dba565b95602085013595506040909401359392505050565b600080604083850312156154ae57600080fd5b82356154b981614dba565b91506020830135614f0f81614dba565b60008060008060008060a087890312156154e257600080fd5b86356154ed81614dba565b955060208701356154fd81614dba565b9450604087013593506060870135925060808701356001600160401b0381111561552657600080fd5b61553289828a01614f1a565b979a9699509497509295939492505050565b6020808252601a908201527f41433a204d757374206265206f776e6572206f722061646d696e000000000000604082015260600190565b600181811c9082168061558f57607f821691505b6020821081036155af57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600c908201526b496e76616c6964206461746160a01b604082015260600190565b60208082526013908201527226bab9ba103132903a37b5b2b71037bbb732b960691b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008282101561567d5761567d615655565b500390565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008160001904831182151516156156ed576156ed615655565b500290565b634e487b7160e01b600052601260045260246000fd5b600082615717576157176156f2565b500490565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006001820161576357615763615655565b5060010190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b60006020828403121561581457600080fd5b81516125af81615298565b60008351615831818460208801614dec565b835190830190615845818360208801614dec565b01949350505050565b6000821982111561586157615861615655565b500190565b60006020828403121561587857600080fd5b5051919050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6000806000606084860312156158e657600080fd5b505081359360208301359350604090920135919050565b6001600160a01b03878116825286166020820152604081018590526060810184905260a06080820181905281018290526000828460c0840137600060c0848401015260c0601f19601f8501168301019050979650505050505050565b600082615968576159686156f2565b500690565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615a6590830184614e18565b9695505050505050565b600060208284031215615a8157600080fd5b81516125af81614d87565b60008251615a9e818460208701614dec565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122065ee95bf6a70f85917de47abe7b26c1ed775bb1228824bf4fdcfc180a481616464736f6c634300080e0033496e697469616c697a61626c653a20636f6e747261637420697320616c726561
Deployed Bytecode
0x6080604052600436106104515760003560e01c80636d73e6691161023f578063bc197c8111610139578063e33e4b49116100b6578063f00db69a1161007a578063f00db69a14610de1578063f23a6e6114610e01578063f2fde38b14610e21578063f43f7bf214610e41578063fe4b84df14610e5657600080fd5b8063e33e4b4914610d36578063e5dbbdcd14610d59578063e8ca160c14610d6e578063e985e9c514610d83578063ed9ba19414610dcc57600080fd5b8063cd8fbdd9116100fd578063cd8fbdd914610c88578063d2b0737b14610cc1578063d326d06214610ce1578063e21283a414610d02578063e27fa50414610d1757600080fd5b8063bc197c8114610bf6578063c1ffa35614610c16578063c87b56dd14610c31578063cb9a5edd14610c51578063cbaa1d9b14610c6857600080fd5b806390f30323116101c7578063a22cb4651161018b578063a22cb46514610b53578063b4871ec814610b73578063b88d4fde14610b88578063b9c4d9fb14610ba8578063bb3bafd614610bc857600080fd5b806390f3032314610ab057806392f06fd714610ade57806395d89b4114610afe57806397aba7f914610b135780639b99a6b414610b3357600080fd5b8063715018a61161020e578063715018a614610a1d5780637313215e14610a32578063819d4cc614610a525780638980f11f14610a725780638da5cb5b14610a9257600080fd5b80636d73e669146109995780636f92650d146109b957806370a08231146109ea57806370ed0ada14610a0a57600080fd5b80632d3456701161035057806349efe5ae116102d857806355f804b31161029c57806355f804b3146108ed5780636352211e1461090d57806364a1dc8e1461092d57806365c9ff9f146109425780636c2f5acd1461097957600080fd5b806349efe5ae146108705780634f1ef2861461089057806352d1902d146108a357806354ff127e146108b857806355047e32146108d857600080fd5b80633511ae331161031f5780633511ae33146107d05780633659cfe6146107f057806340d097c31461081057806342842e0e1461083057806342966c681461085057600080fd5b80632d3456701461074e5780632e1a7d4d1461076e57806331a6638f1461078e57806331ae450b146107ae57600080fd5b8063150b7a02116103de57806324609f61116103a257806324609f61146106a557806324d7806c146106ba57806328a71af3146106da5780632a55205a146106ef5780632d20f1d21461072e57600080fd5b8063150b7a02146105e757806318160ddd1461062057806319250d33146106355780631a296e021461066657806323b872dd1461068557600080fd5b806306fdde031161042557806306fdde0314610502578063081812fc14610524578063095ea7b3146105445780630ebd4c7f1461056457806310696e361461059157600080fd5b80627ffb781461045657806301ffc9a71461048e578063046dc166146104be57806304b76d9b146104e0575b600080fd5b34801561046257600080fd5b50610196546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b34801561049a57600080fd5b506104ae6104a9366004614d9d565b610e76565b6040519015158152602001610485565b3480156104ca57600080fd5b506104de6104d9366004614dcf565b610f01565b005b3480156104ec57600080fd5b5061019d546104ae906301000000900460ff1681565b34801561050e57600080fd5b50610517610f77565b6040516104859190614e44565b34801561053057600080fd5b5061047161053f366004614e57565b611009565b34801561055057600080fd5b506104de61055f366004614e70565b61109e565b34801561057057600080fd5b5061058461057f366004614e57565b6111b3565b6040516104859190614ed7565b34801561059d57600080fd5b506105d96105ac366004614eea565b60008281526101a0602090815260408083206001600160a01b038516845260060190915290205492915050565b604051908152602001610485565b3480156105f357600080fd5b50610607610602366004614f5b565b611211565b6040516001600160e01b03199091168152602001610485565b34801561062c57600080fd5b506105d9611497565b34801561064157600080fd5b506105d9610650366004614e57565b60009081526101a0602052604090206001015490565b34801561067257600080fd5b5061019b546001600160a01b0316610471565b34801561069157600080fd5b506104de6106a0366004614fcd565b6114c2565b3480156106b157600080fd5b506104de6114f4565b3480156106c657600080fd5b506104ae6106d5366004614dcf565b61157d565b3480156106e657600080fd5b506104de6115b6565b3480156106fb57600080fd5b5061070f61070a36600461500e565b611636565b604080516001600160a01b039093168352602083019190915201610485565b34801561073a57600080fd5b506104de6107493660046150d2565b611673565b34801561075a57600080fd5b506104de610769366004614dcf565b6117ef565b34801561077a57600080fd5b506104de610789366004614e57565b61186f565b34801561079a57600080fd5b506104de6107a9366004614dcf565b6118f4565b3480156107ba57600080fd5b506107c3611961565b6040516104859190615169565b3480156107dc57600080fd5b506105846107eb366004614e57565b611a0f565b3480156107fc57600080fd5b506104de61080b366004614dcf565b611a2d565b34801561081c57600080fd5b506104de61082b366004614dcf565b611b09565b34801561083c57600080fd5b506104de61084b366004614fcd565b611b5c565b34801561085c57600080fd5b506104de61086b366004614e57565b611b77565b34801561087c57600080fd5b506104de61088b366004614dcf565b611bee565b6104de61089e36600461517c565b611c5b565b3480156108af57600080fd5b506105d9611d27565b3480156108c457600080fd5b506104de6108d3366004614dcf565b611dda565b3480156108e457600080fd5b506104de611e47565b3480156108f957600080fd5b506104de6109083660046151cb565b611eca565b34801561091957600080fd5b50610471610928366004614e57565b611f21565b34801561093957600080fd5b506104de611f98565b34801561094e57600080fd5b5061047161095d366004614e57565b60009081526101a060205260409020546001600160a01b031690565b34801561098557600080fd5b506104de610994366004614e70565b61201f565b3480156109a557600080fd5b506104de6109b4366004614dcf565b612091565b3480156109c557600080fd5b506109d96109d4366004614e57565b61210b565b60405161048595949392919061520c565b3480156109f657600080fd5b506105d9610a05366004614dcf565b61227c565b348015610a1657600080fd5b50476105d9565b348015610a2957600080fd5b506104de612303565b348015610a3e57600080fd5b506104de610a4d366004614e57565b612339565b348015610a5e57600080fd5b506104de610a6d366004614e70565b612389565b348015610a7e57600080fd5b506104de610a8d366004614e70565b61243c565b348015610a9e57600080fd5b506065546001600160a01b0316610471565b348015610abc57600080fd5b506105d9610acb366004614e57565b600090815261019f602052604090205490565b348015610aea57600080fd5b506107c3610af9366004614e57565b612504565b348015610b0a57600080fd5b50610517612522565b348015610b1f57600080fd5b50610471610b2e366004615268565b612531565b348015610b3f57600080fd5b506104ae610b4e36600461500e565b612593565b348015610b5f57600080fd5b506104de610b6e3660046152a6565b6125b6565b348015610b7f57600080fd5b506104de6125c1565b348015610b9457600080fd5b506104de610ba33660046152d4565b612643565b348015610bb457600080fd5b506107c3610bc3366004614e57565b61267b565b348015610bd457600080fd5b50610be8610be3366004614e57565b6126f6565b60405161048592919061533f565b348015610c0257600080fd5b50610607610c113660046153a8565b6127ad565b348015610c2257600080fd5b5061019d546104ae9060ff1681565b348015610c3d57600080fd5b50610517610c4c366004614e57565b612879565b348015610c5d57600080fd5b506105d961019e5481565b348015610c7457600080fd5b506104de610c83366004615466565b612953565b348015610c9457600080fd5b506104ae610ca3366004614e57565b60009081526101a060205260409020546001600160a01b0316151590565b348015610ccd57600080fd5b506105d9610cdc366004615466565b612a24565b348015610ced57600080fd5b5061019d546104ae9062010000900460ff1681565b348015610d0e57600080fd5b506104de612a73565b348015610d2357600080fd5b50610197546001600160a01b0316610471565b348015610d4257600080fd5b5061019d546104ae90640100000000900460ff1681565b348015610d6557600080fd5b506104de612af4565b348015610d7a57600080fd5b506104de612b7f565b348015610d8f57600080fd5b506104ae610d9e36600461549b565b6001600160a01b03918216600090815260d06020908152604080832093909416825291909152205460ff1690565b348015610dd857600080fd5b506104de612c04565b348015610ded57600080fd5b5061019d546104ae90610100900460ff1681565b348015610e0d57600080fd5b50610607610e1c3660046154c9565b612c88565b348015610e2d57600080fd5b506104de610e3c366004614dcf565b612cd5565b348015610e4d57600080fd5b506104de612d6d565b348015610e6257600080fd5b506104de610e71366004614e57565b612df0565b60006001600160e01b03198216630271189760e51b1480610e9b5750610e9b82612f09565b80610eaa5750610eaa82612f45565b80610ec557506001600160e01b03198216635d9dd7eb60e11b145b80610ee057506001600160e01b0319821663152a902d60e11b145b80610efb57506001600160e01b03198216632dde656160e21b145b92915050565b33610f146065546001600160a01b031690565b6001600160a01b03161480610f2f5750610f2f60c933612f7a565b610f545760405162461bcd60e51b8152600401610f4b90615544565b60405180910390fd5b61019b80546001600160a01b0319166001600160a01b0392909216919091179055565b606060cb8054610f869061557b565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb29061557b565b8015610fff5780601f10610fd457610100808354040283529160200191610fff565b820191906000526020600020905b815481529060010190602001808311610fe257829003601f168201915b5050505050905090565b600081815260cd60205260408120546001600160a01b03166110825760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610f4b565b50600090815260cf60205260409020546001600160a01b031690565b60006110a982611f21565b9050806001600160a01b0316836001600160a01b0316036111165760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610f4b565b336001600160a01b038216148061113257506111328133610d9e565b6111a45760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610f4b565b6111ae8383612f9c565b505050565b610199546060906001600160a01b03161561120c57604080516001808252818301909252906020808301908036833701905050905061019854816000815181106111ff576111ff6155b5565b6020026020010181815250505b919050565b60006002600154036112355760405162461bcd60e51b8152600401610f4b906155cb565b6002600155610196546001600160a01b031633146112835760405162461bcd60e51b815260206004820152600b60248201526a125b9d985b1a590813919560aa1b6044820152606401610f4b565b604082146112a35760405162461bcd60e51b8152600401610f4b90615602565b6000806112b28486018661500e565b9150915081600a146112d65760405162461bcd60e51b8152600401610f4b90615602565b61019d54640100000000900460ff166113225760405162461bcd60e51b815260206004820152600e60248201526d4d6572676520696e61637469766560901b6044820152606401610f4b565b61019d54610100900460ff16156113715760405162461bcd60e51b8152602060048201526013602482015272436f6c6f6e697a6174696f6e2061637469766560681b6044820152606401610f4b565b61137a81611f21565b6001600160a01b0316876001600160a01b0316146113aa5760405162461bcd60e51b8152600401610f4b90615628565b6040516323b872dd60e01b815230600482015261dead60248201526044810187905233906323b872dd90606401600060405180830381600087803b1580156113f157600080fd5b505af1925050508015611402575060015b61146d573d808015611430576040519150601f19603f3d011682016040523d82523d6000602084013e611435565b606091505b5060405162461bcd60e51b815260206004820152600c60248201526b4275726e206661696c75726560a01b6044820152606401610f4b565b81600a0361147f5761147f868261300a565b50506001805550630a85bd0160e11b95945050505050565b600060016114a56101945490565b610193546114b3919061566b565b6114bd919061566b565b905090565b6114cd335b826130e6565b6114e95760405162461bcd60e51b8152600401610f4b90615682565b6111ae8383836131dc565b336115076065546001600160a01b031690565b6001600160a01b03161480611522575061152260c933612f7a565b61153e5760405162461bcd60e51b8152600401610f4b90615544565b61019d805463ff000000191663010000001790556040517ff1a4d60a5457b7534e6226e0700facf0c2e205db1552a87c522145178f680bf690600090a1565b6000816001600160a01b031661159b6065546001600160a01b031690565b6001600160a01b03161480610efb5750610efb60c983612f7a565b336115c96065546001600160a01b031690565b6001600160a01b031614806115e457506115e460c933612f7a565b6116005760405162461bcd60e51b8152600401610f4b90615544565b61019d805460ff191690556040517fe3a963bef07e506593be4006a248520df8ebbe653c15125a3f9eb576098d3d2890600090a1565b610199546101985460009182916001600160a01b03909116906127109061165d90866156d3565b6116679190615708565b915091505b9250929050565b61019d54610100900460ff166116c35760405162461bcd60e51b8152602060048201526015602482015274436f6c6f6e697a6174696f6e20696e61637469766560581b6044820152606401610f4b565b61019b546001600160a01b031661170d5760405162461bcd60e51b815260206004820152600e60248201526d14da59db995c881b9bdd081cd95d60921b6044820152606401610f4b565b60008281526101a060205260409020546001600160a01b0316156117635760405162461bcd60e51b815260206004820152600d60248201526c436f6c6f6e792065786973747360981b6044820152606401610f4b565b61176c82611f21565b6001600160a01b0316836001600160a01b03161461179c5760405162461bcd60e51b8152600401610f4b90615628565b60006117a9848484612a24565b905060006117b78287612531565b61019b549091506001600160a01b0380831691161480156117d85750826001145b156117e7576117e78486613378565b505050505050565b6065546001600160a01b031633146118195760405162461bcd60e51b8152600401610f4b9061571c565b61182460c982612f7a565b1561186c5760405133906001600160a01b038316907f7c0c3c84c67c85fcac635147348bfe374c24a1a93d0366d1cfe9d8853cbf89d590600090a361186a60c9826133d2565b505b50565b336118826065546001600160a01b031690565b6001600160a01b0316148061189d575061189d60c933612f7a565b6118b95760405162461bcd60e51b8152600401610f4b90615544565b61019a546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801561186a573d6000803e3d6000fd5b336119076065546001600160a01b031690565b6001600160a01b03161480611922575061192260c933612f7a565b61193e5760405162461bcd60e51b8152600401610f4b90615544565b61019680546001600160a01b0319166001600160a01b0392909216919091179055565b606061196d60c96133e7565b6001600160401b0381111561198457611984615030565b6040519080825280602002602001820160405280156119ad578160200160208202803683370190505b50905060005b6119bd60c96133e7565b811015611a0b576119cf60c9826133f1565b8282815181106119e1576119e16155b5565b6001600160a01b039092166020928302919091019091015280611a0381615751565b9150506119b3565b5090565b60008181526101a060205260409020606090610efb906004016133fd565b6001600160a01b037f0000000000000000000000006e48c5925bcdd68caa03c548eb070a521225ee7f163003611a755760405162461bcd60e51b8152600401610f4b9061576a565b7f0000000000000000000000006e48c5925bcdd68caa03c548eb070a521225ee7f6001600160a01b0316611abe600080516020615aa9833981519152546001600160a01b031690565b6001600160a01b031614611ae45760405162461bcd60e51b8152600401610f4b906157b6565b611aed8161340a565b6040805160008082526020820190925261186c91839190613454565b33611b1c6065546001600160a01b031690565b6001600160a01b03161480611b375750611b3760c933612f7a565b611b535760405162461bcd60e51b8152600401610f4b90615544565b61186c816135bf565b6111ae83838360405180602001604052806000815250612643565b611b80336114c7565b611be55760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b6064820152608401610f4b565b61186c81613615565b33611c016065546001600160a01b031690565b6001600160a01b03161480611c1c5750611c1c60c933612f7a565b611c385760405162461bcd60e51b8152600401610f4b90615544565b61019a80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b037f0000000000000000000000006e48c5925bcdd68caa03c548eb070a521225ee7f163003611ca35760405162461bcd60e51b8152600401610f4b9061576a565b7f0000000000000000000000006e48c5925bcdd68caa03c548eb070a521225ee7f6001600160a01b0316611cec600080516020615aa9833981519152546001600160a01b031690565b6001600160a01b031614611d125760405162461bcd60e51b8152600401610f4b906157b6565b611d1b8261340a565b61186a82826001613454565b6000306001600160a01b037f0000000000000000000000006e48c5925bcdd68caa03c548eb070a521225ee7f1614611dc75760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610f4b565b50600080516020615aa983398151915290565b33611ded6065546001600160a01b031690565b6001600160a01b03161480611e085750611e0860c933612f7a565b611e245760405162461bcd60e51b8152600401610f4b90615544565b61019780546001600160a01b0319166001600160a01b0392909216919091179055565b33611e5a6065546001600160a01b031690565b6001600160a01b03161480611e755750611e7560c933612f7a565b611e915760405162461bcd60e51b8152600401610f4b90615544565b61019d805463ff000000191690556040517f0d010c1653abc58bfc99a7310db96184160842ea65341f23c6f7937f9240709c90600090a1565b33611edd6065546001600160a01b031690565b6001600160a01b03161480611ef85750611ef860c933612f7a565b611f145760405162461bcd60e51b8152600401610f4b90615544565b6111ae6101958383614c7e565b600081815260cd60205260408120546001600160a01b031680610efb5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610f4b565b33611fab6065546001600160a01b031690565b6001600160a01b03161480611fc65750611fc660c933612f7a565b611fe25760405162461bcd60e51b8152600401610f4b90615544565b61019d805462ff00001916620100001790556040517f984ce28ffab3b1381031d648a91d26db16ee2a760067ace2e918e877bb37e4ce90600090a1565b336120326065546001600160a01b031690565b6001600160a01b0316148061204d575061204d60c933612f7a565b6120695760405162461bcd60e51b8152600401610f4b90615544565b61019980546001600160a01b0319166001600160a01b03939093169290921790915561019855565b6065546001600160a01b031633146120bb5760405162461bcd60e51b8152600401610f4b9061571c565b6120c660c982612f7a565b61186c5760405133906001600160a01b038316907f7e1a1a08d52e4ba0e21554733d66165fd5151f99460116223d9e3a608eec5cb190600090a361186a60c982613658565b600080606080606060006121346101a060008981526020019081526020016000206002016133e7565b90506000816001600160401b0381111561215057612150615030565b604051908082528060200260200182016040528015612179578160200160208202803683370190505b5060008981526101a06020526040812091925090612199906002016133fd565b60008a81526101a060205260408120919250906121b8906004016133fd565b905060005b84811015612248576101a060008c815260200190815260200160002060060160008483815181106121f0576121f06155b5565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205484828151811061222b5761222b6155b5565b60209081029190910101528061224081615751565b9150506121bd565b506000998a526101a0602052604090992060018101549054909a6001600160a01b0390911699919850919650945092505050565b60006001600160a01b0382166122e75760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610f4b565b506001600160a01b0316600090815260ce602052604090205490565b6065546001600160a01b0316331461232d5760405162461bcd60e51b8152600401610f4b9061571c565b612337600061366d565b565b3361234c6065546001600160a01b031690565b6001600160a01b03161480612367575061236760c933612f7a565b6123835760405162461bcd60e51b8152600401610f4b90615544565b61019e55565b3361239c6065546001600160a01b031690565b6001600160a01b031614806123b757506123b760c933612f7a565b6123d35760405162461bcd60e51b8152600401610f4b90615544565b61019a546040516323b872dd60e01b81523060048201526001600160a01b03918216602482015260448101839052908316906323b872dd90606401600060405180830381600087803b15801561242857600080fd5b505af11580156117e7573d6000803e3d6000fd5b3361244f6065546001600160a01b031690565b6001600160a01b0316148061246a575061246a60c933612f7a565b6124865760405162461bcd60e51b8152600401610f4b90615544565b61019a546040516323b872dd60e01b81523060048201526001600160a01b03918216602482015260448101839052908316906323b872dd906064016020604051808303816000875af11580156124e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ae9190615802565b60008181526101a060205260409020606090610efb906002016133fd565b606060cc8054610f869061557b565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018390526000908190605c0160405160208183030381529060405280519060200120905061258b81846136bf565b949350505050565b60008281526101a0602052604081206125af90600401836136e3565b9392505050565b61186a3383836136fb565b336125d46065546001600160a01b031690565b6001600160a01b031614806125ef57506125ef60c933612f7a565b61260b5760405162461bcd60e51b8152600401610f4b90615544565b61019d805462ff0000191690556040517f783239dc75412cbf7e4b699d43fd740d484fa9a24b4717101437f4fc51b5c09090600090a1565b61264d33836130e6565b6126695760405162461bcd60e51b8152600401610f4b90615682565b612675848484846137ca565b50505050565b610199546060906001600160a01b03161561120c57604080516001808252818301909252906020808301908036833750506101995482519293506001600160a01b0316918391506000906126d1576126d16155b5565b60200260200101906001600160a01b031690816001600160a01b031681525050919050565b6101995460609081906001600160a01b0316156127a857604080516001808252818301909252906020808301908036833750506101995482519294506001600160a01b03169184915060009061274e5761274e6155b5565b6001600160a01b0392909216602092830291909101820152604080516001808252818301909252918281019080368337019050509050610198548160008151811061279b5761279b6155b5565b6020026020010181815250505b915091565b60006002600154036127d15760405162461bcd60e51b8152600401610f4b906155cb565b60026001908155861480156127e557508584145b6128215760405162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a59081a5b9c1d5d609a1b6044820152606401610f4b565b6128608888886000818110612838576128386155b5565b9050602002013587876000818110612852576128526155b5565b9050602002013586866137fd565b5063bc197c8160e01b6001805598975050505050505050565b600081815260cd60205260409020546060906001600160a01b03166128f85760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610f4b565b6000612902613df7565b9050600081511161292257604051806020016040528060008152506125af565b8061292c84613e07565b60405160200161293d92919061581f565b6040516020818303038152906040529392505050565b336129666065546001600160a01b031690565b6001600160a01b03161480612981575061298160c933612f7a565b61299d5760405162461bcd60e51b8152600401610f4b90615544565b61019a54604051637921219560e11b81523060048201526001600160a01b039182166024820152604481018490526064810183905260a06084820152600060a48201529084169063f242432a9060c401600060405180830381600087803b158015612a0757600080fd5b505af1158015612a1b573d6000803e3d6000fd5b50505050505050565b6040516bffffffffffffffffffffffff19606085901b16602082015260348101839052605481018290526000906074016040516020818303038152906040528051906020012090509392505050565b33612a866065546001600160a01b031690565b6001600160a01b03161480612aa15750612aa160c933612f7a565b612abd5760405162461bcd60e51b8152600401610f4b90615544565b61019d805461ff00191690556040517f21018f2958a6cca22f29b7ac4c69d3b59ca73253c674d75f185bc410aec09b6890600090a1565b33612b076065546001600160a01b031690565b6001600160a01b03161480612b225750612b2260c933612f7a565b612b3e5760405162461bcd60e51b8152600401610f4b90615544565b61019d805464ff0000000019166401000000001790556040517fce0af73f1569a468536669acb9fd89b4d56fc99c2df759ef91e9e7888c14ec7c90600090a1565b33612b926065546001600160a01b031690565b6001600160a01b03161480612bad5750612bad60c933612f7a565b612bc95760405162461bcd60e51b8152600401610f4b90615544565b61019d805461ff0019166101001790556040517f23a6a8bb4d7b2deba3f983e09212e9d336bf7701a5fe65af0915caf1aeda535790600090a1565b33612c176065546001600160a01b031690565b6001600160a01b03161480612c325750612c3260c933612f7a565b612c4e5760405162461bcd60e51b8152600401610f4b90615544565b61019d805464ff00000000191690556040517ff5b8ed2d5ddf6cc75e4a997f8d29fa4833f1012057e342ad0300a237a1925c5290600090a1565b6000600260015403612cac5760405162461bcd60e51b8152600401610f4b906155cb565b6002600155612cbe86868686866137fd565b5063f23a6e6160e01b600180559695505050505050565b6065546001600160a01b03163314612cff5760405162461bcd60e51b8152600401610f4b9061571c565b6001600160a01b038116612d645760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610f4b565b61186c8161366d565b33612d806065546001600160a01b031690565b6001600160a01b03161480612d9b5750612d9b60c933612f7a565b612db75760405162461bcd60e51b8152600401610f4b90615544565b61019d805460ff191660011790556040517f33bd661cf390c9eab45e883b23ed2c6aca761957770d11058e541d75386e06c490600090a1565b6000612dfc6001613f07565b90508015612e14576000805461ff0019166101001790555b612e66604051806040016040528060148152602001734c616e6420627920466f72657665724c616e647360601b815250604051806040016040528060048152602001631310539160e21b815250613f8f565b612e6e613fc0565b612e76613fe7565b612e7e613fc0565b60655461019a80546001600160a01b0319166001600160a01b039092169190911790556101938054600101905561019e829055801561186a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6001600160a01b03163b151590565b60006001600160e01b031982166380ac58cd60e01b1480612f3a57506001600160e01b03198216635b5e139f60e01b145b80610efb5750610efb825b60006001600160e01b03198216632a9f3abf60e11b1480610efb57506301ffc9a760e01b6001600160e01b0319831614610efb565b6001600160a01b038116600090815260018301602052604081205415156125af565b600081815260cf6020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612fd182611f21565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600082815261019f602052604081205461302590600161584e565b600083815261019f6020526040812054919250613042828461584e565b9050600781101561306457600084815261019f60205260409020819055613078565b600084815261019f60205260409020600790555b61308761019480546001019055565b604051849086907f78229c368fd1968ee0b5c695d7bf34d9fa963dd6dcd7c9b32b62fac9f443342490600090a360405185907fb90306ad06b2a6ff86ddc9327db583062895ef6540e62dc50add009db5b356eb90600090a25050505050565b600081815260cd60205260408120546001600160a01b031661315f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610f4b565b600061316a83611f21565b9050806001600160a01b0316846001600160a01b031614806131b157506001600160a01b03808216600090815260d0602090815260408083209388168352929052205460ff165b8061258b5750836001600160a01b03166131ca84611009565b6001600160a01b031614949350505050565b826001600160a01b03166131ef82611f21565b6001600160a01b0316146132535760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610f4b565b6001600160a01b0382166132b55760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610f4b565b6132c0600082612f9c565b6001600160a01b038316600090815260ce602052604081208054600192906132e990849061566b565b90915550506001600160a01b038216600090815260ce6020526040812080546001929061331790849061584e565b9091555050600081815260cd602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60008281526101a0602052604080822080546001600160a01b0319166001600160a01b03851690811782559151909285917f2f56fa49f427140ac966132d73f6b7878338d580951015c18f3c8205f3ee87599190a3505050565b60006125af836001600160a01b038416614016565b6000610efb825490565b60006125af8383614109565b606060006125af83614133565b3361341d6065546001600160a01b031690565b6001600160a01b03161480613438575061343860c933612f7a565b61186c5760405162461bcd60e51b8152600401610f4b90615544565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615613487576111ae8361418f565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156134e1575060408051601f3d908101601f191682019092526134de91810190615866565b60015b6135445760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610f4b565b600080516020615aa983398151915281146135b35760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610f4b565b506111ae83838361422b565b60006135cb6101935490565b90506135dc61019380546001019055565b6135e68282614250565b60405181907f61f36b0ed9629a1a8b0ebc34ff07af9c7e48f10762c5adc3f0a29b81d9059d1790600090a25050565b61362461019480546001019055565b60405181907fb90306ad06b2a6ff86ddc9327db583062895ef6540e62dc50add009db5b356eb90600090a261186c8161426a565b60006125af836001600160a01b038416614306565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008060006136ce8585614355565b915091506136db816143c0565b509392505050565b600081815260018301602052604081205415156125af565b816001600160a01b0316836001600160a01b03160361375c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610f4b565b6001600160a01b03838116600081815260d06020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191015b60405180910390a3505050565b6137d58484846131dc565b6137e184848484614576565b6126755760405162461bcd60e51b8152600401610f4b9061587f565b610197546001600160a01b0316331480156138185750836001145b6138525760405162461bcd60e51b815260206004820152600b60248201526a125b9d985b1a590813919560aa1b6044820152606401610f4b565b6000808060208490036138725761386b84860186614e57565b92506138ca565b6040849003613891576138878486018661500e565b90935091506138ca565b60608490036138b2576138a6848601866158d1565b919450925090506138ca565b60405162461bcd60e51b8152600401610f4b90615602565b826000036139655761019d5460ff1661391a5760405162461bcd60e51b8152602060048201526012602482015271446973636f7665727920696e61637469766560701b6044820152606401610f4b565b8561019e5410156139605760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f7567682073746f636b60801b6044820152606401610f4b565b613cdb565b82600103613a575761019d546301000000900460ff166139be5760405162461bcd60e51b81526020600482015260146024820152734578706c6f726174696f6e20696e61637469766560601b6044820152606401610f4b565b6139c782611f21565b6001600160a01b0316886001600160a01b0316146139f75760405162461bcd60e51b8152600401610f4b90615628565b600082815261019f6020526040902054600790613a1590889061584e565b11156139605760405162461bcd60e51b8152602060048201526011602482015270115e1c1b1bdc985d1a5bdb881b1a5b5a5d607a1b6044820152606401610f4b565b82600203613b665761019d54610100900460ff16613aaf5760405162461bcd60e51b8152602060048201526015602482015274436f6c6f6e697a6174696f6e20696e61637469766560581b6044820152606401610f4b565b60008281526101a060205260409020546001600160a01b0316613b075760405162461bcd60e51b815260206004820152601060248201526f4e6f20636f6c6f6e792065786973747360801b6044820152606401610f4b565b600082815261019f60205260409020546007146139605760405162461bcd60e51b815260206004820152601b60248201527f4c616e64206d7573742062652066756c6c79204578706c6f72656400000000006044820152606401610f4b565b826003036138b25761019d5462010000900460ff16613bba5760405162461bcd60e51b815260206004820152601060248201526f506f7274616c7320696e61637469766560801b6044820152606401610f4b565b85600114613c035760405162461bcd60e51b815260206004820152601660248201527543616e206c696e6b206f6e6520617420612074696d6560501b6044820152606401610f4b565b613c0c82611f21565b6001600160a01b0316886001600160a01b031614613c3c5760405162461bcd60e51b8152600401610f4b90615628565b60008181526101a060205260409020546001600160a01b0316613c945760405162461bcd60e51b815260206004820152601060248201526f4e6f20636f6c6f6e792065786973747360801b6044820152606401610f4b565b613c9e8183612593565b156139605760405162461bcd60e51b815260206004820152600d60248201526c506f7274616c2065786973747360981b6044820152606401610f4b565b604051637921219560e11b8152339063f242432a90613d0a90309061dead908c908c908c908c906004016158fd565b600060405180830381600087803b158015613d2457600080fd5b505af1925050508015613d35575060015b613d63573d808015611430576040519150601f19603f3d011682016040523d82523d6000602084013e611435565b82600003613db0578561019e6000828254613d7e919061566b565b90915550600090505b86811015613daa57613d98896135bf565b80613da281615751565b915050613d87565b50613ded565b82600103613dc757613dc28287614677565b613ded565b82600203613dda57613dc28883886146d4565b826003036138b257613dc2888383614790565b5050505050505050565b60606101958054610f869061557b565b606081600003613e2e5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613e585780613e4281615751565b9150613e519050600a83615708565b9150613e32565b6000816001600160401b03811115613e7257613e72615030565b6040519080825280601f01601f191660200182016040528015613e9c576020820181803683370190505b5090505b841561258b57613eb160018361566b565b9150613ebe600a86615959565b613ec990603061584e565b60f81b818381518110613ede57613ede6155b5565b60200101906001600160f81b031916908160001a905350613f00600a86615708565b9450613ea0565b60008054610100900460ff1615613f4e578160ff166001148015613f2a5750303b155b613f465760405162461bcd60e51b8152600401610f4b9061596d565b506000919050565b60005460ff808416911610613f755760405162461bcd60e51b8152600401610f4b9061596d565b506000805460ff191660ff92909216919091179055600190565b600054610100900460ff16613fb65760405162461bcd60e51b8152600401610f4b906159bb565b61186a82826147eb565b600054610100900460ff166123375760405162461bcd60e51b8152600401610f4b906159bb565b600054610100900460ff1661400e5760405162461bcd60e51b8152600401610f4b906159bb565b612337614839565b600081815260018301602052604081205480156140ff57600061403a60018361566b565b855490915060009061404e9060019061566b565b90508181146140b357600086600001828154811061406e5761406e6155b5565b9060005260206000200154905080876000018481548110614091576140916155b5565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806140c4576140c4615a06565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610efb565b6000915050610efb565b6000826000018281548110614120576141206155b5565b9060005260206000200154905092915050565b60608160000180548060200260200160405190810160405280929190818152602001828054801561418357602002820191906000526020600020905b81548152602001906001019080831161416f575b50505050509050919050565b6001600160a01b0381163b6141fc5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610f4b565b600080516020615aa983398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b61423483614869565b6000825111806142415750805b156111ae5761267583836148a9565b61186a82826040518060200160405280600081525061499d565b600061427582611f21565b9050614282600083612f9c565b6001600160a01b038116600090815260ce602052604081208054600192906142ab90849061566b565b9091555050600082815260cd602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a461186a565b600081815260018301602052604081205461434d57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610efb565b506000610efb565b600080825160410361438b5760208301516040840151606085015160001a61437f878285856149d0565b9450945050505061166c565b82516040036143b457602083015160408401516143a9868383614abd565b93509350505061166c565b5060009050600261166c565b60008160048111156143d4576143d4615a1c565b036143dc5750565b60018160048111156143f0576143f0615a1c565b0361443d5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610f4b565b600281600481111561445157614451615a1c565b0361449e5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610f4b565b60038160048111156144b2576144b2615a1c565b0361450a5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610f4b565b600481600481111561451e5761451e615a1c565b0361186c5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610f4b565b60006001600160a01b0384163b1561466c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906145ba903390899088908890600401615a32565b6020604051808303816000875af19250505080156145f5575060408051601f3d908101601f191682019092526145f291810190615a6f565b60015b614652573d808015614623576040519150601f19603f3d011682016040523d82523d6000602084013e614628565b606091505b50805160000361464a5760405162461bcd60e51b8152600401610f4b9061587f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061258b565b506001949350505050565b600082815261019f60205260408120805483929061469690849061584e565b909155505060405181815282907fc1ec9d40f0513225a2722d0559711f345f64052651cd25bc2079ea0db1ab72429060200160405180910390a25050565b60008281526101a06020526040812060010180548392906146f690849061584e565b909155505060008281526101a0602052604090206147179060020184613658565b5060008281526101a0602090815260408083206001600160a01b03871684526006019091528120805483929061474e90849061584e565b909155505060405181815282906001600160a01b038516907f4fbc32cd3e6036f5cb98e166f4396ae4cf37448523e3b9f8659759384d2b2a28906020016137bd565b60008181526101a0602052604090206147ac6004820184614af6565b508183856001600160a01b03167f478b738c75acd1abcfb92a05b2c7a7c56a10fff5ed8f634714247c3bba4624d560405160405180910390a450505050565b600054610100900460ff166148125760405162461bcd60e51b8152600401610f4b906159bb565b81516148259060cb906020850190614cfe565b5080516111ae9060cc906020840190614cfe565b600054610100900460ff166148605760405162461bcd60e51b8152600401610f4b906159bb565b6123373361366d565b6148728161418f565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b6149115760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610f4b565b600080846001600160a01b03168460405161492c9190615a8c565b600060405180830381855af49150503d8060008114614967576040519150601f19603f3d011682016040523d82523d6000602084013e61496c565b606091505b50915091506149948282604051806060016040528060278152602001615ac960279139614b02565b95945050505050565b6149a78383614b3b565b6149b46000848484614576565b6111ae5760405162461bcd60e51b8152600401610f4b9061587f565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115614a075750600090506003614ab4565b8460ff16601b14158015614a1f57508460ff16601c14155b15614a305750600090506004614ab4565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015614a84573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116614aad57600060019250925050614ab4565b9150600090505b94509492505050565b6000806001600160ff1b03831681614ada60ff86901c601b61584e565b9050614ae8878288856149d0565b935093505050935093915050565b60006125af8383614306565b60608315614b115750816125af565b825115614b215782518084602001fd5b8160405162461bcd60e51b8152600401610f4b9190614e44565b6001600160a01b038216614b915760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610f4b565b600081815260cd60205260409020546001600160a01b031615614bf65760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610f4b565b6001600160a01b038216600090815260ce60205260408120805460019290614c1f90849061584e565b9091555050600081815260cd602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461186a565b828054614c8a9061557b565b90600052602060002090601f016020900481019282614cac5760008555614cf2565b82601f10614cc55782800160ff19823516178555614cf2565b82800160010185558215614cf2579182015b82811115614cf2578235825591602001919060010190614cd7565b50611a0b929150614d72565b828054614d0a9061557b565b90600052602060002090601f016020900481019282614d2c5760008555614cf2565b82601f10614d4557805160ff1916838001178555614cf2565b82800160010185558215614cf2579182015b82811115614cf2578251825591602001919060010190614d57565b5b80821115611a0b5760008155600101614d73565b6001600160e01b03198116811461186c57600080fd5b600060208284031215614daf57600080fd5b81356125af81614d87565b6001600160a01b038116811461186c57600080fd5b600060208284031215614de157600080fd5b81356125af81614dba565b60005b83811015614e07578181015183820152602001614def565b838111156126755750506000910152565b60008151808452614e30816020860160208601614dec565b601f01601f19169290920160200192915050565b6020815260006125af6020830184614e18565b600060208284031215614e6957600080fd5b5035919050565b60008060408385031215614e8357600080fd5b8235614e8e81614dba565b946020939093013593505050565b600081518084526020808501945080840160005b83811015614ecc57815187529582019590820190600101614eb0565b509495945050505050565b6020815260006125af6020830184614e9c565b60008060408385031215614efd57600080fd5b823591506020830135614f0f81614dba565b809150509250929050565b60008083601f840112614f2c57600080fd5b5081356001600160401b03811115614f4357600080fd5b60208301915083602082850101111561166c57600080fd5b600080600080600060808688031215614f7357600080fd5b8535614f7e81614dba565b94506020860135614f8e81614dba565b93506040860135925060608601356001600160401b03811115614fb057600080fd5b614fbc88828901614f1a565b969995985093965092949392505050565b600080600060608486031215614fe257600080fd5b8335614fed81614dba565b92506020840135614ffd81614dba565b929592945050506040919091013590565b6000806040838503121561502157600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261505757600080fd5b81356001600160401b038082111561507157615071615030565b604051601f8301601f19908116603f0116810190828211818310171561509957615099615030565b816040528381528660208588010111156150b257600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080608085870312156150e857600080fd5b84356001600160401b038111156150fe57600080fd5b61510a87828801615046565b945050602085013561511b81614dba565b93969395505050506040820135916060013590565b600081518084526020808501945080840160005b83811015614ecc5781516001600160a01b031687529582019590820190600101615144565b6020815260006125af6020830184615130565b6000806040838503121561518f57600080fd5b823561519a81614dba565b915060208301356001600160401b038111156151b557600080fd5b6151c185828601615046565b9150509250929050565b600080602083850312156151de57600080fd5b82356001600160401b038111156151f457600080fd5b61520085828601614f1a565b90969095509350505050565b8581526001600160a01b038516602082015260a06040820181905260009061523690830186615130565b82810360608401526152488186614e9c565b9050828103608084015261525c8185614e9c565b98975050505050505050565b6000806040838503121561527b57600080fd5b8235915060208301356001600160401b038111156151b557600080fd5b801515811461186c57600080fd5b600080604083850312156152b957600080fd5b82356152c481614dba565b91506020830135614f0f81615298565b600080600080608085870312156152ea57600080fd5b84356152f581614dba565b9350602085013561530581614dba565b92506040850135915060608501356001600160401b0381111561532757600080fd5b61533387828801615046565b91505092959194509250565b6040815260006153526040830185615130565b82810360208401526149948185614e9c565b60008083601f84011261537657600080fd5b5081356001600160401b0381111561538d57600080fd5b6020830191508360208260051b850101111561166c57600080fd5b60008060008060008060008060a0898b0312156153c457600080fd5b88356153cf81614dba565b975060208901356153df81614dba565b965060408901356001600160401b03808211156153fb57600080fd5b6154078c838d01615364565b909850965060608b013591508082111561542057600080fd5b61542c8c838d01615364565b909650945060808b013591508082111561544557600080fd5b506154528b828c01614f1a565b999c989b5096995094979396929594505050565b60008060006060848603121561547b57600080fd5b833561548681614dba565b95602085013595506040909401359392505050565b600080604083850312156154ae57600080fd5b82356154b981614dba565b91506020830135614f0f81614dba565b60008060008060008060a087890312156154e257600080fd5b86356154ed81614dba565b955060208701356154fd81614dba565b9450604087013593506060870135925060808701356001600160401b0381111561552657600080fd5b61553289828a01614f1a565b979a9699509497509295939492505050565b6020808252601a908201527f41433a204d757374206265206f776e6572206f722061646d696e000000000000604082015260600190565b600181811c9082168061558f57607f821691505b6020821081036155af57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600c908201526b496e76616c6964206461746160a01b604082015260600190565b60208082526013908201527226bab9ba103132903a37b5b2b71037bbb732b960691b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008282101561567d5761567d615655565b500390565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008160001904831182151516156156ed576156ed615655565b500290565b634e487b7160e01b600052601260045260246000fd5b600082615717576157176156f2565b500490565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006001820161576357615763615655565b5060010190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b60006020828403121561581457600080fd5b81516125af81615298565b60008351615831818460208801614dec565b835190830190615845818360208801614dec565b01949350505050565b6000821982111561586157615861615655565b500190565b60006020828403121561587857600080fd5b5051919050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6000806000606084860312156158e657600080fd5b505081359360208301359350604090920135919050565b6001600160a01b03878116825286166020820152604081018590526060810184905260a06080820181905281018290526000828460c0840137600060c0848401015260c0601f19601f8501168301019050979650505050505050565b600082615968576159686156f2565b500690565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615a6590830184614e18565b9695505050505050565b600060208284031215615a8157600080fd5b81516125af81614d87565b60008251615a9e818460208701614dec565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122065ee95bf6a70f85917de47abe7b26c1ed775bb1228824bf4fdcfc180a481616464736f6c634300080e0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.