Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
Latest 8 from a total of 8 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Diamond Cut | 5671009 | 181 days ago | IN | 0 ETH | 0.00255978 | ||||
Diamond Cut | 5671007 | 181 days ago | IN | 0 ETH | 0.00035002 | ||||
Diamond Cut | 5671004 | 181 days ago | IN | 0 ETH | 0.00014122 | ||||
Diamond Cut | 5671000 | 181 days ago | IN | 0 ETH | 0.00015102 | ||||
Diamond Cut | 5670998 | 181 days ago | IN | 0 ETH | 0.00040695 | ||||
Diamond Cut | 5670995 | 181 days ago | IN | 0 ETH | 0.00024387 | ||||
Diamond Cut | 5670990 | 181 days ago | IN | 0 ETH | 0.00133442 | ||||
0x60806040 | 5670985 | 181 days ago | IN | 0 ETH | 0.00833024 |
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 Source Code Verified (Exact Match)
Contract Name:
MagicProxy
Compiler Version
v0.8.23+commit.f704f362
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import '@solidstate/contracts/proxy/diamond/Diamond.sol'; import '@solidstate/contracts/token/ERC20/metadata/ERC20MetadataStorage.sol'; contract MagicProxy is Diamond { constructor() { ERC20MetadataStorage.Layout storage l = ERC20MetadataStorage.layout(); l.name = 'MAGIC'; l.symbol = 'MAGIC'; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title Contract ownership standard interface * @dev see https://eips.ethereum.org/EIPS/eip-173 */ interface IERC173 { event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @notice get the ERC173 contract owner * @return conract owner */ function owner() external view returns (address); /** * @notice transfer contract ownership to new account * @param account address of new owner */ function transferOwnership(address account) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import { IERC173 } from './IERC173.sol'; import { OwnableInternal } from './OwnableInternal.sol'; import { OwnableStorage } from './OwnableStorage.sol'; /** * @title Ownership access control based on ERC173 */ abstract contract Ownable is IERC173, OwnableInternal { using OwnableStorage for OwnableStorage.Layout; /** * @inheritdoc IERC173 */ function owner() public view virtual override returns (address) { return OwnableStorage.layout().owner; } /** * @inheritdoc IERC173 */ function transferOwnership(address account) public virtual override onlyOwner { OwnableStorage.layout().setOwner(account); emit OwnershipTransferred(msg.sender, account); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import { OwnableStorage } from './OwnableStorage.sol'; abstract contract OwnableInternal { using OwnableStorage for OwnableStorage.Layout; modifier onlyOwner() { require( msg.sender == OwnableStorage.layout().owner, 'Ownable: sender must be owner' ); _; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; library OwnableStorage { struct Layout { address owner; } bytes32 internal constant STORAGE_SLOT = keccak256('solidstate.contracts.storage.Ownable'); function layout() internal pure returns (Layout storage l) { bytes32 slot = STORAGE_SLOT; assembly { l.slot := slot } } function setOwner(Layout storage l, address owner) internal { l.owner = owner; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import { Ownable, OwnableStorage } from './Ownable.sol'; import { SafeOwnableInternal } from './SafeOwnableInternal.sol'; import { SafeOwnableStorage } from './SafeOwnableStorage.sol'; /** * @title Ownership access control based on ERC173 with ownership transfer safety check */ abstract contract SafeOwnable is Ownable, SafeOwnableInternal { using OwnableStorage for OwnableStorage.Layout; using SafeOwnableStorage for SafeOwnableStorage.Layout; function nomineeOwner() public view virtual returns (address) { return SafeOwnableStorage.layout().nomineeOwner; } /** * @inheritdoc Ownable * @dev ownership transfer must be accepted by beneficiary before transfer is complete */ function transferOwnership(address account) public virtual override onlyOwner { SafeOwnableStorage.layout().setNomineeOwner(account); } /** * @notice accept transfer of contract ownership */ function acceptOwnership() public virtual onlyNomineeOwner { OwnableStorage.Layout storage l = OwnableStorage.layout(); emit OwnershipTransferred(l.owner, msg.sender); l.setOwner(msg.sender); SafeOwnableStorage.layout().setNomineeOwner(address(0)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import { SafeOwnableStorage } from './SafeOwnableStorage.sol'; abstract contract SafeOwnableInternal { using SafeOwnableStorage for SafeOwnableStorage.Layout; modifier onlyNomineeOwner() { require( msg.sender == SafeOwnableStorage.layout().nomineeOwner, 'SafeOwnable: sender must be nominee owner' ); _; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; library SafeOwnableStorage { struct Layout { address nomineeOwner; } bytes32 internal constant STORAGE_SLOT = keccak256('solidstate.contracts.storage.SafeOwnable'); function layout() internal pure returns (Layout storage l) { bytes32 slot = STORAGE_SLOT; assembly { l.slot := slot } } function setNomineeOwner(Layout storage l, address nomineeOwner) internal { l.nomineeOwner = nomineeOwner; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import { IERC165 } from './IERC165.sol'; import { ERC165Storage } from './ERC165Storage.sol'; /** * @title ERC165 implementation */ abstract contract ERC165 is IERC165 { using ERC165Storage for ERC165Storage.Layout; /** * @inheritdoc IERC165 */ function supportsInterface(bytes4 interfaceId) public view override returns (bool) { return ERC165Storage.layout().isSupportedInterface(interfaceId); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; library ERC165Storage { struct Layout { mapping(bytes4 => bool) supportedInterfaces; } bytes32 internal constant STORAGE_SLOT = keccak256('solidstate.contracts.storage.ERC165'); function layout() internal pure returns (Layout storage l) { bytes32 slot = STORAGE_SLOT; assembly { l.slot := slot } } function isSupportedInterface(Layout storage l, bytes4 interfaceId) internal view returns (bool) { return l.supportedInterfaces[interfaceId]; } function setSupportedInterface( Layout storage l, bytes4 interfaceId, bool status ) internal { require(interfaceId != 0xffffffff, 'ERC165: invalid interface id'); l.supportedInterfaces[interfaceId] = status; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title ERC165 interface registration interface * @dev see https://eips.ethereum.org/EIPS/eip-165 */ interface IERC165 { /** * @notice query whether contract has registered support for given interface * @param interfaceId interface id * @return bool whether interface is supported */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import { AddressUtils } from '../utils/AddressUtils.sol'; /** * @title Base proxy contract */ abstract contract Proxy { using AddressUtils for address; /** * @notice delegate all calls to implementation contract * @dev reverts if implementation address contains no code, for compatibility with metamorphic contracts * @dev memory location in use by assembly may be unsafe in other contexts */ fallback() external payable virtual { address implementation = _getImplementation(); require( implementation.isContract(), 'Proxy: implementation must be contract' ); assembly { calldatacopy(0, 0, calldatasize()) let result := delegatecall( gas(), implementation, 0, calldatasize(), 0, 0 ) returndatacopy(0, 0, returndatasize()) switch result case 0 { revert(0, returndatasize()) } default { return(0, returndatasize()) } } } /** * @notice get logic implementation address * @return implementation address */ function _getImplementation() internal virtual returns (address); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import { SafeOwnable, OwnableStorage, Ownable } from '../../access/SafeOwnable.sol'; import { IERC173 } from '../../access/IERC173.sol'; import { ERC165, IERC165, ERC165Storage } from '../../introspection/ERC165.sol'; import { DiamondBase, DiamondBaseStorage } from './DiamondBase.sol'; import { DiamondCuttable, IDiamondCuttable } from './DiamondCuttable.sol'; import { DiamondLoupe, IDiamondLoupe } from './DiamondLoupe.sol'; /** * @notice SolidState "Diamond" proxy reference implementation */ abstract contract Diamond is DiamondBase, DiamondCuttable, DiamondLoupe, SafeOwnable, ERC165 { using DiamondBaseStorage for DiamondBaseStorage.Layout; using ERC165Storage for ERC165Storage.Layout; using OwnableStorage for OwnableStorage.Layout; constructor() { ERC165Storage.Layout storage erc165 = ERC165Storage.layout(); bytes4[] memory selectors = new bytes4[](12); // register DiamondCuttable selectors[0] = IDiamondCuttable.diamondCut.selector; erc165.setSupportedInterface(type(IDiamondCuttable).interfaceId, true); // register DiamondLoupe selectors[1] = IDiamondLoupe.facets.selector; selectors[2] = IDiamondLoupe.facetFunctionSelectors.selector; selectors[3] = IDiamondLoupe.facetAddresses.selector; selectors[4] = IDiamondLoupe.facetAddress.selector; erc165.setSupportedInterface(type(IDiamondLoupe).interfaceId, true); // register ERC165 selectors[5] = IERC165.supportsInterface.selector; erc165.setSupportedInterface(type(IERC165).interfaceId, true); // register SafeOwnable selectors[6] = Ownable.owner.selector; selectors[7] = SafeOwnable.nomineeOwner.selector; selectors[8] = SafeOwnable.transferOwnership.selector; selectors[9] = SafeOwnable.acceptOwnership.selector; erc165.setSupportedInterface(type(IERC173).interfaceId, true); // register Diamond selectors[10] = Diamond.getFallbackAddress.selector; selectors[11] = Diamond.setFallbackAddress.selector; // diamond cut FacetCut[] memory facetCuts = new FacetCut[](1); facetCuts[0] = FacetCut({ target: address(this), action: IDiamondCuttable.FacetCutAction.ADD, selectors: selectors }); DiamondBaseStorage.layout().diamondCut(facetCuts, address(0), ''); // set owner OwnableStorage.layout().setOwner(msg.sender); } receive() external payable {} /** * @notice get the address of the fallback contract * @return fallback address */ function getFallbackAddress() external view returns (address) { return DiamondBaseStorage.layout().fallbackAddress; } /** * @notice set the address of the fallback contract * @param fallbackAddress fallback address */ function setFallbackAddress(address fallbackAddress) external onlyOwner { DiamondBaseStorage.layout().fallbackAddress = fallbackAddress; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import { Proxy } from '../Proxy.sol'; import { DiamondBaseStorage } from './DiamondBaseStorage.sol'; import { IDiamondLoupe } from './IDiamondLoupe.sol'; import { IDiamondCuttable } from './IDiamondCuttable.sol'; /** * @title EIP-2535 "Diamond" proxy base contract * @dev see https://eips.ethereum.org/EIPS/eip-2535 */ abstract contract DiamondBase is Proxy { /** * @inheritdoc Proxy */ function _getImplementation() internal view override returns (address) { // inline storage layout retrieval uses less gas DiamondBaseStorage.Layout storage l; bytes32 slot = DiamondBaseStorage.STORAGE_SLOT; assembly { l.slot := slot } address implementation = address(bytes20(l.facets[msg.sig])); if (implementation == address(0)) { implementation = l.fallbackAddress; require( implementation != address(0), 'DiamondBase: no facet found for function signature' ); } return implementation; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import { AddressUtils } from '../../utils/AddressUtils.sol'; import { IDiamondCuttable } from './IDiamondCuttable.sol'; /** * @dev derived from https://github.com/mudgen/diamond-2 (MIT license) */ library DiamondBaseStorage { using AddressUtils for address; using DiamondBaseStorage for DiamondBaseStorage.Layout; struct Layout { // function selector => (facet address, selector slot position) mapping(bytes4 => bytes32) facets; // total number of selectors registered uint16 selectorCount; // array of selector slots with 8 selectors per slot mapping(uint256 => bytes32) selectorSlots; address fallbackAddress; } bytes32 constant CLEAR_ADDRESS_MASK = bytes32(uint256(0xffffffffffffffffffffffff)); bytes32 constant CLEAR_SELECTOR_MASK = bytes32(uint256(0xffffffff << 224)); bytes32 internal constant STORAGE_SLOT = keccak256('solidstate.contracts.storage.DiamondBase'); event DiamondCut( IDiamondCuttable.FacetCut[] facetCuts, address target, bytes data ); function layout() internal pure returns (Layout storage l) { bytes32 slot = STORAGE_SLOT; assembly { l.slot := slot } } /** * @notice update functions callable on Diamond proxy * @param l storage layout * @param facetCuts array of structured Diamond facet update data * @param target optional recipient of initialization delegatecall * @param data optional initialization call data */ function diamondCut( Layout storage l, IDiamondCuttable.FacetCut[] memory facetCuts, address target, bytes memory data ) internal { unchecked { uint256 originalSelectorCount = l.selectorCount; uint256 selectorCount = originalSelectorCount; bytes32 selectorSlot; // Check if last selector slot is not full if (selectorCount & 7 > 0) { // get last selectorSlot selectorSlot = l.selectorSlots[selectorCount >> 3]; } for (uint256 i; i < facetCuts.length; i++) { IDiamondCuttable.FacetCut memory facetCut = facetCuts[i]; IDiamondCuttable.FacetCutAction action = facetCut.action; require( facetCut.selectors.length > 0, 'DiamondBase: no selectors specified' ); if (action == IDiamondCuttable.FacetCutAction.ADD) { (selectorCount, selectorSlot) = l.addFacetSelectors( selectorCount, selectorSlot, facetCut ); } else if (action == IDiamondCuttable.FacetCutAction.REMOVE) { (selectorCount, selectorSlot) = l.removeFacetSelectors( selectorCount, selectorSlot, facetCut ); } else if (action == IDiamondCuttable.FacetCutAction.REPLACE) { l.replaceFacetSelectors(facetCut); } } if (selectorCount != originalSelectorCount) { l.selectorCount = uint16(selectorCount); } // If last selector slot is not full if (selectorCount & 7 > 0) { l.selectorSlots[selectorCount >> 3] = selectorSlot; } emit DiamondCut(facetCuts, target, data); initialize(target, data); } } function addFacetSelectors( Layout storage l, uint256 selectorCount, bytes32 selectorSlot, IDiamondCuttable.FacetCut memory facetCut ) internal returns (uint256, bytes32) { unchecked { require( facetCut.target == address(this) || facetCut.target.isContract(), 'DiamondBase: ADD target has no code' ); for (uint256 i; i < facetCut.selectors.length; i++) { bytes4 selector = facetCut.selectors[i]; bytes32 oldFacet = l.facets[selector]; require( address(bytes20(oldFacet)) == address(0), 'DiamondBase: selector already added' ); // add facet for selector l.facets[selector] = bytes20(facetCut.target) | bytes32(selectorCount); uint256 selectorInSlotPosition = (selectorCount & 7) << 5; // clear selector position in slot and add selector selectorSlot = (selectorSlot & ~(CLEAR_SELECTOR_MASK >> selectorInSlotPosition)) | (bytes32(selector) >> selectorInSlotPosition); // if slot is full then write it to storage if (selectorInSlotPosition == 224) { l.selectorSlots[selectorCount >> 3] = selectorSlot; selectorSlot = 0; } selectorCount++; } return (selectorCount, selectorSlot); } } function removeFacetSelectors( Layout storage l, uint256 selectorCount, bytes32 selectorSlot, IDiamondCuttable.FacetCut memory facetCut ) internal returns (uint256, bytes32) { unchecked { require( facetCut.target == address(0), 'DiamondBase: REMOVE target must be zero address' ); uint256 selectorSlotCount = selectorCount >> 3; uint256 selectorInSlotIndex = selectorCount & 7; for (uint256 i; i < facetCut.selectors.length; i++) { bytes4 selector = facetCut.selectors[i]; bytes32 oldFacet = l.facets[selector]; require( address(bytes20(oldFacet)) != address(0), 'DiamondBase: selector not found' ); require( address(bytes20(oldFacet)) != address(this), 'DiamondBase: selector is immutable' ); if (selectorSlot == 0) { selectorSlotCount--; selectorSlot = l.selectorSlots[selectorSlotCount]; selectorInSlotIndex = 7; } else { selectorInSlotIndex--; } bytes4 lastSelector; uint256 oldSelectorsSlotCount; uint256 oldSelectorInSlotPosition; // adding a block here prevents stack too deep error { // replace selector with last selector in l.facets lastSelector = bytes4( selectorSlot << (selectorInSlotIndex << 5) ); if (lastSelector != selector) { // update last selector slot position info l.facets[lastSelector] = (oldFacet & CLEAR_ADDRESS_MASK) | bytes20(l.facets[lastSelector]); } delete l.facets[selector]; uint256 oldSelectorCount = uint16(uint256(oldFacet)); oldSelectorsSlotCount = oldSelectorCount >> 3; oldSelectorInSlotPosition = (oldSelectorCount & 7) << 5; } if (oldSelectorsSlotCount != selectorSlotCount) { bytes32 oldSelectorSlot = l.selectorSlots[ oldSelectorsSlotCount ]; // clears the selector we are deleting and puts the last selector in its place. oldSelectorSlot = (oldSelectorSlot & ~(CLEAR_SELECTOR_MASK >> oldSelectorInSlotPosition)) | (bytes32(lastSelector) >> oldSelectorInSlotPosition); // update storage with the modified slot l.selectorSlots[oldSelectorsSlotCount] = oldSelectorSlot; } else { // clears the selector we are deleting and puts the last selector in its place. selectorSlot = (selectorSlot & ~(CLEAR_SELECTOR_MASK >> oldSelectorInSlotPosition)) | (bytes32(lastSelector) >> oldSelectorInSlotPosition); } if (selectorInSlotIndex == 0) { delete l.selectorSlots[selectorSlotCount]; selectorSlot = 0; } } selectorCount = (selectorSlotCount << 3) | selectorInSlotIndex; return (selectorCount, selectorSlot); } } function replaceFacetSelectors( Layout storage l, IDiamondCuttable.FacetCut memory facetCut ) internal { unchecked { require( facetCut.target.isContract(), 'DiamondBase: REPLACE target has no code' ); for (uint256 i; i < facetCut.selectors.length; i++) { bytes4 selector = facetCut.selectors[i]; bytes32 oldFacet = l.facets[selector]; address oldFacetAddress = address(bytes20(oldFacet)); require( oldFacetAddress != address(0), 'DiamondBase: selector not found' ); require( oldFacetAddress != address(this), 'DiamondBase: selector is immutable' ); require( oldFacetAddress != facetCut.target, 'DiamondBase: REPLACE target is identical' ); // replace old facet address l.facets[selector] = (oldFacet & CLEAR_ADDRESS_MASK) | bytes20(facetCut.target); } } } function initialize(address target, bytes memory data) private { require( (target == address(0)) == (data.length == 0), 'DiamondBase: invalid initialization parameters' ); if (target != address(0)) { if (target != address(this)) { require( target.isContract(), 'DiamondBase: initialization target has no code' ); } (bool success, ) = target.delegatecall(data); if (!success) { assembly { returndatacopy(0, 0, returndatasize()) revert(0, returndatasize()) } } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import { OwnableInternal } from '../../access/OwnableInternal.sol'; import { IDiamondCuttable } from './IDiamondCuttable.sol'; import { DiamondBaseStorage } from './DiamondBaseStorage.sol'; /** * @title EIP-2535 "Diamond" proxy update contract */ abstract contract DiamondCuttable is IDiamondCuttable, OwnableInternal { using DiamondBaseStorage for DiamondBaseStorage.Layout; /** * @notice update functions callable on Diamond proxy * @param facetCuts array of structured Diamond facet update data * @param target optional recipient of initialization delegatecall * @param data optional initialization call data */ function diamondCut( FacetCut[] calldata facetCuts, address target, bytes calldata data ) external override onlyOwner { DiamondBaseStorage.layout().diamondCut(facetCuts, target, data); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import { DiamondBaseStorage } from './DiamondBaseStorage.sol'; import { IDiamondLoupe } from './IDiamondLoupe.sol'; /** * @title EIP-2535 "Diamond" proxy introspection contract * @dev derived from https://github.com/mudgen/diamond-2 (MIT license) */ abstract contract DiamondLoupe is IDiamondLoupe { /** * @inheritdoc IDiamondLoupe */ function facets() external view override returns (Facet[] memory diamondFacets) { DiamondBaseStorage.Layout storage l = DiamondBaseStorage.layout(); diamondFacets = new Facet[](l.selectorCount); uint8[] memory numFacetSelectors = new uint8[](l.selectorCount); uint256 numFacets; uint256 selectorIndex; // loop through function selectors for (uint256 slotIndex; selectorIndex < l.selectorCount; slotIndex++) { bytes32 slot = l.selectorSlots[slotIndex]; for ( uint256 selectorSlotIndex; selectorSlotIndex < 8; selectorSlotIndex++ ) { selectorIndex++; if (selectorIndex > l.selectorCount) { break; } bytes4 selector = bytes4(slot << (selectorSlotIndex << 5)); address facet = address(bytes20(l.facets[selector])); bool continueLoop; for (uint256 facetIndex; facetIndex < numFacets; facetIndex++) { if (diamondFacets[facetIndex].target == facet) { diamondFacets[facetIndex].selectors[ numFacetSelectors[facetIndex] ] = selector; // probably will never have more than 256 functions from one facet contract require(numFacetSelectors[facetIndex] < 255); numFacetSelectors[facetIndex]++; continueLoop = true; break; } } if (continueLoop) { continue; } diamondFacets[numFacets].target = facet; diamondFacets[numFacets].selectors = new bytes4[]( l.selectorCount ); diamondFacets[numFacets].selectors[0] = selector; numFacetSelectors[numFacets] = 1; numFacets++; } } for (uint256 facetIndex; facetIndex < numFacets; facetIndex++) { uint256 numSelectors = numFacetSelectors[facetIndex]; bytes4[] memory selectors = diamondFacets[facetIndex].selectors; // setting the number of selectors assembly { mstore(selectors, numSelectors) } } // setting the number of facets assembly { mstore(diamondFacets, numFacets) } } /** * @inheritdoc IDiamondLoupe */ function facetFunctionSelectors(address facet) external view override returns (bytes4[] memory selectors) { DiamondBaseStorage.Layout storage l = DiamondBaseStorage.layout(); selectors = new bytes4[](l.selectorCount); uint256 numSelectors; uint256 selectorIndex; // loop through function selectors for (uint256 slotIndex; selectorIndex < l.selectorCount; slotIndex++) { bytes32 slot = l.selectorSlots[slotIndex]; for ( uint256 selectorSlotIndex; selectorSlotIndex < 8; selectorSlotIndex++ ) { selectorIndex++; if (selectorIndex > l.selectorCount) { break; } bytes4 selector = bytes4(slot << (selectorSlotIndex << 5)); if (facet == address(bytes20(l.facets[selector]))) { selectors[numSelectors] = selector; numSelectors++; } } } // set the number of selectors in the array assembly { mstore(selectors, numSelectors) } } /** * @inheritdoc IDiamondLoupe */ function facetAddresses() external view override returns (address[] memory addresses) { DiamondBaseStorage.Layout storage l = DiamondBaseStorage.layout(); addresses = new address[](l.selectorCount); uint256 numFacets; uint256 selectorIndex; for (uint256 slotIndex; selectorIndex < l.selectorCount; slotIndex++) { bytes32 slot = l.selectorSlots[slotIndex]; for ( uint256 selectorSlotIndex; selectorSlotIndex < 8; selectorSlotIndex++ ) { selectorIndex++; if (selectorIndex > l.selectorCount) { break; } bytes4 selector = bytes4(slot << (selectorSlotIndex << 5)); address facet = address(bytes20(l.facets[selector])); bool continueLoop; for (uint256 facetIndex; facetIndex < numFacets; facetIndex++) { if (facet == addresses[facetIndex]) { continueLoop = true; break; } } if (continueLoop) { continue; } addresses[numFacets] = facet; numFacets++; } } // set the number of facet addresses in the array assembly { mstore(addresses, numFacets) } } /** * @inheritdoc IDiamondLoupe */ function facetAddress(bytes4 selector) external view override returns (address facet) { facet = address(bytes20(DiamondBaseStorage.layout().facets[selector])); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title Diamond proxy upgrade interface * @dev see https://eips.ethereum.org/EIPS/eip-2535 */ interface IDiamondCuttable { enum FacetCutAction { ADD, REPLACE, REMOVE } event DiamondCut(FacetCut[] facetCuts, address target, bytes data); struct FacetCut { address target; FacetCutAction action; bytes4[] selectors; } /** * @notice update diamond facets and optionally execute arbitrary initialization function * @param facetCuts facet addresses, actions, and function selectors * @param target initialization function target * @param data initialization function call data */ function diamondCut( FacetCut[] calldata facetCuts, address target, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title Diamond proxy introspection interface * @dev see https://eips.ethereum.org/EIPS/eip-2535 */ interface IDiamondLoupe { struct Facet { address target; bytes4[] selectors; } /** * @notice get all facets and their selectors * @return diamondFacets array of structured facet data */ function facets() external view returns (Facet[] memory diamondFacets); /** * @notice get all selectors for given facet address * @param facet address of facet to query * @return selectors array of function selectors */ function facetFunctionSelectors(address facet) external view returns (bytes4[] memory selectors); /** * @notice get addresses of all facets used by diamond * @return addresses array of facet addresses */ function facetAddresses() external view returns (address[] memory addresses); /** * @notice get the address of the facet associated with given selector * @param selector function selector to query * @return facet facet address (zero address if not found) */ function facetAddress(bytes4 selector) external view returns (address facet); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; library ERC20MetadataStorage { struct Layout { string name; string symbol; uint8 decimals; } bytes32 internal constant STORAGE_SLOT = keccak256('solidstate.contracts.storage.ERC20Metadata'); function layout() internal pure returns (Layout storage l) { bytes32 slot = STORAGE_SLOT; assembly { l.slot := slot } } function setName(Layout storage l, string memory name) internal { l.name = name; } function setSymbol(Layout storage l, string memory symbol) internal { l.symbol = symbol; } function setDecimals(Layout storage l, uint8 decimals) internal { l.decimals = decimals; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; library AddressUtils { function toString(address account) internal pure returns (string memory) { bytes32 value = bytes32(uint256(uint160(account))); bytes memory alphabet = '0123456789abcdef'; bytes memory chars = new bytes(42); chars[0] = '0'; chars[1] = 'x'; for (uint256 i = 0; i < 20; i++) { chars[2 + i * 2] = alphabet[uint8(value[i + 12] >> 4)]; chars[3 + i * 2] = alphabet[uint8(value[i + 12] & 0x0f)]; } return string(chars); } function isContract(address account) internal view returns (bool) { uint256 size; assembly { size := extcodesize(account) } return size > 0; } function sendValue(address payable account, uint256 amount) internal { (bool success, ) = account.call{ value: amount }(''); require(success, 'AddressUtils: failed to send value'); } function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, 'AddressUtils: failed low-level call'); } function functionCall( address target, bytes memory data, string memory error ) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, error); } function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, 'AddressUtils: failed low-level call with value' ); } function functionCallWithValue( address target, bytes memory data, uint256 value, string memory error ) internal returns (bytes memory) { require( address(this).balance >= value, 'AddressUtils: insufficient balance for call' ); return _functionCallWithValue(target, data, value, error); } function _functionCallWithValue( address target, bytes memory data, uint256 value, string memory error ) private returns (bytes memory) { require( isContract(target), 'AddressUtils: function call to non-contract' ); (bool success, bytes memory returnData) = target.call{ value: value }( data ); if (success) { return returnData; } else if (returnData.length > 0) { assembly { let returnData_size := mload(returnData) revert(add(32, returnData), returnData_size) } } else { revert(error); } } }
{ "evmVersion": "paris", "libraries": {}, "metadata": { "bytecodeHash": "ipfs", "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 200 }, "remappings": [], "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"enum IDiamondCuttable.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"selectors","type":"bytes4[]"}],"indexed":false,"internalType":"struct IDiamondCuttable.FacetCut[]","name":"facetCuts","type":"tuple[]"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"DiamondCut","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"enum IDiamondCuttable.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"selectors","type":"bytes4[]"}],"indexed":false,"internalType":"struct IDiamondCuttable.FacetCut[]","name":"facetCuts","type":"tuple[]"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"DiamondCut","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"enum IDiamondCuttable.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"selectors","type":"bytes4[]"}],"internalType":"struct IDiamondCuttable.FacetCut[]","name":"facetCuts","type":"tuple[]"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"diamondCut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"facetAddress","outputs":[{"internalType":"address","name":"facet","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"facetAddresses","outputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"facet","type":"address"}],"name":"facetFunctionSelectors","outputs":[{"internalType":"bytes4[]","name":"selectors","type":"bytes4[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"facets","outputs":[{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes4[]","name":"selectors","type":"bytes4[]"}],"internalType":"struct IDiamondLoupe.Facet[]","name":"diamondFacets","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFallbackAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nomineeOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fallbackAddress","type":"address"}],"name":"setFallbackAddress","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":"account","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060408051600c8082526101a082019092527f326d0c59a7612f6a9919e2a8ee333c80ba689d8ba2634de89c85cbb04832e70591600091906020820161018080368337019050509050631f931c1c60e01b8160008151811062000078576200007862000fc8565b6001600160e01b031990921660209283029190910190910152620000a6826307e4c70760e21b6001620004b9565b637a0ed62760e01b81600181518110620000c457620000c462000fc8565b6001600160e01b03199092166020928302919091019091015280516356fe50af60e11b9082906002908110620000fe57620000fe62000fc8565b6001600160e01b03199092166020928302919091019091015280516314bbdacb60e21b908290600390811062000138576200013862000fc8565b6001600160e01b03199092166020928302919091019091015280516366ffd66360e11b908290600490811062000172576200017262000fc8565b6001600160e01b031990921660209283029190910190910152620001a0826348e2b09360e01b6001620004b9565b6301ffc9a760e01b81600581518110620001be57620001be62000fc8565b6001600160e01b031990921660209283029190910190910152620001ec826301ffc9a760e01b6001620004b9565b638da5cb5b60e01b816006815181106200020a576200020a62000fc8565b6001600160e01b031990921660209283029190910190910152805163455a8a8560e11b908290600790811062000244576200024462000fc8565b6001600160e01b031990921660209283029190910190910152805163f2fde38b60e01b90829060089081106200027e576200027e62000fc8565b6001600160e01b03199092166020928302919091019091015280516379ba509760e01b9082906009908110620002b857620002b862000fc8565b6001600160e01b031990921660209283029190910190910152620002e6826307f5828d60e41b6001620004b9565b632c40805960e01b81600a8151811062000304576200030462000fc8565b6001600160e01b0319909216602092830291909101909101528051639142376560e01b908290600b9081106200033e576200033e62000fc8565b6001600160e01b03199290921660209283029190910190910152604080516001808252818301909252600091816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816200036f57905050604080516060810190915230815290915060208101600081526020018381525081600081518110620003d557620003d562000fc8565b60200260200101819052506200041081600060405180602001604052806000815250620004076200054760201b60201c565b9291906200056b565b7f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f67168046080546001600160a01b031916331790555050506000620004566200075d60201b60201c565b6040805180820190915260058152644d4147494360d81b6020820152909150819062000483908262001084565b506040805180820190915260058152644d4147494360d81b60208201526001820190620004b1908262001084565b5050620012cc565b6001600160e01b03198083169003620005195760405162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e746572666163652069640000000060448201526064015b60405180910390fd5b6001600160e01b03199190911660009081526020929092526040909120805460ff1916911515919091179055565b7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc9390565b600184015461ffff8116908190600090600716156200059c5750600381901c60009081526002870160205260409020545b60005b8651811015620006cb576000878281518110620005c057620005c062000fc8565b60200260200101519050600081602001519050600082604001515111620006365760405162461bcd60e51b815260206004820152602360248201527f4469616d6f6e64426173653a206e6f2073656c6563746f7273207370656369666044820152621a595960ea1b606482015260840162000510565b60008160028111156200064d576200064d62000fde565b036200066c57620006618a86868562000781565b9095509350620006c0565b600281600281111562000683576200068362000fde565b036200069757620006618a8686856200093f565b6001816002811115620006ae57620006ae62000fde565b03620006c057620006c08a8362000c0d565b50506001016200059f565b50828214620006e85760018701805461ffff191661ffff84161790555b60078216156200070b57600382901c600090815260028801602052604090208190555b7f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb6738686866040516200074093929190620011a4565b60405180910390a162000754858562000e37565b50505050505050565b7f2967a798b92539a1b9eefe4d8eb931f96b68d27665e276f1bee2d5db7f74304790565b805160009081906001600160a01b0316301480620007a9575082516001600160a01b03163b15155b620008035760405162461bcd60e51b815260206004820152602360248201527f4469616d6f6e64426173653a204144442074617267657420686173206e6f20636044820152626f646560e81b606482015260840162000510565b60005b83604001515181101562000932576000846040015182815181106200082f576200082f62000fc8565b6020908102919091018101516001600160e01b031981166000908152918a9052604090912054909150606081901c15620008b85760405162461bcd60e51b815260206004820152602360248201527f4469616d6f6e64426173653a2073656c6563746f7220616c726561647920616460448201526219195960ea1b606482015260840162000510565b85516001600160e01b0319838116600081815260208d90526040902060609390931b6001600160601b0319168b1790925560058a901b60e090811692831c91831c199990991617978190036200092257600389901c600090815260028b0160205260408120989098555b5050506001958601950162000806565b5093959294509192505050565b805160009081906001600160a01b031615620009b65760405162461bcd60e51b815260206004820152602f60248201527f4469616d6f6e64426173653a2052454d4f564520746172676574206d7573742060448201526e6265207a65726f206164647265737360881b606482015260840162000510565b600385901c6007861660005b85604001515181101562000bf957600086604001518281518110620009eb57620009eb62000fc8565b6020908102919091018101516001600160e01b031981166000908152918c9052604090912054909150606081901c62000a675760405162461bcd60e51b815260206004820152601f60248201527f4469616d6f6e64426173653a2073656c6563746f72206e6f7420666f756e6400604482015260640162000510565b30606082901c0362000ab65760405162461bcd60e51b815260206004820152602260248201526000805160206200319c8339815191526044820152616c6560f01b606482015260840162000510565b600089900362000ae457600019909401600081815260028c0160205260409020549850936007935062000aec565b600019909301925b600584901b89901b6000806001600160e01b03198084169086161462000b3f576001600160e01b03198316600090815260208f90526040902080546001600160601b0319166001600160601b0386161790555b50506001600160e01b03198316600090815260208d90526040812055611fff600383901c1660e0600584901b1687821462000ba457600082815260028f016020526040902080546001600160e01b031980841c19909116908516831c17905562000bc8565b80836001600160e01b031916901c816001600160e01b031960001b901c198d16179b505b8660000362000be757600088815260028f01602052604081208190559b505b505060019093019250620009c2915050565b5060039190911b1796939550929350505050565b80516001600160a01b03163b62000c775760405162461bcd60e51b815260206004820152602760248201527f4469616d6f6e64426173653a205245504c4143452074617267657420686173206044820152666e6f20636f646560c81b606482015260840162000510565b60005b81604001515181101562000e325760008260400151828151811062000ca35762000ca362000fc8565b6020908102919091018101516001600160e01b03198116600090815291869052604090912054909150606081901c8062000d205760405162461bcd60e51b815260206004820152601f60248201527f4469616d6f6e64426173653a2073656c6563746f72206e6f7420666f756e6400604482015260640162000510565b306001600160a01b0382160362000d745760405162461bcd60e51b815260206004820152602260248201526000805160206200319c8339815191526044820152616c6560f01b606482015260840162000510565b84600001516001600160a01b0316816001600160a01b03160362000dec5760405162461bcd60e51b815260206004820152602860248201527f4469616d6f6e64426173653a205245504c41434520746172676574206973206960448201526719195b9d1a58d85b60c21b606482015260840162000510565b5083516001600160e01b031992909216600090815260208690526040902060609290921b6001600160601b0319166001600160601b039190911617905560010162000c7a565b505050565b8051156001600160a01b038316151462000eab5760405162461bcd60e51b815260206004820152602e60248201527f4469616d6f6e64426173653a20696e76616c696420696e697469616c697a617460448201526d696f6e20706172616d657465727360901b606482015260840162000510565b6001600160a01b0382161562000fae576001600160a01b038216301462000f3c576001600160a01b0382163b62000f3c5760405162461bcd60e51b815260206004820152602e60248201527f4469616d6f6e64426173653a20696e697469616c697a6174696f6e207461726760448201526d657420686173206e6f20636f646560901b606482015260840162000510565b6000826001600160a01b03168260405162000f589190620012ae565b600060405180830381855af49150503d806000811462000f95576040519150601f19603f3d011682016040523d82523d6000602084013e62000f9a565b606091505b505090508062000e32573d6000803e3d6000fd5b5050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b600181811c908216806200100957607f821691505b6020821081036200102a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000e32576000816000526020600020601f850160051c810160208610156200105b5750805b601f850160051c820191505b818110156200107c5782815560010162001067565b505050505050565b81516001600160401b03811115620010a057620010a062000fb2565b620010b881620010b1845462000ff4565b8462001030565b602080601f831160018114620010f05760008415620010d75750858301515b600019600386901b1c1916600185901b1785556200107c565b600085815260208120601f198616915b82811015620011215788860151825594840194600190910190840162001100565b5085821015620011405787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60005b838110156200116d57818101518382015260200162001153565b50506000910152565b600081518084526200119081602086016020860162001150565b601f01601f19169290920160200192915050565b60006060808301606084528087518083526080925060808601915060808160051b8701016020808b0160005b848110156200127c57898403607f19018652815180516001600160a01b031685528381015189860190600381106200121857634e487b7160e01b600052602160045260246000fd5b868601526040918201519186018a905281519081905290840190600090898701905b80831015620012665783516001600160e01b03191682529286019260019290920191908601906200123a565b50978501979550505090820190600101620011d0565b50506001600160a01b038a16908801528681036040880152620012a0818962001176565b9a9950505050505050505050565b60008251620012c281846020870162001150565b9190910192915050565b611ec080620012dc6000396000f3fe6080604052600436106100ab5760003560e01c80638ab5150a116100645780638ab5150a146102875780638da5cb5b1461029c57806391423765146102b1578063adfca15e146102d1578063cdffacc6146102fe578063f2fde38b14610345576100b2565b806301ffc9a71461014f5780631f931c1c146101bd5780632c408059146101dd57806352ef6b2c1461022e57806379ba5097146102505780637a0ed62714610265576100b2565b366100b257005b60006100bc610365565b90506001600160a01b0381163b6101295760405162461bcd60e51b815260206004820152602660248201527f50726f78793a20696d706c656d656e746174696f6e206d75737420626520636f6044820152651b9d1c9858dd60d21b60648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e808015610148573d6000f35b3d6000fd5b005b34801561015b57600080fd5b506101a861016a36600461179d565b6001600160e01b03191660009081527f326d0c59a7612f6a9919e2a8ee333c80ba689d8ba2634de89c85cbb04832e705602052604090205460ff1690565b60405190151581526020015b60405180910390f35b3480156101c957600080fd5b5061014d6101d8366004611818565b610416565b3480156101e957600080fd5b507f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc96546001600160a01b03165b6040516001600160a01b0390911681526020016101b4565b34801561023a57600080fd5b506102436104aa565b6040516101b491906118ca565b34801561025c57600080fd5b5061014d61065a565b34801561027157600080fd5b5061027a61075f565b6040516101b4919061195d565b34801561029357600080fd5b50610216610b89565b3480156102a857600080fd5b50610216610baa565b3480156102bd57600080fd5b5061014d6102cc3660046119dc565b610bc0565b3480156102dd57600080fd5b506102f16102ec3660046119dc565b610c38565b6040516101b491906119f7565b34801561030a57600080fd5b5061021661031936600461179d565b6001600160e01b0319166000908152600080516020611e4b833981519152602052604090205460601c90565b34801561035157600080fd5b5061014d6103603660046119dc565b610d9b565b600080356001600160e01b0319168152600080516020611e4b83398151915260208190526040822054819060601c8061040f575060038201546001600160a01b03168061040f5760405162461bcd60e51b815260206004820152603260248201527f4469616d6f6e64426173653a206e6f20666163657420666f756e6420666f722060448201527166756e6374696f6e207369676e617475726560701b6064820152608401610120565b9392505050565b600080516020611e6b833981519152546001600160a01b0316331461044d5760405162461bcd60e51b815260040161012090611a39565b6104a361045a8587611b04565b8484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061049b9250610dea915050565b929190610dfc565b5050505050565b7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc9454606090600080516020611e4b8339815191529061ffff1667ffffffffffffffff8111156104fb576104fb611a70565b604051908082528060200260200182016040528015610524578160200160208202803683370190505b50915060008060005b600184015461ffff16821015610652576000818152600285016020526040812054905b600881101561063d578361056381611c4e565b600188015490955061ffff168511905061063d57600581901b82901b6001600160e01b0319811660009081526020889052604081205460601c90805b888110156105ea578a81815181106105b9576105b9611c67565b60200260200101516001600160a01b0316836001600160a01b0316036105e257600191506105ea565b60010161059f565b5080156105f957505050610635565b818a898151811061060c5761060c611c67565b6001600160a01b03909216602092830291909101909101528761062e81611c4e565b9850505050505b600101610550565b5050808061064a90611c4e565b91505061052d565b505082525090565b600080516020611e2b833981519152546001600160a01b031633146106d35760405162461bcd60e51b815260206004820152602960248201527f536166654f776e61626c653a2073656e646572206d757374206265206e6f6d696044820152683732b29037bbb732b960b91b6064820152608401610120565b600080516020611e6b833981519152805460405133916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a380546001600160a01b0319163317815561075c6000600080516020611e2b8339815191525b9081546001600160a01b0319166001600160a01b0391909116179055565b50565b7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc9454606090600080516020611e4b8339815191529061ffff1667ffffffffffffffff8111156107b0576107b0611a70565b6040519080825280602002602001820160405280156107f657816020015b6040805180820190915260008152606060208201528152602001906001900390816107ce5790505b50600182015490925060009061ffff1667ffffffffffffffff81111561081e5761081e611a70565b604051908082528060200260200182016040528015610847578160200160208202803683370190505b50905060008060005b600185015461ffff16821015610b22576000818152600286016020526040812054905b6008811015610b0d578361088681611c4e565b600189015490955061ffff1685119050610b0d57600581901b82901b6001600160e01b0319811660009081526020899052604081205460601c90805b888110156109d557826001600160a01b03168c82815181106108e6576108e6611c67565b6020026020010151600001516001600160a01b0316036109cd57838c828151811061091357610913611c67565b6020026020010151602001518b838151811061093157610931611c67565b602002602001015160ff168151811061094c5761094c611c67565b60200260200101906001600160e01b03191690816001600160e01b0319168152505060ff8a828151811061098257610982611c67565b602002602001015160ff161061099757600080fd5b8981815181106109a9576109a9611c67565b6020026020010180518091906109be90611c7d565b60ff16905250600191506109d5565b6001016108c2565b5080156109e457505050610b05565b818b89815181106109f7576109f7611c67565b60209081029190910101516001600160a01b03909116905260018a015461ffff1667ffffffffffffffff811115610a3057610a30611a70565b604051908082528060200260200182016040528015610a59578160200160208202803683370190505b508b8981518110610a6c57610a6c611c67565b602002602001015160200181905250828b8981518110610a8e57610a8e611c67565b602002602001015160200151600081518110610aac57610aac611c67565b60200260200101906001600160e01b03191690816001600160e01b031916815250506001898981518110610ae257610ae2611c67565b60ff9092166020928302919091019091015287610afe81611c4e565b9850505050505b600101610873565b50508080610b1a90611c4e565b915050610850565b5060005b82811015610b7e576000848281518110610b4257610b42611c67565b602002602001015160ff1690506000878381518110610b6357610b63611c67565b60209081029190910181015101519190915250600101610b26565b508185525050505090565b6000600080516020611e2b8339815191525b546001600160a01b0316919050565b6000600080516020611e6b833981519152610b9b565b600080516020611e6b833981519152546001600160a01b03163314610bf75760405162461bcd60e51b815260040161012090611a39565b7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc9680546001600160a01b0319166001600160a01b0392909216919091179055565b7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc9454606090600080516020611e4b8339815191529061ffff1667ffffffffffffffff811115610c8957610c89611a70565b604051908082528060200260200182016040528015610cb2578160200160208202803683370190505b50915060008060005b600184015461ffff16821015610d91576000818152600285016020526040812054905b6008811015610d7c5783610cf181611c4e565b600188015490955061ffff1685119050610d7c57600581901b82901b6001600160e01b0319811660009081526020889052604090205460601c6001600160a01b038a1603610d735780888781518110610d4c57610d4c611c67565b6001600160e01b03199092166020928302919091019091015285610d6f81611c4e565b9650505b50600101610cde565b50508080610d8990611c4e565b915050610cbb565b5050825250919050565b600080516020611e6b833981519152546001600160a01b03163314610dd25760405162461bcd60e51b815260040161012090611a39565b61075c81600080516020611e2b83398151915261073e565b600080516020611e4b83398151915290565b600184015461ffff811690819060009060071615610e2c5750600381901c60009081526002870160205260409020545b60005b8651811015610f41576000878281518110610e4c57610e4c611c67565b60200260200101519050600081602001519050600082604001515111610ec05760405162461bcd60e51b815260206004820152602360248201527f4469616d6f6e64426173653a206e6f2073656c6563746f7273207370656369666044820152621a595960ea1b6064820152608401610120565b6000816002811115610ed457610ed4611c9c565b03610eef57610ee58a868685610fcd565b9095509350610f37565b6002816002811115610f0357610f03611c9c565b03610f1457610ee58a868685611180565b6001816002811115610f2857610f28611c9c565b03610f3757610f378a83611418565b5050600101610e2f565b50828214610f5d5760018701805461ffff191661ffff84161790555b6007821615610f7f57600382901c600090815260028801602052604090208190555b7f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb673868686604051610fb293929190611d02565b60405180910390a1610fc48585611610565b50505050505050565b805160009081906001600160a01b0316301480610ff4575082516001600160a01b03163b15155b61104c5760405162461bcd60e51b815260206004820152602360248201527f4469616d6f6e64426173653a204144442074617267657420686173206e6f20636044820152626f646560e81b6064820152608401610120565b60005b8360400151518110156111735760008460400151828151811061107457611074611c67565b6020908102919091018101516001600160e01b031981166000908152918a9052604090912054909150606081901c156110fb5760405162461bcd60e51b815260206004820152602360248201527f4469616d6f6e64426173653a2073656c6563746f7220616c726561647920616460448201526219195960ea1b6064820152608401610120565b85516001600160e01b0319838116600081815260208d90526040902060609390931b6001600160601b0319168b1790925560058a901b60e090811692831c91831c1999909916179781900361116457600389901c600090815260028b0160205260408120989098555b5050506001958601950161104f565b5093959294509192505050565b805160009081906001600160a01b0316156111f55760405162461bcd60e51b815260206004820152602f60248201527f4469616d6f6e64426173653a2052454d4f564520746172676574206d7573742060448201526e6265207a65726f206164647265737360881b6064820152608401610120565b600385901c6007861660005b8560400151518110156114045760008660400151828151811061122657611226611c67565b6020908102919091018101516001600160e01b031981166000908152918c9052604090912054909150606081901c6112a05760405162461bcd60e51b815260206004820152601f60248201527f4469616d6f6e64426173653a2073656c6563746f72206e6f7420666f756e64006044820152606401610120565b30606082901c036112c35760405162461bcd60e51b815260040161012090611dcc565b60008990036112ef57600019909401600081815260028c016020526040902054985093600793506112f7565b600019909301925b600584901b89901b6000806001600160e01b03198084169086161461134e576001600160e01b03198316600090815260208f90526040902080546001600160601b0319166bffffffffffffffffffffffff86161790555b50506001600160e01b03198316600090815260208d90526040812055611fff600383901c1660e0600584901b168782146113b157600082815260028f016020526040902080546001600160e01b031980841c19909116908516831c1790556113d5565b80836001600160e01b031916901c816001600160e01b031960001b901c198d16179b505b866000036113f357600088815260028f01602052604081208190559b505b505060019093019250611201915050565b5060039190911b1796939550929350505050565b80516001600160a01b03163b6114805760405162461bcd60e51b815260206004820152602760248201527f4469616d6f6e64426173653a205245504c4143452074617267657420686173206044820152666e6f20636f646560c81b6064820152608401610120565b60005b81604001515181101561160b576000826040015182815181106114a8576114a8611c67565b6020908102919091018101516001600160e01b03198116600090815291869052604090912054909150606081901c806115235760405162461bcd60e51b815260206004820152601f60248201527f4469616d6f6e64426173653a2073656c6563746f72206e6f7420666f756e64006044820152606401610120565b306001600160a01b0382160361154b5760405162461bcd60e51b815260040161012090611dcc565b84600001516001600160a01b0316816001600160a01b0316036115c15760405162461bcd60e51b815260206004820152602860248201527f4469616d6f6e64426173653a205245504c41434520746172676574206973206960448201526719195b9d1a58d85b60c21b6064820152608401610120565b5083516001600160e01b031992909216600090815260208690526040902060609290921b6001600160601b0319166bffffffffffffffffffffffff91909116179055600101611483565b505050565b8051156001600160a01b03831615146116825760405162461bcd60e51b815260206004820152602e60248201527f4469616d6f6e64426173653a20696e76616c696420696e697469616c697a617460448201526d696f6e20706172616d657465727360901b6064820152608401610120565b6001600160a01b0382161561177c576001600160a01b038216301461170f576001600160a01b0382163b61170f5760405162461bcd60e51b815260206004820152602e60248201527f4469616d6f6e64426173653a20696e697469616c697a6174696f6e207461726760448201526d657420686173206e6f20636f646560901b6064820152608401610120565b6000826001600160a01b0316826040516117299190611e0e565b600060405180830381855af49150503d8060008114611764576040519150601f19603f3d011682016040523d82523d6000602084013e611769565b606091505b505090508061160b573d6000803e3d6000fd5b5050565b80356001600160e01b03198116811461179857600080fd5b919050565b6000602082840312156117af57600080fd5b61040f82611780565b80356001600160a01b038116811461179857600080fd5b60008083601f8401126117e157600080fd5b50813567ffffffffffffffff8111156117f957600080fd5b60208301915083602082850101111561181157600080fd5b9250929050565b60008060008060006060868803121561183057600080fd5b853567ffffffffffffffff8082111561184857600080fd5b818801915088601f83011261185c57600080fd5b81358181111561186b57600080fd5b8960208260051b850101111561188057600080fd5b60208301975080965050611896602089016117b8565b945060408801359150808211156118ac57600080fd5b506118b9888289016117cf565b969995985093965092949392505050565b6020808252825182820181905260009190848201906040850190845b8181101561190b5783516001600160a01b0316835292840192918401916001016118e6565b50909695505050505050565b60008151808452602080850194506020840160005b838110156119525781516001600160e01b0319168752958201959082019060010161192c565b509495945050505050565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b838110156119ce57888303603f19018552815180516001600160a01b031684528701518784018790526119bb87850182611917565b9588019593505090860190600101611986565b509098975050505050505050565b6000602082840312156119ee57600080fd5b61040f826117b8565b6020808252825182820181905260009190848201906040850190845b8181101561190b5783516001600160e01b03191683529284019291840191600101611a13565b6020808252601d908201527f4f776e61626c653a2073656e646572206d757374206265206f776e6572000000604082015260600190565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715611aa957611aa9611a70565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611ad857611ad8611a70565b604052919050565b600067ffffffffffffffff821115611afa57611afa611a70565b5060051b60200190565b6000611b17611b1284611ae0565b611aaf565b83815260208082019190600586811b860136811115611b3557600080fd5b865b81811015611c2b57803567ffffffffffffffff80821115611b585760008081fd5b818a01915060608236031215611b6e5760008081fd5b611b76611a86565b611b7f836117b8565b81528683013560038110611b935760008081fd5b8188015260408381013583811115611bab5760008081fd5b939093019236601f850112611bc257600092508283fd5b83359250611bd2611b1284611ae0565b83815292871b84018801928881019036851115611bef5760008081fd5b948901945b84861015611c1457611c0586611780565b82529489019490890190611bf4565b918301919091525088525050948301948301611b37565b5092979650505050505050565b634e487b7160e01b600052601160045260246000fd5b600060018201611c6057611c60611c38565b5060010190565b634e487b7160e01b600052603260045260246000fd5b600060ff821660ff8103611c9357611c93611c38565b60010192915050565b634e487b7160e01b600052602160045260246000fd5b60005b83811015611ccd578181015183820152602001611cb5565b50506000910152565b60008151808452611cee816020860160208601611cb2565b601f01601f19169290920160200192915050565b600060608083016060845280875180835260808601915060808160051b87010192506020808a016000805b84811015611d9c57898703607f19018652825180516001600160a01b031688528481015160038110611d6d57634e487b7160e01b84526021600452602484fd5b88860152604090810151908801899052611d8989890182611917565b9750509483019491830191600101611d2d565b5050506001600160a01b0389169087015250508381036040850152611dc18186611cd6565b979650505050505050565b60208082526022908201527f4469616d6f6e64426173653a2073656c6563746f7220697320696d6d757461626040820152616c6560f01b606082015260800190565b60008251611e20818460208701611cb2565b919091019291505056fe24aa1f7b31fd188a8d3ecfb06bc55c806040e59b03bd4396283442fce6617890177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc938a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f671680460a2646970667358221220b64081504a66bbecefbd1d8f4b1a8969e48f6ed025eb1bc85e895abd7736387f64736f6c634300081700334469616d6f6e64426173653a2073656c6563746f7220697320696d6d75746162
Deployed Bytecode
0x6080604052600436106100ab5760003560e01c80638ab5150a116100645780638ab5150a146102875780638da5cb5b1461029c57806391423765146102b1578063adfca15e146102d1578063cdffacc6146102fe578063f2fde38b14610345576100b2565b806301ffc9a71461014f5780631f931c1c146101bd5780632c408059146101dd57806352ef6b2c1461022e57806379ba5097146102505780637a0ed62714610265576100b2565b366100b257005b60006100bc610365565b90506001600160a01b0381163b6101295760405162461bcd60e51b815260206004820152602660248201527f50726f78793a20696d706c656d656e746174696f6e206d75737420626520636f6044820152651b9d1c9858dd60d21b60648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e808015610148573d6000f35b3d6000fd5b005b34801561015b57600080fd5b506101a861016a36600461179d565b6001600160e01b03191660009081527f326d0c59a7612f6a9919e2a8ee333c80ba689d8ba2634de89c85cbb04832e705602052604090205460ff1690565b60405190151581526020015b60405180910390f35b3480156101c957600080fd5b5061014d6101d8366004611818565b610416565b3480156101e957600080fd5b507f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc96546001600160a01b03165b6040516001600160a01b0390911681526020016101b4565b34801561023a57600080fd5b506102436104aa565b6040516101b491906118ca565b34801561025c57600080fd5b5061014d61065a565b34801561027157600080fd5b5061027a61075f565b6040516101b4919061195d565b34801561029357600080fd5b50610216610b89565b3480156102a857600080fd5b50610216610baa565b3480156102bd57600080fd5b5061014d6102cc3660046119dc565b610bc0565b3480156102dd57600080fd5b506102f16102ec3660046119dc565b610c38565b6040516101b491906119f7565b34801561030a57600080fd5b5061021661031936600461179d565b6001600160e01b0319166000908152600080516020611e4b833981519152602052604090205460601c90565b34801561035157600080fd5b5061014d6103603660046119dc565b610d9b565b600080356001600160e01b0319168152600080516020611e4b83398151915260208190526040822054819060601c8061040f575060038201546001600160a01b03168061040f5760405162461bcd60e51b815260206004820152603260248201527f4469616d6f6e64426173653a206e6f20666163657420666f756e6420666f722060448201527166756e6374696f6e207369676e617475726560701b6064820152608401610120565b9392505050565b600080516020611e6b833981519152546001600160a01b0316331461044d5760405162461bcd60e51b815260040161012090611a39565b6104a361045a8587611b04565b8484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061049b9250610dea915050565b929190610dfc565b5050505050565b7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc9454606090600080516020611e4b8339815191529061ffff1667ffffffffffffffff8111156104fb576104fb611a70565b604051908082528060200260200182016040528015610524578160200160208202803683370190505b50915060008060005b600184015461ffff16821015610652576000818152600285016020526040812054905b600881101561063d578361056381611c4e565b600188015490955061ffff168511905061063d57600581901b82901b6001600160e01b0319811660009081526020889052604081205460601c90805b888110156105ea578a81815181106105b9576105b9611c67565b60200260200101516001600160a01b0316836001600160a01b0316036105e257600191506105ea565b60010161059f565b5080156105f957505050610635565b818a898151811061060c5761060c611c67565b6001600160a01b03909216602092830291909101909101528761062e81611c4e565b9850505050505b600101610550565b5050808061064a90611c4e565b91505061052d565b505082525090565b600080516020611e2b833981519152546001600160a01b031633146106d35760405162461bcd60e51b815260206004820152602960248201527f536166654f776e61626c653a2073656e646572206d757374206265206e6f6d696044820152683732b29037bbb732b960b91b6064820152608401610120565b600080516020611e6b833981519152805460405133916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a380546001600160a01b0319163317815561075c6000600080516020611e2b8339815191525b9081546001600160a01b0319166001600160a01b0391909116179055565b50565b7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc9454606090600080516020611e4b8339815191529061ffff1667ffffffffffffffff8111156107b0576107b0611a70565b6040519080825280602002602001820160405280156107f657816020015b6040805180820190915260008152606060208201528152602001906001900390816107ce5790505b50600182015490925060009061ffff1667ffffffffffffffff81111561081e5761081e611a70565b604051908082528060200260200182016040528015610847578160200160208202803683370190505b50905060008060005b600185015461ffff16821015610b22576000818152600286016020526040812054905b6008811015610b0d578361088681611c4e565b600189015490955061ffff1685119050610b0d57600581901b82901b6001600160e01b0319811660009081526020899052604081205460601c90805b888110156109d557826001600160a01b03168c82815181106108e6576108e6611c67565b6020026020010151600001516001600160a01b0316036109cd57838c828151811061091357610913611c67565b6020026020010151602001518b838151811061093157610931611c67565b602002602001015160ff168151811061094c5761094c611c67565b60200260200101906001600160e01b03191690816001600160e01b0319168152505060ff8a828151811061098257610982611c67565b602002602001015160ff161061099757600080fd5b8981815181106109a9576109a9611c67565b6020026020010180518091906109be90611c7d565b60ff16905250600191506109d5565b6001016108c2565b5080156109e457505050610b05565b818b89815181106109f7576109f7611c67565b60209081029190910101516001600160a01b03909116905260018a015461ffff1667ffffffffffffffff811115610a3057610a30611a70565b604051908082528060200260200182016040528015610a59578160200160208202803683370190505b508b8981518110610a6c57610a6c611c67565b602002602001015160200181905250828b8981518110610a8e57610a8e611c67565b602002602001015160200151600081518110610aac57610aac611c67565b60200260200101906001600160e01b03191690816001600160e01b031916815250506001898981518110610ae257610ae2611c67565b60ff9092166020928302919091019091015287610afe81611c4e565b9850505050505b600101610873565b50508080610b1a90611c4e565b915050610850565b5060005b82811015610b7e576000848281518110610b4257610b42611c67565b602002602001015160ff1690506000878381518110610b6357610b63611c67565b60209081029190910181015101519190915250600101610b26565b508185525050505090565b6000600080516020611e2b8339815191525b546001600160a01b0316919050565b6000600080516020611e6b833981519152610b9b565b600080516020611e6b833981519152546001600160a01b03163314610bf75760405162461bcd60e51b815260040161012090611a39565b7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc9680546001600160a01b0319166001600160a01b0392909216919091179055565b7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc9454606090600080516020611e4b8339815191529061ffff1667ffffffffffffffff811115610c8957610c89611a70565b604051908082528060200260200182016040528015610cb2578160200160208202803683370190505b50915060008060005b600184015461ffff16821015610d91576000818152600285016020526040812054905b6008811015610d7c5783610cf181611c4e565b600188015490955061ffff1685119050610d7c57600581901b82901b6001600160e01b0319811660009081526020889052604090205460601c6001600160a01b038a1603610d735780888781518110610d4c57610d4c611c67565b6001600160e01b03199092166020928302919091019091015285610d6f81611c4e565b9650505b50600101610cde565b50508080610d8990611c4e565b915050610cbb565b5050825250919050565b600080516020611e6b833981519152546001600160a01b03163314610dd25760405162461bcd60e51b815260040161012090611a39565b61075c81600080516020611e2b83398151915261073e565b600080516020611e4b83398151915290565b600184015461ffff811690819060009060071615610e2c5750600381901c60009081526002870160205260409020545b60005b8651811015610f41576000878281518110610e4c57610e4c611c67565b60200260200101519050600081602001519050600082604001515111610ec05760405162461bcd60e51b815260206004820152602360248201527f4469616d6f6e64426173653a206e6f2073656c6563746f7273207370656369666044820152621a595960ea1b6064820152608401610120565b6000816002811115610ed457610ed4611c9c565b03610eef57610ee58a868685610fcd565b9095509350610f37565b6002816002811115610f0357610f03611c9c565b03610f1457610ee58a868685611180565b6001816002811115610f2857610f28611c9c565b03610f3757610f378a83611418565b5050600101610e2f565b50828214610f5d5760018701805461ffff191661ffff84161790555b6007821615610f7f57600382901c600090815260028801602052604090208190555b7f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb673868686604051610fb293929190611d02565b60405180910390a1610fc48585611610565b50505050505050565b805160009081906001600160a01b0316301480610ff4575082516001600160a01b03163b15155b61104c5760405162461bcd60e51b815260206004820152602360248201527f4469616d6f6e64426173653a204144442074617267657420686173206e6f20636044820152626f646560e81b6064820152608401610120565b60005b8360400151518110156111735760008460400151828151811061107457611074611c67565b6020908102919091018101516001600160e01b031981166000908152918a9052604090912054909150606081901c156110fb5760405162461bcd60e51b815260206004820152602360248201527f4469616d6f6e64426173653a2073656c6563746f7220616c726561647920616460448201526219195960ea1b6064820152608401610120565b85516001600160e01b0319838116600081815260208d90526040902060609390931b6001600160601b0319168b1790925560058a901b60e090811692831c91831c1999909916179781900361116457600389901c600090815260028b0160205260408120989098555b5050506001958601950161104f565b5093959294509192505050565b805160009081906001600160a01b0316156111f55760405162461bcd60e51b815260206004820152602f60248201527f4469616d6f6e64426173653a2052454d4f564520746172676574206d7573742060448201526e6265207a65726f206164647265737360881b6064820152608401610120565b600385901c6007861660005b8560400151518110156114045760008660400151828151811061122657611226611c67565b6020908102919091018101516001600160e01b031981166000908152918c9052604090912054909150606081901c6112a05760405162461bcd60e51b815260206004820152601f60248201527f4469616d6f6e64426173653a2073656c6563746f72206e6f7420666f756e64006044820152606401610120565b30606082901c036112c35760405162461bcd60e51b815260040161012090611dcc565b60008990036112ef57600019909401600081815260028c016020526040902054985093600793506112f7565b600019909301925b600584901b89901b6000806001600160e01b03198084169086161461134e576001600160e01b03198316600090815260208f90526040902080546001600160601b0319166bffffffffffffffffffffffff86161790555b50506001600160e01b03198316600090815260208d90526040812055611fff600383901c1660e0600584901b168782146113b157600082815260028f016020526040902080546001600160e01b031980841c19909116908516831c1790556113d5565b80836001600160e01b031916901c816001600160e01b031960001b901c198d16179b505b866000036113f357600088815260028f01602052604081208190559b505b505060019093019250611201915050565b5060039190911b1796939550929350505050565b80516001600160a01b03163b6114805760405162461bcd60e51b815260206004820152602760248201527f4469616d6f6e64426173653a205245504c4143452074617267657420686173206044820152666e6f20636f646560c81b6064820152608401610120565b60005b81604001515181101561160b576000826040015182815181106114a8576114a8611c67565b6020908102919091018101516001600160e01b03198116600090815291869052604090912054909150606081901c806115235760405162461bcd60e51b815260206004820152601f60248201527f4469616d6f6e64426173653a2073656c6563746f72206e6f7420666f756e64006044820152606401610120565b306001600160a01b0382160361154b5760405162461bcd60e51b815260040161012090611dcc565b84600001516001600160a01b0316816001600160a01b0316036115c15760405162461bcd60e51b815260206004820152602860248201527f4469616d6f6e64426173653a205245504c41434520746172676574206973206960448201526719195b9d1a58d85b60c21b6064820152608401610120565b5083516001600160e01b031992909216600090815260208690526040902060609290921b6001600160601b0319166bffffffffffffffffffffffff91909116179055600101611483565b505050565b8051156001600160a01b03831615146116825760405162461bcd60e51b815260206004820152602e60248201527f4469616d6f6e64426173653a20696e76616c696420696e697469616c697a617460448201526d696f6e20706172616d657465727360901b6064820152608401610120565b6001600160a01b0382161561177c576001600160a01b038216301461170f576001600160a01b0382163b61170f5760405162461bcd60e51b815260206004820152602e60248201527f4469616d6f6e64426173653a20696e697469616c697a6174696f6e207461726760448201526d657420686173206e6f20636f646560901b6064820152608401610120565b6000826001600160a01b0316826040516117299190611e0e565b600060405180830381855af49150503d8060008114611764576040519150601f19603f3d011682016040523d82523d6000602084013e611769565b606091505b505090508061160b573d6000803e3d6000fd5b5050565b80356001600160e01b03198116811461179857600080fd5b919050565b6000602082840312156117af57600080fd5b61040f82611780565b80356001600160a01b038116811461179857600080fd5b60008083601f8401126117e157600080fd5b50813567ffffffffffffffff8111156117f957600080fd5b60208301915083602082850101111561181157600080fd5b9250929050565b60008060008060006060868803121561183057600080fd5b853567ffffffffffffffff8082111561184857600080fd5b818801915088601f83011261185c57600080fd5b81358181111561186b57600080fd5b8960208260051b850101111561188057600080fd5b60208301975080965050611896602089016117b8565b945060408801359150808211156118ac57600080fd5b506118b9888289016117cf565b969995985093965092949392505050565b6020808252825182820181905260009190848201906040850190845b8181101561190b5783516001600160a01b0316835292840192918401916001016118e6565b50909695505050505050565b60008151808452602080850194506020840160005b838110156119525781516001600160e01b0319168752958201959082019060010161192c565b509495945050505050565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b838110156119ce57888303603f19018552815180516001600160a01b031684528701518784018790526119bb87850182611917565b9588019593505090860190600101611986565b509098975050505050505050565b6000602082840312156119ee57600080fd5b61040f826117b8565b6020808252825182820181905260009190848201906040850190845b8181101561190b5783516001600160e01b03191683529284019291840191600101611a13565b6020808252601d908201527f4f776e61626c653a2073656e646572206d757374206265206f776e6572000000604082015260600190565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715611aa957611aa9611a70565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611ad857611ad8611a70565b604052919050565b600067ffffffffffffffff821115611afa57611afa611a70565b5060051b60200190565b6000611b17611b1284611ae0565b611aaf565b83815260208082019190600586811b860136811115611b3557600080fd5b865b81811015611c2b57803567ffffffffffffffff80821115611b585760008081fd5b818a01915060608236031215611b6e5760008081fd5b611b76611a86565b611b7f836117b8565b81528683013560038110611b935760008081fd5b8188015260408381013583811115611bab5760008081fd5b939093019236601f850112611bc257600092508283fd5b83359250611bd2611b1284611ae0565b83815292871b84018801928881019036851115611bef5760008081fd5b948901945b84861015611c1457611c0586611780565b82529489019490890190611bf4565b918301919091525088525050948301948301611b37565b5092979650505050505050565b634e487b7160e01b600052601160045260246000fd5b600060018201611c6057611c60611c38565b5060010190565b634e487b7160e01b600052603260045260246000fd5b600060ff821660ff8103611c9357611c93611c38565b60010192915050565b634e487b7160e01b600052602160045260246000fd5b60005b83811015611ccd578181015183820152602001611cb5565b50506000910152565b60008151808452611cee816020860160208601611cb2565b601f01601f19169290920160200192915050565b600060608083016060845280875180835260808601915060808160051b87010192506020808a016000805b84811015611d9c57898703607f19018652825180516001600160a01b031688528481015160038110611d6d57634e487b7160e01b84526021600452602484fd5b88860152604090810151908801899052611d8989890182611917565b9750509483019491830191600101611d2d565b5050506001600160a01b0389169087015250508381036040850152611dc18186611cd6565b979650505050505050565b60208082526022908201527f4469616d6f6e64426173653a2073656c6563746f7220697320696d6d757461626040820152616c6560f01b606082015260800190565b60008251611e20818460208701611cb2565b919091019291505056fe24aa1f7b31fd188a8d3ecfb06bc55c806040e59b03bd4396283442fce6617890177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc938a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f671680460a2646970667358221220b64081504a66bbecefbd1d8f4b1a8969e48f6ed025eb1bc85e895abd7736387f64736f6c63430008170033
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.