Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 84 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 20412758 | 29 days ago | IN | 0 ETH | 0.00031416 | ||||
Redeem | 17738237 | 404 days ago | IN | 0 ETH | 0.0008891 | ||||
Withdraw | 16834490 | 531 days ago | IN | 0 ETH | 0.0014476 | ||||
Withdraw | 16834475 | 531 days ago | IN | 0 ETH | 0.00156 | ||||
Withdraw | 16834461 | 531 days ago | IN | 0 ETH | 0.00173494 | ||||
Safe Transfer Fr... | 16742667 | 544 days ago | IN | 0 ETH | 0.00450661 | ||||
0x3c6d610b | 16595042 | 565 days ago | IN | 0 ETH | 0.00580224 | ||||
Safe Transfer Fr... | 16542997 | 572 days ago | IN | 0 ETH | 0.00450007 | ||||
Safe Transfer Fr... | 16542561 | 572 days ago | IN | 0 ETH | 0.00647221 | ||||
Safe Transfer Fr... | 16542544 | 572 days ago | IN | 0 ETH | 0.00658326 | ||||
0xb038965c | 16491837 | 579 days ago | IN | 0.5 ETH | 0.00781948 | ||||
Withdraw | 16478151 | 581 days ago | IN | 0 ETH | 0.00219155 | ||||
Safe Transfer Fr... | 16470972 | 582 days ago | IN | 0 ETH | 0.00408731 | ||||
Transfer From | 16470396 | 582 days ago | IN | 0 ETH | 0.00285851 | ||||
Transfer From | 16470391 | 582 days ago | IN | 0 ETH | 0.00307084 | ||||
Safe Transfer Fr... | 16463944 | 583 days ago | IN | 0 ETH | 0.00210606 | ||||
Safe Transfer Fr... | 16449439 | 585 days ago | IN | 0 ETH | 0.00685298 | ||||
Redeem | 16444881 | 586 days ago | IN | 0 ETH | 0.00061706 | ||||
0xb038965c | 16441768 | 586 days ago | IN | 0.5 ETH | 0.02373383 | ||||
Redeem | 16437684 | 587 days ago | IN | 0 ETH | 0.00072062 | ||||
0xb038965c | 16437653 | 587 days ago | IN | 0.5 ETH | 0.00545809 | ||||
0xb038965c | 16437132 | 587 days ago | IN | 0.5 ETH | 0.00867941 | ||||
Whitelist Mint | 16437129 | 587 days ago | IN | 0.5 ETH | 0.00113266 | ||||
0xb038965c | 16436828 | 587 days ago | IN | 0.35 ETH | 0.00531846 | ||||
Transfer From | 16436504 | 587 days ago | IN | 0 ETH | 0.00229786 |
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:
DiamondBaseProxy
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 1000000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {SolidStateDiamond} from "@solidstate/contracts/proxy/diamond/SolidStateDiamond.sol"; contract DiamondBaseProxy is SolidStateDiamond {}
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import { IERC173Internal } from './IERC173Internal.sol'; /** * @title Contract ownership standard interface * @dev see https://eips.ethereum.org/EIPS/eip-173 */ interface IERC173 is IERC173Internal { /** * @notice get the ERC173 contract owner * @return conrtact 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; /** * @title Partial ERC173 interface needed by internal functions */ interface IERC173Internal { event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import { IERC173 } from '../IERC173.sol'; interface IOwnable is IERC173 {}
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import { IERC173Internal } from '../IERC173Internal.sol'; interface IOwnableInternal is IERC173Internal {}
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import { IOwnable } from './IOwnable.sol'; interface ISafeOwnable is IOwnable { /** * @notice get the nominated owner who has permission to call acceptOwnership */ function nomineeOwner() external view returns (address); /** * @notice accept transfer of contract ownership */ function acceptOwnership() external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import { IOwnableInternal } from './IOwnableInternal.sol'; interface ISafeOwnableInternal is IOwnableInternal {}
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import { IERC173 } from '../IERC173.sol'; import { IOwnable } from './IOwnable.sol'; import { OwnableInternal } from './OwnableInternal.sol'; import { OwnableStorage } from './OwnableStorage.sol'; /** * @title Ownership access control based on ERC173 */ abstract contract Ownable is IOwnable, OwnableInternal { using OwnableStorage for OwnableStorage.Layout; /** * @inheritdoc IERC173 */ function owner() public view virtual returns (address) { return _owner(); } /** * @inheritdoc IERC173 */ function transferOwnership(address account) public virtual onlyOwner { _transferOwnership(account); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import { IOwnableInternal } from './IOwnableInternal.sol'; import { OwnableStorage } from './OwnableStorage.sol'; abstract contract OwnableInternal is IOwnableInternal { using OwnableStorage for OwnableStorage.Layout; modifier onlyOwner() { require( msg.sender == OwnableStorage.layout().owner, 'Ownable: sender must be owner' ); _; } function _owner() internal view virtual returns (address) { return OwnableStorage.layout().owner; } function _transferOwnership(address account) internal virtual { OwnableStorage.layout().setOwner(account); emit OwnershipTransferred(msg.sender, account); } }
// 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 { ISafeOwnable } from './ISafeOwnable.sol'; import { OwnableInternal } from './OwnableInternal.sol'; import { SafeOwnableInternal } from './SafeOwnableInternal.sol'; /** * @title Ownership access control based on ERC173 with ownership transfer safety check */ abstract contract SafeOwnable is ISafeOwnable, Ownable, SafeOwnableInternal { /** * @inheritdoc ISafeOwnable */ function nomineeOwner() public view virtual returns (address) { return _nomineeOwner(); } /** * @inheritdoc ISafeOwnable */ function acceptOwnership() public virtual onlyNomineeOwner { _acceptOwnership(); } function _transferOwnership(address account) internal virtual override(OwnableInternal, SafeOwnableInternal) { super._transferOwnership(account); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import { ISafeOwnableInternal } from './ISafeOwnableInternal.sol'; import { OwnableInternal } from './OwnableInternal.sol'; import { OwnableStorage } from './OwnableStorage.sol'; import { SafeOwnableStorage } from './SafeOwnableStorage.sol'; abstract contract SafeOwnableInternal is ISafeOwnableInternal, OwnableInternal { using OwnableStorage for OwnableStorage.Layout; using SafeOwnableStorage for SafeOwnableStorage.Layout; modifier onlyNomineeOwner() { require( msg.sender == _nomineeOwner(), 'SafeOwnable: sender must be nominee owner' ); _; } /** * @notice get the nominated owner who has permission to call acceptOwnership */ function _nomineeOwner() internal view virtual returns (address) { return SafeOwnableStorage.layout().nomineeOwner; } /** * @notice accept transfer of contract ownership */ function _acceptOwnership() internal virtual { OwnableStorage.Layout storage l = OwnableStorage.layout(); emit OwnershipTransferred(l.owner, msg.sender); l.setOwner(msg.sender); SafeOwnableStorage.layout().setNomineeOwner(address(0)); } /** * @notice set nominee owner, granting permission to call acceptOwnership */ function _transferOwnership(address account) internal virtual override { SafeOwnableStorage.layout().setNomineeOwner(account); } }
// 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 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 { Proxy } from '../../Proxy.sol'; import { IDiamondBase } from './IDiamondBase.sol'; import { DiamondBaseStorage } from './DiamondBaseStorage.sol'; /** * @title EIP-2535 "Diamond" proxy base contract * @dev see https://eips.ethereum.org/EIPS/eip-2535 */ abstract contract DiamondBase is IDiamondBase, 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 { IDiamondWritable } from '../writable/IDiamondWritable.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( IDiamondWritable.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, IDiamondWritable.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++) { IDiamondWritable.FacetCut memory facetCut = facetCuts[i]; IDiamondWritable.FacetCutAction action = facetCut.action; require( facetCut.selectors.length > 0, 'DiamondBase: no selectors specified' ); if (action == IDiamondWritable.FacetCutAction.ADD) { (selectorCount, selectorSlot) = l.addFacetSelectors( selectorCount, selectorSlot, facetCut ); } else if (action == IDiamondWritable.FacetCutAction.REPLACE) { l.replaceFacetSelectors(facetCut); } else if (action == IDiamondWritable.FacetCutAction.REMOVE) { (selectorCount, selectorSlot) = l.removeFacetSelectors( selectorCount, selectorSlot, 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, IDiamondWritable.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, IDiamondWritable.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, IDiamondWritable.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 { IProxy } from '../../IProxy.sol'; interface IDiamondBase is IProxy {}
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import { ISafeOwnable } from '../../access/ownable/ISafeOwnable.sol'; import { IERC165 } from '../../introspection/IERC165.sol'; import { IDiamondBase } from './base/IDiamondBase.sol'; import { IDiamondReadable } from './readable/IDiamondReadable.sol'; import { IDiamondWritable } from './writable/IDiamondWritable.sol'; interface ISolidStateDiamond is IDiamondBase, IDiamondReadable, IDiamondWritable, ISafeOwnable, IERC165 { receive() external payable; /** * @notice get the address of the fallback contract * @return fallback address */ function getFallbackAddress() external view returns (address); /** * @notice set the address of the fallback contract * @param fallbackAddress fallback address */ function setFallbackAddress(address fallbackAddress) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import { DiamondBaseStorage } from '../base/DiamondBaseStorage.sol'; import { IDiamondReadable } from './IDiamondReadable.sol'; /** * @title EIP-2535 "Diamond" proxy introspection contract * @dev derived from https://github.com/mudgen/diamond-2 (MIT license) */ abstract contract DiamondReadable is IDiamondReadable { /** * @inheritdoc IDiamondReadable */ function facets() external view 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 IDiamondReadable */ function facetFunctionSelectors(address facet) external view 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 IDiamondReadable */ function facetAddresses() external view 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 IDiamondReadable */ function facetAddress(bytes4 selector) external view returns (address facet) { facet = address(bytes20(DiamondBaseStorage.layout().facets[selector])); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title Diamond proxy introspection interface * @dev see https://eips.ethereum.org/EIPS/eip-2535 */ interface IDiamondReadable { 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; import { IOwnable, Ownable, OwnableInternal, OwnableStorage } from '../../access/ownable/Ownable.sol'; import { ISafeOwnable, SafeOwnable } from '../../access/ownable/SafeOwnable.sol'; import { IERC173 } from '../../access/IERC173.sol'; import { ERC165, IERC165, ERC165Storage } from '../../introspection/ERC165.sol'; import { DiamondBase, DiamondBaseStorage } from './base/DiamondBase.sol'; import { DiamondReadable, IDiamondReadable } from './readable/DiamondReadable.sol'; import { DiamondWritable, IDiamondWritable } from './writable/DiamondWritable.sol'; import { ISolidStateDiamond } from './ISolidStateDiamond.sol'; /** * @title SolidState "Diamond" proxy reference implementation */ abstract contract SolidStateDiamond is ISolidStateDiamond, DiamondBase, DiamondReadable, DiamondWritable, 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 DiamondWritable selectors[0] = IDiamondWritable.diamondCut.selector; erc165.setSupportedInterface(type(IDiamondWritable).interfaceId, true); // register DiamondReadable selectors[1] = IDiamondReadable.facets.selector; selectors[2] = IDiamondReadable.facetFunctionSelectors.selector; selectors[3] = IDiamondReadable.facetAddresses.selector; selectors[4] = IDiamondReadable.facetAddress.selector; erc165.setSupportedInterface(type(IDiamondReadable).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] = Ownable.transferOwnership.selector; selectors[9] = SafeOwnable.acceptOwnership.selector; erc165.setSupportedInterface(type(IERC173).interfaceId, true); // register Diamond selectors[10] = SolidStateDiamond.getFallbackAddress.selector; selectors[11] = SolidStateDiamond.setFallbackAddress.selector; // diamond cut FacetCut[] memory facetCuts = new FacetCut[](1); facetCuts[0] = FacetCut({ target: address(this), action: IDiamondWritable.FacetCutAction.ADD, selectors: selectors }); DiamondBaseStorage.layout().diamondCut(facetCuts, address(0), ''); // set owner OwnableStorage.layout().setOwner(msg.sender); } receive() external payable {} /** * @inheritdoc ISolidStateDiamond */ function getFallbackAddress() external view returns (address) { return DiamondBaseStorage.layout().fallbackAddress; } /** * @inheritdoc ISolidStateDiamond */ function setFallbackAddress(address fallbackAddress) external onlyOwner { DiamondBaseStorage.layout().fallbackAddress = fallbackAddress; } function _transferOwnership(address account) internal virtual override(OwnableInternal, SafeOwnable) { super._transferOwnership(account); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import { OwnableInternal } from '../../../access/ownable/OwnableInternal.sol'; import { DiamondBaseStorage } from '../base/DiamondBaseStorage.sol'; import { IDiamondWritable } from './IDiamondWritable.sol'; /** * @title EIP-2535 "Diamond" proxy update contract */ abstract contract DiamondWritable is IDiamondWritable, OwnableInternal { using DiamondBaseStorage for DiamondBaseStorage.Layout; /** * @inheritdoc IDiamondWritable */ function diamondCut( FacetCut[] calldata facetCuts, address target, bytes calldata data ) external onlyOwner { DiamondBaseStorage.layout().diamondCut(facetCuts, target, data); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title Diamond proxy upgrade interface * @dev see https://eips.ethereum.org/EIPS/eip-2535 */ interface IDiamondWritable { 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 array of structured Diamond facet update data * @param target optional target of initialization delegatecall * @param data optional initialization function call data */ function diamondCut( FacetCut[] calldata facetCuts, address target, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IProxy { fallback() external payable; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import { AddressUtils } from '../utils/AddressUtils.sol'; import { IProxy } from './IProxy.sol'; /** * @title Base proxy contract */ abstract contract Proxy is IProxy { 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 { UintUtils } from './UintUtils.sol'; library AddressUtils { using UintUtils for uint256; function toString(address account) internal pure returns (string memory) { return uint256(uint160(account)).toHexString(20); } 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); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title utility functions for uint256 operations * @dev derived from https://github.com/OpenZeppelin/openzeppelin-contracts/ (MIT license) */ library UintUtils { bytes16 private constant HEX_SYMBOLS = '0123456789abcdef'; function toString(uint256 value) internal pure returns (string memory) { 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); } function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return '0x00'; } uint256 length = 0; for (uint256 temp = value; temp != 0; temp >>= 8) { unchecked { length++; } } return toHexString(value, 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'; unchecked { for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = HEX_SYMBOLS[value & 0xf]; value >>= 4; } } require(value == 0, 'UintUtils: hex length insufficient'); return string(buffer); } }
{ "viaIR": true, "optimizer": { "enabled": true, "runs": 1000000 }, "metadata": { "bytecodeHash": "none" }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"enum IDiamondWritable.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"selectors","type":"bytes4[]"}],"indexed":false,"internalType":"struct IDiamondWritable.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 IDiamondWritable.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"selectors","type":"bytes4[]"}],"internalType":"struct IDiamondWritable.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 IDiamondReadable.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
6080604052346200031357620002d2620000186200035e565b620000336200002782620003b4565b6307e4c70760e21b9052565b6307e4c70760e21b60005260008051602062003bb28339815191526020527f0d4788a0b44c46b444980749e449748fac74ddbe9c9a3c4b852be9d6953626eb805460ff19166001179055620000986200008c82620003d1565b637a0ed62760e01b9052565b620000b3620000a782620003e3565b6356fe50af60e11b9052565b620000ce620000c282620003f5565b6314bbdacb60e21b9052565b620000e9620000dd8262000407565b6366ffd66360e11b9052565b6348e2b09360e01b60005260008051602062003bb28339815191526020527ff1c26c15c4c7e7a3d7e88294bd51c8400a73e713f6f4d7d5b796efd9d76bb4f2805460ff191660011790556200014e620001428262000419565b6301ffc9a760e01b9052565b6301ffc9a760e01b60005260008051602062003bb28339815191526020527f957b6597519742eecfd87d4d72f1dfbc376d634e105d7285e1edcf5e10a29882805460ff19166001179055620001b3620001a7826200042b565b638da5cb5b60e01b9052565b620001ce620001c2826200043d565b63455a8a8560e11b9052565b620001e9620001dd8262000450565b63f2fde38b60e01b9052565b62000204620001f88262000463565b6379ba509760e01b9052565b6307f5828d60e41b60005260008051602062003bb28339815191526020527fa72fb21d8f9d3357d2fcee8a0068d4df1505cb14a9a87b701b976ac59696dd52805460ff19166001179055620002696200025d8262000476565b632c40805960e01b9052565b62000284620002788262000489565b639142376560e01b9052565b6200028e620004c2565b90620002996200032f565b30815290600060208301526040820152620002b482620003b4565b52620002c081620003b4565b50620002cb6200055a565b906200071b565b7f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f67168046080546001600160a01b03191633179055604051612a8c9081620011068239f35b600080fd5b50634e487b7160e01b600052604160045260246000fd5b60405190606082016001600160401b038111838210176200034f57604052565b6200035962000318565b604052565b604051906101a082016001600160401b038111838210176200038d575b604052600c8252610180366020840137565b6200039762000318565b6200037b565b50634e487b7160e01b600052603260045260246000fd5b602090805115620003c3570190565b620003cd6200039d565b0190565b604090805160011015620003c3570190565b606090805160021015620003c3570190565b608090805160031015620003c3570190565b60a090805160041015620003c3570190565b60c090805160051015620003c3570190565b60e090805160061015620003c3570190565b61010090805160071015620003c3570190565b61012090805160081015620003c3570190565b61014090805160091015620003c3570190565b610160908051600a1015620003c3570190565b610180908051600b1015620003c3570190565b6020918151811015620004b2575b60051b010190565b620004bc6200039d565b620004aa565b6040805191908281016001600160401b0381118482101762000529575b8152600183528291600091825b602080821015620005205790602091620005056200032f565b908682528681830152606085830152828901015201620004ec565b50505091925050565b6200053362000318565b620004df565b600311156200054457565b634e487b7160e01b600052602160045260246000fd5b60405190602082016001600160401b038111838210176200057f575b60405260008252565b6200058962000318565b62000576565b156200059757565b60405162461bcd60e51b815260206004820152602360248201527f4469616d6f6e64426173653a206e6f2073656c6563746f7273207370656369666044820152621a595960ea1b6064820152608490fd5b919082519283825260005b84811062000615575050826000602080949584010152601f8019910116010190565b602081830181015184830182015201620005f3565b919091606092838201848352815180915260809485840191868160051b860101966020809501936000915b83831062000681575050505050509060006200067e9493928201526040818403910152620005e8565b90565b909192939498607f198882030183528951908681019060018060a01b038351168152888301516003811015620005445784828b9594939286809401528a604080960151958201528451809452019201906000905b808210620006f65750505090806001929b0193019301919493929062000655565b82516001600160e01b03191684528a94938401939092019160019190910190620006d5565b919091620007456200073e60008051602062003b928339815191525461ffff1690565b61ffff1690565b90819260009460078416620008d7575b6000935b835185101562000825576200076f85856200049c565b51906020820151620007818162000539565b6200079360408401515115156200058f565b6200079e8162000539565b80620007c0575090600197620007b492620009b9565b9690945b019362000759565b620007cf819793929762000539565b60018103620007ed575090620007e760019262000f94565b620007b8565b80620007fb60029262000539565b146200080c575b50600190620007b8565b6001976200081b929662000c5f565b9690949062000802565b819450957f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb6739391929662000881968103620008b2575b6007811662000883575b505062000878604051928392836200062a565b0390a16200109d565b565b620008a99060031c60005260008051602062003bf2833981519152602052604060002090565b55388062000865565b60008051602062003b92833981519152805461ffff191661ffff83161790556200085b565b9450620008ff8360031c60005260008051602062003bf2833981519152602052604060002090565b549462000755565b156200090f57565b60405162461bcd60e51b815260206004820152602360248201527f4469616d6f6e64426173653a204144442074617267657420686173206e6f20636044820152626f646560e81b6064820152608490fd5b156200096857565b60405162461bcd60e51b815260206004820152602360248201527f4469616d6f6e64426173653a2073656c6563746f7220616c726561647920616460448201526219195960ea1b6064820152608490fd5b8251929392909190620009eb906001600160a01b03166001600160a01b038116301490811562000b49575b5062000907565b60009384925b6040820151805185101562000b3f5762000a108562000a1e926200049c565b516001600160e01b03191690565b62000a8162000a7a62000a6e62000a6862000a5a8563ffffffff60e01b1660005260008051602062003bd2833981519152602052604060002090565b546001600160601b03191690565b60601c90565b6001600160a01b031690565b1562000960565b825182906001600160601b03199062000aae906001600160a01b03165b60601b6001600160601b03191690565b161762000adc8263ffffffff60e01b1660005260008051602062003bd2833981519152602052604060002090565b5560e090818360051b169463ffffffff60e01b809216861c91861c191617931462000b0f575b60019384019301620009f1565b9162000b368360031c60005260008051602062003bf2833981519152602052604060002090565b55849162000b02565b5092505092509190565b90503b151538620009e4565b1562000b5d57565b60405162461bcd60e51b815260206004820152602f60248201527f4469616d6f6e64426173653a2052454d4f564520746172676574206d7573742060448201526e6265207a65726f206164647265737360881b6064820152608490fd5b1562000bc257565b60405162461bcd60e51b815260206004820152601f60248201527f4469616d6f6e64426173653a2073656c6563746f72206e6f7420666f756e64006044820152606490fd5b1562000c0f57565b60405162461bcd60e51b815260206004820152602260248201527f4469616d6f6e64426173653a2073656c6563746f7220697320696d6d757461626044820152616c6560f01b6064820152608490fd5b825190919062000c79906001600160a01b03161562000b55565b600780831692600390600090821c5b6040870151805183101562000ecb5762000a108362000ca7926200049c565b9462000cd48663ffffffff60e01b1660005260008051602062003bd2833981519152602052604060002090565b549662000cf48860601c62000ceb81151562000bba565b30141562000c07565b8162000eb8575050600019019062000d248260005260008051602062003bf2833981519152602052604060002090565b5494849687915b60e063ffffffff811b92600062000d76858c600598891b1b1694868116860362000e345763ffffffff60e01b1660005260008051602062003bd2833981519152602052604060002090565b5580881c611fff16941b169185841462000e21579062000ddc929162000db48560005260008051602062003bf2833981519152602052604060002090565b5491831c921c1916179160005260008051602062003bf2833981519152602052604060002090565b555b851562000df0575b6001019062000c88565b9350600062000e178260005260008051602062003bf2833981519152602052604060002090565b5560009362000de6565b9180949893501c921c1916179362000dde565b62000e7562000e6862000a5a8863ffffffff60e01b1660005260008051602062003bd2833981519152602052604060002090565b6001600160601b03191690565b6001600160e01b0319878116600090815260008051602062003bd283398151915260205260408082206001600160601b0389169490941790935592168252902090565b6000190196909591929187919062000d2b565b50939695505090501b179190565b1562000ee157565b60405162461bcd60e51b815260206004820152602760248201527f4469616d6f6e64426173653a205245504c4143452074617267657420686173206044820152666e6f20636f646560c81b6064820152608490fd5b1562000f3e57565b60405162461bcd60e51b815260206004820152602860248201527f4469616d6f6e64426173653a205245504c41434520746172676574206973206960448201526719195b9d1a58d85b60c21b6064820152608490fd5b805162000fad906001600160a01b03163b151562000ed9565b60005b6040820151908151811015620010985762000fd262000a10826001946200049c565b62001090620010028263ffffffff60e01b1660005260008051602062003bd2833981519152602052604060002090565b54620010448160601c6200101881151562000bba565b620010263082141562000c07565b87516200103c906001600160a01b031662000a6e565b141562000f36565b85516200105f9062000e68906001600160a01b031662000a9e565b90858060601b0316179163ffffffff60e01b1660005260008051602062003bd2833981519152602052604060002090565b550162000fb0565b505050565b5115600103620010a957565b60405162461bcd60e51b815260206004820152602e60248201527f4469616d6f6e64426173653a20696e76616c696420696e697469616c697a617460448201526d696f6e20706172616d657465727360901b6064820152608490fdfe6080604052600436101561001e575b361561001c5761001c61131a565b005b60003560e01c806301ffc9a71461010e5780631f931c1c146101055780632c408059146100fc57806352ef6b2c146100f357806379ba5097146100ea5780637a0ed627146100e15780638ab5150a146100d85780638da5cb5b146100cf57806391423765146100c6578063adfca15e146100bd578063cdffacc6146100b45763f2fde38b0361000e576100af611160565b61000e565b506100af6110cc565b506100af610eed565b506100af610dc6565b506100af610d54565b506100af610ce2565b506100af610968565b506100af610694565b506100af6103ff565b506100af61033c565b506100af6102a3565b506100af610178565b600435907fffffffff000000000000000000000000000000000000000000000000000000008216820361014657565b600080fd5b35907fffffffff000000000000000000000000000000000000000000000000000000008216820361014657565b50346101465760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610146577fffffffff000000000000000000000000000000000000000000000000000000006101d1610117565b166000527f326d0c59a7612f6a9919e2a8ee333c80ba689d8ba2634de89c85cbb04832e705602052602060ff604060002054166040519015158152f35b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361014657565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361014657565b359073ffffffffffffffffffffffffffffffffffffffff8216820361014657565b9181601f840112156101465782359167ffffffffffffffff8311610146576020838186019501011161014657565b50346101465760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101465760043567ffffffffffffffff808211610146573660238301121561014657816004013591818311610146573660248460051b830101116101465761031561020e565b6044359283116101465761001c936103336024943690600401610275565b949093016116f9565b50346101465760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014657602073ffffffffffffffffffffffffffffffffffffffff7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc965416604051908152f35b6020908160408183019282815285518094520193019160005b8281106103d5575050505090565b835173ffffffffffffffffffffffffffffffffffffffff16855293810193928101926001016103c7565b5034610146576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106915761046661045f7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc945461ffff1690565b61ffff1690565b90610470826115c9565b908080815b858210610491578385526040518061048d87826103ae565b0390f35b6104c4816000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc95602052604060002090565b5483905b600882106104e1575b50506104dc9061163e565b610475565b9195939690926104f09061163e565b94818611610684576105a66105a061057a7fffffffff00000000000000000000000000000000000000000000000000000000868860051b1b167fffffffff00000000000000000000000000000000000000000000000000000000166000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052604060002090565b547fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001690565b60601c90565b8873ffffffffffffffffffffffffffffffffffffffff8216815b848110610621575b505061061657816105fe610603926105e3610609958a6116be565b9073ffffffffffffffffffffffffffffffffffffffff169052565b61163e565b9361163e565b90969395919492946104c8565b50926106099061163e565b61066461064b610631838c6116be565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b8214610678576106739061163e565b6105c0565b505050600138806105c8565b94928197949692506104d1565b80fd5b5034610146576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106915773ffffffffffffffffffffffffffffffffffffffff807f24aa1f7b31fd188a8d3ecfb06bc55c806040e59b03bd4396283442fce6617890541633036107e55733907f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f67168046054167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a37f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f67168046080547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790556107e27f24aa1f7b31fd188a8d3ecfb06bc55c806040e59b03bd4396283442fce66178907fffffffffffffffffffffffff00000000000000000000000000000000000000008154169055565b80f35b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f536166654f776e61626c653a2073656e646572206d757374206265206e6f6d6960448201527f6e6565206f776e657200000000000000000000000000000000000000000000006064820152fd5b90815180825260208080930193019160005b828110610889575050505090565b83517fffffffff00000000000000000000000000000000000000000000000000000000168552938101939281019260010161087b565b602080820190808352835180925260409283810182858560051b8401019601946000925b8584106108f4575050505050505090565b909192939495968580610957837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0866001960301885286838d5173ffffffffffffffffffffffffffffffffffffffff815116845201519181858201520190610869565b9901940194019295949391906108e3565b5034610146576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610691576109c861045f7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc945461ffff1690565b6109d181611532565b906109db816115c9565b92809181825b828210610a3f575050505b818110610a04578183526040518061048d85826108bf565b80610a25610a1f610a18610a3a94886116be565b5160ff1690565b60ff1690565b6020610a3183876116be565b5101515261163e565b6109ec565b610a72816000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc95602052604060002090565b5484905b60088210610a8f575b5050610a8a9061163e565b6109e1565b9093919692610aa09098959861163e565b95828711610cd5577fffffffff00000000000000000000000000000000000000000000000000000000828660051b1b16610b2b6105a061057a837fffffffff00000000000000000000000000000000000000000000000000000000166000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052604060002090565b8a73ffffffffffffffffffffffffffffffffffffffff8216815b858110610c12575b5050610c065791610bde610bf192610b88610bf795610b6c858b6116be565b519073ffffffffffffffffffffffffffffffffffffffff169052565b610bb7610b94886115c9565b60209081610ba2878d6116be565b510152610baf858b6116be565b5101516116a8565b907fffffffff00000000000000000000000000000000000000000000000000000000169052565b6105fe610beb828a6116be565b60019052565b9461163e565b90979497969193959296610a76565b505093610bf79061163e565b8a858a84610c4161064b610c2687856116be565b515173ffffffffffffffffffffffffffffffffffffffff1690565b14610c5757505050610c529061163e565b610b45565b610ccc955083809550610cbd93610c99610cb894610bb76020610c80610cc49a610a18986116be565b510151610c93610a1f610a1888886116be565b906116be565b610cb360ff80610cac610a1886866116be565b16106116e0565b6116be565b6116e7565b918b6116be565b9060ff169052565b60013880610b4d565b9592969193979497610a7f565b50346101465760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014657602073ffffffffffffffffffffffffffffffffffffffff7f24aa1f7b31fd188a8d3ecfb06bc55c806040e59b03bd4396283442fce66178905416604051908152f35b50346101465760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014657602073ffffffffffffffffffffffffffffffffffffffff7f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f6716804605416604051908152f35b50346101465760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014657610dfe610231565b73ffffffffffffffffffffffffffffffffffffffff610e41817f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f6716804605416331461122a565b7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc9691167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b6020908160408183019282815285518094520193019160005b828110610eb7575050505090565b83517fffffffff000000000000000000000000000000000000000000000000000000001685529381019392810192600101610ea9565b50346101465760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014657610f25610231565b610f5461045f7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc945461ffff1690565b90610f5e826115c9565b9060009073ffffffffffffffffffffffffffffffffffffffff1681805b858210610f93578385526040518061048d8782610e90565b610fc6816000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc95602052604060002090565b5460005b60088110610fe3575b5050610fde9061163e565b610f7b565b9492610ff49097919796929661163e565b948186116110be577fffffffff00000000000000000000000000000000000000000000000000000000888260051b1b1661108261064b6105a061057a847fffffffff00000000000000000000000000000000000000000000000000000000166000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052604060002090565b86146110a1575b506110939061163e565b969096959195949294610fca565b846105fe6110b792610bb76110939598886116be565b9390611089565b819750959195949294610fd3565b50346101465760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610146577fffffffff00000000000000000000000000000000000000000000000000000000611125610117565b166000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052602060406000205460601c604051908152f35b50346101465760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014657611198610231565b73ffffffffffffffffffffffffffffffffffffffff6111db817f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f6716804605416331461122a565b7f24aa1f7b31fd188a8d3ecfb06bc55c806040e59b03bd4396283442fce661789091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b1561123157565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4f776e61626c653a2073656e646572206d757374206265206f776e65720000006044820152fd5b1561129657565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f50726f78793a20696d706c656d656e746174696f6e206d75737420626520636f60448201527f6e747261637400000000000000000000000000000000000000000000000000006064820152fd5b5060007fffffffff0000000000000000000000000000000000000000000000000000000081351681527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc9360205280604081205460601c801561139f575b8061138583923b151561128f565b368280378136915af43d82803e1561139b573d90f35b3d90fd5b505073ffffffffffffffffffffffffffffffffffffffff7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc96541680156113e6578190611377565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4469616d6f6e64426173653a206e6f20666163657420666f756e6420666f722060448201527f66756e6374696f6e207369676e617475726500000000000000000000000000006064820152fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051906060820182811067ffffffffffffffff8211176114ba57604052565b6114c261146a565b604052565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f604051930116820182811067ffffffffffffffff8211176114ba57604052565b60209067ffffffffffffffff8111611525575b60051b0190565b61152d61146a565b61151e565b9061154461153f8361150b565b6114c7565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611572829461150b565b0190600090815b8381106115865750505050565b60209060408051908082019082821067ffffffffffffffff8311176115bc575b5284815282606081830152828501015201611579565b6115c461146a565b6115a6565b906115d661153f8361150b565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611604829461150b565b0190602036910137565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461166c570190565b61167461160e565b0190565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020908051156116b6570190565b611674611678565b60209181518110156116d3575b60051b010190565b6116db611678565b6116cb565b1561014657565b60ff6001911660ff811461166c570190565b949390929461174073ffffffffffffffffffffffffffffffffffffffff7f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f6716804605416331461122a565b61174c61153f8561150b565b9081948083526020809301600591821b8301923684116101465780915b84831061178e5750505050505061178c93946117869136916118a2565b91611b14565b565b67ffffffffffffffff8335818111610146578301606081360312610146576117b461149a565b916117be82610254565b835288820135600381101561014657898401526040918281013591821161014657019036601f83011215610146578135916117fb61153f8461150b565b928a808583815201918a1b8301019136831161014657918b80969492979593015b818110611836575050849550820152815201920191611769565b91939580919395976118478461014b565b8152019101918b95939196949261181c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111611895575b01160190565b61189d61146a565b61188f565b9291926118b161153f83611859565b938285528282011161014657816000926020928387013784010152565b600311156118d857565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1561190e57565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4469616d6f6e64426173653a206e6f2073656c6563746f72732073706563696660448201527f69656400000000000000000000000000000000000000000000000000000000006064820152fd5b919082519283825260005b8481106119dc5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b60208183018101518483018201520161199d565b93929091936060928382019380835281518095526080830160808660051b85010195602080940192600080915b838310611a6057505050505050611a5d9495611a509183019073ffffffffffffffffffffffffffffffffffffffff169052565b6040818403910152611992565b90565b9091929394987fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8088820301865289519073ffffffffffffffffffffffffffffffffffffffff8251168152878201516003811015611ae757611ad960019385848c9594868096015281604080940151938201520190610869565b9b0196019493019190611a1d565b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526021600452fd5b9091611b4561045f7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc945461ffff1690565b91829460009260078516611cf2575b6000935b8351851015611c0b57611b6b85856116be565b51906020820151611b7b816118ce565b611b8b6040840151511515611907565b611b94816118ce565b80611bb3575090611ba89160019697611e47565b9490955b0193611b58565b611bc081979392976118ce565b60018103611bda575090611bd560019261275b565b611bac565b80611be66002926118ce565b14611bf5575b50600190611bac565b600195611c02929761221c565b94909590611bec565b8694507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb67393919561178c9793988103611ca0575b60078116611c62575b5050611c5a85604051938493846119f0565b0390a161298d565b611c989060031c6000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc95602052604060002090565b553880611c48565b7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc9480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff8316179055611c3f565b9250611d2a8460031c6000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc95602052604060002090565b5492611b54565b15611d3857565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4469616d6f6e64426173653a204144442074617267657420686173206e6f206360448201527f6f646500000000000000000000000000000000000000000000000000000000006064820152fd5b15611dc357565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4469616d6f6e64426173653a2073656c6563746f7220616c726561647920616460448201527f64656400000000000000000000000000000000000000000000000000000000006064820152fd5b90929192611e93611e6c855173ffffffffffffffffffffffffffffffffffffffff1690565b3073ffffffffffffffffffffffffffffffffffffffff821614908115612096575b50611d31565b60009384925b6040820151805185101561208c57611eb485611eda926116be565b517fffffffff000000000000000000000000000000000000000000000000000000001690565b611f41611f3b61064b6105a061057a857fffffffff00000000000000000000000000000000000000000000000000000000166000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052604060002090565b15611dbc565b817fffffffffffffffffffffffffffffffffffffffff000000000000000000000000611fac611f84865173ffffffffffffffffffffffffffffffffffffffff1690565b60601b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001690565b1617612003827fffffffff00000000000000000000000000000000000000000000000000000000166000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052604060002090565b5560e090818360051b16947fffffffff00000000000000000000000000000000000000000000000000000000809216861c91861c191617931461204d575b60019384019301611e99565b916120848360031c6000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc95602052604060002090565b558491612041565b5092505092509190565b90503b151538611e8d565b156120a857565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4469616d6f6e64426173653a2052454d4f564520746172676574206d7573742060448201527f6265207a65726f206164647265737300000000000000000000000000000000006064820152fd5b1561213357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4469616d6f6e64426173653a2073656c6563746f72206e6f7420666f756e64006044820152fd5b1561219857565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4469616d6f6e64426173653a2073656c6563746f7220697320696d6d7574616260448201527f6c650000000000000000000000000000000000000000000000000000000000006064820152fd5b9061225a73ffffffffffffffffffffffffffffffffffffffff612253855173ffffffffffffffffffffffffffffffffffffffff1690565b16156120a1565b600780831692600390600090821c5b6040870151805183101561263757611eb483612284926116be565b946122da867fffffffff00000000000000000000000000000000000000000000000000000000166000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052604060002090565b54966122f68860601c6122ee81151561212c565b301415612191565b816126075750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190612353826000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc95602052604060002090565b5494849687915b60e07fffffffff000000000000000000000000000000000000000000000000000000009260006123e7858c600598891b1b169486811686036124d0577fffffffff00000000000000000000000000000000000000000000000000000000166000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052604060002090565b5580881c611fff16941b16918584146124be579061246c9291612433856000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc95602052604060002090565b5491831c921c191617916000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc95602052604060002090565b555b851561247e575b60010190612269565b935060006124b5826000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc95602052604060002090565b55600093612475565b9180949893501c921c1916179361246e565b61255061252b61057a887fffffffff00000000000000000000000000000000000000000000000000000000166000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052604060002090565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001690565b6bffffffffffffffffffffffff8516176125b5877fffffffff00000000000000000000000000000000000000000000000000000000166000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052604060002090565b557fffffffff00000000000000000000000000000000000000000000000000000000166000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052604060002090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0196909591929187919061235a565b50939695505090501b179190565b1561264c57565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4469616d6f6e64426173653a205245504c41434520746172676574206861732060448201527f6e6f20636f6465000000000000000000000000000000000000000000000000006064820152fd5b156126d757565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4469616d6f6e64426173653a205245504c41434520746172676574206973206960448201527f64656e746963616c0000000000000000000000000000000000000000000000006064820152fd5b61278a61278561277f835173ffffffffffffffffffffffffffffffffffffffff1690565b3b151590565b612645565b60005b60408201519081518110156128d7576127ab611eb4826001946116be565b6128d0612803827fffffffff00000000000000000000000000000000000000000000000000000000166000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052604060002090565b5461284a8160601c61281681151561212c565b61282230821415612191565b61284361064b895173ffffffffffffffffffffffffffffffffffffffff1690565b14156126d0565b6bffffffffffffffffffffffff61287b61252b611f84895173ffffffffffffffffffffffffffffffffffffffff1690565b911617917fffffffff00000000000000000000000000000000000000000000000000000000166000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052604060002090565b550161278d565b505050565b156128e357565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4469616d6f6e64426173653a20696e697469616c697a6174696f6e207461726760448201527f657420686173206e6f20636f64650000000000000000000000000000000000006064820152fd5b3d15612988573d9061297b61153f83611859565b9182523d6000602084013e565b606090565b9073ffffffffffffffffffffffffffffffffffffffff821690811581511581036129fb57156129bb57505050565b600092839230036129ea575b602082519201905af46129d8612967565b50156129e057565b3d6000803e3d6000fd5b6129f6813b15156128dc565b6129c7565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4469616d6f6e64426173653a20696e76616c696420696e697469616c697a617460448201527f696f6e20706172616d65746572730000000000000000000000000000000000006064820152fdfea164736f6c6343000811000a177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc94326d0c59a7612f6a9919e2a8ee333c80ba689d8ba2634de89c85cbb04832e705177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc95
Deployed Bytecode
0x6080604052600436101561001e575b361561001c5761001c61131a565b005b60003560e01c806301ffc9a71461010e5780631f931c1c146101055780632c408059146100fc57806352ef6b2c146100f357806379ba5097146100ea5780637a0ed627146100e15780638ab5150a146100d85780638da5cb5b146100cf57806391423765146100c6578063adfca15e146100bd578063cdffacc6146100b45763f2fde38b0361000e576100af611160565b61000e565b506100af6110cc565b506100af610eed565b506100af610dc6565b506100af610d54565b506100af610ce2565b506100af610968565b506100af610694565b506100af6103ff565b506100af61033c565b506100af6102a3565b506100af610178565b600435907fffffffff000000000000000000000000000000000000000000000000000000008216820361014657565b600080fd5b35907fffffffff000000000000000000000000000000000000000000000000000000008216820361014657565b50346101465760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610146577fffffffff000000000000000000000000000000000000000000000000000000006101d1610117565b166000527f326d0c59a7612f6a9919e2a8ee333c80ba689d8ba2634de89c85cbb04832e705602052602060ff604060002054166040519015158152f35b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361014657565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361014657565b359073ffffffffffffffffffffffffffffffffffffffff8216820361014657565b9181601f840112156101465782359167ffffffffffffffff8311610146576020838186019501011161014657565b50346101465760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101465760043567ffffffffffffffff808211610146573660238301121561014657816004013591818311610146573660248460051b830101116101465761031561020e565b6044359283116101465761001c936103336024943690600401610275565b949093016116f9565b50346101465760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014657602073ffffffffffffffffffffffffffffffffffffffff7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc965416604051908152f35b6020908160408183019282815285518094520193019160005b8281106103d5575050505090565b835173ffffffffffffffffffffffffffffffffffffffff16855293810193928101926001016103c7565b5034610146576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106915761046661045f7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc945461ffff1690565b61ffff1690565b90610470826115c9565b908080815b858210610491578385526040518061048d87826103ae565b0390f35b6104c4816000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc95602052604060002090565b5483905b600882106104e1575b50506104dc9061163e565b610475565b9195939690926104f09061163e565b94818611610684576105a66105a061057a7fffffffff00000000000000000000000000000000000000000000000000000000868860051b1b167fffffffff00000000000000000000000000000000000000000000000000000000166000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052604060002090565b547fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001690565b60601c90565b8873ffffffffffffffffffffffffffffffffffffffff8216815b848110610621575b505061061657816105fe610603926105e3610609958a6116be565b9073ffffffffffffffffffffffffffffffffffffffff169052565b61163e565b9361163e565b90969395919492946104c8565b50926106099061163e565b61066461064b610631838c6116be565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b8214610678576106739061163e565b6105c0565b505050600138806105c8565b94928197949692506104d1565b80fd5b5034610146576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106915773ffffffffffffffffffffffffffffffffffffffff807f24aa1f7b31fd188a8d3ecfb06bc55c806040e59b03bd4396283442fce6617890541633036107e55733907f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f67168046054167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a37f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f67168046080547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790556107e27f24aa1f7b31fd188a8d3ecfb06bc55c806040e59b03bd4396283442fce66178907fffffffffffffffffffffffff00000000000000000000000000000000000000008154169055565b80f35b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f536166654f776e61626c653a2073656e646572206d757374206265206e6f6d6960448201527f6e6565206f776e657200000000000000000000000000000000000000000000006064820152fd5b90815180825260208080930193019160005b828110610889575050505090565b83517fffffffff00000000000000000000000000000000000000000000000000000000168552938101939281019260010161087b565b602080820190808352835180925260409283810182858560051b8401019601946000925b8584106108f4575050505050505090565b909192939495968580610957837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0866001960301885286838d5173ffffffffffffffffffffffffffffffffffffffff815116845201519181858201520190610869565b9901940194019295949391906108e3565b5034610146576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610691576109c861045f7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc945461ffff1690565b6109d181611532565b906109db816115c9565b92809181825b828210610a3f575050505b818110610a04578183526040518061048d85826108bf565b80610a25610a1f610a18610a3a94886116be565b5160ff1690565b60ff1690565b6020610a3183876116be565b5101515261163e565b6109ec565b610a72816000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc95602052604060002090565b5484905b60088210610a8f575b5050610a8a9061163e565b6109e1565b9093919692610aa09098959861163e565b95828711610cd5577fffffffff00000000000000000000000000000000000000000000000000000000828660051b1b16610b2b6105a061057a837fffffffff00000000000000000000000000000000000000000000000000000000166000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052604060002090565b8a73ffffffffffffffffffffffffffffffffffffffff8216815b858110610c12575b5050610c065791610bde610bf192610b88610bf795610b6c858b6116be565b519073ffffffffffffffffffffffffffffffffffffffff169052565b610bb7610b94886115c9565b60209081610ba2878d6116be565b510152610baf858b6116be565b5101516116a8565b907fffffffff00000000000000000000000000000000000000000000000000000000169052565b6105fe610beb828a6116be565b60019052565b9461163e565b90979497969193959296610a76565b505093610bf79061163e565b8a858a84610c4161064b610c2687856116be565b515173ffffffffffffffffffffffffffffffffffffffff1690565b14610c5757505050610c529061163e565b610b45565b610ccc955083809550610cbd93610c99610cb894610bb76020610c80610cc49a610a18986116be565b510151610c93610a1f610a1888886116be565b906116be565b610cb360ff80610cac610a1886866116be565b16106116e0565b6116be565b6116e7565b918b6116be565b9060ff169052565b60013880610b4d565b9592969193979497610a7f565b50346101465760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014657602073ffffffffffffffffffffffffffffffffffffffff7f24aa1f7b31fd188a8d3ecfb06bc55c806040e59b03bd4396283442fce66178905416604051908152f35b50346101465760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014657602073ffffffffffffffffffffffffffffffffffffffff7f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f6716804605416604051908152f35b50346101465760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014657610dfe610231565b73ffffffffffffffffffffffffffffffffffffffff610e41817f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f6716804605416331461122a565b7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc9691167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b6020908160408183019282815285518094520193019160005b828110610eb7575050505090565b83517fffffffff000000000000000000000000000000000000000000000000000000001685529381019392810192600101610ea9565b50346101465760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014657610f25610231565b610f5461045f7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc945461ffff1690565b90610f5e826115c9565b9060009073ffffffffffffffffffffffffffffffffffffffff1681805b858210610f93578385526040518061048d8782610e90565b610fc6816000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc95602052604060002090565b5460005b60088110610fe3575b5050610fde9061163e565b610f7b565b9492610ff49097919796929661163e565b948186116110be577fffffffff00000000000000000000000000000000000000000000000000000000888260051b1b1661108261064b6105a061057a847fffffffff00000000000000000000000000000000000000000000000000000000166000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052604060002090565b86146110a1575b506110939061163e565b969096959195949294610fca565b846105fe6110b792610bb76110939598886116be565b9390611089565b819750959195949294610fd3565b50346101465760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610146577fffffffff00000000000000000000000000000000000000000000000000000000611125610117565b166000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052602060406000205460601c604051908152f35b50346101465760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014657611198610231565b73ffffffffffffffffffffffffffffffffffffffff6111db817f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f6716804605416331461122a565b7f24aa1f7b31fd188a8d3ecfb06bc55c806040e59b03bd4396283442fce661789091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b1561123157565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4f776e61626c653a2073656e646572206d757374206265206f776e65720000006044820152fd5b1561129657565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f50726f78793a20696d706c656d656e746174696f6e206d75737420626520636f60448201527f6e747261637400000000000000000000000000000000000000000000000000006064820152fd5b5060007fffffffff0000000000000000000000000000000000000000000000000000000081351681527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc9360205280604081205460601c801561139f575b8061138583923b151561128f565b368280378136915af43d82803e1561139b573d90f35b3d90fd5b505073ffffffffffffffffffffffffffffffffffffffff7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc96541680156113e6578190611377565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4469616d6f6e64426173653a206e6f20666163657420666f756e6420666f722060448201527f66756e6374696f6e207369676e617475726500000000000000000000000000006064820152fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051906060820182811067ffffffffffffffff8211176114ba57604052565b6114c261146a565b604052565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f604051930116820182811067ffffffffffffffff8211176114ba57604052565b60209067ffffffffffffffff8111611525575b60051b0190565b61152d61146a565b61151e565b9061154461153f8361150b565b6114c7565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611572829461150b565b0190600090815b8381106115865750505050565b60209060408051908082019082821067ffffffffffffffff8311176115bc575b5284815282606081830152828501015201611579565b6115c461146a565b6115a6565b906115d661153f8361150b565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611604829461150b565b0190602036910137565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461166c570190565b61167461160e565b0190565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020908051156116b6570190565b611674611678565b60209181518110156116d3575b60051b010190565b6116db611678565b6116cb565b1561014657565b60ff6001911660ff811461166c570190565b949390929461174073ffffffffffffffffffffffffffffffffffffffff7f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f6716804605416331461122a565b61174c61153f8561150b565b9081948083526020809301600591821b8301923684116101465780915b84831061178e5750505050505061178c93946117869136916118a2565b91611b14565b565b67ffffffffffffffff8335818111610146578301606081360312610146576117b461149a565b916117be82610254565b835288820135600381101561014657898401526040918281013591821161014657019036601f83011215610146578135916117fb61153f8461150b565b928a808583815201918a1b8301019136831161014657918b80969492979593015b818110611836575050849550820152815201920191611769565b91939580919395976118478461014b565b8152019101918b95939196949261181c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111611895575b01160190565b61189d61146a565b61188f565b9291926118b161153f83611859565b938285528282011161014657816000926020928387013784010152565b600311156118d857565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1561190e57565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4469616d6f6e64426173653a206e6f2073656c6563746f72732073706563696660448201527f69656400000000000000000000000000000000000000000000000000000000006064820152fd5b919082519283825260005b8481106119dc5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b60208183018101518483018201520161199d565b93929091936060928382019380835281518095526080830160808660051b85010195602080940192600080915b838310611a6057505050505050611a5d9495611a509183019073ffffffffffffffffffffffffffffffffffffffff169052565b6040818403910152611992565b90565b9091929394987fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8088820301865289519073ffffffffffffffffffffffffffffffffffffffff8251168152878201516003811015611ae757611ad960019385848c9594868096015281604080940151938201520190610869565b9b0196019493019190611a1d565b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526021600452fd5b9091611b4561045f7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc945461ffff1690565b91829460009260078516611cf2575b6000935b8351851015611c0b57611b6b85856116be565b51906020820151611b7b816118ce565b611b8b6040840151511515611907565b611b94816118ce565b80611bb3575090611ba89160019697611e47565b9490955b0193611b58565b611bc081979392976118ce565b60018103611bda575090611bd560019261275b565b611bac565b80611be66002926118ce565b14611bf5575b50600190611bac565b600195611c02929761221c565b94909590611bec565b8694507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb67393919561178c9793988103611ca0575b60078116611c62575b5050611c5a85604051938493846119f0565b0390a161298d565b611c989060031c6000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc95602052604060002090565b553880611c48565b7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc9480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff8316179055611c3f565b9250611d2a8460031c6000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc95602052604060002090565b5492611b54565b15611d3857565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4469616d6f6e64426173653a204144442074617267657420686173206e6f206360448201527f6f646500000000000000000000000000000000000000000000000000000000006064820152fd5b15611dc357565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4469616d6f6e64426173653a2073656c6563746f7220616c726561647920616460448201527f64656400000000000000000000000000000000000000000000000000000000006064820152fd5b90929192611e93611e6c855173ffffffffffffffffffffffffffffffffffffffff1690565b3073ffffffffffffffffffffffffffffffffffffffff821614908115612096575b50611d31565b60009384925b6040820151805185101561208c57611eb485611eda926116be565b517fffffffff000000000000000000000000000000000000000000000000000000001690565b611f41611f3b61064b6105a061057a857fffffffff00000000000000000000000000000000000000000000000000000000166000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052604060002090565b15611dbc565b817fffffffffffffffffffffffffffffffffffffffff000000000000000000000000611fac611f84865173ffffffffffffffffffffffffffffffffffffffff1690565b60601b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001690565b1617612003827fffffffff00000000000000000000000000000000000000000000000000000000166000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052604060002090565b5560e090818360051b16947fffffffff00000000000000000000000000000000000000000000000000000000809216861c91861c191617931461204d575b60019384019301611e99565b916120848360031c6000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc95602052604060002090565b558491612041565b5092505092509190565b90503b151538611e8d565b156120a857565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4469616d6f6e64426173653a2052454d4f564520746172676574206d7573742060448201527f6265207a65726f206164647265737300000000000000000000000000000000006064820152fd5b1561213357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4469616d6f6e64426173653a2073656c6563746f72206e6f7420666f756e64006044820152fd5b1561219857565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4469616d6f6e64426173653a2073656c6563746f7220697320696d6d7574616260448201527f6c650000000000000000000000000000000000000000000000000000000000006064820152fd5b9061225a73ffffffffffffffffffffffffffffffffffffffff612253855173ffffffffffffffffffffffffffffffffffffffff1690565b16156120a1565b600780831692600390600090821c5b6040870151805183101561263757611eb483612284926116be565b946122da867fffffffff00000000000000000000000000000000000000000000000000000000166000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052604060002090565b54966122f68860601c6122ee81151561212c565b301415612191565b816126075750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190612353826000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc95602052604060002090565b5494849687915b60e07fffffffff000000000000000000000000000000000000000000000000000000009260006123e7858c600598891b1b169486811686036124d0577fffffffff00000000000000000000000000000000000000000000000000000000166000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052604060002090565b5580881c611fff16941b16918584146124be579061246c9291612433856000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc95602052604060002090565b5491831c921c191617916000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc95602052604060002090565b555b851561247e575b60010190612269565b935060006124b5826000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc95602052604060002090565b55600093612475565b9180949893501c921c1916179361246e565b61255061252b61057a887fffffffff00000000000000000000000000000000000000000000000000000000166000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052604060002090565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001690565b6bffffffffffffffffffffffff8516176125b5877fffffffff00000000000000000000000000000000000000000000000000000000166000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052604060002090565b557fffffffff00000000000000000000000000000000000000000000000000000000166000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052604060002090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0196909591929187919061235a565b50939695505090501b179190565b1561264c57565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4469616d6f6e64426173653a205245504c41434520746172676574206861732060448201527f6e6f20636f6465000000000000000000000000000000000000000000000000006064820152fd5b156126d757565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4469616d6f6e64426173653a205245504c41434520746172676574206973206960448201527f64656e746963616c0000000000000000000000000000000000000000000000006064820152fd5b61278a61278561277f835173ffffffffffffffffffffffffffffffffffffffff1690565b3b151590565b612645565b60005b60408201519081518110156128d7576127ab611eb4826001946116be565b6128d0612803827fffffffff00000000000000000000000000000000000000000000000000000000166000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052604060002090565b5461284a8160601c61281681151561212c565b61282230821415612191565b61284361064b895173ffffffffffffffffffffffffffffffffffffffff1690565b14156126d0565b6bffffffffffffffffffffffff61287b61252b611f84895173ffffffffffffffffffffffffffffffffffffffff1690565b911617917fffffffff00000000000000000000000000000000000000000000000000000000166000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052604060002090565b550161278d565b505050565b156128e357565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4469616d6f6e64426173653a20696e697469616c697a6174696f6e207461726760448201527f657420686173206e6f20636f64650000000000000000000000000000000000006064820152fd5b3d15612988573d9061297b61153f83611859565b9182523d6000602084013e565b606090565b9073ffffffffffffffffffffffffffffffffffffffff821690811581511581036129fb57156129bb57505050565b600092839230036129ea575b602082519201905af46129d8612967565b50156129e057565b3d6000803e3d6000fd5b6129f6813b15156128dc565b6129c7565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4469616d6f6e64426173653a20696e76616c696420696e697469616c697a617460448201527f696f6e20706172616d65746572730000000000000000000000000000000000006064820152fdfea164736f6c6343000811000a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.