ERC-20
Overview
Max Total Supply
1,000,000 THRO
Holders
402
Transfers
-
5
Market
Price
$0.00 @ 0.000000 ETH
Onchain Market Cap
-
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
NewThroneThroDiamond
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import {SolidStateDiamond} from "@solidstate/contracts/proxy/diamond/SolidStateDiamond.sol";
import {Pausable} from "@solidstate/contracts/security/pausable/Pausable.sol";
contract NewThroneThroDiamond is SolidStateDiamond, Pausable {}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
import { IERC173 } from '../../interfaces/IERC173.sol';
import { IOwnableInternal } from './IOwnableInternal.sol';
interface IOwnable is IOwnableInternal, IERC173 {}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
import { IERC173Internal } from '../../interfaces/IERC173Internal.sol';
interface IOwnableInternal is IERC173Internal {
error Ownable__NotOwner();
error Ownable__NotTransitiveOwner();
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
import { IOwnable } from './IOwnable.sol';
import { ISafeOwnableInternal } from './ISafeOwnableInternal.sol';
interface ISafeOwnable is ISafeOwnableInternal, 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.8;
import { IOwnableInternal } from './IOwnableInternal.sol';
interface ISafeOwnableInternal is IOwnableInternal {
error SafeOwnable__NotNomineeOwner();
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
import { IERC173 } from '../../interfaces/IERC173.sol';
import { IOwnable } from './IOwnable.sol';
import { OwnableInternal } from './OwnableInternal.sol';
/**
* @title Ownership access control based on ERC173
*/
abstract contract Ownable is IOwnable, OwnableInternal {
/**
* @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.8;
import { IERC173 } from '../../interfaces/IERC173.sol';
import { AddressUtils } from '../../utils/AddressUtils.sol';
import { IOwnableInternal } from './IOwnableInternal.sol';
import { OwnableStorage } from './OwnableStorage.sol';
abstract contract OwnableInternal is IOwnableInternal {
using AddressUtils for address;
modifier onlyOwner() {
if (msg.sender != _owner()) revert Ownable__NotOwner();
_;
}
modifier onlyTransitiveOwner() {
if (msg.sender != _transitiveOwner())
revert Ownable__NotTransitiveOwner();
_;
}
function _owner() internal view virtual returns (address) {
return OwnableStorage.layout().owner;
}
function _transitiveOwner() internal view virtual returns (address owner) {
owner = _owner();
while (owner.isContract()) {
try IERC173(owner).owner() returns (address transitiveOwner) {
owner = transitiveOwner;
} catch {
break;
}
}
}
function _transferOwnership(address account) internal virtual {
_setOwner(account);
}
function _setOwner(address account) internal virtual {
OwnableStorage.Layout storage l = OwnableStorage.layout();
emit OwnershipTransferred(l.owner, account);
l.owner = account;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
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
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
import { Ownable } 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.8;
import { ISafeOwnableInternal } from './ISafeOwnableInternal.sol';
import { OwnableInternal } from './OwnableInternal.sol';
import { SafeOwnableStorage } from './SafeOwnableStorage.sol';
abstract contract SafeOwnableInternal is ISafeOwnableInternal, OwnableInternal {
modifier onlyNomineeOwner() {
if (msg.sender != _nomineeOwner())
revert SafeOwnable__NotNomineeOwner();
_;
}
/**
* @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 {
_setOwner(msg.sender);
delete SafeOwnableStorage.layout().nomineeOwner;
}
/**
* @notice grant permission to given address to claim contract ownership
*/
function _transferOwnership(address account) internal virtual override {
_setNomineeOwner(account);
}
/**
* @notice set nominee owner
*/
function _setNomineeOwner(address account) internal virtual {
SafeOwnableStorage.layout().nomineeOwner = account;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
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
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
import { IERC165Internal } from './IERC165Internal.sol';
/**
* @title ERC165 interface registration interface
* @dev see https://eips.ethereum.org/EIPS/eip-165
*/
interface IERC165 is IERC165Internal {
/**
* @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.8;
/**
* @title ERC165 interface registration interface
*/
interface IERC165Internal {
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
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 contract 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.8;
/**
* @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.8;
import { IERC165 } from '../../../interfaces/IERC165.sol';
import { IERC165Base } from './IERC165Base.sol';
import { ERC165BaseInternal } from './ERC165BaseInternal.sol';
import { ERC165BaseStorage } from './ERC165BaseStorage.sol';
/**
* @title ERC165 implementation
*/
abstract contract ERC165Base is IERC165Base, ERC165BaseInternal {
/**
* @inheritdoc IERC165
*/
function supportsInterface(bytes4 interfaceId) public view returns (bool) {
return _supportsInterface(interfaceId);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
import { IERC165BaseInternal } from './IERC165BaseInternal.sol';
import { ERC165BaseStorage } from './ERC165BaseStorage.sol';
/**
* @title ERC165 implementation
*/
abstract contract ERC165BaseInternal is IERC165BaseInternal {
/**
* @notice indicates whether an interface is already supported based on the interfaceId
* @param interfaceId id of interface to check
* @return bool indicating whether interface is supported
*/
function _supportsInterface(
bytes4 interfaceId
) internal view virtual returns (bool) {
return ERC165BaseStorage.layout().supportedInterfaces[interfaceId];
}
/**
* @notice sets status of interface support
* @param interfaceId id of interface to set status for
* @param status boolean indicating whether interface will be set as supported
*/
function _setSupportsInterface(
bytes4 interfaceId,
bool status
) internal virtual {
if (interfaceId == 0xffffffff) revert ERC165Base__InvalidInterfaceId();
ERC165BaseStorage.layout().supportedInterfaces[interfaceId] = status;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
library ERC165BaseStorage {
struct Layout {
mapping(bytes4 => bool) supportedInterfaces;
}
bytes32 internal constant STORAGE_SLOT =
keccak256('solidstate.contracts.storage.ERC165Base');
function layout() internal pure returns (Layout storage l) {
bytes32 slot = STORAGE_SLOT;
assembly {
l.slot := slot
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { IERC165 } from '../../../interfaces/IERC165.sol';
import { IERC165BaseInternal } from './IERC165BaseInternal.sol';
interface IERC165Base is IERC165, IERC165BaseInternal {}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { IERC165Internal } from '../../../interfaces/IERC165Internal.sol';
interface IERC165BaseInternal is IERC165Internal {
error ERC165Base__InvalidInterfaceId();
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
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
virtual
override
returns (address implementation)
{
// inline storage layout retrieval uses less gas
DiamondBaseStorage.Layout storage l;
bytes32 slot = DiamondBaseStorage.STORAGE_SLOT;
assembly {
l.slot := slot
}
implementation = address(bytes20(l.facets[msg.sig]));
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
/**
* @dev derived from https://github.com/mudgen/diamond-2 (MIT license)
*/
library DiamondBaseStorage {
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 internal constant STORAGE_SLOT =
keccak256('solidstate.contracts.storage.DiamondBase');
function layout() internal pure returns (Layout storage l) {
bytes32 slot = STORAGE_SLOT;
assembly {
l.slot := slot
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
import { IProxy } from '../../IProxy.sol';
interface IDiamondBase is IProxy {}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
import { OwnableInternal } from '../../../access/ownable/OwnableInternal.sol';
import { DiamondBase } from '../base/DiamondBase.sol';
import { DiamondBaseStorage } from '../base/DiamondBaseStorage.sol';
import { IDiamondFallback } from './IDiamondFallback.sol';
/**
* @title Fallback feature for EIP-2535 "Diamond" proxy
*/
abstract contract DiamondFallback is
IDiamondFallback,
OwnableInternal,
DiamondBase
{
/**
* @inheritdoc IDiamondFallback
*/
function getFallbackAddress()
external
view
returns (address fallbackAddress)
{
fallbackAddress = _getFallbackAddress();
}
/**
* @inheritdoc IDiamondFallback
*/
function setFallbackAddress(address fallbackAddress) external onlyOwner {
_setFallbackAddress(fallbackAddress);
}
/**
* @inheritdoc DiamondBase
* @notice query custom fallback address is no implementation is found
*/
function _getImplementation()
internal
view
virtual
override
returns (address implementation)
{
implementation = super._getImplementation();
if (implementation == address(0)) {
implementation = _getFallbackAddress();
}
}
/**
* @notice query the address of the fallback implementation
* @return fallbackAddress address of fallback implementation
*/
function _getFallbackAddress()
internal
view
virtual
returns (address fallbackAddress)
{
fallbackAddress = DiamondBaseStorage.layout().fallbackAddress;
}
/**
* @notice set the address of the fallback implementation
* @param fallbackAddress address of fallback implementation
*/
function _setFallbackAddress(address fallbackAddress) internal virtual {
DiamondBaseStorage.layout().fallbackAddress = fallbackAddress;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
import { IDiamondBase } from '../base/IDiamondBase.sol';
interface IDiamondFallback is IDiamondBase {
/**
* @notice query the address of the fallback implementation
* @return fallbackAddress address of fallback implementation
*/
function getFallbackAddress()
external
view
returns (address fallbackAddress);
/**
* @notice set the address of the fallback implementation
* @param fallbackAddress address of fallback implementation
*/
function setFallbackAddress(address fallbackAddress) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
import { ISafeOwnable } from '../../access/ownable/ISafeOwnable.sol';
import { IERC165 } from '../../interfaces/IERC165.sol';
import { IDiamondBase } from './base/IDiamondBase.sol';
import { IDiamondFallback } from './fallback/IDiamondFallback.sol';
import { IDiamondReadable } from './readable/IDiamondReadable.sol';
import { IDiamondWritable } from './writable/IDiamondWritable.sol';
interface ISolidStateDiamond is
IDiamondBase,
IDiamondFallback,
IDiamondReadable,
IDiamondWritable,
ISafeOwnable,
IERC165
{
receive() external payable;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
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.8;
/**
* @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.8;
import { IOwnable, Ownable, OwnableInternal } from '../../access/ownable/Ownable.sol';
import { ISafeOwnable, SafeOwnable } from '../../access/ownable/SafeOwnable.sol';
import { IERC165 } from '../../interfaces/IERC165.sol';
import { IERC173 } from '../../interfaces/IERC173.sol';
import { ERC165Base, ERC165BaseStorage } from '../../introspection/ERC165/base/ERC165Base.sol';
import { DiamondBase } from './base/DiamondBase.sol';
import { DiamondFallback, IDiamondFallback } from './fallback/DiamondFallback.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,
DiamondFallback,
DiamondReadable,
DiamondWritable,
SafeOwnable,
ERC165Base
{
constructor() {
bytes4[] memory selectors = new bytes4[](12);
uint256 selectorIndex;
// register DiamondFallback
selectors[selectorIndex++] = IDiamondFallback
.getFallbackAddress
.selector;
selectors[selectorIndex++] = IDiamondFallback
.setFallbackAddress
.selector;
_setSupportsInterface(type(IDiamondFallback).interfaceId, true);
// register DiamondWritable
selectors[selectorIndex++] = IDiamondWritable.diamondCut.selector;
_setSupportsInterface(type(IDiamondWritable).interfaceId, true);
// register DiamondReadable
selectors[selectorIndex++] = IDiamondReadable.facets.selector;
selectors[selectorIndex++] = IDiamondReadable
.facetFunctionSelectors
.selector;
selectors[selectorIndex++] = IDiamondReadable.facetAddresses.selector;
selectors[selectorIndex++] = IDiamondReadable.facetAddress.selector;
_setSupportsInterface(type(IDiamondReadable).interfaceId, true);
// register ERC165
selectors[selectorIndex++] = IERC165.supportsInterface.selector;
_setSupportsInterface(type(IERC165).interfaceId, true);
// register SafeOwnable
selectors[selectorIndex++] = Ownable.owner.selector;
selectors[selectorIndex++] = SafeOwnable.nomineeOwner.selector;
selectors[selectorIndex++] = Ownable.transferOwnership.selector;
selectors[selectorIndex++] = SafeOwnable.acceptOwnership.selector;
_setSupportsInterface(type(IERC173).interfaceId, true);
// diamond cut
FacetCut[] memory facetCuts = new FacetCut[](1);
facetCuts[0] = FacetCut({
target: address(this),
action: FacetCutAction.ADD,
selectors: selectors
});
_diamondCut(facetCuts, address(0), '');
// set owner
_setOwner(msg.sender);
}
receive() external payable {}
function _transferOwnership(
address account
) internal virtual override(OwnableInternal, SafeOwnable) {
super._transferOwnership(account);
}
/**
* @inheritdoc DiamondFallback
*/
function _getImplementation()
internal
view
override(DiamondBase, DiamondFallback)
returns (address implementation)
{
implementation = super._getImplementation();
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
import { OwnableInternal } from '../../../access/ownable/OwnableInternal.sol';
import { IDiamondWritable } from './IDiamondWritable.sol';
import { DiamondWritableInternal } from './DiamondWritableInternal.sol';
/**
* @title EIP-2535 "Diamond" proxy update contract
*/
abstract contract DiamondWritable is
IDiamondWritable,
DiamondWritableInternal,
OwnableInternal
{
/**
* @inheritdoc IDiamondWritable
*/
function diamondCut(
FacetCut[] calldata facetCuts,
address target,
bytes calldata data
) external onlyOwner {
_diamondCut(facetCuts, target, data);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { AddressUtils } from '../../../utils/AddressUtils.sol';
import { DiamondBaseStorage } from '../base/DiamondBaseStorage.sol';
import { IDiamondWritableInternal } from './IDiamondWritableInternal.sol';
abstract contract DiamondWritableInternal is IDiamondWritableInternal {
using AddressUtils for address;
bytes32 private constant CLEAR_ADDRESS_MASK =
bytes32(uint256(0xffffffffffffffffffffffff));
bytes32 private constant CLEAR_SELECTOR_MASK =
bytes32(uint256(0xffffffff << 224));
/**
* @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[] memory facetCuts,
address target,
bytes memory data
) internal virtual {
DiamondBaseStorage.Layout storage l = DiamondBaseStorage.layout();
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++) {
FacetCut memory facetCut = facetCuts[i];
FacetCutAction action = facetCut.action;
if (facetCut.selectors.length == 0)
revert DiamondWritable__SelectorNotSpecified();
if (action == FacetCutAction.ADD) {
(selectorCount, selectorSlot) = _addFacetSelectors(
l,
selectorCount,
selectorSlot,
facetCut
);
} else if (action == FacetCutAction.REPLACE) {
_replaceFacetSelectors(l, facetCut);
} else if (action == FacetCutAction.REMOVE) {
(selectorCount, selectorSlot) = _removeFacetSelectors(
l,
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(
DiamondBaseStorage.Layout storage l,
uint256 selectorCount,
bytes32 selectorSlot,
FacetCut memory facetCut
) internal returns (uint256, bytes32) {
unchecked {
if (
facetCut.target != address(this) &&
!facetCut.target.isContract()
) revert DiamondWritable__TargetHasNoCode();
for (uint256 i; i < facetCut.selectors.length; i++) {
bytes4 selector = facetCut.selectors[i];
bytes32 oldFacet = l.facets[selector];
if (address(bytes20(oldFacet)) != address(0))
revert DiamondWritable__SelectorAlreadyAdded();
// 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(
DiamondBaseStorage.Layout storage l,
uint256 selectorCount,
bytes32 selectorSlot,
FacetCut memory facetCut
) internal returns (uint256, bytes32) {
unchecked {
if (facetCut.target != address(0))
revert DiamondWritable__RemoveTargetNotZeroAddress();
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];
if (address(bytes20(oldFacet)) == address(0))
revert DiamondWritable__SelectorNotFound();
if (address(bytes20(oldFacet)) == address(this))
revert DiamondWritable__SelectorIsImmutable();
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(
DiamondBaseStorage.Layout storage l,
FacetCut memory facetCut
) internal {
unchecked {
if (!facetCut.target.isContract())
revert DiamondWritable__TargetHasNoCode();
for (uint256 i; i < facetCut.selectors.length; i++) {
bytes4 selector = facetCut.selectors[i];
bytes32 oldFacet = l.facets[selector];
address oldFacetAddress = address(bytes20(oldFacet));
if (oldFacetAddress == address(0))
revert DiamondWritable__SelectorNotFound();
if (oldFacetAddress == address(this))
revert DiamondWritable__SelectorIsImmutable();
if (oldFacetAddress == facetCut.target)
revert DiamondWritable__ReplaceTargetIsIdentical();
// replace old facet address
l.facets[selector] =
(oldFacet & CLEAR_ADDRESS_MASK) |
bytes20(facetCut.target);
}
}
}
function _initialize(address target, bytes memory data) private {
if ((target == address(0)) != (data.length == 0))
revert DiamondWritable__InvalidInitializationParameters();
if (target != address(0)) {
if (target != address(this)) {
if (!target.isContract())
revert DiamondWritable__TargetHasNoCode();
}
(bool success, ) = target.delegatecall(data);
if (!success) {
assembly {
returndatacopy(0, 0, returndatasize())
revert(0, returndatasize())
}
}
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
import { IDiamondWritableInternal } from './IDiamondWritableInternal.sol';
/**
* @title Diamond proxy upgrade interface
* @dev see https://eips.ethereum.org/EIPS/eip-2535
*/
interface IDiamondWritable is IDiamondWritableInternal {
/**
* @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.8;
interface IDiamondWritableInternal {
enum FacetCutAction {
ADD,
REPLACE,
REMOVE
}
event DiamondCut(FacetCut[] facetCuts, address target, bytes data);
error DiamondWritable__InvalidInitializationParameters();
error DiamondWritable__RemoveTargetNotZeroAddress();
error DiamondWritable__ReplaceTargetIsIdentical();
error DiamondWritable__SelectorAlreadyAdded();
error DiamondWritable__SelectorIsImmutable();
error DiamondWritable__SelectorNotFound();
error DiamondWritable__SelectorNotSpecified();
error DiamondWritable__TargetHasNoCode();
struct FacetCut {
address target;
FacetCutAction action;
bytes4[] selectors;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
interface IProxy {
error Proxy__ImplementationIsNotContract();
fallback() external payable;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
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();
if (!implementation.isContract())
revert Proxy__ImplementationIsNotContract();
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.8;
import { IPausableInternal } from './IPausableInternal.sol';
interface IPausable is IPausableInternal {
/**
* @notice query whether contract is paused
* @return status whether contract is paused
*/
function paused() external view returns (bool status);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
interface IPausableInternal {
error Pausable__Paused();
error Pausable__NotPaused();
event Paused(address account);
event Unpaused(address account);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
import { IPausable } from './IPausable.sol';
import { PausableInternal } from './PausableInternal.sol';
/**
* @title Pausable security control module.
*/
abstract contract Pausable is IPausable, PausableInternal {
/**
* @inheritdoc IPausable
*/
function paused() external view virtual returns (bool status) {
status = _paused();
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
import { IPausableInternal } from './IPausableInternal.sol';
import { PausableStorage } from './PausableStorage.sol';
/**
* @title Internal functions for Pausable security control module.
*/
abstract contract PausableInternal is IPausableInternal {
modifier whenNotPaused() {
if (_paused()) revert Pausable__Paused();
_;
}
modifier whenPaused() {
if (!_paused()) revert Pausable__NotPaused();
_;
}
/**
* @notice query whether contract is paused
* @return status whether contract is paused
*/
function _paused() internal view virtual returns (bool status) {
status = PausableStorage.layout().paused;
}
/**
* @notice Triggers paused state, when contract is unpaused.
*/
function _pause() internal virtual whenNotPaused {
PausableStorage.layout().paused = true;
emit Paused(msg.sender);
}
/**
* @notice Triggers unpaused state, when contract is paused.
*/
function _unpause() internal virtual whenPaused {
delete PausableStorage.layout().paused;
emit Unpaused(msg.sender);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
library PausableStorage {
struct Layout {
bool paused;
}
bytes32 internal constant STORAGE_SLOT =
keccak256('solidstate.contracts.storage.Pausable');
function layout() internal pure returns (Layout storage l) {
bytes32 slot = STORAGE_SLOT;
assembly {
l.slot := slot
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
import { UintUtils } from './UintUtils.sol';
library AddressUtils {
using UintUtils for uint256;
error AddressUtils__InsufficientBalance();
error AddressUtils__NotContract();
error AddressUtils__SendValueFailed();
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 }('');
if (!success) revert AddressUtils__SendValueFailed();
}
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) {
if (value > address(this).balance)
revert AddressUtils__InsufficientBalance();
return _functionCallWithValue(target, data, value, error);
}
/**
* @notice execute arbitrary external call with limited gas usage and amount of copied return data
* @dev derived from https://github.com/nomad-xyz/ExcessivelySafeCall (MIT License)
* @param target recipient of call
* @param gasAmount gas allowance for call
* @param value native token value to include in call
* @param maxCopy maximum number of bytes to copy from return data
* @param data encoded call data
* @return success whether call is successful
* @return returnData copied return data
*/
function excessivelySafeCall(
address target,
uint256 gasAmount,
uint256 value,
uint16 maxCopy,
bytes memory data
) internal returns (bool success, bytes memory returnData) {
returnData = new bytes(maxCopy);
assembly {
// execute external call via assembly to avoid automatic copying of return data
success := call(
gasAmount,
target,
value,
add(data, 0x20),
mload(data),
0,
0
)
// determine whether to limit amount of data to copy
let toCopy := returndatasize()
if gt(toCopy, maxCopy) {
toCopy := maxCopy
}
// store the length of the copied bytes
mstore(returnData, toCopy)
// copy the bytes from returndata[0:toCopy]
returndatacopy(add(returnData, 0x20), 0, toCopy)
}
}
function _functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory error
) private returns (bytes memory) {
if (!isContract(target)) revert AddressUtils__NotContract();
(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.8;
/**
* @title utility functions for uint256 operations
* @dev derived from https://github.com/OpenZeppelin/openzeppelin-contracts/ (MIT license)
*/
library UintUtils {
error UintUtils__InsufficientHexLength();
bytes16 private constant HEX_SYMBOLS = '0123456789abcdef';
function add(uint256 a, int256 b) internal pure returns (uint256) {
return b < 0 ? sub(a, -b) : a + uint256(b);
}
function sub(uint256 a, int256 b) internal pure returns (uint256) {
return b < 0 ? add(a, -b) : a - uint256(b);
}
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;
}
}
if (value != 0) revert UintUtils__InsufficientHexLength();
return string(buffer);
}
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"viaIR": true,
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"name":"DiamondWritable__InvalidInitializationParameters","type":"error"},{"inputs":[],"name":"DiamondWritable__RemoveTargetNotZeroAddress","type":"error"},{"inputs":[],"name":"DiamondWritable__ReplaceTargetIsIdentical","type":"error"},{"inputs":[],"name":"DiamondWritable__SelectorAlreadyAdded","type":"error"},{"inputs":[],"name":"DiamondWritable__SelectorIsImmutable","type":"error"},{"inputs":[],"name":"DiamondWritable__SelectorNotFound","type":"error"},{"inputs":[],"name":"DiamondWritable__SelectorNotSpecified","type":"error"},{"inputs":[],"name":"DiamondWritable__TargetHasNoCode","type":"error"},{"inputs":[],"name":"ERC165Base__InvalidInterfaceId","type":"error"},{"inputs":[],"name":"Ownable__NotOwner","type":"error"},{"inputs":[],"name":"Ownable__NotTransitiveOwner","type":"error"},{"inputs":[],"name":"Pausable__NotPaused","type":"error"},{"inputs":[],"name":"Pausable__Paused","type":"error"},{"inputs":[],"name":"Proxy__ImplementationIsNotContract","type":"error"},{"inputs":[],"name":"SafeOwnable__NotNomineeOwner","type":"error"},{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"enum IDiamondWritableInternal.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"selectors","type":"bytes4[]"}],"indexed":false,"internalType":"struct IDiamondWritableInternal.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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"enum IDiamondWritableInternal.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"selectors","type":"bytes4[]"}],"internalType":"struct IDiamondWritableInternal.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":"fallbackAddress","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":[],"name":"paused","outputs":[{"internalType":"bool","name":"status","type":"bool"}],"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
60806040523462000337576200031c6200001862000378565b620000336200002782620003bc565b632c40805960e01b9052565b6200004e6200004282620003d0565b639142376560e01b9052565b632f40adcf60e21b600052600080516020620025c58339815191526020527fea929569903c3e19530358310fcaf1a971b387fd41008d81b0a7f1275e915a5c805460ff19166001179055620000b3620000a782620003e1565b6307e4c70760e21b9052565b6307e4c70760e21b600052600080516020620025c58339815191526020527ffd29538739e576e7ec1eb8c7e901cca011aae0deb8fb2c6280a4c2300add457d805460ff19166001179055620001186200010c82620003f2565b637a0ed62760e01b9052565b62000133620001278262000403565b6356fe50af60e11b9052565b6200014e620001428262000414565b6314bbdacb60e21b9052565b620001696200015d8262000425565b6366ffd66360e11b9052565b6348e2b09360e01b600052600080516020620025c58339815191526020527fb36cab0dec645683c2d905d6b41349479e1d7f665c3cff144fecc78944a31d5b805460ff19166001179055620001ce620001c28262000436565b6301ffc9a760e01b9052565b6301ffc9a760e01b600052600080516020620025c58339815191526020527f3df35b507c5de77f483b4e9b5c258409299a2e6dc816fa76a389e598628b08a5805460ff1916600117905562000233620002278262000448565b638da5cb5b60e01b9052565b6200024e62000242826200045a565b63455a8a8560e11b9052565b620002696200025d826200046c565b63f2fde38b60e01b9052565b6200028462000278826200047e565b6379ba509760e01b9052565b6307f5828d60e41b600052600080516020620025c58339815191526020527fa9832637661075437d81882814f92cc614421ae9c04c71ce67957179f7086c18805460ff19166001179055620002d8620004a5565b90620002e362000352565b30815290600060208301526040820152620002fe82620003bc565b526200030a81620003bc565b50620003156200052c565b90620006ed565b620003273362000550565b604051611750908162000e758239f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60405190606082016001600160401b038111838210176200037257604052565b6200033c565b604051906101a082016001600160401b038111838210176200037257604052600c8252610180366020840137565b634e487b7160e01b600052603260045260246000fd5b805115620003ca5760200190565b620003a6565b805160011015620003ca5760400190565b805160021015620003ca5760600190565b805160031015620003ca5760800190565b805160041015620003ca5760a00190565b805160051015620003ca5760c00190565b805160061015620003ca5760e00190565b805160071015620003ca576101000190565b805160081015620003ca576101200190565b805160091015620003ca576101400190565b8051600a1015620003ca576101600190565b8051600b1015620003ca576101800190565b8051821015620003ca5760209160051b010190565b6040805191908281016001600160401b0381118482101762000372578152600183528291600091825b602080821015620005025790602091620004e762000352565b908682528681830152606085830152828901015201620004ce565b50505091925050565b600311156200051657565b634e487b7160e01b600052602160045260246000fd5b60405190602082016001600160401b03811183821017620003725760405260008252565b7f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f671680460805490916001600160a01b039081169190829082167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a36001600160a01b031916179055565b919082519283825260005b848110620005e7575050826000602080949584010152601f8019910116010190565b602081830181015184830182015201620005c5565b919091606092838201848352815180915260809485840191868160051b860101966020809501936000915b8383106200065357505050505050906000620006509493928201526040818403910152620005ba565b90565b909192939498607f198882030183528951908681019060018060a01b038351168152888301516003811015620005165784828b9594939286809401528a604080960151958201528451809452019201906000905b808210620006c85750505090806001929b0193019301919493929062000627565b82516001600160e01b03191684528a94938401939092019160019190910190620006a7565b9190916200071762000710600080516020620025e58339815191525461ffff1690565b61ffff1690565b90819260009460078416620008b5575b6000935b8351851015620008035762000741858562000490565b5190602082015162000753816200050b565b6040808401515115620007f357506200076c816200050b565b806200078e5750906001976200078292620008e5565b9690945b01936200072b565b6200079d81979392976200050b565b60018103620007bb575090620007b560019262000d3d565b62000786565b80620007c96002926200050b565b14620007da575b5060019062000786565b600197620007e9929662000a98565b96909490620007d0565b5163eb6c3aeb60e01b8152600490fd5b819450957f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb673939192966200085f96810362000890575b6007811662000861575b50506200085660405192839283620005fc565b0390a162000e56565b565b620008879060031c60005260008051602062002625833981519152602052604060002090565b55388062000843565b600080516020620025e5833981519152805461ffff191661ffff831617905562000839565b9450620008dd8360031c60005260008051602062002625833981519152602052604060002090565b549462000727565b82519091906001600160a01b03166001600160a01b038116301415908162000a8d575b5062000a7b5760009384925b604080860151805186101562000a6f576200093486620009429262000490565b516001600160e01b03191690565b906200099b6200098f620009896200097b8563ffffffff60e01b1660005260008051602062002605833981519152602052604060002090565b546001600160601b03191690565b60601c90565b6001600160a01b031690565b62000a5f5750855182906001600160601b031990620009ce906001600160a01b03165b60601b6001600160601b03191690565b1617620009fc8263ffffffff60e01b1660005260008051602062002605833981519152602052604060002090565b5560e090818360051b169463ffffffff60e01b809216861c91861c191617931462000a2f575b6001938401930162000914565b9162000a568360031c60005260008051602062002625833981519152602052604060002090565b55849162000a22565b51634923a77160e11b8152600490fd5b50509250925092509190565b604051633ddc5cab60e21b8152600490fd5b3b1590503862000908565b82519293929091906001600160a01b031662000d2b5790600780821691600390600090821c5b60409586890151805184101562000d1c57620009348462000adf9262000490565b9562000b0c8763ffffffff60e01b1660005260008051602062002605833981519152602052604060002090565b54978860601c801562000d0b57301462000cfb57508162000ce8575050600019019062000b518260005260008051602062002625833981519152602052604060002090565b5494849687915b60e063ffffffff811b92600062000ba3858c600598891b1b1694868116860362000c645763ffffffff60e01b1660005260008051602062002605833981519152602052604060002090565b5580881c611fff16941b169185841462000c51579062000c09929162000be18560005260008051602062002625833981519152602052604060002090565b5491831c921c1916179160005260008051602062002625833981519152602052604060002090565b555b851562000c20575b6001019094939462000abe565b9350600062000c478260005260008051602062002625833981519152602052604060002090565b5560009362000c13565b9180949893501c921c1916179362000c0b565b62000ca562000c986200097b8863ffffffff60e01b1660005260008051602062002605833981519152602052604060002090565b6001600160601b03191690565b6001600160e01b031987811660009081526000805160206200260583398151915260205260408082206001600160601b0389169490941790935592168252902090565b6000190196909591929187919062000b58565b5163e983573160e01b8152600490fd5b81516337e25a9760e11b8152600490fd5b5097509394505090501b179190565b604051633ab3490960e21b8152600490fd5b80516001600160a01b03163b1562000a7b5760005b604080830151805183101562000e5057620009348362000d729262000490565b9062000d9f8263ffffffff60e01b1660005260008051602062002605833981519152602052604060002090565b54908160601c801562000d0b5730811462000e3f57855162000dca906001600160a01b03166200098f565b1462000e2f57508351600193929162000e279162000df69062000c98906001600160a01b0316620009be565b90858060601b0316179163ffffffff60e01b1660005260008051602062002605833981519152602052604060002090565b550162000d52565b516330baabf360e11b8152600490fd5b815163e983573160e01b8152600490fd5b50505050565b511560010362000e6257565b6040516326df4ccd60e01b8152600490fdfe60806040526004361015610015575b36610bf857005b60003560e01c806301ffc9a7146100e55780631f931c1c146100e05780632c408059146100db57806352ef6b2c146100d65780635c975abb146100d157806379ba5097146100cc5780637a0ed627146100c75780638ab5150a146100c25780638da5cb5b146100bd57806391423765146100b8578063adfca15e146100b3578063cdffacc6146100ae5763f2fde38b0361000e57610b50565b610af3565b6109e1565b61091a565b6108e4565b61089c565b61061f565b6104bc565b61047a565b6102f0565b610264565b6101e8565b61011b565b600435906001600160e01b03198216820361010157565b600080fd5b35906001600160e01b03198216820361010157565b34610101576020366003190112610101576001600160e01b031961013d6100ea565b166000527ffc606c433378e3a7e0a6a531deac289b66caa1b4aa8554fd4ab2c6f1570f92d8602052602060ff604060002054166040519015158152f35b602435906001600160a01b038216820361010157565b600435906001600160a01b038216820361010157565b35906001600160a01b038216820361010157565b9181601f840112156101015782359167ffffffffffffffff8311610101576020838186019501011161010157565b346101015760603660031901126101015760043567ffffffffffffffff808211610101573660238301121561010157816004013591818311610101573660248460051b830101116101015761023b61017a565b604435928311610101576102629361025960249436906004016101ba565b94909301610e5d565b005b34610101576000366003190112610101577f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc96546040516001600160a01b039091168152602090f35b6020908160408183019282815285518094520193019160005b8281106102d3575050505090565b83516001600160a01b0316855293810193928101926001016102c5565b34610101576000806003193601126104775761032661031f6000805160206116db8339815191525461ffff1690565b61ffff1690565b9061033082610d88565b908080815b858210610351578385526040518061034d87826102ac565b0390f35b61035a81610dda565b5483905b60088210610377575b505061037290610dc6565b610335565b91959396909261038690610dc6565b9481861161046a576103bf6103b96103ab63ffffffff60e01b868860051b1b16610bc0565b546001600160601b03191690565b60601c90565b886001600160a01b038216815b848110610421575b505061041657816103fe610403926103ef610409958a610e31565b6001600160a01b039091169052565b610dc6565b93610dc6565b909693959194929461035e565b509261040990610dc6565b61044a61043e610431838c610e31565b516001600160a01b031690565b6001600160a01b031690565b821461045e5761045990610dc6565b6103cc565b505050600138806103d4565b9492819794969250610367565b80fd5b3461010157600036600319011261010157602060ff7f68721c0bbf2c02a4d65000340d1370666be06a630022208d4baa9bd7a4b6fea854166040519015158152f35b3461010157600080600319360112610477577f24aa1f7b31fd188a8d3ecfb06bc55c806040e59b03bd4396283442fce661789080546001600160a01b03908181163303610553576000805160206116fb833981519152805492339084167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08780a36001600160a01b03199283163317905516905580f35b60405163efd1052d60e01b8152600490fd5b90815180825260208080930193019160005b828110610585575050505090565b83516001600160e01b03191685529381019392810192600101610577565b602080820190808352835180925260409283810182858560051b8401019601946000925b8584106105d8575050505050505090565b90919293949596858061060e600193603f1986820301885286838d51878060a01b03815116845201519181858201520190610565565b9901940194019295949391906105c7565b34610101576000806003193601126104775761064e61031f6000805160206116db8339815191525461ffff1690565b61065781610d1f565b9061066181610d88565b92809181825b8282106106c5575050505b81811061068a578183526040518061034d85826105a3565b806106ab6106a561069e6106c09488610e31565b5160ff1690565b60ff1690565b60206106b78387610e31565b51015152610dc6565b610672565b6106ce81610dda565b5484905b600882106106eb575b50506106e690610dc6565b610667565b90939196926106fc90989598610dc6565b9582871161088f5763ffffffff60e01b828660051b1b166107226103b96103ab83610bc0565b8a6001600160a01b038216815b8581106107d9575b50506107cd57916107a56107b8926107666107be95610756858b610e31565b516001600160a01b039091169052565b61079561077288610d88565b60209081610780878d610e31565b51015261078d858b610e31565b510151610e1f565b6001600160e01b03199091169052565b6103fe6107b2828a610e31565b60019052565b94610dc6565b909794979691939592966106d2565b5050936107be90610dc6565b8a858a846107fb61043e6107ed8785610e31565b51516001600160a01b031690565b146108115750505061080c90610dc6565b61072f565b6108869550838095506108779361085361087294610795602061083a61087e9a61069e98610e31565b51015161084d6106a561069e8888610e31565b90610e31565b61086d60ff8061086661069e8686610e31565b1610610e45565b610e31565b610e4c565b918b610e31565b9060ff169052565b60013880610737565b95929691939794976106db565b34610101576000366003190112610101577f24aa1f7b31fd188a8d3ecfb06bc55c806040e59b03bd4396283442fce6617890546040516001600160a01b039091168152602090f35b34610101576000366003190112610101576000805160206116fb833981519152546040516001600160a01b039091168152602090f35b3461010157602036600319011261010157610933610190565b6000805160206116fb833981519152546001600160a01b03908116330361098a577f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc9680546001600160a01b03191691909216179055005b604051632f7a8ee160e01b8152600490fd5b6020908160408183019282815285518094520193019160005b8281106109c3575050505090565b83516001600160e01b031916855293810193928101926001016109b5565b34610101576020366003190112610101576109fa610190565b610a1761031f6000805160206116db8339815191525461ffff1690565b90610a2182610d88565b9060009081906001600160a01b0316815b858310610a4a578385526040518061034d878261099c565b610a5381610dda565b546000905b60088210610a71575b5050610a6c90610dc6565b610a32565b91969095929493610a8190610dc6565b95818711610ae55763ffffffff60e01b838260051b1b16610aaa61043e6103b96103ab84610bc0565b8714610ac8575b50610abb90610dc6565b9096919593949295610a58565b856103fe610ade92610795610abb959989610e31565b9490610ab1565b819792509593949295610a61565b34610101576020366003190112610101576001600160e01b0319610b156100ea565b166000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052602060406000205460601c604051908152f35b3461010157602036600319011261010157610b69610190565b6000805160206116fb833981519152546001600160a01b03908116330361098a577f24aa1f7b31fd188a8d3ecfb06bc55c806040e59b03bd4396283442fce661789080546001600160a01b03191691909216179055005b63ffffffff60e01b166000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052604060002090565b600080356001600160e01b03191681527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052604090205460601c8015610c75575b803b15610c635760008091368280378136915af43d6000803e15610c5e573d6000f35b3d6000fd5b6040516321f27f0d60e21b8152600490fd5b507f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc96546001600160a01b0316610c3b565b634e487b7160e01b600052604160045260246000fd5b604051906060820182811067ffffffffffffffff821117610cdc57604052565b610ca6565b6040519190601f01601f1916820167ffffffffffffffff811183821017610cdc57604052565b67ffffffffffffffff8111610cdc5760051b60200190565b90610d31610d2c83610d07565b610ce1565b8281528092610d42601f1991610d07565b016000805b828110610d545750505050565b604090815182810181811067ffffffffffffffff821117610cdc576020935283815282606081830152828701015201610d47565b90610d95610d2c83610d07565b8281528092610da6601f1991610d07565b0190602036910137565b634e487b7160e01b600052601160045260246000fd5b6000198114610dd55760010190565b610db0565b6000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc95602052604060002090565b634e487b7160e01b600052603260045260246000fd5b805115610e2c5760200190565b610e09565b8051821015610e2c5760209160051b010190565b1561010157565b60ff1660ff8114610dd55760010190565b6000805160206116fb8339815191525493959491936001600160a01b0316330361098a57610e8d610d2c85610d07565b9081948083526020809301600591821b8301923684116101015780915b848310610ecf57505050505050610ecd9394610ec7913691610fb6565b91611113565b565b67ffffffffffffffff833581811161010157830160608136031261010157610ef5610cbc565b91610eff826101a6565b835288820135600381101561010157898401526040918281013591821161010157019036601f8301121561010157813591610f3c610d2c84610d07565b928a808583815201918a1b8301019136831161010157918b80969492979593015b818110610f77575050849550820152815201920191610eaa565b9193958091939597610f8884610106565b8152019101918b959391969492610f5d565b67ffffffffffffffff8111610cdc57601f01601f191660200190565b929192610fc5610d2c83610f9a565b938285528282011161010157816000926020928387013784010152565b60031115610fec57565b634e487b7160e01b600052602160045260246000fd5b919082519283825260005b84811061102e575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161100d565b93929091936060928382019380835281518095526080830160808660051b85010195602080940192600080915b8383106110a4575050505050506110a194956110949183019060018060a01b03169052565b6040818403910152611002565b90565b909192939498607f1988820301865289519060018060a01b0382511681528782015160038110156110ff576110f160019385848c9594868096015281604080940151938201520190610565565b9b019601949301919061106f565b634e487b7160e01b85526021600452602485fd5b92909261113361031f6000805160206116db8339815191525461ffff1690565b91829360009560078516611294575b6000945b8451861015611205576111598686610e31565b5190602082015161116981610fe2565b60408084015151156111f5575061117f81610fe2565b8061119d575090600198611192926112a9565b9790955b0194611146565b6111aa8198939298610fe2565b600181036111c45750906111bf60019261156c565b611196565b806111d0600292610fe2565b146111df575b50600190611196565b6001986111ec92976113cd565b979095906111d6565b5163eb6c3aeb60e01b8152600490fd5b819491929550967f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb6739397610ecd978103611271575b6007811661125d575b50506112558560405193849384611042565b0390a161165f565b6112699060031c610dda565b553880611243565b6000805160206116db833981519152805461ffff191661ffff831617905561123a565b95506112a28460031c610dda565b5495611142565b82519091906001600160a01b03166001600160a01b03811630141590816113c3575b506113b15760009384925b60408086015180518610156113a5576112f28661130092610e31565b516001600160e01b03191690565b9061131361043e6103b96103ab85610bc0565b6113955750855182906001600160601b031990611344906001600160a01b03165b60601b6001600160601b03191690565b161761134f82610bc0565b5560e090818360051b169463ffffffff60e01b809216861c91861c1916179314611380575b600193840193016112d6565b9161138d8360031c610dda565b558491611374565b51634923a77160e11b8152600490fd5b50509250925092509190565b604051633ddc5cab60e21b8152600490fd5b3b159050386112cb565b82519293929091906001600160a01b031661155a5790600780821691600390600090821c5b60409586890151805184101561154b576112f28461140f92610e31565b9561141987610bc0565b54978860601c801561153a57301461152a575081611518575050600019019061144182610dda565b5494849687915b60e063ffffffff811b92600061146f858c600598891b1b169486811686036114dd57610bc0565b5580881c611fff16941b16918584146114cb57906114a0929161149185610dda565b5491831c921c19161791610dda565b555b85156114b5575b600101909493946113f2565b935060006114c282610dda565b556000936114a9565b9180949893501c921c191617936114a2565b6114f96114ec6103ab88610bc0565b6001600160601b03191690565b6bffffffffffffffffffffffff85161761151287610bc0565b55610bc0565b60001901969095919291879190611448565b5163e983573160e01b8152600490fd5b81516337e25a9760e11b8152600490fd5b5097509394505090501b179190565b604051633ab3490960e21b8152600490fd5b80516001600160a01b03163b156113b15760005b6040808301518051831015611633576112f28361159c92610e31565b906115a682610bc0565b54908160601c801561153a573081146116225785516115cd906001600160a01b031661043e565b1461161257508351600193929161160b916bffffffffffffffffffffffff90611602906114ec906001600160a01b0316611334565b91161791610bc0565b5501611580565b516330baabf360e11b8152600490fd5b815163e983573160e01b8152600490fd5b50505050565b3d1561165a573d9061164d610d2c83610f9a565b9182523d6000602084013e565b606090565b81516001600160a01b038216908115901581036116c8571561168057505050565b30036116b0575b816000929160208493519201905af461169e611639565b50156116a657565b3d6000803e3d6000fd5b803b61168757604051633ddc5cab60e21b8152600490fd5b6040516326df4ccd60e01b8152600490fdfe177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc948a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f671680460a26469706673582212206d64f9faa948d4750c95d7cff36ad9edf9fc3b1dcf7ae5749089c22ac35e1bc664736f6c63430008130033fc606c433378e3a7e0a6a531deac289b66caa1b4aa8554fd4ab2c6f1570f92d8177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc94177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc95
Deployed Bytecode
0x60806040526004361015610015575b36610bf857005b60003560e01c806301ffc9a7146100e55780631f931c1c146100e05780632c408059146100db57806352ef6b2c146100d65780635c975abb146100d157806379ba5097146100cc5780637a0ed627146100c75780638ab5150a146100c25780638da5cb5b146100bd57806391423765146100b8578063adfca15e146100b3578063cdffacc6146100ae5763f2fde38b0361000e57610b50565b610af3565b6109e1565b61091a565b6108e4565b61089c565b61061f565b6104bc565b61047a565b6102f0565b610264565b6101e8565b61011b565b600435906001600160e01b03198216820361010157565b600080fd5b35906001600160e01b03198216820361010157565b34610101576020366003190112610101576001600160e01b031961013d6100ea565b166000527ffc606c433378e3a7e0a6a531deac289b66caa1b4aa8554fd4ab2c6f1570f92d8602052602060ff604060002054166040519015158152f35b602435906001600160a01b038216820361010157565b600435906001600160a01b038216820361010157565b35906001600160a01b038216820361010157565b9181601f840112156101015782359167ffffffffffffffff8311610101576020838186019501011161010157565b346101015760603660031901126101015760043567ffffffffffffffff808211610101573660238301121561010157816004013591818311610101573660248460051b830101116101015761023b61017a565b604435928311610101576102629361025960249436906004016101ba565b94909301610e5d565b005b34610101576000366003190112610101577f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc96546040516001600160a01b039091168152602090f35b6020908160408183019282815285518094520193019160005b8281106102d3575050505090565b83516001600160a01b0316855293810193928101926001016102c5565b34610101576000806003193601126104775761032661031f6000805160206116db8339815191525461ffff1690565b61ffff1690565b9061033082610d88565b908080815b858210610351578385526040518061034d87826102ac565b0390f35b61035a81610dda565b5483905b60088210610377575b505061037290610dc6565b610335565b91959396909261038690610dc6565b9481861161046a576103bf6103b96103ab63ffffffff60e01b868860051b1b16610bc0565b546001600160601b03191690565b60601c90565b886001600160a01b038216815b848110610421575b505061041657816103fe610403926103ef610409958a610e31565b6001600160a01b039091169052565b610dc6565b93610dc6565b909693959194929461035e565b509261040990610dc6565b61044a61043e610431838c610e31565b516001600160a01b031690565b6001600160a01b031690565b821461045e5761045990610dc6565b6103cc565b505050600138806103d4565b9492819794969250610367565b80fd5b3461010157600036600319011261010157602060ff7f68721c0bbf2c02a4d65000340d1370666be06a630022208d4baa9bd7a4b6fea854166040519015158152f35b3461010157600080600319360112610477577f24aa1f7b31fd188a8d3ecfb06bc55c806040e59b03bd4396283442fce661789080546001600160a01b03908181163303610553576000805160206116fb833981519152805492339084167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08780a36001600160a01b03199283163317905516905580f35b60405163efd1052d60e01b8152600490fd5b90815180825260208080930193019160005b828110610585575050505090565b83516001600160e01b03191685529381019392810192600101610577565b602080820190808352835180925260409283810182858560051b8401019601946000925b8584106105d8575050505050505090565b90919293949596858061060e600193603f1986820301885286838d51878060a01b03815116845201519181858201520190610565565b9901940194019295949391906105c7565b34610101576000806003193601126104775761064e61031f6000805160206116db8339815191525461ffff1690565b61065781610d1f565b9061066181610d88565b92809181825b8282106106c5575050505b81811061068a578183526040518061034d85826105a3565b806106ab6106a561069e6106c09488610e31565b5160ff1690565b60ff1690565b60206106b78387610e31565b51015152610dc6565b610672565b6106ce81610dda565b5484905b600882106106eb575b50506106e690610dc6565b610667565b90939196926106fc90989598610dc6565b9582871161088f5763ffffffff60e01b828660051b1b166107226103b96103ab83610bc0565b8a6001600160a01b038216815b8581106107d9575b50506107cd57916107a56107b8926107666107be95610756858b610e31565b516001600160a01b039091169052565b61079561077288610d88565b60209081610780878d610e31565b51015261078d858b610e31565b510151610e1f565b6001600160e01b03199091169052565b6103fe6107b2828a610e31565b60019052565b94610dc6565b909794979691939592966106d2565b5050936107be90610dc6565b8a858a846107fb61043e6107ed8785610e31565b51516001600160a01b031690565b146108115750505061080c90610dc6565b61072f565b6108869550838095506108779361085361087294610795602061083a61087e9a61069e98610e31565b51015161084d6106a561069e8888610e31565b90610e31565b61086d60ff8061086661069e8686610e31565b1610610e45565b610e31565b610e4c565b918b610e31565b9060ff169052565b60013880610737565b95929691939794976106db565b34610101576000366003190112610101577f24aa1f7b31fd188a8d3ecfb06bc55c806040e59b03bd4396283442fce6617890546040516001600160a01b039091168152602090f35b34610101576000366003190112610101576000805160206116fb833981519152546040516001600160a01b039091168152602090f35b3461010157602036600319011261010157610933610190565b6000805160206116fb833981519152546001600160a01b03908116330361098a577f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc9680546001600160a01b03191691909216179055005b604051632f7a8ee160e01b8152600490fd5b6020908160408183019282815285518094520193019160005b8281106109c3575050505090565b83516001600160e01b031916855293810193928101926001016109b5565b34610101576020366003190112610101576109fa610190565b610a1761031f6000805160206116db8339815191525461ffff1690565b90610a2182610d88565b9060009081906001600160a01b0316815b858310610a4a578385526040518061034d878261099c565b610a5381610dda565b546000905b60088210610a71575b5050610a6c90610dc6565b610a32565b91969095929493610a8190610dc6565b95818711610ae55763ffffffff60e01b838260051b1b16610aaa61043e6103b96103ab84610bc0565b8714610ac8575b50610abb90610dc6565b9096919593949295610a58565b856103fe610ade92610795610abb959989610e31565b9490610ab1565b819792509593949295610a61565b34610101576020366003190112610101576001600160e01b0319610b156100ea565b166000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052602060406000205460601c604051908152f35b3461010157602036600319011261010157610b69610190565b6000805160206116fb833981519152546001600160a01b03908116330361098a577f24aa1f7b31fd188a8d3ecfb06bc55c806040e59b03bd4396283442fce661789080546001600160a01b03191691909216179055005b63ffffffff60e01b166000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052604060002090565b600080356001600160e01b03191681527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052604090205460601c8015610c75575b803b15610c635760008091368280378136915af43d6000803e15610c5e573d6000f35b3d6000fd5b6040516321f27f0d60e21b8152600490fd5b507f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc96546001600160a01b0316610c3b565b634e487b7160e01b600052604160045260246000fd5b604051906060820182811067ffffffffffffffff821117610cdc57604052565b610ca6565b6040519190601f01601f1916820167ffffffffffffffff811183821017610cdc57604052565b67ffffffffffffffff8111610cdc5760051b60200190565b90610d31610d2c83610d07565b610ce1565b8281528092610d42601f1991610d07565b016000805b828110610d545750505050565b604090815182810181811067ffffffffffffffff821117610cdc576020935283815282606081830152828701015201610d47565b90610d95610d2c83610d07565b8281528092610da6601f1991610d07565b0190602036910137565b634e487b7160e01b600052601160045260246000fd5b6000198114610dd55760010190565b610db0565b6000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc95602052604060002090565b634e487b7160e01b600052603260045260246000fd5b805115610e2c5760200190565b610e09565b8051821015610e2c5760209160051b010190565b1561010157565b60ff1660ff8114610dd55760010190565b6000805160206116fb8339815191525493959491936001600160a01b0316330361098a57610e8d610d2c85610d07565b9081948083526020809301600591821b8301923684116101015780915b848310610ecf57505050505050610ecd9394610ec7913691610fb6565b91611113565b565b67ffffffffffffffff833581811161010157830160608136031261010157610ef5610cbc565b91610eff826101a6565b835288820135600381101561010157898401526040918281013591821161010157019036601f8301121561010157813591610f3c610d2c84610d07565b928a808583815201918a1b8301019136831161010157918b80969492979593015b818110610f77575050849550820152815201920191610eaa565b9193958091939597610f8884610106565b8152019101918b959391969492610f5d565b67ffffffffffffffff8111610cdc57601f01601f191660200190565b929192610fc5610d2c83610f9a565b938285528282011161010157816000926020928387013784010152565b60031115610fec57565b634e487b7160e01b600052602160045260246000fd5b919082519283825260005b84811061102e575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161100d565b93929091936060928382019380835281518095526080830160808660051b85010195602080940192600080915b8383106110a4575050505050506110a194956110949183019060018060a01b03169052565b6040818403910152611002565b90565b909192939498607f1988820301865289519060018060a01b0382511681528782015160038110156110ff576110f160019385848c9594868096015281604080940151938201520190610565565b9b019601949301919061106f565b634e487b7160e01b85526021600452602485fd5b92909261113361031f6000805160206116db8339815191525461ffff1690565b91829360009560078516611294575b6000945b8451861015611205576111598686610e31565b5190602082015161116981610fe2565b60408084015151156111f5575061117f81610fe2565b8061119d575090600198611192926112a9565b9790955b0194611146565b6111aa8198939298610fe2565b600181036111c45750906111bf60019261156c565b611196565b806111d0600292610fe2565b146111df575b50600190611196565b6001986111ec92976113cd565b979095906111d6565b5163eb6c3aeb60e01b8152600490fd5b819491929550967f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb6739397610ecd978103611271575b6007811661125d575b50506112558560405193849384611042565b0390a161165f565b6112699060031c610dda565b553880611243565b6000805160206116db833981519152805461ffff191661ffff831617905561123a565b95506112a28460031c610dda565b5495611142565b82519091906001600160a01b03166001600160a01b03811630141590816113c3575b506113b15760009384925b60408086015180518610156113a5576112f28661130092610e31565b516001600160e01b03191690565b9061131361043e6103b96103ab85610bc0565b6113955750855182906001600160601b031990611344906001600160a01b03165b60601b6001600160601b03191690565b161761134f82610bc0565b5560e090818360051b169463ffffffff60e01b809216861c91861c1916179314611380575b600193840193016112d6565b9161138d8360031c610dda565b558491611374565b51634923a77160e11b8152600490fd5b50509250925092509190565b604051633ddc5cab60e21b8152600490fd5b3b159050386112cb565b82519293929091906001600160a01b031661155a5790600780821691600390600090821c5b60409586890151805184101561154b576112f28461140f92610e31565b9561141987610bc0565b54978860601c801561153a57301461152a575081611518575050600019019061144182610dda565b5494849687915b60e063ffffffff811b92600061146f858c600598891b1b169486811686036114dd57610bc0565b5580881c611fff16941b16918584146114cb57906114a0929161149185610dda565b5491831c921c19161791610dda565b555b85156114b5575b600101909493946113f2565b935060006114c282610dda565b556000936114a9565b9180949893501c921c191617936114a2565b6114f96114ec6103ab88610bc0565b6001600160601b03191690565b6bffffffffffffffffffffffff85161761151287610bc0565b55610bc0565b60001901969095919291879190611448565b5163e983573160e01b8152600490fd5b81516337e25a9760e11b8152600490fd5b5097509394505090501b179190565b604051633ab3490960e21b8152600490fd5b80516001600160a01b03163b156113b15760005b6040808301518051831015611633576112f28361159c92610e31565b906115a682610bc0565b54908160601c801561153a573081146116225785516115cd906001600160a01b031661043e565b1461161257508351600193929161160b916bffffffffffffffffffffffff90611602906114ec906001600160a01b0316611334565b91161791610bc0565b5501611580565b516330baabf360e11b8152600490fd5b815163e983573160e01b8152600490fd5b50505050565b3d1561165a573d9061164d610d2c83610f9a565b9182523d6000602084013e565b606090565b81516001600160a01b038216908115901581036116c8571561168057505050565b30036116b0575b816000929160208493519201905af461169e611639565b50156116a657565b3d6000803e3d6000fd5b803b61168757604051633ddc5cab60e21b8152600490fd5b6040516326df4ccd60e01b8152600490fdfe177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc948a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f671680460a26469706673582212206d64f9faa948d4750c95d7cff36ad9edf9fc3b1dcf7ae5749089c22ac35e1bc664736f6c63430008130033
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.
Add Token to MetaMask (Web3)