Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
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:
BaseDiamondCloneFacet
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {DiamondCloneCutFacet} from "./DiamondCloneCutFacet.sol"; import {DiamondCloneLoupeFacet} from "./DiamondCloneLoupeFacet.sol"; import {BasicAccessControlFacet} from "../AccessControl/BasicAccessControlFacet.sol"; import {PausableFacet} from "../Pausable/PausableFacet.sol"; contract BaseDiamondCloneFacet is DiamondCloneCutFacet, DiamondCloneLoupeFacet, BasicAccessControlFacet, PausableFacet {}
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {DiamondCloneLib, IDiamondCut} from "./DiamondCloneLib.sol"; import {AccessControlModifiers} from "../AccessControl/AccessControlModifiers.sol"; // Remember to add the loupe functions from DiamondLoupeFacet to the diamond. // The loupe functions are required by the EIP2535 Diamonds standard contract DiamondCloneCutFacet is IDiamondCut, AccessControlModifiers { // NOTE: ownership must be set already so this is impossible // to call on the implementation instance // // NOTE: can only be called once // (enforced in the library via saw Address) function initializeDiamondClone( address diamondSawAddress, address[] calldata facetAddresses ) external onlyOwner { DiamondCloneLib.initializeDiamondClone( diamondSawAddress, facetAddresses ); } function diamondCut( FacetCut[] calldata _diamondCut, address _init, bytes calldata _calldata ) external override onlyOwner { require( !DiamondCloneLib.isImmutable(), "Cannot cut the diamond while immutable" ); DiamondCloneLib.cutWithDiamondSaw(_diamondCut, _init, _calldata); } function setGasCacheForSelector(bytes4 selector) external onlyOperator { DiamondCloneLib.setGasCacheForSelector(selector); } function gasCacheForSelector(bytes4 selector) public view returns (address) { return DiamondCloneLib.diamondCloneStorage().selectorGasCache[selector]; } function setImmutableUntilBlock(uint256 blockNumber) external onlyOwner { require( !DiamondCloneLib.isImmutable(), "Cannot set immutable block while immutable" ); DiamondCloneLib.setImmutableUntilBlock(blockNumber); } function immutableUntilBlock() external view returns (uint256) { return DiamondCloneLib.immutableUntilBlock(); } // to prevent this function from being called // use the immutability window function upgradeDiamondSaw( address _upgradeSaw, address[] calldata _oldFacetAddresses, address[] calldata _newFacetAddresses, address _init, bytes calldata _calldata ) external onlyOwner { DiamondCloneLib.upgradeDiamondSaw( _upgradeSaw, _oldFacetAddresses, _newFacetAddresses, _init, _calldata ); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {DiamondCloneLib} from "./DiamondCloneLib.sol"; import {IDiamondLoupe} from "./IDiamondLoupe.sol"; import {IERC165} from "../../interfaces/IERC165.sol"; import {DiamondSaw} from "../../DiamondSaw.sol"; // The functions in DiamondLoupeFacet MUST be added to a diamond. // The EIP-2535 Diamond standard requires these functions. contract DiamondCloneLoupeFacet is IDiamondLoupe, IERC165 { // Diamond Loupe Functions //////////////////////////////////////////////////////////////////// /// These functions are expected to be called frequently by tools. // // struct Facet { // address facetAddress; // bytes4[] functionSelectors; // } /// @notice Gets all facets and their selectors. /// @return facets_ Facet // Finds the subset of all facets used in this facet clone function facets() external view override returns (Facet[] memory facets_) { facets_ = DiamondCloneLib.facets(); } /// @notice Gets all the function selectors provided by a facet. /// @param _facet The facet address. /// @return facetFunctionSelectors_ function facetFunctionSelectors(address _facet) external view override returns (bytes4[] memory facetFunctionSelectors_) { DiamondCloneLib.DiamondCloneStorage storage ds = DiamondCloneLib.diamondCloneStorage(); facetFunctionSelectors_ = DiamondSaw(ds.diamondSawAddress).functionSelectorsForFacetAddress(_facet); } /// @notice Get all the facet addresses used by a diamond. /// @return facetAddresses_ function facetAddresses() external view override returns (address[] memory facetAddresses_) { facetAddresses_ = DiamondCloneLib.facetAddresses(); } /// @notice Gets the facet that supports the given selector. /// @dev If facet is not found return address(0). /// @param _functionSelector The function selector. /// @return facetAddress_ The facet address. function facetAddress(bytes4 _functionSelector) external view override returns (address facetAddress_) { DiamondCloneLib.DiamondCloneStorage storage ds = DiamondCloneLib.diamondCloneStorage(); facetAddress_ = DiamondSaw(ds.diamondSawAddress).facetAddressForSelector(_functionSelector); } // This implements ERC-165. // DiamondSaw maintains a map of which facet addresses implement which interfaces // All the clone has to do is query the facet address and check if the clone implements it function supportsInterface(bytes4 _interfaceId) external view override returns (bool) { DiamondCloneLib.DiamondCloneStorage storage ds = DiamondCloneLib.diamondCloneStorage(); address facetAddressForInterface = DiamondSaw(ds.diamondSawAddress).facetAddressForInterface(_interfaceId); return ds.facetAddresses[facetAddressForInterface]; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (access/AccessControl.sol) pragma solidity ^0.8.0; import "@openzeppelin/contracts/access/IAccessControl.sol"; import "@openzeppelin/contracts/utils/Context.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; import "./AccessControlLib.sol"; import {PausableLib} from "../Pausable/PausableLib.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 BasicAccessControlFacet is Context { /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return AccessControlLib.accessControlStorage()._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 { PausableLib.enforceUnpaused(); AccessControlLib._enforceOwner(); AccessControlLib._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 { PausableLib.enforceUnpaused(); AccessControlLib._enforceOwner(); require( newOwner != address(0), "Ownable: new owner is the zero address" ); AccessControlLib._transferOwnership(newOwner); } function grantOperator(address _operator) public virtual { PausableLib.enforceUnpaused(); AccessControlLib._enforceOwner(); AccessControlLib.grantRole(AccessControlLib.OPERATOR_ROLE, _operator); } function revokeOperator(address _operator) public virtual { PausableLib.enforceUnpaused(); AccessControlLib._enforceOwner(); AccessControlLib.revokeRole(AccessControlLib.OPERATOR_ROLE, _operator); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; import {AccessControlModifiers} from "../AccessControl/AccessControlModifiers.sol"; import {PausableLib} from "./PausableLib.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract PausableFacet is AccessControlModifiers { function pause() public onlyOwner { PausableLib._pause(); } function unpause() public onlyOwner { PausableLib._unpause(); } function paused() public view returns (bool) { return PausableLib._paused(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {DiamondSaw} from "../../DiamondSaw.sol"; import {IDiamondLoupe} from "./IDiamondLoupe.sol"; import {IDiamondCut} from "./IDiamondCut.sol"; library DiamondCloneLib { bytes32 constant DIAMOND_CLONE_STORAGE_POSITION = keccak256("diamond.standard.diamond.clone.storage"); bytes32 constant ERC721A_STORAGE_POSITION = keccak256("erc721a.facet.storage"); event DiamondCut( IDiamondCut.FacetCut[] _diamondCut, address _init, bytes _calldata ); struct DiamondCloneStorage { // address of the diamond saw contract address diamondSawAddress; // mapping to all the facets this diamond implements. mapping(address => bool) facetAddresses; // number of facets supported uint256 numFacets; // optional gas cache for highly trafficked write selectors mapping(bytes4 => address) selectorGasCache; // immutability window uint256 immutableUntilBlock; } // minimal copy of ERC721AStorage for initialization struct ERC721AStorage { // The tokenId of the next token to be minted. uint256 _currentIndex; } function diamondCloneStorage() internal pure returns (DiamondCloneStorage storage s) { bytes32 position = DIAMOND_CLONE_STORAGE_POSITION; assembly { s.slot := position } } // calls externally to the saw to find the appropriate facet to delegate to function _getFacetAddressForCall() internal view returns (address addr) { DiamondCloneStorage storage s = diamondCloneStorage(); addr = s.selectorGasCache[msg.sig]; if (addr != address(0)) { return addr; } (bool success, bytes memory res) = s.diamondSawAddress.staticcall( abi.encodeWithSelector(0x14bc7560, msg.sig) ); require(success, "Failed to fetch facet address for call"); assembly { addr := mload(add(res, 32)) } return s.facetAddresses[addr] ? addr : address(0); } function initNFT() internal { ERC721AStorage storage es; bytes32 position = ERC721A_STORAGE_POSITION; assembly { es.slot := position } es._currentIndex = 1; } function initializeDiamondClone( address diamondSawAddress, address[] calldata _facetAddresses ) internal { DiamondCloneLib.DiamondCloneStorage storage s = DiamondCloneLib .diamondCloneStorage(); require(diamondSawAddress != address(0), "Must set saw addy"); require(s.diamondSawAddress == address(0), "Already inited"); initNFT(); s.diamondSawAddress = diamondSawAddress; IDiamondCut.FacetCut[] memory cuts = new IDiamondCut.FacetCut[]( _facetAddresses.length ); // emit the diamond cut event for (uint256 i; i < _facetAddresses.length; i++) { address facetAddress = _facetAddresses[i]; bytes4[] memory selectors = DiamondSaw(diamondSawAddress) .functionSelectorsForFacetAddress(facetAddress); require(selectors.length > 0, "Facet is not supported by the saw"); cuts[i].facetAddress = _facetAddresses[i]; cuts[i].functionSelectors = selectors; s.facetAddresses[facetAddress] = true; } emit DiamondCut(cuts, address(0), ""); s.numFacets = _facetAddresses.length; } function _purgeGasCache(bytes4[] memory selectors) internal { DiamondCloneStorage storage s = diamondCloneStorage(); for (uint256 i; i < selectors.length; i++) { if (s.selectorGasCache[selectors[i]] != address(0)) { delete s.selectorGasCache[selectors[i]]; } } } function cutWithDiamondSaw( IDiamondCut.FacetCut[] memory _diamondCut, address _init, bytes calldata _calldata ) internal { DiamondCloneStorage storage s = diamondCloneStorage(); uint256 newNumFacets = s.numFacets; // emit the diamond cut event for (uint256 i; i < _diamondCut.length; i++) { IDiamondCut.FacetCut memory cut = _diamondCut[i]; bytes4[] memory selectors = DiamondSaw(s.diamondSawAddress) .functionSelectorsForFacetAddress(cut.facetAddress); require(selectors.length > 0, "Facet is not supported by the saw"); require( selectors.length == cut.functionSelectors.length, "You can only modify all selectors at once with diamond saw" ); // NOTE we override the passed selectors after validating the length matches // With diamond saw we can only add / remove all selectors for a given facet cut.functionSelectors = selectors; // if the address is already in the facet map // remove it and remove all the selectors // otherwise add the selectors if (s.facetAddresses[cut.facetAddress]) { require( cut.action == IDiamondCut.FacetCutAction.Remove, "Can only remove existing facet selectors" ); delete s.facetAddresses[cut.facetAddress]; _purgeGasCache(selectors); newNumFacets -= 1; } else { require( cut.action == IDiamondCut.FacetCutAction.Add, "Can only add non-existing facet selectors" ); s.facetAddresses[cut.facetAddress] = true; newNumFacets += 1; } } emit DiamondCut(_diamondCut, _init, _calldata); // call the init function (bool success, bytes memory error) = _init.delegatecall(_calldata); if (!success) { if (error.length > 0) { // bubble up the error revert(string(error)); } else { revert("DiamondCloneLib: _init function reverted"); } } s.numFacets = newNumFacets; } function upgradeDiamondSaw( address _upgradeSawAddress, address[] calldata _oldFacetAddresses, address[] calldata _newFacetAddresses, address _init, bytes calldata _calldata ) internal { require( !isImmutable(), "Cannot upgrade saw during immutability window" ); require( _upgradeSawAddress != address(0), "Cannot set saw to zero address" ); DiamondCloneStorage storage s = diamondCloneStorage(); require( _oldFacetAddresses.length == s.numFacets, "Must remove all facets to upgrade saw" ); DiamondSaw oldSawInstance = DiamondSaw(s.diamondSawAddress); require( oldSawInstance.isUpgradeSawSupported(_upgradeSawAddress), "Upgrade saw is not supported" ); DiamondSaw newSawInstance = DiamondSaw(_upgradeSawAddress); IDiamondCut.FacetCut[] memory cuts = new IDiamondCut.FacetCut[]( _oldFacetAddresses.length + _newFacetAddresses.length ); for ( uint256 i; i < _oldFacetAddresses.length + _newFacetAddresses.length; i++ ) { if (i < _oldFacetAddresses.length) { address facetAddress = _oldFacetAddresses[i]; require( s.facetAddresses[facetAddress], "Cannot remove facet that is not supported" ); bytes4[] memory selectors = oldSawInstance .functionSelectorsForFacetAddress(facetAddress); require( selectors.length > 0, "Facet is not supported by the saw" ); cuts[i].action = IDiamondCut.FacetCutAction.Remove; cuts[i].facetAddress = facetAddress; cuts[i].functionSelectors = selectors; _purgeGasCache(selectors); delete s.facetAddresses[facetAddress]; } else { address facetAddress = _newFacetAddresses[ i - _oldFacetAddresses.length ]; bytes4[] memory selectors = newSawInstance .functionSelectorsForFacetAddress(facetAddress); require( selectors.length > 0, "Facet is not supported by the new saw" ); cuts[i].action = IDiamondCut.FacetCutAction.Add; cuts[i].facetAddress = facetAddress; cuts[i].functionSelectors = selectors; s.facetAddresses[facetAddress] = true; } } emit DiamondCut(cuts, _init, _calldata); // actually update the diamond saw address s.numFacets = _newFacetAddresses.length; s.diamondSawAddress = _upgradeSawAddress; // call the init function (bool success, bytes memory error) = _init.delegatecall(_calldata); if (!success) { if (error.length > 0) { // bubble up the error revert(string(error)); } else { revert("DiamondCloneLib: _init function reverted"); } } } function setGasCacheForSelector(bytes4 selector) internal { DiamondCloneStorage storage s = diamondCloneStorage(); address facetAddress = DiamondSaw(s.diamondSawAddress) .facetAddressForSelector(selector); require(facetAddress != address(0), "Facet not supported"); require(s.facetAddresses[facetAddress], "Facet not included in clone"); s.selectorGasCache[selector] = facetAddress; } function setImmutableUntilBlock(uint256 blockNum) internal { diamondCloneStorage().immutableUntilBlock = blockNum; } function isImmutable() internal view returns (bool) { return block.number < diamondCloneStorage().immutableUntilBlock; } function immutableUntilBlock() internal view returns (uint256) { return diamondCloneStorage().immutableUntilBlock; } /** * LOUPE FUNCTIONALITY BELOW */ function facets() internal view returns (IDiamondLoupe.Facet[] memory facets_) { DiamondCloneLib.DiamondCloneStorage storage ds = DiamondCloneLib .diamondCloneStorage(); IDiamondLoupe.Facet[] memory allSawFacets = DiamondSaw( ds.diamondSawAddress ).allFacetsWithSelectors(); uint256 copyIndex = 0; facets_ = new IDiamondLoupe.Facet[](ds.numFacets); for (uint256 i; i < allSawFacets.length; i++) { if (ds.facetAddresses[allSawFacets[i].facetAddress]) { facets_[copyIndex] = allSawFacets[i]; copyIndex++; } } } function facetAddresses() internal view returns (address[] memory facetAddresses_) { DiamondCloneLib.DiamondCloneStorage storage ds = DiamondCloneLib .diamondCloneStorage(); address[] memory allSawFacetAddresses = DiamondSaw(ds.diamondSawAddress) .allFacetAddresses(); facetAddresses_ = new address[](ds.numFacets); uint256 copyIndex = 0; for (uint256 i; i < allSawFacetAddresses.length; i++) { if (ds.facetAddresses[allSawFacetAddresses[i]]) { facetAddresses_[copyIndex] = allSawFacetAddresses[i]; copyIndex++; } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./AccessControlLib.sol"; abstract contract AccessControlModifiers { modifier onlyOperator() { AccessControlLib._checkRole(AccessControlLib.OPERATOR_ROLE, msg.sender); _; } modifier onlyOwner() { AccessControlLib._enforceOwner(); _; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/access/Ownable.sol"; import {IDiamondCut} from "./facets/DiamondClone/IDiamondCut.sol"; import {IDiamondLoupe} from "./facets/DiamondClone/IDiamondLoupe.sol"; import {DiamondSawLib} from "./libraries/DiamondSawLib.sol"; import {BasicAccessControlFacet} from "./facets/AccessControl/BasicAccessControlFacet.sol"; import {AccessControlModifiers} from "./facets/AccessControl/AccessControlModifiers.sol"; import {AccessControlLib} from "./facets/AccessControl/AccessControlLib.sol"; import {PausableFacet} from "./facets/Pausable/PausableFacet.sol"; import {PausableModifiers} from "./facets/Pausable/PausableModifiers.sol"; /** * DiamondSaw is meant to be used as a * Singleton to "cut" many minimal diamond clones * In a gas efficient manner for deployments. * * This is accomplished by handling the storage intensive * selector mappings in one contract, "the saw" instead of in each diamond. * * Adding a new facet to the saw enables new diamond "patterns" * * This should be used if you * * 1. Need cheap deployments of many similar cloned diamonds that * utilize the same pre-deployed facets * * 2. Are okay with gas overhead on write txn to the diamonds * to communicate with the singleton (saw) to fetch selectors * */ contract DiamondSaw is BasicAccessControlFacet, AccessControlModifiers, PausableFacet, PausableModifiers { constructor() { AccessControlLib._transferOwnership(msg.sender); } function addFacetPattern( IDiamondCut.FacetCut[] calldata _facetAdds, address _init, bytes calldata _calldata ) external onlyOwner whenNotPaused { DiamondSawLib.diamondCutAddOnly(_facetAdds, _init, _calldata); } // if a facet has no selectors, it is not supported function checkFacetSupported(address _facetAddress) external view { DiamondSawLib.checkFacetSupported(_facetAddress); } function facetAddressForSelector(bytes4 selector) external view returns (address) { return DiamondSawLib .diamondSawStorage() .selectorToFacetAndPosition[selector] .facetAddress; } function functionSelectorsForFacetAddress(address facetAddress) external view returns (bytes4[] memory) { return DiamondSawLib .diamondSawStorage() .facetFunctionSelectors[facetAddress] .functionSelectors; } function allFacetAddresses() external view returns (address[] memory) { return DiamondSawLib.diamondSawStorage().facetAddresses; } function allFacetsWithSelectors() external view returns (IDiamondLoupe.Facet[] memory _facetsWithSelectors) { DiamondSawLib.DiamondSawStorage storage ds = DiamondSawLib .diamondSawStorage(); uint256 numFacets = ds.facetAddresses.length; _facetsWithSelectors = new IDiamondLoupe.Facet[](numFacets); for (uint256 i; i < numFacets; i++) { address facetAddress_ = ds.facetAddresses[i]; _facetsWithSelectors[i].facetAddress = facetAddress_; _facetsWithSelectors[i].functionSelectors = ds .facetFunctionSelectors[facetAddress_] .functionSelectors; } } function facetAddressForInterface(bytes4 _interface) external view returns (address) { DiamondSawLib.DiamondSawStorage storage ds = DiamondSawLib .diamondSawStorage(); return ds.interfaceToFacet[_interface]; } function setFacetForERC165Interface(bytes4 _interface, address _facet) external onlyOwner whenNotPaused { DiamondSawLib.checkFacetSupported(_facet); require( DiamondSawLib.diamondSawStorage().interfaceToFacet[_interface] == address(0), "Only one facet can implement an interface" ); DiamondSawLib.diamondSawStorage().interfaceToFacet[_interface] = _facet; } function approveTransferHookSelector(bytes4 selector) external onlyOwner whenNotPaused { DiamondSawLib.approveTransferHookSelector(selector); } function approveTokenURISelector(bytes4 selector) external onlyOwner whenNotPaused { DiamondSawLib.approveTokenURISelector(selector); } function isTokenURISelectorApproved(bytes4 selector) external view returns (bool) { return DiamondSawLib.diamondSawStorage().approvedTokenURIFunctionSelectors[ selector ]; } function isTransferHookSelectorApproved(bytes4 selector) external view returns (bool) { return DiamondSawLib .diamondSawStorage() .approvedTransferHookFunctionSelectors[selector]; } function setUpgradeSawAddress(address _upgradeSaw) external onlyOwner whenNotPaused { DiamondSawLib.setUpgradeSawAddress(_upgradeSaw); } function isUpgradeSawSupported(address _upgradeSaw) external view returns (bool) { return DiamondSawLib.diamondSawStorage().supportedSawAddresses[ _upgradeSaw ]; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /******************************************************************************\ * Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen) * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 /******************************************************************************/ // A loupe is a small magnifying glass used to look at diamonds. // These functions look at diamonds interface IDiamondLoupe { /// These functions are expected to be called frequently /// by tools. struct Facet { address facetAddress; bytes4[] functionSelectors; } /// @notice Gets all facet addresses and their four byte function selectors. /// @return facets_ Facet function facets() external view returns (Facet[] memory facets_); /// @notice Gets all the function selectors supported by a specific facet. /// @param _facet The facet address. /// @return facetFunctionSelectors_ function facetFunctionSelectors(address _facet) external view returns (bytes4[] memory facetFunctionSelectors_); /// @notice Get all the facet addresses used by a diamond. /// @return facetAddresses_ function facetAddresses() external view returns (address[] memory facetAddresses_); /// @notice Gets the facet that supports the given selector. /// @dev If facet is not found return address(0). /// @param _functionSelector The function selector. /// @return facetAddress_ The facet address. function facetAddress(bytes4 _functionSelector) external view returns (address facetAddress_); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /******************************************************************************\ * Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen) * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 /******************************************************************************/ interface IDiamondCut { enum FacetCutAction {Add, Replace, Remove} // Add=0, Replace=1, Remove=2 struct FacetCut { address facetAddress; FacetCutAction action; bytes4[] functionSelectors; } /// @notice Add/replace/remove any number of functions and optionally execute /// a function with delegatecall /// @param _diamondCut Contains the facet addresses and function selectors /// @param _init The address of the contract or facet to execute _calldata /// @param _calldata A function call, including function selector and arguments /// _calldata is executed with delegatecall on _init function diamondCut( FacetCut[] calldata _diamondCut, address _init, bytes calldata _calldata ) external; event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev 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); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {IDiamondCut} from "../facets/DiamondClone/IDiamondCut.sol"; library DiamondSawLib { bytes32 constant DIAMOND_SAW_STORAGE_POSITION = keccak256("diamond.standard.diamond.saw.storage"); struct FacetAddressAndPosition { address facetAddress; uint96 functionSelectorPosition; // position in facetFunctionSelectors.functionSelectors array } struct FacetFunctionSelectors { bytes4[] functionSelectors; uint256 facetAddressPosition; // position of facetAddress in facetAddresses array } struct DiamondSawStorage { // maps function selector to the facet address and // the position of the selector in the facetFunctionSelectors.selectors array mapping(bytes4 => FacetAddressAndPosition) selectorToFacetAndPosition; // maps facet addresses to function selectors mapping(address => FacetFunctionSelectors) facetFunctionSelectors; // facet addresses address[] facetAddresses; // Used to query if a facet implements a given interface // Note: this works because no interface can be implemented by // two different facets with diamond saw because no // selector overlap is permitted!! mapping(bytes4 => address) interfaceToFacet; // for transfer hooks, selectors must be approved in the saw mapping(bytes4 => bool) approvedTransferHookFunctionSelectors; // for tokenURI overrides, selectors must be approved in the saw mapping(bytes4 => bool) approvedTokenURIFunctionSelectors; // Saw contracts which clients can upgrade to mapping(address => bool) supportedSawAddresses; } function diamondSawStorage() internal pure returns (DiamondSawStorage storage ds) { bytes32 position = DIAMOND_SAW_STORAGE_POSITION; assembly { ds.slot := position } } event DiamondCut( IDiamondCut.FacetCut[] _diamondCut, address _init, bytes _calldata ); // Internal function version of diamondCut // only supports adding new selectors function diamondCutAddOnly( IDiamondCut.FacetCut[] memory _diamondCut, address _init, bytes memory _calldata ) internal { for ( uint256 facetIndex; facetIndex < _diamondCut.length; facetIndex++ ) { require( _diamondCut[facetIndex].action == IDiamondCut.FacetCutAction.Add, "Only add action supported in saw" ); require( !isFacetSupported(_diamondCut[facetIndex].facetAddress), "Facet already exists in saw" ); addFunctions( _diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors ); } emit DiamondCut(_diamondCut, _init, _calldata); initializeDiamondCut(_init, _calldata); } function addFunctions( address _facetAddress, bytes4[] memory _functionSelectors ) internal { require( _functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut" ); DiamondSawStorage storage ds = diamondSawStorage(); require( _facetAddress != address(0), "LibDiamondCut: Add facet can't be address(0)" ); uint96 selectorPosition = uint96( ds.facetFunctionSelectors[_facetAddress].functionSelectors.length ); // add new facet address if it does not exist if (selectorPosition == 0) { addFacet(ds, _facetAddress); } for ( uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++ ) { bytes4 selector = _functionSelectors[selectorIndex]; address oldFacetAddress = ds .selectorToFacetAndPosition[selector] .facetAddress; require( oldFacetAddress == address(0), "Cannot add function that already exists" ); addFunction(ds, selector, selectorPosition, _facetAddress); selectorPosition++; } } function addFacet(DiamondSawStorage storage ds, address _facetAddress) internal { enforceHasContractCode( _facetAddress, "LibDiamondCut: New facet has no code" ); ds.facetFunctionSelectors[_facetAddress].facetAddressPosition = ds .facetAddresses .length; ds.facetAddresses.push(_facetAddress); } function addFunction( DiamondSawStorage storage ds, bytes4 _selector, uint96 _selectorPosition, address _facetAddress ) internal { ds .selectorToFacetAndPosition[_selector] .functionSelectorPosition = _selectorPosition; ds.facetFunctionSelectors[_facetAddress].functionSelectors.push( _selector ); ds.selectorToFacetAndPosition[_selector].facetAddress = _facetAddress; } function initializeDiamondCut(address _init, bytes memory _calldata) internal { if (_init == address(0)) { require( _calldata.length == 0, "LibDiamondCut: _init is address(0) but_calldata is not empty" ); } else { require( _calldata.length > 0, "LibDiamondCut: _calldata is empty but _init is not address(0)" ); if (_init != address(this)) { enforceHasContractCode( _init, "LibDiamondCut: _init address has no code" ); } (bool success, bytes memory error) = _init.delegatecall(_calldata); if (!success) { if (error.length > 0) { // bubble up the error revert(string(error)); } else { revert("LibDiamondCut: _init function reverted"); } } } } function enforceHasContractCode( address _contract, string memory _errorMessage ) internal view { uint256 contractSize; assembly { contractSize := extcodesize(_contract) } require(contractSize > 0, _errorMessage); } function setFacetSupportsInterface(bytes4 _interface, address _facetAddress) internal { checkFacetSupported(_facetAddress); DiamondSawStorage storage ds = diamondSawStorage(); ds.interfaceToFacet[_interface] = _facetAddress; } function isFacetSupported(address _facetAddress) internal view returns (bool) { return diamondSawStorage() .facetFunctionSelectors[_facetAddress] .functionSelectors .length > 0; } function checkFacetSupported(address _facetAddress) internal view { require(isFacetSupported(_facetAddress), "Facet not supported"); } function approveTransferHookSelector(bytes4 transferHookSelector) internal { DiamondSawStorage storage s = diamondSawStorage(); address facetImplementation = s .selectorToFacetAndPosition[transferHookSelector] .facetAddress; require( facetImplementation != address(0), "Cannot set transfer hook to unsupported selector" ); s.approvedTransferHookFunctionSelectors[transferHookSelector] = true; } function approveTokenURISelector(bytes4 tokenURISelector) internal { DiamondSawStorage storage s = diamondSawStorage(); address facetImplementation = s .selectorToFacetAndPosition[tokenURISelector] .facetAddress; require( facetImplementation != address(0), "Cannot set token uri override to unsupported selector" ); s.approvedTokenURIFunctionSelectors[tokenURISelector] = true; } function setUpgradeSawAddress(address _upgradeSaw) internal { diamondSawStorage().supportedSawAddresses[_upgradeSaw] = true; } }
// SPDX-License-Identifier: MIT import "@openzeppelin/contracts/utils/Strings.sol"; import {IAccessControl} from "@openzeppelin/contracts/access/IAccessControl.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; pragma solidity ^0.8.0; library AccessControlLib { bytes32 constant DEFAULT_ADMIN_ROLE = 0x00; bytes32 constant OPERATOR_ROLE = keccak256("operator.role"); /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged( bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole ); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted( bytes32 indexed role, address indexed account, address indexed sender ); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked( bytes32 indexed role, address indexed account, address indexed sender ); event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); struct RoleData { mapping(address => bool) members; bytes32 adminRole; } struct AccessControlStorage { address _owner; mapping(bytes32 => RoleData) _roles; } bytes32 constant ACCESS_CONTROL_STORAGE_POSITION = keccak256("Access.Control.library.storage"); function accessControlStorage() internal pure returns (AccessControlStorage storage s) { bytes32 position = ACCESS_CONTROL_STORAGE_POSITION; assembly { s.slot := position } } function _isOwner() internal view returns (bool) { return accessControlStorage()._owner == msg.sender; } function owner() internal view returns (address) { return accessControlStorage()._owner; } function _enforceOwner() internal view { require(_isOwner(), "Caller is not the owner"); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal { address oldOwner = accessControlStorage()._owner; accessControlStorage()._owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, msg.sender); _; } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) internal view returns (bool) { return accessControlStorage()._roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * NOTE: Modified to always pass if the account is the owner * and to always fail if ownership is revoked! */ function _checkRole(bytes32 role, address account) internal view { address ownerAddress = accessControlStorage()._owner; require(ownerAddress != address(0), "Admin functionality revoked"); if (!hasRole(role, account) && account != ownerAddress) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) internal view returns (bytes32) { return accessControlStorage()._roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) internal onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) internal onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) internal { require( account == msg.sender, "AccessControl: can only renounce roles for self" ); _revokeRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal { bytes32 previousAdminRole = getRoleAdmin(role); accessControlStorage()._roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. */ function _grantRole(bytes32 role, address account) internal { if (!hasRole(role, account)) { accessControlStorage()._roles[role].members[account] = true; emit RoleGranted(role, account, msg.sender); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. */ function _revokeRole(bytes32 role, address account) internal { if (hasRole(role, account)) { accessControlStorage()._roles[role].members[account] = false; emit RoleRevoked(role, account, msg.sender); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {PausableLib} from "./PausableLib.sol"; abstract contract PausableModifiers { /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { PausableLib.enforceUnpaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { PausableLib.enforcePaused(); _; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { 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 "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; error ContractPaused(); error ContractUnpaused(); library PausableLib { bytes32 constant PAUSABLE_STORAGE_POSITION = keccak256("pausable.facet.storage"); /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); struct PausableStorage { bool _paused; } function pausableStorage() internal pure returns (PausableStorage storage s) { bytes32 position = PAUSABLE_STORAGE_POSITION; assembly { s.slot := position } } /** * @dev Returns true if the contract is paused, and false otherwise. */ function _paused() internal view returns (bool) { return pausableStorage()._paused; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal { PausableStorage storage s = pausableStorage(); if (s._paused) revert ContractPaused(); s._paused = true; emit Paused(msg.sender); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal { PausableStorage storage s = pausableStorage(); if (!s._paused) revert ContractUnpaused(); s._paused = false; emit Unpaused(msg.sender); } function enforceUnpaused() internal view { if (pausableStorage()._paused) revert ContractPaused(); } function enforcePaused() internal view { if (!pausableStorage()._paused) revert ContractUnpaused(); } }
// 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 IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IERC165 { /// @notice Query if a contract implements an interface /// @param interfaceId The interface identifier, as specified in ERC-165 /// @dev Interface identification is specified in ERC-165. This function /// uses less than 30,000 gas. /// @return `true` if the contract implements `interfaceID` and /// `interfaceID` is not 0xffffffff, `false` otherwise function supportsInterface(bytes4 interfaceId) external view returns (bool); }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"name":"ContractPaused","type":"error"},{"inputs":[],"name":"ContractUnpaused","type":"error"},{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"facetAddress","type":"address"},{"internalType":"enum IDiamondCut.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"functionSelectors","type":"bytes4[]"}],"indexed":false,"internalType":"struct IDiamondCut.FacetCut[]","name":"_diamondCut","type":"tuple[]"},{"indexed":false,"internalType":"address","name":"_init","type":"address"},{"indexed":false,"internalType":"bytes","name":"_calldata","type":"bytes"}],"name":"DiamondCut","type":"event"},{"inputs":[{"components":[{"internalType":"address","name":"facetAddress","type":"address"},{"internalType":"enum IDiamondCut.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"functionSelectors","type":"bytes4[]"}],"internalType":"struct IDiamondCut.FacetCut[]","name":"_diamondCut","type":"tuple[]"},{"internalType":"address","name":"_init","type":"address"},{"internalType":"bytes","name":"_calldata","type":"bytes"}],"name":"diamondCut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_functionSelector","type":"bytes4"}],"name":"facetAddress","outputs":[{"internalType":"address","name":"facetAddress_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"facetAddresses","outputs":[{"internalType":"address[]","name":"facetAddresses_","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_facet","type":"address"}],"name":"facetFunctionSelectors","outputs":[{"internalType":"bytes4[]","name":"facetFunctionSelectors_","type":"bytes4[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"facets","outputs":[{"components":[{"internalType":"address","name":"facetAddress","type":"address"},{"internalType":"bytes4[]","name":"functionSelectors","type":"bytes4[]"}],"internalType":"struct IDiamondLoupe.Facet[]","name":"facets_","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"gasCacheForSelector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"grantOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"immutableUntilBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"diamondSawAddress","type":"address"},{"internalType":"address[]","name":"facetAddresses","type":"address[]"}],"name":"initializeDiamondClone","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"revokeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"setGasCacheForSelector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"setImmutableUntilBlock","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":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_upgradeSaw","type":"address"},{"internalType":"address[]","name":"_oldFacetAddresses","type":"address[]"},{"internalType":"address[]","name":"_newFacetAddresses","type":"address[]"},{"internalType":"address","name":"_init","type":"address"},{"internalType":"bytes","name":"_calldata","type":"bytes"}],"name":"upgradeDiamondSaw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50615422806100206000396000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c80637a0ed627116100ad578063cdffacc611610071578063cdffacc6146102e5578063e348da1314610315578063f2fde38b14610331578063f44a9d521461034d578063fad8b32a146103695761012c565b80637a0ed6271461023f5780638456cb591461025d5780638da5cb5b14610267578063adfca15e14610285578063cb6a11b7146102b55761012c565b80633f4ba83a116100f45780633f4ba83a146101d35780634ae76e33146101dd57806352ef6b2c146101f95780635c975abb14610217578063715018a6146102355761012c565b806301ffc9a7146101315780631cfad9f3146101615780631e87e4f31461017d5780631f931c1c1461019b57806339d72577146101b7575b600080fd5b61014b60048036038101906101469190613cb6565b610385565b60405161015891906145bc565b60405180910390f35b61017b60048036038101906101769190613cdf565b61049b565b005b6101856104f7565b60405161019291906148b4565b60405180910390f35b6101b560048036038101906101b09190613bc3565b610506565b005b6101d160048036038101906101cc9190613cb6565b610575565b005b6101db6105ab565b005b6101f760048036038101906101f29190613a75565b6105bd565b005b6102016105df565b60405161020e91906144cc565b60405180910390f35b61021f6105ee565b60405161022c91906145bc565b60405180910390f35b61023d6105fd565b005b610247610619565b604051610254919061459a565b60405180910390f35b610265610628565b005b61026f61063a565b60405161027c91906144b1565b60405180910390f35b61029f600480360381019061029a91906139cb565b61066d565b6040516102ac91906144ee565b60405180910390f35b6102cf60048036038101906102ca9190613cb6565b610735565b6040516102dc91906144b1565b60405180910390f35b6102ff60048036038101906102fa9190613cb6565b6107b9565b60405161030c91906144b1565b60405180910390f35b61032f600480360381019061032a91906139cb565b61087b565b005b61034b600480360381019061034691906139cb565b6108b8565b005b61036760048036038101906103629190613a1d565b610944565b005b610383600480360381019061037e91906139cb565b61095c565b005b600080610390610999565b905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166301feb472856040518263ffffffff1660e01b81526004016103f191906145d7565b60206040518083038186803b15801561040957600080fd5b505afa15801561041d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061044191906139f4565b90508160010160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1692505050919050565b6104a36109c6565b6104ab610a0f565b156104eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104e2906147b4565b60405180910390fd5b6104f481610a24565b50565b6000610501610a37565b905090565b61050e6109c6565b610516610a0f565b15610556576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161054d906147d4565b60405180910390fd5b61056e8585906105669190614c47565b848484610a4a565b5050505050565b61059f7fb905253714c57beb31c9b4f35be6565322dce8a529999da99d3bd3479785d83e33611000565b6105a881611178565b50565b6105b36109c6565b6105bb6113ca565b565b6105c56109c6565b6105d58888888888888888611475565b5050505050505050565b60606105e9611f7a565b905090565b60006105f8612226565b905090565b610605612246565b61060d6109c6565b6106176000612298565b565b6060610623612370565b905090565b6106306109c6565b6106386125fd565b565b60006106446126a9565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606000610679610999565b90508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166383372a71846040518263ffffffff1660e01b81526004016106d891906144b1565b60006040518083038186803b1580156106f057600080fd5b505afa158015610704573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061072d9190613b82565b915050919050565b600061073f610999565b6003016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000806107c4610999565b90508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314bc7560846040518263ffffffff1660e01b815260040161082391906145d7565b60206040518083038186803b15801561083b57600080fd5b505afa15801561084f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087391906139f4565b915050919050565b610883612246565b61088b6109c6565b6108b57fb905253714c57beb31c9b4f35be6565322dce8a529999da99d3bd3479785d83e826126d6565b50565b6108c0612246565b6108c86109c6565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092f90614674565b60405180910390fd5b61094181612298565b50565b61094c6109c6565b6109578383836126f8565b505050565b610964612246565b61096c6109c6565b6109967fb905253714c57beb31c9b4f35be6565322dce8a529999da99d3bd3479785d83e82612bd4565b50565b6000807ff8a1c6908b780da9d81bb8be40154a49e4eccafd820fcb10aeac624fcb8e2f8990508091505090565b6109ce612bf6565b610a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0490614654565b60405180910390fd5b565b6000610a19610999565b600401544310905090565b80610a2d610999565b6004018190555050565b6000610a41610999565b60040154905090565b6000610a54610999565b905060008160020154905060005b8651811015610eb9576000878281518110610aa6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905060008460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166383372a7183600001516040518263ffffffff1660e01b8152600401610b1391906144b1565b60006040518083038186803b158015610b2b57600080fd5b505afa158015610b3f573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610b689190613b82565b90506000815111610bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba590614874565b60405180910390fd5b816040015151815114610bf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bed90614894565b60405180910390fd5b808260400181905250846001016000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610d7f57600280811115610c90577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b82602001516002811115610ccd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14610d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0490614814565b60405180910390fd5b846001016000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055610d6b81612c57565b600184610d789190614b8c565b9350610ea4565b60006002811115610db9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b82602001516002811115610df6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14610e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2d90614854565b60405180910390fd5b6001856001016000846000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600184610ea19190614adc565b93505b50508080610eb190614d0b565b915050610a62565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb67386868686604051610eef9493929190614510565b60405180910390a16000808673ffffffffffffffffffffffffffffffffffffffff168686604051610f2192919061445e565b600060405180830381855af49150503d8060008114610f5c576040519150601f19603f3d011682016040523d82523d6000602084013e610f61565b606091505b509150915081610fed57600081511115610fb257806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa991906145f2565b60405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe490614774565b60405180910390fd5b8284600201819055505050505050505050565b600061100a6126a9565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614634565b60405180910390fd5b6110aa8383612e25565b1580156110e357508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15611173576111098273ffffffffffffffffffffffffffffffffffffffff166014612e99565b6111178460001c6020612e99565b604051602001611128929190614477565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116a91906145f2565b60405180910390fd5b505050565b6000611182610999565b905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314bc7560846040518263ffffffff1660e01b81526004016111e391906145d7565b60206040518083038186803b1580156111fb57600080fd5b505afa15801561120f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123391906139f4565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129c906146d4565b60405180910390fd5b8160010160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611333576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132a90614834565b60405180910390fd5b80826003016000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b60006113d4613193565b90508060000160009054906101000a900460ff1661141e576040517f0e5e3b3f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008160000160006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa3360405161146a91906144b1565b60405180910390a150565b61147d610a0f565b156114bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b490614734565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16141561152d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152490614754565b60405180910390fd5b6000611537610999565b905080600201548888905014611582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157990614694565b60405180910390fd5b60008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166324ca5e1f8b6040518263ffffffff1660e01b81526004016115e491906144b1565b60206040518083038186803b1580156115fc57600080fd5b505afa158015611610573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116349190613c8d565b611673576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166a906146f4565b60405180910390fd5b60008a90506000888890508b8b905061168c9190614adc565b67ffffffffffffffff8111156116cb577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561170457816020015b6116f16133e7565b8152602001906001900390816116e95790505b50905060005b898990508c8c905061171c9190614adc565b811015611de7578b8b9050811015611ac35760008c8c83818110611769577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060200201602081019061177e91906139cb565b90508560010160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661180e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611805906146b4565b60405180910390fd5b60008573ffffffffffffffffffffffffffffffffffffffff166383372a71836040518263ffffffff1660e01b815260040161184991906144b1565b60006040518083038186803b15801561186157600080fd5b505afa158015611875573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061189e9190613b82565b905060008151116118e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118db90614874565b60405180910390fd5b600284848151811061191f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151602001906002811115611963577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9081600281111561199d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81525050818484815181106119db577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080848481518110611a53577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160400181905250611a6b81612c57565b8660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690555050611dd4565b60008a8a8e8e905084611ad69190614b8c565b818110611b0c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190611b2191906139cb565b905060008473ffffffffffffffffffffffffffffffffffffffff166383372a71836040518263ffffffff1660e01b8152600401611b5e91906144b1565b60006040518083038186803b158015611b7657600080fd5b505afa158015611b8a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611bb39190613b82565b90506000815111611bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf0906147f4565b60405180910390fd5b6000848481518110611c34577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151602001906002811115611c78577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b90816002811115611cb2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8152505081848481518110611cf0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080848481518110611d68577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040018190525060018760010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050505b8080611ddf90614d0b565b91505061170a565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb67381888888604051611e1d9493929190614510565b60405180910390a18888905084600201819055508b8460000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000808873ffffffffffffffffffffffffffffffffffffffff168888604051611e9e92919061445e565b600060405180830381855af49150503d8060008114611ed9576040519150601f19603f3d011682016040523d82523d6000602084013e611ede565b606091505b509150915081611f6a57600081511115611f2f57806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2691906145f2565b60405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6190614774565b60405180910390fd5b5050505050505050505050505050565b60606000611f86610999565b905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638f7e19506040518163ffffffff1660e01b815260040160006040518083038186803b158015611ff457600080fd5b505afa158015612008573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906120319190613b41565b9050816002015467ffffffffffffffff811115612077577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156120a55781602001602082028036833780820191505090505b5092506000805b825181101561221f578360010160008483815181106120f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561220c57828181518110612182577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518583815181106121c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050818061220890614d0b565b9250505b808061221790614d0b565b9150506120ac565b5050505090565b6000612230613193565b60000160009054906101000a900460ff16905090565b61224e613193565b60000160009054906101000a900460ff1615612296576040517fab35696f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b60006122a26126a9565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816122d16126a9565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6060600061237c610999565b905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166355a2cd0b6040518163ffffffff1660e01b815260040160006040518083038186803b1580156123ea57600080fd5b505afa1580156123fe573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906124279190613c4c565b90506000826002015467ffffffffffffffff81111561246f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156124a857816020015b612495613456565b81526020019060019003908161248d5790505b50935060005b82518110156125f6578360010160008483815181106124f6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156125e357828181518110612588577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518583815181106125c9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018190525081806125df90614d0b565b9250505b80806125ee90614d0b565b9150506124ae565b5050505090565b6000612607613193565b90508060000160009054906101000a900460ff1615612652576040517fab35696f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018160000160006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2583360405161269e91906144b1565b60405180910390a150565b6000807f23a3985ff794c67d8d516a95b83c7dfb32e426521153078d1eadc4dc887e2d3e90508091505090565b6126df826131c0565b6126e98133611000565b6126f383836131e9565b505050565b6000612702610999565b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276b90614794565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612807576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127fe90614714565b60405180910390fd5b61280f6132cc565b838160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008383905067ffffffffffffffff811115612897577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156128d057816020015b6128bd6133e7565b8152602001906001900390816128b55790505b50905060005b84849050811015612b8657600085858381811061291c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060200201602081019061293191906139cb565b905060008773ffffffffffffffffffffffffffffffffffffffff166383372a71836040518263ffffffff1660e01b815260040161296e91906144b1565b60006040518083038186803b15801561298657600080fd5b505afa15801561299a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906129c39190613b82565b90506000815111612a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0090614874565b60405180910390fd5b868684818110612a42577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190612a5791906139cb565b848481518110612a90577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080848481518110612b08577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040018190525060018560010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050508080612b7e90614d0b565b9150506128d6565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb673816000604051612bb9929190614557565b60405180910390a18383905082600201819055505050505050565b612bdd826131c0565b612be78133611000565b612bf18383613303565b505050565b60003373ffffffffffffffffffffffffffffffffffffffff16612c176126a9565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905090565b6000612c61610999565b905060005b8251811015612e2057600073ffffffffffffffffffffffffffffffffffffffff16826003016000858481518110612cc6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612e0d57816003016000848381518110612d95577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b8080612e1890614d0b565b915050612c66565b505050565b6000612e2f6126a9565b600101600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060006002836002612eac9190614b32565b612eb69190614adc565b67ffffffffffffffff811115612ef5577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612f275781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612f85577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061300f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261304f9190614b32565b6130599190614adc565b90505b6001811115613145577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106130c1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b8282815181106130fe577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061313e90614cb0565b905061305c565b5060008414613189576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318090614614565b60405180910390fd5b8091505092915050565b6000807f898bcb892ce96890816cc7d1ea86c592f314ff2e839268e378d8f279767ea82290508091505090565b60006131ca6126a9565b6001016000838152602001908152602001600020600101549050919050565b6131f38282612e25565b6132c85760016132016126a9565b600101600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000807f01a26df8f98be538b506e7341ca6cba96284d7be9a0bfd18f1c9c8aa652ad0299050809150600182600001819055505050565b61330d8282612e25565b156133e357600061331c6126a9565b600101600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160006002811115613449577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8152602001606081525090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b6000613499613494846148f4565b6148cf565b905080838252602082019050828560208602820111156134b857600080fd5b60005b858110156134e857816134ce88826136eb565b8452602084019350602083019250506001810190506134bb565b5050509392505050565b600061350561350084614920565b6148cf565b9050808382526020820190508285602086028201111561352457600080fd5b60005b85811015613554578161353a8882613851565b845260208401935060208301925050600181019050613527565b5050509392505050565b600061357161356c84614920565b6148cf565b9050808382526020820190508285602086028201111561359057600080fd5b60005b858110156135c057816135a68882613866565b845260208401935060208301925050600181019050613593565b5050509392505050565b60006135dd6135d88461494c565b6148cf565b905080838252602082019050828560208602820111156135fc57600080fd5b60005b8581101561364657813567ffffffffffffffff81111561361e57600080fd5b80860161362b89826138da565b855260208501945060208401935050506001810190506135ff565b5050509392505050565b600061366361365e84614978565b6148cf565b9050808382526020820190508285602086028201111561368257600080fd5b60005b858110156136cc57815167ffffffffffffffff8111156136a457600080fd5b8086016136b18982613952565b85526020850194506020840193505050600181019050613685565b5050509392505050565b6000813590506136e581615380565b92915050565b6000815190506136fa81615380565b92915050565b60008083601f84011261371257600080fd5b8235905067ffffffffffffffff81111561372b57600080fd5b60208301915083602082028301111561374357600080fd5b9250929050565b600082601f83011261375b57600080fd5b815161376b848260208601613486565b91505092915050565b600082601f83011261378557600080fd5b81356137958482602086016134f2565b91505092915050565b600082601f8301126137af57600080fd5b81516137bf84826020860161355e565b91505092915050565b60008083601f8401126137da57600080fd5b8235905067ffffffffffffffff8111156137f357600080fd5b60208301915083602082028301111561380b57600080fd5b9250929050565b600082601f83011261382357600080fd5b8151613833848260208601613650565b91505092915050565b60008151905061384b81615397565b92915050565b600081359050613860816153ae565b92915050565b600081519050613875816153ae565b92915050565b60008083601f84011261388d57600080fd5b8235905067ffffffffffffffff8111156138a657600080fd5b6020830191508360018202830111156138be57600080fd5b9250929050565b6000813590506138d4816153c5565b92915050565b6000606082840312156138ec57600080fd5b6138f660606148cf565b90506000613906848285016136d6565b600083015250602061391a848285016138c5565b602083015250604082013567ffffffffffffffff81111561393a57600080fd5b61394684828501613774565b60408301525092915050565b60006040828403121561396457600080fd5b61396e60406148cf565b9050600061397e848285016136eb565b600083015250602082015167ffffffffffffffff81111561399e57600080fd5b6139aa8482850161379e565b60208301525092915050565b6000813590506139c5816153d5565b92915050565b6000602082840312156139dd57600080fd5b60006139eb848285016136d6565b91505092915050565b600060208284031215613a0657600080fd5b6000613a14848285016136eb565b91505092915050565b600080600060408486031215613a3257600080fd5b6000613a40868287016136d6565b935050602084013567ffffffffffffffff811115613a5d57600080fd5b613a6986828701613700565b92509250509250925092565b60008060008060008060008060a0898b031215613a9157600080fd5b6000613a9f8b828c016136d6565b985050602089013567ffffffffffffffff811115613abc57600080fd5b613ac88b828c01613700565b9750975050604089013567ffffffffffffffff811115613ae757600080fd5b613af38b828c01613700565b95509550506060613b068b828c016136d6565b935050608089013567ffffffffffffffff811115613b2357600080fd5b613b2f8b828c0161387b565b92509250509295985092959890939650565b600060208284031215613b5357600080fd5b600082015167ffffffffffffffff811115613b6d57600080fd5b613b798482850161374a565b91505092915050565b600060208284031215613b9457600080fd5b600082015167ffffffffffffffff811115613bae57600080fd5b613bba8482850161379e565b91505092915050565b600080600080600060608688031215613bdb57600080fd5b600086013567ffffffffffffffff811115613bf557600080fd5b613c01888289016137c8565b95509550506020613c14888289016136d6565b935050604086013567ffffffffffffffff811115613c3157600080fd5b613c3d8882890161387b565b92509250509295509295909350565b600060208284031215613c5e57600080fd5b600082015167ffffffffffffffff811115613c7857600080fd5b613c8484828501613812565b91505092915050565b600060208284031215613c9f57600080fd5b6000613cad8482850161383c565b91505092915050565b600060208284031215613cc857600080fd5b6000613cd684828501613851565b91505092915050565b600060208284031215613cf157600080fd5b6000613cff848285016139b6565b91505092915050565b6000613d148383613d60565b60208301905092915050565b6000613d2c8383613f91565b60208301905092915050565b6000613d4483836143c2565b905092915050565b6000613d588383614412565b905092915050565b613d6981614bc0565b82525050565b613d7881614bc0565b82525050565b6000613d89826149e4565b613d938185614a4f565b9350613d9e836149a4565b8060005b83811015613dcf578151613db68882613d08565b9750613dc183614a1b565b925050600181019050613da2565b5085935050505092915050565b6000613de7826149ef565b613df18185614a60565b9350613dfc836149b4565b8060005b83811015613e2d578151613e148882613d20565b9750613e1f83614a28565b925050600181019050613e00565b5085935050505092915050565b6000613e45826149ef565b613e4f8185614a71565b9350613e5a836149b4565b8060005b83811015613e8b578151613e728882613d20565b9750613e7d83614a28565b925050600181019050613e5e565b5085935050505092915050565b6000613ea3826149fa565b613ead8185614a82565b935083602082028501613ebf856149c4565b8060005b85811015613efb5784840389528151613edc8582613d38565b9450613ee783614a35565b925060208a01995050600181019050613ec3565b50829750879550505050505092915050565b6000613f1882614a05565b613f228185614a93565b935083602082028501613f34856149d4565b8060005b85811015613f705784840389528151613f518582613d4c565b9450613f5c83614a42565b925060208a01995050600181019050613f38565b50829750879550505050505092915050565b613f8b81614bd2565b82525050565b613f9a81614bde565b82525050565b613fa981614bde565b82525050565b6000613fbb8385614aa4565b9350613fc8838584614c6e565b613fd183614de1565b840190509392505050565b6000613fe88385614ab5565b9350613ff5838584614c6e565b82840190509392505050565b61400a81614c5c565b82525050565b600061401b82614a10565b6140258185614ac0565b9350614035818560208601614c7d565b61403e81614de1565b840191505092915050565b600061405482614a10565b61405e8185614ad1565b935061406e818560208601614c7d565b80840191505092915050565b6000614087602083614ac0565b915061409282614df2565b602082019050919050565b60006140aa601b83614ac0565b91506140b582614e1b565b602082019050919050565b60006140cd601783614ac0565b91506140d882614e44565b602082019050919050565b60006140f0602683614ac0565b91506140fb82614e6d565b604082019050919050565b6000614113602583614ac0565b915061411e82614ebc565b604082019050919050565b6000614136602983614ac0565b915061414182614f0b565b604082019050919050565b6000614159601383614ac0565b915061416482614f5a565b602082019050919050565b600061417c601c83614ac0565b915061418782614f83565b602082019050919050565b600061419f600e83614ac0565b91506141aa82614fac565b602082019050919050565b60006141c2602d83614ac0565b91506141cd82614fd5565b604082019050919050565b60006141e5601e83614ac0565b91506141f082615024565b602082019050919050565b6000614208602883614ac0565b91506142138261504d565b604082019050919050565b600061422b601183614ac0565b91506142368261509c565b602082019050919050565b600061424e602a83614ac0565b9150614259826150c5565b604082019050919050565b6000614271602683614ac0565b915061427c82615114565b604082019050919050565b6000614294602583614ac0565b915061429f82615163565b604082019050919050565b60006142b7602883614ac0565b91506142c2826151b2565b604082019050919050565b60006142da600083614aa4565b91506142e582615201565b600082019050919050565b60006142fd601b83614ac0565b915061430882615204565b602082019050919050565b6000614320601783614ad1565b915061432b8261522d565b601782019050919050565b6000614343602983614ac0565b915061434e82615256565b604082019050919050565b6000614366602183614ac0565b9150614371826152a5565b604082019050919050565b6000614389601183614ad1565b9150614394826152f4565b601182019050919050565b60006143ac603a83614ac0565b91506143b78261531d565b604082019050919050565b60006060830160008301516143da6000860182613d60565b5060208301516143ed6020860182614001565b50604083015184820360408601526144058282613ddc565b9150508091505092915050565b600060408301600083015161442a6000860182613d60565b50602083015184820360208601526144428282613ddc565b9150508091505092915050565b61445881614c3d565b82525050565b600061446b828486613fdc565b91508190509392505050565b600061448282614313565b915061448e8285614049565b91506144998261437c565b91506144a58284614049565b91508190509392505050565b60006020820190506144c66000830184613d6f565b92915050565b600060208201905081810360008301526144e68184613d7e565b905092915050565b600060208201905081810360008301526145088184613e3a565b905092915050565b6000606082019050818103600083015261452a8187613e98565b90506145396020830186613d6f565b818103604083015261454c818486613faf565b905095945050505050565b600060608201905081810360008301526145718185613e98565b90506145806020830184613d6f565b8181036040830152614591816142cd565b90509392505050565b600060208201905081810360008301526145b48184613f0d565b905092915050565b60006020820190506145d16000830184613f82565b92915050565b60006020820190506145ec6000830184613fa0565b92915050565b6000602082019050818103600083015261460c8184614010565b905092915050565b6000602082019050818103600083015261462d8161407a565b9050919050565b6000602082019050818103600083015261464d8161409d565b9050919050565b6000602082019050818103600083015261466d816140c0565b9050919050565b6000602082019050818103600083015261468d816140e3565b9050919050565b600060208201905081810360008301526146ad81614106565b9050919050565b600060208201905081810360008301526146cd81614129565b9050919050565b600060208201905081810360008301526146ed8161414c565b9050919050565b6000602082019050818103600083015261470d8161416f565b9050919050565b6000602082019050818103600083015261472d81614192565b9050919050565b6000602082019050818103600083015261474d816141b5565b9050919050565b6000602082019050818103600083015261476d816141d8565b9050919050565b6000602082019050818103600083015261478d816141fb565b9050919050565b600060208201905081810360008301526147ad8161421e565b9050919050565b600060208201905081810360008301526147cd81614241565b9050919050565b600060208201905081810360008301526147ed81614264565b9050919050565b6000602082019050818103600083015261480d81614287565b9050919050565b6000602082019050818103600083015261482d816142aa565b9050919050565b6000602082019050818103600083015261484d816142f0565b9050919050565b6000602082019050818103600083015261486d81614336565b9050919050565b6000602082019050818103600083015261488d81614359565b9050919050565b600060208201905081810360008301526148ad8161439f565b9050919050565b60006020820190506148c9600083018461444f565b92915050565b60006148d96148ea565b90506148e58282614cda565b919050565b6000604051905090565b600067ffffffffffffffff82111561490f5761490e614db2565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561493b5761493a614db2565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561496757614966614db2565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561499357614992614db2565b5b602082029050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614ae782614c3d565b9150614af283614c3d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b2757614b26614d54565b5b828201905092915050565b6000614b3d82614c3d565b9150614b4883614c3d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b8157614b80614d54565b5b828202905092915050565b6000614b9782614c3d565b9150614ba283614c3d565b925082821015614bb557614bb4614d54565b5b828203905092915050565b6000614bcb82614c1d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050614c188261536c565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614c543684846135ca565b905092915050565b6000614c6782614c0a565b9050919050565b82818337600083830152505050565b60005b83811015614c9b578082015181840152602081019050614c80565b83811115614caa576000848401525b50505050565b6000614cbb82614c3d565b91506000821415614ccf57614cce614d54565b5b600182039050919050565b614ce382614de1565b810181811067ffffffffffffffff82111715614d0257614d01614db2565b5b80604052505050565b6000614d1682614c3d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d4957614d48614d54565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f41646d696e2066756e6374696f6e616c697479207265766f6b65640000000000600082015250565b7f43616c6c6572206973206e6f7420746865206f776e6572000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d7573742072656d6f766520616c6c2066616365747320746f2075706772616460008201527f6520736177000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f742072656d6f76652066616365742074686174206973206e6f742060008201527f737570706f727465640000000000000000000000000000000000000000000000602082015250565b7f4661636574206e6f7420737570706f7274656400000000000000000000000000600082015250565b7f5570677261646520736177206973206e6f7420737570706f7274656400000000600082015250565b7f416c726561647920696e69746564000000000000000000000000000000000000600082015250565b7f43616e6e6f7420757067726164652073617720647572696e6720696d6d75746160008201527f62696c6974792077696e646f7700000000000000000000000000000000000000602082015250565b7f43616e6e6f74207365742073617720746f207a65726f20616464726573730000600082015250565b7f4469616d6f6e64436c6f6e654c69623a205f696e69742066756e6374696f6e2060008201527f7265766572746564000000000000000000000000000000000000000000000000602082015250565b7f4d75737420736574207361772061646479000000000000000000000000000000600082015250565b7f43616e6e6f742073657420696d6d757461626c6520626c6f636b207768696c6560008201527f20696d6d757461626c6500000000000000000000000000000000000000000000602082015250565b7f43616e6e6f742063757420746865206469616d6f6e64207768696c6520696d6d60008201527f757461626c650000000000000000000000000000000000000000000000000000602082015250565b7f4661636574206973206e6f7420737570706f7274656420627920746865206e6560008201527f7720736177000000000000000000000000000000000000000000000000000000602082015250565b7f43616e206f6e6c792072656d6f7665206578697374696e67206661636574207360008201527f656c6563746f7273000000000000000000000000000000000000000000000000602082015250565b50565b7f4661636574206e6f7420696e636c7564656420696e20636c6f6e650000000000600082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f43616e206f6e6c7920616464206e6f6e2d6578697374696e672066616365742060008201527f73656c6563746f72730000000000000000000000000000000000000000000000602082015250565b7f4661636574206973206e6f7420737570706f727465642062792074686520736160008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f596f752063616e206f6e6c79206d6f6469667920616c6c2073656c6563746f7260008201527f73206174206f6e63652077697468206469616d6f6e6420736177000000000000602082015250565b6003811061537d5761537c614d83565b5b50565b61538981614bc0565b811461539457600080fd5b50565b6153a081614bd2565b81146153ab57600080fd5b50565b6153b781614bde565b81146153c257600080fd5b50565b600381106153d257600080fd5b50565b6153de81614c3d565b81146153e957600080fd5b5056fea2646970667358221220e73e1fd31f0ddef3498361e85285bb31ca5a0bb50f44906e287f1417f235abce64736f6c63430008040033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061012c5760003560e01c80637a0ed627116100ad578063cdffacc611610071578063cdffacc6146102e5578063e348da1314610315578063f2fde38b14610331578063f44a9d521461034d578063fad8b32a146103695761012c565b80637a0ed6271461023f5780638456cb591461025d5780638da5cb5b14610267578063adfca15e14610285578063cb6a11b7146102b55761012c565b80633f4ba83a116100f45780633f4ba83a146101d35780634ae76e33146101dd57806352ef6b2c146101f95780635c975abb14610217578063715018a6146102355761012c565b806301ffc9a7146101315780631cfad9f3146101615780631e87e4f31461017d5780631f931c1c1461019b57806339d72577146101b7575b600080fd5b61014b60048036038101906101469190613cb6565b610385565b60405161015891906145bc565b60405180910390f35b61017b60048036038101906101769190613cdf565b61049b565b005b6101856104f7565b60405161019291906148b4565b60405180910390f35b6101b560048036038101906101b09190613bc3565b610506565b005b6101d160048036038101906101cc9190613cb6565b610575565b005b6101db6105ab565b005b6101f760048036038101906101f29190613a75565b6105bd565b005b6102016105df565b60405161020e91906144cc565b60405180910390f35b61021f6105ee565b60405161022c91906145bc565b60405180910390f35b61023d6105fd565b005b610247610619565b604051610254919061459a565b60405180910390f35b610265610628565b005b61026f61063a565b60405161027c91906144b1565b60405180910390f35b61029f600480360381019061029a91906139cb565b61066d565b6040516102ac91906144ee565b60405180910390f35b6102cf60048036038101906102ca9190613cb6565b610735565b6040516102dc91906144b1565b60405180910390f35b6102ff60048036038101906102fa9190613cb6565b6107b9565b60405161030c91906144b1565b60405180910390f35b61032f600480360381019061032a91906139cb565b61087b565b005b61034b600480360381019061034691906139cb565b6108b8565b005b61036760048036038101906103629190613a1d565b610944565b005b610383600480360381019061037e91906139cb565b61095c565b005b600080610390610999565b905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166301feb472856040518263ffffffff1660e01b81526004016103f191906145d7565b60206040518083038186803b15801561040957600080fd5b505afa15801561041d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061044191906139f4565b90508160010160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1692505050919050565b6104a36109c6565b6104ab610a0f565b156104eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104e2906147b4565b60405180910390fd5b6104f481610a24565b50565b6000610501610a37565b905090565b61050e6109c6565b610516610a0f565b15610556576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161054d906147d4565b60405180910390fd5b61056e8585906105669190614c47565b848484610a4a565b5050505050565b61059f7fb905253714c57beb31c9b4f35be6565322dce8a529999da99d3bd3479785d83e33611000565b6105a881611178565b50565b6105b36109c6565b6105bb6113ca565b565b6105c56109c6565b6105d58888888888888888611475565b5050505050505050565b60606105e9611f7a565b905090565b60006105f8612226565b905090565b610605612246565b61060d6109c6565b6106176000612298565b565b6060610623612370565b905090565b6106306109c6565b6106386125fd565b565b60006106446126a9565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606000610679610999565b90508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166383372a71846040518263ffffffff1660e01b81526004016106d891906144b1565b60006040518083038186803b1580156106f057600080fd5b505afa158015610704573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061072d9190613b82565b915050919050565b600061073f610999565b6003016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000806107c4610999565b90508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314bc7560846040518263ffffffff1660e01b815260040161082391906145d7565b60206040518083038186803b15801561083b57600080fd5b505afa15801561084f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087391906139f4565b915050919050565b610883612246565b61088b6109c6565b6108b57fb905253714c57beb31c9b4f35be6565322dce8a529999da99d3bd3479785d83e826126d6565b50565b6108c0612246565b6108c86109c6565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092f90614674565b60405180910390fd5b61094181612298565b50565b61094c6109c6565b6109578383836126f8565b505050565b610964612246565b61096c6109c6565b6109967fb905253714c57beb31c9b4f35be6565322dce8a529999da99d3bd3479785d83e82612bd4565b50565b6000807ff8a1c6908b780da9d81bb8be40154a49e4eccafd820fcb10aeac624fcb8e2f8990508091505090565b6109ce612bf6565b610a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0490614654565b60405180910390fd5b565b6000610a19610999565b600401544310905090565b80610a2d610999565b6004018190555050565b6000610a41610999565b60040154905090565b6000610a54610999565b905060008160020154905060005b8651811015610eb9576000878281518110610aa6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905060008460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166383372a7183600001516040518263ffffffff1660e01b8152600401610b1391906144b1565b60006040518083038186803b158015610b2b57600080fd5b505afa158015610b3f573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610b689190613b82565b90506000815111610bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba590614874565b60405180910390fd5b816040015151815114610bf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bed90614894565b60405180910390fd5b808260400181905250846001016000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610d7f57600280811115610c90577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b82602001516002811115610ccd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14610d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0490614814565b60405180910390fd5b846001016000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055610d6b81612c57565b600184610d789190614b8c565b9350610ea4565b60006002811115610db9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b82602001516002811115610df6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14610e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2d90614854565b60405180910390fd5b6001856001016000846000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600184610ea19190614adc565b93505b50508080610eb190614d0b565b915050610a62565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb67386868686604051610eef9493929190614510565b60405180910390a16000808673ffffffffffffffffffffffffffffffffffffffff168686604051610f2192919061445e565b600060405180830381855af49150503d8060008114610f5c576040519150601f19603f3d011682016040523d82523d6000602084013e610f61565b606091505b509150915081610fed57600081511115610fb257806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa991906145f2565b60405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe490614774565b60405180910390fd5b8284600201819055505050505050505050565b600061100a6126a9565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614634565b60405180910390fd5b6110aa8383612e25565b1580156110e357508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15611173576111098273ffffffffffffffffffffffffffffffffffffffff166014612e99565b6111178460001c6020612e99565b604051602001611128929190614477565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116a91906145f2565b60405180910390fd5b505050565b6000611182610999565b905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314bc7560846040518263ffffffff1660e01b81526004016111e391906145d7565b60206040518083038186803b1580156111fb57600080fd5b505afa15801561120f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123391906139f4565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129c906146d4565b60405180910390fd5b8160010160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611333576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132a90614834565b60405180910390fd5b80826003016000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b60006113d4613193565b90508060000160009054906101000a900460ff1661141e576040517f0e5e3b3f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008160000160006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa3360405161146a91906144b1565b60405180910390a150565b61147d610a0f565b156114bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b490614734565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16141561152d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152490614754565b60405180910390fd5b6000611537610999565b905080600201548888905014611582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157990614694565b60405180910390fd5b60008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166324ca5e1f8b6040518263ffffffff1660e01b81526004016115e491906144b1565b60206040518083038186803b1580156115fc57600080fd5b505afa158015611610573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116349190613c8d565b611673576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166a906146f4565b60405180910390fd5b60008a90506000888890508b8b905061168c9190614adc565b67ffffffffffffffff8111156116cb577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561170457816020015b6116f16133e7565b8152602001906001900390816116e95790505b50905060005b898990508c8c905061171c9190614adc565b811015611de7578b8b9050811015611ac35760008c8c83818110611769577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060200201602081019061177e91906139cb565b90508560010160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661180e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611805906146b4565b60405180910390fd5b60008573ffffffffffffffffffffffffffffffffffffffff166383372a71836040518263ffffffff1660e01b815260040161184991906144b1565b60006040518083038186803b15801561186157600080fd5b505afa158015611875573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061189e9190613b82565b905060008151116118e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118db90614874565b60405180910390fd5b600284848151811061191f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151602001906002811115611963577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9081600281111561199d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81525050818484815181106119db577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080848481518110611a53577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160400181905250611a6b81612c57565b8660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690555050611dd4565b60008a8a8e8e905084611ad69190614b8c565b818110611b0c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190611b2191906139cb565b905060008473ffffffffffffffffffffffffffffffffffffffff166383372a71836040518263ffffffff1660e01b8152600401611b5e91906144b1565b60006040518083038186803b158015611b7657600080fd5b505afa158015611b8a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611bb39190613b82565b90506000815111611bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf0906147f4565b60405180910390fd5b6000848481518110611c34577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151602001906002811115611c78577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b90816002811115611cb2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8152505081848481518110611cf0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080848481518110611d68577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040018190525060018760010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050505b8080611ddf90614d0b565b91505061170a565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb67381888888604051611e1d9493929190614510565b60405180910390a18888905084600201819055508b8460000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000808873ffffffffffffffffffffffffffffffffffffffff168888604051611e9e92919061445e565b600060405180830381855af49150503d8060008114611ed9576040519150601f19603f3d011682016040523d82523d6000602084013e611ede565b606091505b509150915081611f6a57600081511115611f2f57806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2691906145f2565b60405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6190614774565b60405180910390fd5b5050505050505050505050505050565b60606000611f86610999565b905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638f7e19506040518163ffffffff1660e01b815260040160006040518083038186803b158015611ff457600080fd5b505afa158015612008573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906120319190613b41565b9050816002015467ffffffffffffffff811115612077577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156120a55781602001602082028036833780820191505090505b5092506000805b825181101561221f578360010160008483815181106120f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561220c57828181518110612182577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518583815181106121c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050818061220890614d0b565b9250505b808061221790614d0b565b9150506120ac565b5050505090565b6000612230613193565b60000160009054906101000a900460ff16905090565b61224e613193565b60000160009054906101000a900460ff1615612296576040517fab35696f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b60006122a26126a9565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816122d16126a9565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6060600061237c610999565b905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166355a2cd0b6040518163ffffffff1660e01b815260040160006040518083038186803b1580156123ea57600080fd5b505afa1580156123fe573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906124279190613c4c565b90506000826002015467ffffffffffffffff81111561246f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156124a857816020015b612495613456565b81526020019060019003908161248d5790505b50935060005b82518110156125f6578360010160008483815181106124f6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156125e357828181518110612588577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518583815181106125c9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018190525081806125df90614d0b565b9250505b80806125ee90614d0b565b9150506124ae565b5050505090565b6000612607613193565b90508060000160009054906101000a900460ff1615612652576040517fab35696f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018160000160006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2583360405161269e91906144b1565b60405180910390a150565b6000807f23a3985ff794c67d8d516a95b83c7dfb32e426521153078d1eadc4dc887e2d3e90508091505090565b6126df826131c0565b6126e98133611000565b6126f383836131e9565b505050565b6000612702610999565b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276b90614794565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612807576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127fe90614714565b60405180910390fd5b61280f6132cc565b838160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008383905067ffffffffffffffff811115612897577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156128d057816020015b6128bd6133e7565b8152602001906001900390816128b55790505b50905060005b84849050811015612b8657600085858381811061291c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060200201602081019061293191906139cb565b905060008773ffffffffffffffffffffffffffffffffffffffff166383372a71836040518263ffffffff1660e01b815260040161296e91906144b1565b60006040518083038186803b15801561298657600080fd5b505afa15801561299a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906129c39190613b82565b90506000815111612a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0090614874565b60405180910390fd5b868684818110612a42577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190612a5791906139cb565b848481518110612a90577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080848481518110612b08577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040018190525060018560010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050508080612b7e90614d0b565b9150506128d6565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb673816000604051612bb9929190614557565b60405180910390a18383905082600201819055505050505050565b612bdd826131c0565b612be78133611000565b612bf18383613303565b505050565b60003373ffffffffffffffffffffffffffffffffffffffff16612c176126a9565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905090565b6000612c61610999565b905060005b8251811015612e2057600073ffffffffffffffffffffffffffffffffffffffff16826003016000858481518110612cc6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612e0d57816003016000848381518110612d95577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b8080612e1890614d0b565b915050612c66565b505050565b6000612e2f6126a9565b600101600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060006002836002612eac9190614b32565b612eb69190614adc565b67ffffffffffffffff811115612ef5577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612f275781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612f85577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061300f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261304f9190614b32565b6130599190614adc565b90505b6001811115613145577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106130c1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b8282815181106130fe577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061313e90614cb0565b905061305c565b5060008414613189576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318090614614565b60405180910390fd5b8091505092915050565b6000807f898bcb892ce96890816cc7d1ea86c592f314ff2e839268e378d8f279767ea82290508091505090565b60006131ca6126a9565b6001016000838152602001908152602001600020600101549050919050565b6131f38282612e25565b6132c85760016132016126a9565b600101600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000807f01a26df8f98be538b506e7341ca6cba96284d7be9a0bfd18f1c9c8aa652ad0299050809150600182600001819055505050565b61330d8282612e25565b156133e357600061331c6126a9565b600101600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160006002811115613449577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8152602001606081525090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b6000613499613494846148f4565b6148cf565b905080838252602082019050828560208602820111156134b857600080fd5b60005b858110156134e857816134ce88826136eb565b8452602084019350602083019250506001810190506134bb565b5050509392505050565b600061350561350084614920565b6148cf565b9050808382526020820190508285602086028201111561352457600080fd5b60005b85811015613554578161353a8882613851565b845260208401935060208301925050600181019050613527565b5050509392505050565b600061357161356c84614920565b6148cf565b9050808382526020820190508285602086028201111561359057600080fd5b60005b858110156135c057816135a68882613866565b845260208401935060208301925050600181019050613593565b5050509392505050565b60006135dd6135d88461494c565b6148cf565b905080838252602082019050828560208602820111156135fc57600080fd5b60005b8581101561364657813567ffffffffffffffff81111561361e57600080fd5b80860161362b89826138da565b855260208501945060208401935050506001810190506135ff565b5050509392505050565b600061366361365e84614978565b6148cf565b9050808382526020820190508285602086028201111561368257600080fd5b60005b858110156136cc57815167ffffffffffffffff8111156136a457600080fd5b8086016136b18982613952565b85526020850194506020840193505050600181019050613685565b5050509392505050565b6000813590506136e581615380565b92915050565b6000815190506136fa81615380565b92915050565b60008083601f84011261371257600080fd5b8235905067ffffffffffffffff81111561372b57600080fd5b60208301915083602082028301111561374357600080fd5b9250929050565b600082601f83011261375b57600080fd5b815161376b848260208601613486565b91505092915050565b600082601f83011261378557600080fd5b81356137958482602086016134f2565b91505092915050565b600082601f8301126137af57600080fd5b81516137bf84826020860161355e565b91505092915050565b60008083601f8401126137da57600080fd5b8235905067ffffffffffffffff8111156137f357600080fd5b60208301915083602082028301111561380b57600080fd5b9250929050565b600082601f83011261382357600080fd5b8151613833848260208601613650565b91505092915050565b60008151905061384b81615397565b92915050565b600081359050613860816153ae565b92915050565b600081519050613875816153ae565b92915050565b60008083601f84011261388d57600080fd5b8235905067ffffffffffffffff8111156138a657600080fd5b6020830191508360018202830111156138be57600080fd5b9250929050565b6000813590506138d4816153c5565b92915050565b6000606082840312156138ec57600080fd5b6138f660606148cf565b90506000613906848285016136d6565b600083015250602061391a848285016138c5565b602083015250604082013567ffffffffffffffff81111561393a57600080fd5b61394684828501613774565b60408301525092915050565b60006040828403121561396457600080fd5b61396e60406148cf565b9050600061397e848285016136eb565b600083015250602082015167ffffffffffffffff81111561399e57600080fd5b6139aa8482850161379e565b60208301525092915050565b6000813590506139c5816153d5565b92915050565b6000602082840312156139dd57600080fd5b60006139eb848285016136d6565b91505092915050565b600060208284031215613a0657600080fd5b6000613a14848285016136eb565b91505092915050565b600080600060408486031215613a3257600080fd5b6000613a40868287016136d6565b935050602084013567ffffffffffffffff811115613a5d57600080fd5b613a6986828701613700565b92509250509250925092565b60008060008060008060008060a0898b031215613a9157600080fd5b6000613a9f8b828c016136d6565b985050602089013567ffffffffffffffff811115613abc57600080fd5b613ac88b828c01613700565b9750975050604089013567ffffffffffffffff811115613ae757600080fd5b613af38b828c01613700565b95509550506060613b068b828c016136d6565b935050608089013567ffffffffffffffff811115613b2357600080fd5b613b2f8b828c0161387b565b92509250509295985092959890939650565b600060208284031215613b5357600080fd5b600082015167ffffffffffffffff811115613b6d57600080fd5b613b798482850161374a565b91505092915050565b600060208284031215613b9457600080fd5b600082015167ffffffffffffffff811115613bae57600080fd5b613bba8482850161379e565b91505092915050565b600080600080600060608688031215613bdb57600080fd5b600086013567ffffffffffffffff811115613bf557600080fd5b613c01888289016137c8565b95509550506020613c14888289016136d6565b935050604086013567ffffffffffffffff811115613c3157600080fd5b613c3d8882890161387b565b92509250509295509295909350565b600060208284031215613c5e57600080fd5b600082015167ffffffffffffffff811115613c7857600080fd5b613c8484828501613812565b91505092915050565b600060208284031215613c9f57600080fd5b6000613cad8482850161383c565b91505092915050565b600060208284031215613cc857600080fd5b6000613cd684828501613851565b91505092915050565b600060208284031215613cf157600080fd5b6000613cff848285016139b6565b91505092915050565b6000613d148383613d60565b60208301905092915050565b6000613d2c8383613f91565b60208301905092915050565b6000613d4483836143c2565b905092915050565b6000613d588383614412565b905092915050565b613d6981614bc0565b82525050565b613d7881614bc0565b82525050565b6000613d89826149e4565b613d938185614a4f565b9350613d9e836149a4565b8060005b83811015613dcf578151613db68882613d08565b9750613dc183614a1b565b925050600181019050613da2565b5085935050505092915050565b6000613de7826149ef565b613df18185614a60565b9350613dfc836149b4565b8060005b83811015613e2d578151613e148882613d20565b9750613e1f83614a28565b925050600181019050613e00565b5085935050505092915050565b6000613e45826149ef565b613e4f8185614a71565b9350613e5a836149b4565b8060005b83811015613e8b578151613e728882613d20565b9750613e7d83614a28565b925050600181019050613e5e565b5085935050505092915050565b6000613ea3826149fa565b613ead8185614a82565b935083602082028501613ebf856149c4565b8060005b85811015613efb5784840389528151613edc8582613d38565b9450613ee783614a35565b925060208a01995050600181019050613ec3565b50829750879550505050505092915050565b6000613f1882614a05565b613f228185614a93565b935083602082028501613f34856149d4565b8060005b85811015613f705784840389528151613f518582613d4c565b9450613f5c83614a42565b925060208a01995050600181019050613f38565b50829750879550505050505092915050565b613f8b81614bd2565b82525050565b613f9a81614bde565b82525050565b613fa981614bde565b82525050565b6000613fbb8385614aa4565b9350613fc8838584614c6e565b613fd183614de1565b840190509392505050565b6000613fe88385614ab5565b9350613ff5838584614c6e565b82840190509392505050565b61400a81614c5c565b82525050565b600061401b82614a10565b6140258185614ac0565b9350614035818560208601614c7d565b61403e81614de1565b840191505092915050565b600061405482614a10565b61405e8185614ad1565b935061406e818560208601614c7d565b80840191505092915050565b6000614087602083614ac0565b915061409282614df2565b602082019050919050565b60006140aa601b83614ac0565b91506140b582614e1b565b602082019050919050565b60006140cd601783614ac0565b91506140d882614e44565b602082019050919050565b60006140f0602683614ac0565b91506140fb82614e6d565b604082019050919050565b6000614113602583614ac0565b915061411e82614ebc565b604082019050919050565b6000614136602983614ac0565b915061414182614f0b565b604082019050919050565b6000614159601383614ac0565b915061416482614f5a565b602082019050919050565b600061417c601c83614ac0565b915061418782614f83565b602082019050919050565b600061419f600e83614ac0565b91506141aa82614fac565b602082019050919050565b60006141c2602d83614ac0565b91506141cd82614fd5565b604082019050919050565b60006141e5601e83614ac0565b91506141f082615024565b602082019050919050565b6000614208602883614ac0565b91506142138261504d565b604082019050919050565b600061422b601183614ac0565b91506142368261509c565b602082019050919050565b600061424e602a83614ac0565b9150614259826150c5565b604082019050919050565b6000614271602683614ac0565b915061427c82615114565b604082019050919050565b6000614294602583614ac0565b915061429f82615163565b604082019050919050565b60006142b7602883614ac0565b91506142c2826151b2565b604082019050919050565b60006142da600083614aa4565b91506142e582615201565b600082019050919050565b60006142fd601b83614ac0565b915061430882615204565b602082019050919050565b6000614320601783614ad1565b915061432b8261522d565b601782019050919050565b6000614343602983614ac0565b915061434e82615256565b604082019050919050565b6000614366602183614ac0565b9150614371826152a5565b604082019050919050565b6000614389601183614ad1565b9150614394826152f4565b601182019050919050565b60006143ac603a83614ac0565b91506143b78261531d565b604082019050919050565b60006060830160008301516143da6000860182613d60565b5060208301516143ed6020860182614001565b50604083015184820360408601526144058282613ddc565b9150508091505092915050565b600060408301600083015161442a6000860182613d60565b50602083015184820360208601526144428282613ddc565b9150508091505092915050565b61445881614c3d565b82525050565b600061446b828486613fdc565b91508190509392505050565b600061448282614313565b915061448e8285614049565b91506144998261437c565b91506144a58284614049565b91508190509392505050565b60006020820190506144c66000830184613d6f565b92915050565b600060208201905081810360008301526144e68184613d7e565b905092915050565b600060208201905081810360008301526145088184613e3a565b905092915050565b6000606082019050818103600083015261452a8187613e98565b90506145396020830186613d6f565b818103604083015261454c818486613faf565b905095945050505050565b600060608201905081810360008301526145718185613e98565b90506145806020830184613d6f565b8181036040830152614591816142cd565b90509392505050565b600060208201905081810360008301526145b48184613f0d565b905092915050565b60006020820190506145d16000830184613f82565b92915050565b60006020820190506145ec6000830184613fa0565b92915050565b6000602082019050818103600083015261460c8184614010565b905092915050565b6000602082019050818103600083015261462d8161407a565b9050919050565b6000602082019050818103600083015261464d8161409d565b9050919050565b6000602082019050818103600083015261466d816140c0565b9050919050565b6000602082019050818103600083015261468d816140e3565b9050919050565b600060208201905081810360008301526146ad81614106565b9050919050565b600060208201905081810360008301526146cd81614129565b9050919050565b600060208201905081810360008301526146ed8161414c565b9050919050565b6000602082019050818103600083015261470d8161416f565b9050919050565b6000602082019050818103600083015261472d81614192565b9050919050565b6000602082019050818103600083015261474d816141b5565b9050919050565b6000602082019050818103600083015261476d816141d8565b9050919050565b6000602082019050818103600083015261478d816141fb565b9050919050565b600060208201905081810360008301526147ad8161421e565b9050919050565b600060208201905081810360008301526147cd81614241565b9050919050565b600060208201905081810360008301526147ed81614264565b9050919050565b6000602082019050818103600083015261480d81614287565b9050919050565b6000602082019050818103600083015261482d816142aa565b9050919050565b6000602082019050818103600083015261484d816142f0565b9050919050565b6000602082019050818103600083015261486d81614336565b9050919050565b6000602082019050818103600083015261488d81614359565b9050919050565b600060208201905081810360008301526148ad8161439f565b9050919050565b60006020820190506148c9600083018461444f565b92915050565b60006148d96148ea565b90506148e58282614cda565b919050565b6000604051905090565b600067ffffffffffffffff82111561490f5761490e614db2565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561493b5761493a614db2565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561496757614966614db2565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561499357614992614db2565b5b602082029050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614ae782614c3d565b9150614af283614c3d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b2757614b26614d54565b5b828201905092915050565b6000614b3d82614c3d565b9150614b4883614c3d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b8157614b80614d54565b5b828202905092915050565b6000614b9782614c3d565b9150614ba283614c3d565b925082821015614bb557614bb4614d54565b5b828203905092915050565b6000614bcb82614c1d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050614c188261536c565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614c543684846135ca565b905092915050565b6000614c6782614c0a565b9050919050565b82818337600083830152505050565b60005b83811015614c9b578082015181840152602081019050614c80565b83811115614caa576000848401525b50505050565b6000614cbb82614c3d565b91506000821415614ccf57614cce614d54565b5b600182039050919050565b614ce382614de1565b810181811067ffffffffffffffff82111715614d0257614d01614db2565b5b80604052505050565b6000614d1682614c3d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d4957614d48614d54565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f41646d696e2066756e6374696f6e616c697479207265766f6b65640000000000600082015250565b7f43616c6c6572206973206e6f7420746865206f776e6572000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d7573742072656d6f766520616c6c2066616365747320746f2075706772616460008201527f6520736177000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f742072656d6f76652066616365742074686174206973206e6f742060008201527f737570706f727465640000000000000000000000000000000000000000000000602082015250565b7f4661636574206e6f7420737570706f7274656400000000000000000000000000600082015250565b7f5570677261646520736177206973206e6f7420737570706f7274656400000000600082015250565b7f416c726561647920696e69746564000000000000000000000000000000000000600082015250565b7f43616e6e6f7420757067726164652073617720647572696e6720696d6d75746160008201527f62696c6974792077696e646f7700000000000000000000000000000000000000602082015250565b7f43616e6e6f74207365742073617720746f207a65726f20616464726573730000600082015250565b7f4469616d6f6e64436c6f6e654c69623a205f696e69742066756e6374696f6e2060008201527f7265766572746564000000000000000000000000000000000000000000000000602082015250565b7f4d75737420736574207361772061646479000000000000000000000000000000600082015250565b7f43616e6e6f742073657420696d6d757461626c6520626c6f636b207768696c6560008201527f20696d6d757461626c6500000000000000000000000000000000000000000000602082015250565b7f43616e6e6f742063757420746865206469616d6f6e64207768696c6520696d6d60008201527f757461626c650000000000000000000000000000000000000000000000000000602082015250565b7f4661636574206973206e6f7420737570706f7274656420627920746865206e6560008201527f7720736177000000000000000000000000000000000000000000000000000000602082015250565b7f43616e206f6e6c792072656d6f7665206578697374696e67206661636574207360008201527f656c6563746f7273000000000000000000000000000000000000000000000000602082015250565b50565b7f4661636574206e6f7420696e636c7564656420696e20636c6f6e650000000000600082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f43616e206f6e6c7920616464206e6f6e2d6578697374696e672066616365742060008201527f73656c6563746f72730000000000000000000000000000000000000000000000602082015250565b7f4661636574206973206e6f7420737570706f727465642062792074686520736160008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f596f752063616e206f6e6c79206d6f6469667920616c6c2073656c6563746f7260008201527f73206174206f6e63652077697468206469616d6f6e6420736177000000000000602082015250565b6003811061537d5761537c614d83565b5b50565b61538981614bc0565b811461539457600080fd5b50565b6153a081614bd2565b81146153ab57600080fd5b50565b6153b781614bde565b81146153c257600080fd5b50565b600381106153d257600080fd5b50565b6153de81614c3d565b81146153e957600080fd5b5056fea2646970667358221220e73e1fd31f0ddef3498361e85285bb31ca5a0bb50f44906e287f1417f235abce64736f6c63430008040033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.