Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 13 from a total of 13 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Set Text | 24355383 | 33 days ago | IN | 0 ETH | 0.00002768 | ||||
| Set Contenthash | 23971240 | 87 days ago | IN | 0 ETH | 0.00003236 | ||||
| Set Addr | 23944187 | 91 days ago | IN | 0 ETH | 0.00000151 | ||||
| Set Contenthash | 22968398 | 227 days ago | IN | 0 ETH | 0.00016001 | ||||
| Set Contenthash | 22951935 | 230 days ago | IN | 0 ETH | 0.00003649 | ||||
| Set Contenthash | 22709642 | 263 days ago | IN | 0 ETH | 0.00001584 | ||||
| Set Contenthash | 22703432 | 264 days ago | IN | 0 ETH | 0.0000211 | ||||
| Set Addr | 22555158 | 285 days ago | IN | 0 ETH | 0.00003579 | ||||
| Transfer Ownersh... | 22541612 | 287 days ago | IN | 0 ETH | 0.00034323 | ||||
| Set Text | 21949096 | 370 days ago | IN | 0 ETH | 0.00009146 | ||||
| Set Text | 21949092 | 370 days ago | IN | 0 ETH | 0.00006626 | ||||
| Set Text | 21825561 | 387 days ago | IN | 0 ETH | 0.00011086 | ||||
| Set Contenthash | 21798538 | 391 days ago | IN | 0 ETH | 0.00003649 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
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:
OrbiterResolver
Compiler Version
v0.8.20+commit.a1b79de6
Optimization Enabled:
Yes with 200 runs
Other Settings:
shanghai EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "../lib/ens-contracts/contracts/registry/ENS.sol";
import "../lib/ens-contracts/contracts/wrapper/INameWrapper.sol";
import "../lib/ens-contracts/contracts/resolvers/profiles/IExtendedResolver.sol";
import "../lib/ens-contracts/contracts/resolvers/profiles/ABIResolver.sol";
import "../lib/ens-contracts/contracts/resolvers/profiles/AddrResolver.sol";
import "../lib/ens-contracts/contracts/resolvers/profiles/ContentHashResolver.sol";
import "../lib/ens-contracts/contracts/resolvers/profiles/NameResolver.sol";
import "../lib/ens-contracts/contracts/resolvers/profiles/TextResolver.sol";
import "../lib/ens-contracts/contracts/resolvers/Multicallable.sol";
import "../lib/ens-contracts/contracts/resolvers/profiles/InterfaceResolver.sol";
import "../lib/openzeppelin-contracts/contracts/access/Ownable.sol";
import "./SignatureVerifier.sol";
interface IResolverService {
function resolve(
bytes calldata name,
bytes calldata data
)
external
view
returns (bytes memory result, uint64 expires, bytes memory sig);
}
/**
* A hybrid onchain/offchain ENS resolver contract for flexible record management.
*/
contract OrbiterResolver is
Multicallable,
ABIResolver,
AddrResolver,
ContentHashResolver,
InterfaceResolver,
NameResolver,
TextResolver,
IExtendedResolver,
Ownable
{
ENS immutable ens;
INameWrapper immutable nameWrapper;
string public url;
address public signer;
address public publicResolver;
address public legacyResolver;
error OffchainLookup(
address sender,
string[] urls,
bytes callData,
bytes4 callbackFunction,
bytes extraData
);
constructor(
ENS _ens,
INameWrapper _nameWrapper,
string memory _url,
address _signer,
address _owner,
address _publicResolver,
address _legacyResolver
) Ownable(_owner) {
ens = _ens;
nameWrapper = _nameWrapper;
url = _url;
signer = _signer;
publicResolver = _publicResolver;
legacyResolver = _legacyResolver;
}
function resolve(
bytes calldata name,
bytes memory data
) external view virtual returns (bytes memory) {
// If we have an onchain result in this contract, return it
bytes memory internalResult = resolveOnchain(address(this), data);
if (internalResult.length > 0) return internalResult;
// If we have an onchain result in the latest public resolver, return it
bytes memory publicResResult = resolveOnchain(publicResolver, data);
if (publicResResult.length > 0) return publicResResult;
// If we have an onchain result in the legacy public resolver, return it
bytes memory legacyResResult = resolveOnchain(legacyResolver, data);
if (legacyResResult.length > 0) return legacyResResult;
// Otherwise, fallback to offchain lookup
return resolveOffchain(name, data);
}
function resolveOnchain(
address resolver,
bytes memory data
) internal view returns (bytes memory) {
(bool success, bytes memory result) = resolver.staticcall(data);
bytes32 hashedResult = keccak256(result);
// keccak256(0x0000000000000000000000000000000000000000000000000000000000000000)
// covers empty addr(node), name(node), contenthash(node)
bytes32 emptySingleArg = 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563;
// keccak256(0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000)
// covers addr(node, coinType), text(node, key), ABI(node, contentTypes)
bytes32 emptyDoubleArg = 0x569e75fc77c1a856f6daaf9e69d8a9566ca34aa47f9133711ce065a571af0cfd;
if (
success &&
(hashedResult != emptySingleArg) &&
(hashedResult != emptyDoubleArg)
) {
return result;
}
return bytes("");
}
function resolveOffchain(
bytes calldata name,
bytes memory data
) internal view virtual returns (bytes memory) {
bytes memory callData = abi.encodeWithSelector(
IResolverService.resolve.selector,
name,
data
);
string[] memory urls = new string[](1);
urls[0] = url;
revert OffchainLookup(
address(this),
urls,
callData,
OrbiterResolver.resolveWithProof.selector,
abi.encode(callData, address(this))
);
}
function resolveWithProof(
bytes calldata response,
bytes calldata extraData
) external view returns (bytes memory) {
(address _signer, bytes memory result) = SignatureVerifier.verify(
extraData,
response
);
require(_signer == signer, "SignatureVerifier: Invalid sigature");
return result;
}
function supportsInterface(
bytes4 interfaceID
)
public
view
override(
Multicallable,
ABIResolver,
AddrResolver,
ContentHashResolver,
InterfaceResolver,
NameResolver,
TextResolver
)
returns (bool)
{
return
interfaceID == type(IExtendedResolver).interfaceId ||
super.supportsInterface(interfaceID);
}
function isAuthorised(bytes32 node) internal view override returns (bool) {
address owner = ens.owner(node);
if (
owner == address(nameWrapper)
? !nameWrapper.canModifyName(node, msg.sender)
: (owner != msg.sender &&
!ens.isApprovedForAll(owner, msg.sender))
) {
return false;
}
return true;
}
function setUrl(string memory _url) external onlyOwner {
url = _url;
}
function setSigner(address _signer) external onlyOwner {
signer = _signer;
}
}//SPDX-License-Identifier: MIT
pragma solidity >=0.8.4;
interface ENS {
// Logged when the owner of a node assigns a new owner to a subnode.
event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);
// Logged when the owner of a node transfers ownership to a new account.
event Transfer(bytes32 indexed node, address owner);
// Logged when the resolver for a node changes.
event NewResolver(bytes32 indexed node, address resolver);
// Logged when the TTL of a node changes
event NewTTL(bytes32 indexed node, uint64 ttl);
// Logged when an operator is added or removed.
event ApprovalForAll(
address indexed owner,
address indexed operator,
bool approved
);
function setRecord(
bytes32 node,
address owner,
address resolver,
uint64 ttl
) external;
function setSubnodeRecord(
bytes32 node,
bytes32 label,
address owner,
address resolver,
uint64 ttl
) external;
function setSubnodeOwner(
bytes32 node,
bytes32 label,
address owner
) external returns (bytes32);
function setResolver(bytes32 node, address resolver) external;
function setOwner(bytes32 node, address owner) external;
function setTTL(bytes32 node, uint64 ttl) external;
function setApprovalForAll(address operator, bool approved) external;
function owner(bytes32 node) external view returns (address);
function resolver(bytes32 node) external view returns (address);
function ttl(bytes32 node) external view returns (uint64);
function recordExists(bytes32 node) external view returns (bool);
function isApprovedForAll(
address owner,
address operator
) external view returns (bool);
}//SPDX-License-Identifier: MIT
pragma solidity ~0.8.17;
import "../registry/ENS.sol";
import "../ethregistrar/IBaseRegistrar.sol";
import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
import "./IMetadataService.sol";
import "./INameWrapperUpgrade.sol";
uint32 constant CANNOT_UNWRAP = 1;
uint32 constant CANNOT_BURN_FUSES = 2;
uint32 constant CANNOT_TRANSFER = 4;
uint32 constant CANNOT_SET_RESOLVER = 8;
uint32 constant CANNOT_SET_TTL = 16;
uint32 constant CANNOT_CREATE_SUBDOMAIN = 32;
uint32 constant CANNOT_APPROVE = 64;
//uint16 reserved for parent controlled fuses from bit 17 to bit 32
uint32 constant PARENT_CANNOT_CONTROL = 1 << 16;
uint32 constant IS_DOT_ETH = 1 << 17;
uint32 constant CAN_EXTEND_EXPIRY = 1 << 18;
uint32 constant CAN_DO_EVERYTHING = 0;
uint32 constant PARENT_CONTROLLED_FUSES = 0xFFFF0000;
// all fuses apart from IS_DOT_ETH
uint32 constant USER_SETTABLE_FUSES = 0xFFFDFFFF;
interface INameWrapper is IERC1155 {
event NameWrapped(
bytes32 indexed node,
bytes name,
address owner,
uint32 fuses,
uint64 expiry
);
event NameUnwrapped(bytes32 indexed node, address owner);
event FusesSet(bytes32 indexed node, uint32 fuses);
event ExpiryExtended(bytes32 indexed node, uint64 expiry);
function ens() external view returns (ENS);
function registrar() external view returns (IBaseRegistrar);
function metadataService() external view returns (IMetadataService);
function names(bytes32) external view returns (bytes memory);
function name() external view returns (string memory);
function upgradeContract() external view returns (INameWrapperUpgrade);
function supportsInterface(bytes4 interfaceID) external view returns (bool);
function wrap(
bytes calldata name,
address wrappedOwner,
address resolver
) external;
function wrapETH2LD(
string calldata label,
address wrappedOwner,
uint16 ownerControlledFuses,
address resolver
) external returns (uint64 expires);
function registerAndWrapETH2LD(
string calldata label,
address wrappedOwner,
uint256 duration,
address resolver,
uint16 ownerControlledFuses
) external returns (uint256 registrarExpiry);
function renew(
uint256 labelHash,
uint256 duration
) external returns (uint256 expires);
function unwrap(bytes32 node, bytes32 label, address owner) external;
function unwrapETH2LD(
bytes32 label,
address newRegistrant,
address newController
) external;
function upgrade(bytes calldata name, bytes calldata extraData) external;
function setFuses(
bytes32 node,
uint16 ownerControlledFuses
) external returns (uint32 newFuses);
function setChildFuses(
bytes32 parentNode,
bytes32 labelhash,
uint32 fuses,
uint64 expiry
) external;
function setSubnodeRecord(
bytes32 node,
string calldata label,
address owner,
address resolver,
uint64 ttl,
uint32 fuses,
uint64 expiry
) external returns (bytes32);
function setRecord(
bytes32 node,
address owner,
address resolver,
uint64 ttl
) external;
function setSubnodeOwner(
bytes32 node,
string calldata label,
address newOwner,
uint32 fuses,
uint64 expiry
) external returns (bytes32);
function extendExpiry(
bytes32 node,
bytes32 labelhash,
uint64 expiry
) external returns (uint64);
function canModifyName(
bytes32 node,
address addr
) external view returns (bool);
function setResolver(bytes32 node, address resolver) external;
function setTTL(bytes32 node, uint64 ttl) external;
function ownerOf(uint256 id) external view returns (address owner);
function approve(address to, uint256 tokenId) external;
function getApproved(uint256 tokenId) external view returns (address);
function getData(
uint256 id
) external view returns (address, uint32, uint64);
function setMetadataService(IMetadataService _metadataService) external;
function uri(uint256 tokenId) external view returns (string memory);
function setUpgradeContract(INameWrapperUpgrade _upgradeAddress) external;
function allFusesBurned(
bytes32 node,
uint32 fuseMask
) external view returns (bool);
function isWrapped(bytes32) external view returns (bool);
function isWrapped(bytes32, bytes32) external view returns (bool);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
interface IExtendedResolver {
function resolve(
bytes memory name,
bytes memory data
) external view returns (bytes memory);
}// SPDX-License-Identifier: MIT
pragma solidity >=0.8.4;
import "./IABIResolver.sol";
import "../ResolverBase.sol";
abstract contract ABIResolver is IABIResolver, ResolverBase {
mapping(uint64 => mapping(bytes32 => mapping(uint256 => bytes))) versionable_abis;
/**
* Sets the ABI associated with an ENS node.
* Nodes may have one ABI of each content type. To remove an ABI, set it to
* the empty string.
* @param node The node to update.
* @param contentType The content type of the ABI
* @param data The ABI data.
*/
function setABI(
bytes32 node,
uint256 contentType,
bytes calldata data
) external virtual authorised(node) {
// Content types must be powers of 2
require(((contentType - 1) & contentType) == 0);
versionable_abis[recordVersions[node]][node][contentType] = data;
emit ABIChanged(node, contentType);
}
/**
* Returns the ABI associated with an ENS node.
* Defined in EIP205.
* @param node The ENS node to query
* @param contentTypes A bitwise OR of the ABI formats accepted by the caller.
* @return contentType The content type of the return value
* @return data The ABI data
*/
function ABI(
bytes32 node,
uint256 contentTypes
) external view virtual override returns (uint256, bytes memory) {
mapping(uint256 => bytes) storage abiset = versionable_abis[
recordVersions[node]
][node];
for (
uint256 contentType = 1;
contentType <= contentTypes;
contentType <<= 1
) {
if (
(contentType & contentTypes) != 0 &&
abiset[contentType].length > 0
) {
return (contentType, abiset[contentType]);
}
}
return (0, bytes(""));
}
function supportsInterface(
bytes4 interfaceID
) public view virtual override returns (bool) {
return
interfaceID == type(IABIResolver).interfaceId ||
super.supportsInterface(interfaceID);
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.8.4;
import "../ResolverBase.sol";
import "./IAddrResolver.sol";
import "./IAddressResolver.sol";
abstract contract AddrResolver is
IAddrResolver,
IAddressResolver,
ResolverBase
{
uint256 private constant COIN_TYPE_ETH = 60;
mapping(uint64 => mapping(bytes32 => mapping(uint256 => bytes))) versionable_addresses;
/**
* Sets the address associated with an ENS node.
* May only be called by the owner of that node in the ENS registry.
* @param node The node to update.
* @param a The address to set.
*/
function setAddr(
bytes32 node,
address a
) external virtual authorised(node) {
setAddr(node, COIN_TYPE_ETH, addressToBytes(a));
}
/**
* Returns the address associated with an ENS node.
* @param node The ENS node to query.
* @return The associated address.
*/
function addr(
bytes32 node
) public view virtual override returns (address payable) {
bytes memory a = addr(node, COIN_TYPE_ETH);
if (a.length == 0) {
return payable(0);
}
return bytesToAddress(a);
}
function setAddr(
bytes32 node,
uint256 coinType,
bytes memory a
) public virtual authorised(node) {
emit AddressChanged(node, coinType, a);
if (coinType == COIN_TYPE_ETH) {
emit AddrChanged(node, bytesToAddress(a));
}
versionable_addresses[recordVersions[node]][node][coinType] = a;
}
function addr(
bytes32 node,
uint256 coinType
) public view virtual override returns (bytes memory) {
return versionable_addresses[recordVersions[node]][node][coinType];
}
function supportsInterface(
bytes4 interfaceID
) public view virtual override returns (bool) {
return
interfaceID == type(IAddrResolver).interfaceId ||
interfaceID == type(IAddressResolver).interfaceId ||
super.supportsInterface(interfaceID);
}
function bytesToAddress(
bytes memory b
) internal pure returns (address payable a) {
require(b.length == 20);
assembly {
a := div(mload(add(b, 32)), exp(256, 12))
}
}
function addressToBytes(address a) internal pure returns (bytes memory b) {
b = new bytes(20);
assembly {
mstore(add(b, 32), mul(a, exp(256, 12)))
}
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.8.4;
import "../ResolverBase.sol";
import "./IContentHashResolver.sol";
abstract contract ContentHashResolver is IContentHashResolver, ResolverBase {
mapping(uint64 => mapping(bytes32 => bytes)) versionable_hashes;
/**
* Sets the contenthash associated with an ENS node.
* May only be called by the owner of that node in the ENS registry.
* @param node The node to update.
* @param hash The contenthash to set
*/
function setContenthash(
bytes32 node,
bytes calldata hash
) external virtual authorised(node) {
versionable_hashes[recordVersions[node]][node] = hash;
emit ContenthashChanged(node, hash);
}
/**
* Returns the contenthash associated with an ENS node.
* @param node The ENS node to query.
* @return The associated contenthash.
*/
function contenthash(
bytes32 node
) external view virtual override returns (bytes memory) {
return versionable_hashes[recordVersions[node]][node];
}
function supportsInterface(
bytes4 interfaceID
) public view virtual override returns (bool) {
return
interfaceID == type(IContentHashResolver).interfaceId ||
super.supportsInterface(interfaceID);
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.8.4;
import "../ResolverBase.sol";
import "./INameResolver.sol";
abstract contract NameResolver is INameResolver, ResolverBase {
mapping(uint64 => mapping(bytes32 => string)) versionable_names;
/**
* Sets the name associated with an ENS node, for reverse records.
* May only be called by the owner of that node in the ENS registry.
* @param node The node to update.
*/
function setName(
bytes32 node,
string calldata newName
) external virtual authorised(node) {
versionable_names[recordVersions[node]][node] = newName;
emit NameChanged(node, newName);
}
/**
* Returns the name associated with an ENS node, for reverse records.
* Defined in EIP181.
* @param node The ENS node to query.
* @return The associated name.
*/
function name(
bytes32 node
) external view virtual override returns (string memory) {
return versionable_names[recordVersions[node]][node];
}
function supportsInterface(
bytes4 interfaceID
) public view virtual override returns (bool) {
return
interfaceID == type(INameResolver).interfaceId ||
super.supportsInterface(interfaceID);
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.8.4;
import "../ResolverBase.sol";
import "./ITextResolver.sol";
abstract contract TextResolver is ITextResolver, ResolverBase {
mapping(uint64 => mapping(bytes32 => mapping(string => string))) versionable_texts;
/**
* Sets the text data associated with an ENS node and key.
* May only be called by the owner of that node in the ENS registry.
* @param node The node to update.
* @param key The key to set.
* @param value The text data value to set.
*/
function setText(
bytes32 node,
string calldata key,
string calldata value
) external virtual authorised(node) {
versionable_texts[recordVersions[node]][node][key] = value;
emit TextChanged(node, key, key, value);
}
/**
* Returns the text data associated with an ENS node and key.
* @param node The ENS node to query.
* @param key The text data key to query.
* @return The associated text data.
*/
function text(
bytes32 node,
string calldata key
) external view virtual override returns (string memory) {
return versionable_texts[recordVersions[node]][node][key];
}
function supportsInterface(
bytes4 interfaceID
) public view virtual override returns (bool) {
return
interfaceID == type(ITextResolver).interfaceId ||
super.supportsInterface(interfaceID);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
import "./IMulticallable.sol";
import "@openzeppelin/contracts/utils/introspection/ERC165.sol";
abstract contract Multicallable is IMulticallable, ERC165 {
function _multicall(
bytes32 nodehash,
bytes[] calldata data
) internal returns (bytes[] memory results) {
results = new bytes[](data.length);
for (uint256 i = 0; i < data.length; i++) {
if (nodehash != bytes32(0)) {
bytes32 txNamehash = bytes32(data[i][4:36]);
require(
txNamehash == nodehash,
"multicall: All records must have a matching namehash"
);
}
(bool success, bytes memory result) = address(this).delegatecall(
data[i]
);
require(success);
results[i] = result;
}
return results;
}
// This function provides an extra security check when called
// from priviledged contracts (such as EthRegistrarController)
// that can set records on behalf of the node owners
function multicallWithNodeCheck(
bytes32 nodehash,
bytes[] calldata data
) external returns (bytes[] memory results) {
return _multicall(nodehash, data);
}
function multicall(
bytes[] calldata data
) public override returns (bytes[] memory results) {
return _multicall(bytes32(0), data);
}
function supportsInterface(
bytes4 interfaceID
) public view virtual override returns (bool) {
return
interfaceID == type(IMulticallable).interfaceId ||
super.supportsInterface(interfaceID);
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.8.4;
import "@openzeppelin/contracts/utils/introspection/IERC165.sol";
import "../ResolverBase.sol";
import "./AddrResolver.sol";
import "./IInterfaceResolver.sol";
abstract contract InterfaceResolver is IInterfaceResolver, AddrResolver {
mapping(uint64 => mapping(bytes32 => mapping(bytes4 => address))) versionable_interfaces;
/**
* Sets an interface associated with a name.
* Setting the address to 0 restores the default behaviour of querying the contract at `addr()` for interface support.
* @param node The node to update.
* @param interfaceID The EIP 165 interface ID.
* @param implementer The address of a contract that implements this interface for this node.
*/
function setInterface(
bytes32 node,
bytes4 interfaceID,
address implementer
) external virtual authorised(node) {
versionable_interfaces[recordVersions[node]][node][
interfaceID
] = implementer;
emit InterfaceChanged(node, interfaceID, implementer);
}
/**
* Returns the address of a contract that implements the specified interface for this name.
* If an implementer has not been set for this interfaceID and name, the resolver will query
* the contract at `addr()`. If `addr()` is set, a contract exists at that address, and that
* contract implements EIP165 and returns `true` for the specified interfaceID, its address
* will be returned.
* @param node The ENS node to query.
* @param interfaceID The EIP 165 interface ID to check for.
* @return The address that implements this interface, or 0 if the interface is unsupported.
*/
function interfaceImplementer(
bytes32 node,
bytes4 interfaceID
) external view virtual override returns (address) {
address implementer = versionable_interfaces[recordVersions[node]][
node
][interfaceID];
if (implementer != address(0)) {
return implementer;
}
address a = addr(node);
if (a == address(0)) {
return address(0);
}
(bool success, bytes memory returnData) = a.staticcall(
abi.encodeWithSignature(
"supportsInterface(bytes4)",
type(IERC165).interfaceId
)
);
if (!success || returnData.length < 32 || returnData[31] == 0) {
// EIP 165 not supported by target
return address(0);
}
(success, returnData) = a.staticcall(
abi.encodeWithSignature("supportsInterface(bytes4)", interfaceID)
);
if (!success || returnData.length < 32 || returnData[31] == 0) {
// Specified interface not supported by target
return address(0);
}
return a;
}
function supportsInterface(
bytes4 interfaceID
) public view virtual override returns (bool) {
return
interfaceID == type(IInterfaceResolver).interfaceId ||
super.supportsInterface(interfaceID);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "../lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol";
library SignatureVerifier {
/**
* @dev Generates a hash for signing/verifying.
* @param target: The address the signature is for.
* @param request: The original request that was sent.
* @param result: The `result` field of the response (not including the signature part).
*/
function makeSignatureHash(address target, uint64 expires, bytes memory request, bytes memory result)
internal
pure
returns (bytes32)
{
return keccak256(abi.encodePacked(hex"1900", target, expires, keccak256(request), keccak256(result)));
}
/**
* @dev Verifies a signed message returned from a callback.
* @param request: The original request that was sent.
* @param response: An ABI encoded tuple of `(bytes result, uint64 expires, bytes sig)`, where `result` is the data to return
* to the caller, and `sig` is the (r,s,v) encoded message signature.
* @return signer: The address that signed this message.
* @return result: The `result` decoded from `response`.
*/
function verify(bytes calldata request, bytes calldata response) internal view returns (address, bytes memory) {
(bytes memory result, uint64 expires, bytes memory sig) = abi.decode(response, (bytes, uint64, bytes));
(bytes memory extraData, address sender) = abi.decode(request, (bytes, address));
address signer = ECDSA.recover(makeSignatureHash(sender, expires, extraData, result), sig);
require(expires >= block.timestamp, "SignatureVerifier: Signature expired");
return (signer, result);
}
}import "../registry/ENS.sol";
import "./IBaseRegistrar.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
interface IBaseRegistrar is IERC721 {
event ControllerAdded(address indexed controller);
event ControllerRemoved(address indexed controller);
event NameMigrated(
uint256 indexed id,
address indexed owner,
uint256 expires
);
event NameRegistered(
uint256 indexed id,
address indexed owner,
uint256 expires
);
event NameRenewed(uint256 indexed id, uint256 expires);
// Authorises a controller, who can register and renew domains.
function addController(address controller) external;
// Revoke controller permission for an address.
function removeController(address controller) external;
// Set the resolver for the TLD this registrar manages.
function setResolver(address resolver) external;
// Returns the expiration timestamp of the specified label hash.
function nameExpires(uint256 id) external view returns (uint256);
// Returns true if the specified name is available for registration.
function available(uint256 id) external view returns (bool);
/**
* @dev Register a name.
*/
function register(
uint256 id,
address owner,
uint256 duration
) external returns (uint256);
function renew(uint256 id, uint256 duration) external returns (uint256);
/**
* @dev Reclaim ownership of a name in ENS, if you own it in the registrar.
*/
function reclaim(uint256 id, address owner) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC1155/IERC1155.sol)
pragma solidity ^0.8.20;
import {IERC165} from "../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC-1155 compliant contract, as defined in the
* https://eips.ethereum.org/EIPS/eip-1155[ERC].
*/
interface IERC1155 is IERC165 {
/**
* @dev Emitted when `value` amount of tokens of type `id` are transferred from `from` to `to` by `operator`.
*/
event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);
/**
* @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
* transfers.
*/
event TransferBatch(
address indexed operator,
address indexed from,
address indexed to,
uint256[] ids,
uint256[] values
);
/**
* @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
* `approved`.
*/
event ApprovalForAll(address indexed account, address indexed operator, bool approved);
/**
* @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
*
* If an {URI} event was emitted for `id`, the standard
* https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
* returned by {IERC1155MetadataURI-uri}.
*/
event URI(string value, uint256 indexed id);
/**
* @dev Returns the value of tokens of token type `id` owned by `account`.
*/
function balanceOf(address account, uint256 id) external view returns (uint256);
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
*
* Requirements:
*
* - `accounts` and `ids` must have the same length.
*/
function balanceOfBatch(
address[] calldata accounts,
uint256[] calldata ids
) external view returns (uint256[] memory);
/**
* @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
*
* Emits an {ApprovalForAll} event.
*
* Requirements:
*
* - `operator` cannot be the zero address.
*/
function setApprovalForAll(address operator, bool approved) external;
/**
* @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
*
* See {setApprovalForAll}.
*/
function isApprovedForAll(address account, address operator) external view returns (bool);
/**
* @dev Transfers a `value` amount of tokens of type `id` from `from` to `to`.
*
* WARNING: This function can potentially allow a reentrancy attack when transferring tokens
* to an untrusted contract, when invoking {onERC1155Received} on the receiver.
* Ensure to follow the checks-effects-interactions pattern and consider employing
* reentrancy guards when interacting with untrusted contracts.
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
* - `from` must have a balance of tokens of type `id` of at least `value` amount.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
* acceptance magic value.
*/
function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
*
* WARNING: This function can potentially allow a reentrancy attack when transferring tokens
* to an untrusted contract, when invoking {onERC1155BatchReceived} on the receiver.
* Ensure to follow the checks-effects-interactions pattern and consider employing
* reentrancy guards when interacting with untrusted contracts.
*
* Emits either a {TransferSingle} or a {TransferBatch} event, depending on the length of the array arguments.
*
* Requirements:
*
* - `ids` and `values` must have the same length.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
* acceptance magic value.
*/
function safeBatchTransferFrom(
address from,
address to,
uint256[] calldata ids,
uint256[] calldata values,
bytes calldata data
) external;
}//SPDX-License-Identifier: MIT
pragma solidity ~0.8.17;
interface IMetadataService {
function uri(uint256) external view returns (string memory);
}//SPDX-License-Identifier: MIT
pragma solidity ~0.8.17;
interface INameWrapperUpgrade {
function wrapFromUpgrade(
bytes calldata name,
address wrappedOwner,
uint32 fuses,
uint64 expiry,
address approved,
bytes calldata extraData
) external;
}// SPDX-License-Identifier: MIT
pragma solidity >=0.8.4;
interface IABIResolver {
event ABIChanged(bytes32 indexed node, uint256 indexed contentType);
/**
* Returns the ABI associated with an ENS node.
* Defined in EIP205.
* @param node The ENS node to query
* @param contentTypes A bitwise OR of the ABI formats accepted by the caller.
* @return contentType The content type of the return value
* @return data The ABI data
*/
function ABI(
bytes32 node,
uint256 contentTypes
) external view returns (uint256, bytes memory);
}// SPDX-License-Identifier: MIT
pragma solidity >=0.8.4;
import "@openzeppelin/contracts/utils/introspection/ERC165.sol";
import "./profiles/IVersionableResolver.sol";
abstract contract ResolverBase is ERC165, IVersionableResolver {
mapping(bytes32 => uint64) public recordVersions;
function isAuthorised(bytes32 node) internal view virtual returns (bool);
modifier authorised(bytes32 node) {
require(isAuthorised(node));
_;
}
/**
* Increments the record version associated with an ENS node.
* May only be called by the owner of that node in the ENS registry.
* @param node The node to update.
*/
function clearRecords(bytes32 node) public virtual authorised(node) {
recordVersions[node]++;
emit VersionChanged(node, recordVersions[node]);
}
function supportsInterface(
bytes4 interfaceID
) public view virtual override returns (bool) {
return
interfaceID == type(IVersionableResolver).interfaceId ||
super.supportsInterface(interfaceID);
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.8.4;
/**
* Interface for the legacy (ETH-only) addr function.
*/
interface IAddrResolver {
event AddrChanged(bytes32 indexed node, address a);
/**
* Returns the address associated with an ENS node.
* @param node The ENS node to query.
* @return The associated address.
*/
function addr(bytes32 node) external view returns (address payable);
}// SPDX-License-Identifier: MIT
pragma solidity >=0.8.4;
/**
* Interface for the new (multicoin) addr function.
*/
interface IAddressResolver {
event AddressChanged(
bytes32 indexed node,
uint256 coinType,
bytes newAddress
);
function addr(
bytes32 node,
uint256 coinType
) external view returns (bytes memory);
}// SPDX-License-Identifier: MIT
pragma solidity >=0.8.4;
interface IContentHashResolver {
event ContenthashChanged(bytes32 indexed node, bytes hash);
/**
* Returns the contenthash associated with an ENS node.
* @param node The ENS node to query.
* @return The associated contenthash.
*/
function contenthash(bytes32 node) external view returns (bytes memory);
}// SPDX-License-Identifier: MIT
pragma solidity >=0.8.4;
interface INameResolver {
event NameChanged(bytes32 indexed node, string name);
/**
* Returns the name associated with an ENS node, for reverse records.
* Defined in EIP181.
* @param node The ENS node to query.
* @return The associated name.
*/
function name(bytes32 node) external view returns (string memory);
}// SPDX-License-Identifier: MIT
pragma solidity >=0.8.4;
interface ITextResolver {
event TextChanged(
bytes32 indexed node,
string indexed indexedKey,
string key,
string value
);
/**
* Returns the text data associated with an ENS node and key.
* @param node The ENS node to query.
* @param key The text data key to query.
* @return The associated text data.
*/
function text(
bytes32 node,
string calldata key
) external view returns (string memory);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
interface IMulticallable {
function multicall(
bytes[] calldata data
) external returns (bytes[] memory results);
function multicallWithNodeCheck(
bytes32,
bytes[] calldata data
) external returns (bytes[] memory results);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165.sol)
pragma solidity ^0.8.20;
import {IERC165} from "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC-165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[ERC].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// SPDX-License-Identifier: MIT
pragma solidity >=0.8.4;
interface IInterfaceResolver {
event InterfaceChanged(
bytes32 indexed node,
bytes4 indexed interfaceID,
address implementer
);
/**
* Returns the address of a contract that implements the specified interface for this name.
* If an implementer has not been set for this interfaceID and name, the resolver will query
* the contract at `addr()`. If `addr()` is set, a contract exists at that address, and that
* contract implements EIP165 and returns `true` for the specified interfaceID, its address
* will be returned.
* @param node The ENS node to query.
* @param interfaceID The EIP 165 interface ID to check for.
* @return The address that implements this interface, or 0 if the interface is unsupported.
*/
function interfaceImplementer(
bytes32 node,
bytes4 interfaceID
) external view returns (address);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/cryptography/ECDSA.sol)
pragma solidity ^0.8.20;
/**
* @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
*
* These functions can be used to verify that a message was signed by the holder
* of the private keys of a given address.
*/
library ECDSA {
enum RecoverError {
NoError,
InvalidSignature,
InvalidSignatureLength,
InvalidSignatureS
}
/**
* @dev The signature derives the `address(0)`.
*/
error ECDSAInvalidSignature();
/**
* @dev The signature has an invalid length.
*/
error ECDSAInvalidSignatureLength(uint256 length);
/**
* @dev The signature has an S value that is in the upper half order.
*/
error ECDSAInvalidSignatureS(bytes32 s);
/**
* @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not
* return address(0) without also returning an error description. Errors are documented using an enum (error type)
* and a bytes32 providing additional information about the error.
*
* If no error is returned, then the address can be used for verification purposes.
*
* The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:
* this function rejects them by requiring the `s` value to be in the lower
* half order, and the `v` value to be either 27 or 28.
*
* IMPORTANT: `hash` _must_ be the result of a hash operation for the
* verification to be secure: it is possible to craft signatures that
* recover to arbitrary addresses for non-hashed data. A safe way to ensure
* this is by receiving a hash of the original message (which may otherwise
* be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.
*
* Documentation for signature generation:
* - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
* - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
*/
function tryRecover(
bytes32 hash,
bytes memory signature
) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {
if (signature.length == 65) {
bytes32 r;
bytes32 s;
uint8 v;
// ecrecover takes the signature parameters, and the only way to get them
// currently is to use assembly.
assembly ("memory-safe") {
r := mload(add(signature, 0x20))
s := mload(add(signature, 0x40))
v := byte(0, mload(add(signature, 0x60)))
}
return tryRecover(hash, v, r, s);
} else {
return (address(0), RecoverError.InvalidSignatureLength, bytes32(signature.length));
}
}
/**
* @dev Returns the address that signed a hashed message (`hash`) with
* `signature`. This address can then be used for verification purposes.
*
* The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:
* this function rejects them by requiring the `s` value to be in the lower
* half order, and the `v` value to be either 27 or 28.
*
* IMPORTANT: `hash` _must_ be the result of a hash operation for the
* verification to be secure: it is possible to craft signatures that
* recover to arbitrary addresses for non-hashed data. A safe way to ensure
* this is by receiving a hash of the original message (which may otherwise
* be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.
*/
function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
(address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, signature);
_throwError(error, errorArg);
return recovered;
}
/**
* @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
*
* See https://eips.ethereum.org/EIPS/eip-2098[ERC-2098 short signatures]
*/
function tryRecover(
bytes32 hash,
bytes32 r,
bytes32 vs
) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {
unchecked {
bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
// We do not check for an overflow here since the shift operation results in 0 or 1.
uint8 v = uint8((uint256(vs) >> 255) + 27);
return tryRecover(hash, v, r, s);
}
}
/**
* @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
*/
function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {
(address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, r, vs);
_throwError(error, errorArg);
return recovered;
}
/**
* @dev Overload of {ECDSA-tryRecover} that receives the `v`,
* `r` and `s` signature fields separately.
*/
function tryRecover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {
// EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
// unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
// the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
// signatures from current libraries generate a unique signature with an s-value in the lower half order.
//
// If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
// with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
// vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
// these malleable signatures as well.
if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
return (address(0), RecoverError.InvalidSignatureS, s);
}
// If the signature is valid (and not malleable), return the signer address
address signer = ecrecover(hash, v, r, s);
if (signer == address(0)) {
return (address(0), RecoverError.InvalidSignature, bytes32(0));
}
return (signer, RecoverError.NoError, bytes32(0));
}
/**
* @dev Overload of {ECDSA-recover} that receives the `v`,
* `r` and `s` signature fields separately.
*/
function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {
(address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, v, r, s);
_throwError(error, errorArg);
return recovered;
}
/**
* @dev Optionally reverts with the corresponding custom error according to the `error` argument provided.
*/
function _throwError(RecoverError error, bytes32 errorArg) private pure {
if (error == RecoverError.NoError) {
return; // no error: do nothing
} else if (error == RecoverError.InvalidSignature) {
revert ECDSAInvalidSignature();
} else if (error == RecoverError.InvalidSignatureLength) {
revert ECDSAInvalidSignatureLength(uint256(errorArg));
} else if (error == RecoverError.InvalidSignatureS) {
revert ECDSAInvalidSignatureS(errorArg);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.20;
import {IERC165} from "../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC-721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon
* a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC-721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must have been allowed to move this token by either {approve} or
* {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon
* a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC-721
* or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
* understand this adds an external call which potentially creates a reentrancy vulnerability.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the address zero.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
}// SPDX-License-Identifier: MIT
pragma solidity >=0.8.4;
interface IVersionableResolver {
event VersionChanged(bytes32 indexed node, uint64 newVersion);
function recordVersions(bytes32 node) external view returns (uint64);
}{
"remappings": [
"@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
"ens-contracts/=lib/ens-contracts/contracts/",
"erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
"forge-std/=lib/forge-std/src/",
"halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/"
],
"optimizer": {
"enabled": true,
"runs": 200
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "shanghai",
"viaIR": false,
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract ENS","name":"_ens","type":"address"},{"internalType":"contract INameWrapper","name":"_nameWrapper","type":"address"},{"internalType":"string","name":"_url","type":"string"},{"internalType":"address","name":"_signer","type":"address"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_publicResolver","type":"address"},{"internalType":"address","name":"_legacyResolver","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ECDSAInvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"name":"ECDSAInvalidSignatureLength","type":"error"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"ECDSAInvalidSignatureS","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"string[]","name":"urls","type":"string[]"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"bytes4","name":"callbackFunction","type":"bytes4"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"name":"OffchainLookup","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"contentType","type":"uint256"}],"name":"ABIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"address","name":"a","type":"address"}],"name":"AddrChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"coinType","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"newAddress","type":"bytes"}],"name":"AddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"hash","type":"bytes"}],"name":"ContenthashChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"bytes4","name":"interfaceID","type":"bytes4"},{"indexed":false,"internalType":"address","name":"implementer","type":"address"}],"name":"InterfaceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"NameChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"string","name":"indexedKey","type":"string"},{"indexed":false,"internalType":"string","name":"key","type":"string"},{"indexed":false,"internalType":"string","name":"value","type":"string"}],"name":"TextChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"newVersion","type":"uint64"}],"name":"VersionChanged","type":"event"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"contentTypes","type":"uint256"}],"name":"ABI","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"addr","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"}],"name":"addr","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"clearRecords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"contenthash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"interfaceImplementer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"legacyResolver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"nodehash","type":"bytes32"},{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicallWithNodeCheck","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicResolver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"recordVersions","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"name","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"resolve","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"response","type":"bytes"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"name":"resolveWithProof","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"contentType","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"setABI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"},{"internalType":"bytes","name":"a","type":"bytes"}],"name":"setAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"a","type":"address"}],"name":"setAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes","name":"hash","type":"bytes"}],"name":"setContenthash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes4","name":"interfaceID","type":"bytes4"},{"internalType":"address","name":"implementer","type":"address"}],"name":"setInterface","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"newName","type":"string"}],"name":"setName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"name":"setText","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_url","type":"string"}],"name":"setUrl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"key","type":"string"}],"name":"text","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"url","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60c060405234801562000010575f80fd5b5060405162002ce338038062002ce3833981016040819052620000339162000168565b826001600160a01b0381166200006257604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6200006d81620000d9565b506001600160a01b03808816608052861660a05260086200008f868262000335565b50600980546001600160a01b039586166001600160a01b031991821617909155600a805493861693821693909317909255600b80549190941691161790915550620003fd92505050565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b03811681146200013f575f80fd5b50565b634e487b7160e01b5f52604160045260245ffd5b805162000163816200012a565b919050565b5f805f805f805f60e0888a0312156200017f575f80fd5b87516200018c816200012a565b80975050602080890151620001a1816200012a565b60408a01519097506001600160401b0380821115620001be575f80fd5b818b0191508b601f830112620001d2575f80fd5b815181811115620001e757620001e762000142565b604051601f8201601f19908116603f0116810190838211818310171562000212576200021262000142565b816040528281528e868487010111156200022a575f80fd5b5f93505b828410156200024d57848401860151818501870152928501926200022e565b5f868483010152809a505050505050506200026b6060890162000156565b93506200027b6080890162000156565b92506200028b60a0890162000156565b91506200029b60c0890162000156565b905092959891949750929550565b600181811c90821680620002be57607f821691505b602082108103620002dd57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000330575f81815260208120601f850160051c810160208610156200030b5750805b601f850160051c820191505b818110156200032c5782815560010162000317565b5050505b505050565b81516001600160401b0381111562000351576200035162000142565b6200036981620003628454620002a9565b84620002e3565b602080601f8311600181146200039f575f8415620003875750858301515b5f19600386901b1c1916600185901b1785556200032c565b5f85815260208120601f198616915b82811015620003cf57888601518255948401946001909101908401620003ae565b5085821015620003ed57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a0516128b66200042d5f395f818161128c015261138801525f818161121f01526112fc01526128b65ff3fe608060405234801561000f575f80fd5b50600436106101d1575f3560e01c806377372213116100fe578063d700ff331161009e578063f2fde38b1161006e578063f2fde38b1461042f578063f4d4d2f814610442578063f6d4c9f614610455578063f825612114610468575f80fd5b8063d700ff33146103b6578063e32954eb146103f6578063e59d895d14610409578063f1cb7e061461041c575f80fd5b80639061b923116100d95780639061b9231461035d578063ac9650d814610370578063bc1c58d114610390578063d5fa2b00146103a3575f80fd5b806377372213146103265780638b95dd71146103395780638da5cb5b1461034c575f80fd5b80633603d75811610174578063623195b011610144578063623195b0146102e5578063691f3431146102f85780636c19e7831461030b578063715018a61461031e575f80fd5b80633603d758146102975780633b3b57de146102aa5780635600f04f146102bd57806359d1d43c146102d2575f80fd5b80632203ab56116101af5780632203ab561461023d578063238ac9331461025e578063252498a214610271578063304e6ade14610284575f80fd5b806301ffc9a7146101d557806310f13a8c146101fd578063124a319c14610212575b5f80fd5b6101e86101e3366004611d48565b61047b565b60405190151581526020015b60405180910390f35b61021061020b366004611d9e565b6104a5565b005b610225610220366004611e11565b61056f565b6040516001600160a01b0390911681526020016101f4565b61025061024b366004611e3b565b6107b4565b6040516101f4929190611ea8565b600954610225906001600160a01b031681565b61021061027f366004611f46565b6108e2565b610210610292366004611f8a565b6108fa565b6102106102a5366004611fd1565b610981565b6102256102b8366004611fd1565b610a1f565b6102c5610a4e565b6040516101f49190611fe8565b6102c56102e0366004611f8a565b610ada565b6102106102f3366004611ffa565b610bb6565b6102c5610306366004611fd1565b610c4e565b61021061031936600461205c565b610d09565b610210610d33565b610210610334366004611f8a565b610d46565b610210610347366004612095565b610dbf565b6007546001600160a01b0316610225565b6102c561036b3660046120e0565b610e9c565b61038361037e366004612179565b610f27565b6040516101f491906121b7565b6102c561039e366004611fd1565b610f34565b6102106103b1366004612217565b610f6c565b6103de6103c4366004611fd1565b5f602081905290815260409020546001600160401b031681565b6040516001600160401b0390911681526020016101f4565b610383610404366004612245565b610f92565b61021061041736600461227f565b610fa7565b6102c561042a366004611e3b565b61104b565b61021061043d36600461205c565b61110f565b6102c56104503660046122bc565b611151565b600b54610225906001600160a01b031681565b600a54610225906001600160a01b031681565b5f6001600160e01b03198216639061b92360e01b148061049f575061049f826111d9565b92915050565b846104af816111fd565b6104b7575f80fd5b5f86815260208181526040808320546001600160401b0316835260068252808320898452909152908190209051849184916104f59089908990612316565b908152602001604051809103902091826105109291906123aa565b508484604051610521929190612316565b6040518091039020867f448bc014f1536726cf8d54ff3d6481ed3cbc683c2591ca204274009afa09b1a18787878760405161055f949392919061248c565b60405180910390a3505050505050565b5f82815260208181526040808320546001600160401b031683526004825280832085845282528083206001600160e01b0319851684529091528120546001600160a01b031680156105c157905061049f565b5f6105cb85610a1f565b90506001600160a01b0381166105e5575f9250505061049f565b6040516301ffc9a760e01b60248201525f9081906001600160a01b0384169060440160408051601f198184030181529181526020820180516001600160e01b03166301ffc9a760e01b1790525161063c91906124b2565b5f60405180830381855afa9150503d805f8114610674576040519150601f19603f3d011682016040523d82523d5f602084013e610679565b606091505b509150915081158061068c575060208151105b806106b6575080601f815181106106a5576106a56124cd565b01602001516001600160f81b031916155b156106c7575f94505050505061049f565b6040516001600160e01b0319871660248201526001600160a01b0384169060440160408051601f198184030181529181526020820180516001600160e01b03166301ffc9a760e01b1790525161071d91906124b2565b5f60405180830381855afa9150503d805f8114610755576040519150601f19603f3d011682016040523d82523d5f602084013e61075a565b606091505b50909250905081158061076e575060208151105b80610798575080601f81518110610787576107876124cd565b01602001516001600160f81b031916155b156107a9575f94505050505061049f565b509095945050505050565b5f82815260208181526040808320546001600160401b03168352600180835281842086855290925282206060915b8481116108c4578085161580159061081157505f818152602083905260408120805461080d90612325565b9050115b156108bc5780825f8381526020019081526020015f2080805461083390612325565b80601f016020809104026020016040519081016040528092919081815260200182805461085f90612325565b80156108aa5780601f10610881576101008083540402835291602001916108aa565b820191905f5260205f20905b81548152906001019060200180831161088d57829003601f168201915b505050505090509350935050506108db565b60011b6107e2565b505f60405180602001604052805f81525092509250505b9250929050565b6108ea611411565b60086108f682826124e1565b5050565b82610904816111fd565b61090c575f80fd5b5f84815260208181526040808320546001600160401b031683526003825280832087845290915290206109408385836123aa565b50837fe379c1624ed7e714cc0937528a32359d69d5281337765313dba4e081b72d7578848460405161097392919061259c565b60405180910390a250505050565b8061098b816111fd565b610993575f80fd5b5f82815260208190526040812080546001600160401b0316916109b5836125c3565b82546101009290920a6001600160401b038181021990931691831602179091555f84815260208181526040918290205491519190921681528492507fc6621ccb8f3f5a04bb6502154b2caf6adf5983fe76dfef1cfc9c42e3579db444910160405180910390a25050565b5f80610a2c83603c61104b565b905080515f03610a3e57505f92915050565b610a478161143e565b9392505050565b60088054610a5b90612325565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8790612325565b8015610ad25780601f10610aa957610100808354040283529160200191610ad2565b820191905f5260205f20905b815481529060010190602001808311610ab557829003601f168201915b505050505081565b5f83815260208181526040808320546001600160401b031683526006825280832086845290915290819020905160609190610b189085908590612316565b90815260200160405180910390208054610b3190612325565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5d90612325565b8015610ba85780601f10610b7f57610100808354040283529160200191610ba8565b820191905f5260205f20905b815481529060010190602001808311610b8b57829003601f168201915b505050505090509392505050565b83610bc0816111fd565b610bc8575f80fd5b83610bd46001826125e8565b1615610bde575f80fd5b5f85815260208181526040808320546001600160401b031683526001825280832088845282528083208784529091529020610c1a8385836123aa565b50604051849086907faa121bbeef5f32f5961a2a28966e769023910fc9479059ee3495d4c1a696efe3905f90a35050505050565b5f81815260208181526040808320546001600160401b03168352600582528083208484529091529020805460609190610c8690612325565b80601f0160208091040260200160405190810160405280929190818152602001828054610cb290612325565b8015610cfd5780601f10610cd457610100808354040283529160200191610cfd565b820191905f5260205f20905b815481529060010190602001808311610ce057829003601f168201915b50505050509050919050565b610d11611411565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b610d3b611411565b610d445f61145b565b565b82610d50816111fd565b610d58575f80fd5b5f84815260208181526040808320546001600160401b03168352600582528083208784529091529020610d8c8385836123aa565b50837fb7d29e911041e8d9b843369e890bcb72c9388692ba48b65ac54e7214c4c348f7848460405161097392919061259c565b82610dc9816111fd565b610dd1575f80fd5b837f65412581168e88a1e60c6459d7f44ae83ad0832e670826c05a4e2476b57af7528484604051610e03929190611ea8565b60405180910390a2603c8303610e5a57837f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd2610e3e8461143e565b6040516001600160a01b03909116815260200160405180910390a25b5f84815260208181526040808320546001600160401b031683526002825280832087845282528083208684529091529020610e9583826124e1565b5050505050565b60605f610ea930846114ac565b805190915015610eba579050610a47565b600a545f90610ed2906001600160a01b0316856114ac565b805190915015610ee5579150610a479050565b600b545f90610efd906001600160a01b0316866114ac565b805190915015610f11579250610a47915050565b610f1c878787611599565b979650505050505050565b6060610a475f8484611708565b5f81815260208181526040808320546001600160401b03168352600382528083208484529091529020805460609190610c8690612325565b81610f76816111fd565b610f7e575f80fd5b610f8d83603c610347856118d0565b505050565b6060610f9f848484611708565b949350505050565b82610fb1816111fd565b610fb9575f80fd5b5f84815260208181526040808320546001600160401b031683526004825280832087845282528083206001600160e01b031987168085529083529281902080546001600160a01b0319166001600160a01b038716908117909155905190815286917f7c69f06bea0bdef565b709e93a147836b0063ba2dd89f02d0b7e8d931e6a6daa910160405180910390a350505050565b5f82815260208181526040808320546001600160401b03168352600282528083208584528252808320848452909152902080546060919061108b90612325565b80601f01602080910402602001604051908101604052809291908181526020018280546110b790612325565b80156111025780601f106110d957610100808354040283529160200191611102565b820191905f5260205f20905b8154815290600101906020018083116110e557829003601f168201915b5050505050905092915050565b611117611411565b6001600160a01b03811661114557604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61114e8161145b565b50565b60605f8061116185858989611900565b60095491935091506001600160a01b038084169116146111cf5760405162461bcd60e51b815260206004820152602360248201527f5369676e617475726556657269666965723a20496e76616c696420736967617460448201526275726560e81b606482015260840161113c565b9695505050505050565b5f6001600160e01b03198216631674750f60e21b148061049f575061049f82611a23565b6040516302571be360e01b8152600481018290525f9081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906302571be390602401602060405180830381865afa158015611264573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061128891906125fb565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b03161461136c576001600160a01b0381163314801590611367575060405163e985e9c560e01b81526001600160a01b0382811660048301523360248301527f0000000000000000000000000000000000000000000000000000000000000000169063e985e9c590604401602060405180830381865afa158015611341573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113659190612616565b155b6113fb565b6040516341415eab60e01b8152600481018490523360248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906341415eab90604401602060405180830381865afa1580156113d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113f99190612616565b155b1561140857505f92915050565b50600192915050565b6007546001600160a01b03163314610d445760405163118cdaa760e01b815233600482015260240161113c565b5f815160141461144c575f80fd5b5060200151600160601b900490565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60605f80846001600160a01b0316846040516114c891906124b2565b5f60405180830381855afa9150503d805f8114611500576040519150601f19603f3d011682016040523d82523d5f602084013e611505565b606091505b508051602082012091935091507f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5637f569e75fc77c1a856f6daaf9e69d8a9566ca34aa47f9133711ce065a571af0cfd8480156115615750818314155b801561156d5750808314155b1561157f57839550505050505061049f565b505060408051602081019091525f81529695505050505050565b60605f639061b92360e01b8585856040516024016115b993929190612635565b60408051601f19818403018152918152602080830180516001600160e01b03166001600160e01b03199590951694909417909352805160018082528183019092529193505f9282015b60608152602001906001900390816116025790505090506008805461162690612325565b80601f016020809104026020016040519081016040528092919081815260200182805461165290612325565b801561169d5780601f106116745761010080835404028352916020019161169d565b820191905f5260205f20905b81548152906001019060200180831161168057829003601f168201915b5050505050815f815181106116b4576116b46124cd565b602002602001018190525030818363f4d4d2f860e01b85306040516020016116dd92919061265a565b60408051601f1981840301815290829052630556f18360e41b825261113c9594939291600401612683565b6060816001600160401b0381111561172257611722611ec0565b60405190808252806020026020018201604052801561175557816020015b60608152602001906001900390816117405790505b5090505f5b828110156118c8578415611815575f84848381811061177b5761177b6124cd565b905060200281019061178d919061272c565b61179c9160249160049161276e565b6117a591612795565b90508581146118135760405162461bcd60e51b815260206004820152603460248201527f6d756c746963616c6c3a20416c6c207265636f726473206d7573742068617665604482015273040c240dac2e8c6d0d2dcce40dcc2dacad0c2e6d60631b606482015260840161113c565b505b5f803086868581811061182a5761182a6124cd565b905060200281019061183c919061272c565b60405161184a929190612316565b5f60405180830381855af49150503d805f8114611882576040519150601f19603f3d011682016040523d82523d5f602084013e611887565b606091505b509150915081611895575f80fd5b808484815181106118a8576118a86124cd565b6020026020010181905250505080806118c0906127b2565b91505061175a565b509392505050565b604080516014808252818301909252606091602082018180368337505050600160601b9290920260208301525090565b5f6060818080611912868801886127ca565b919450925090505f806119278a8c018c612829565b81516020808401919091208851828a012060408051601960f81b818601526bffffffffffffffffffffffff19606087901b1660228201526001600160c01b031960c08c901b166036820152603e810193909352605e8084019290925280518084039092018252607e909201909152805191012091935091505f906119ab9085611a47565b905042856001600160401b03161015611a125760405162461bcd60e51b8152602060048201526024808201527f5369676e617475726556657269666965723a205369676e6174757265206578706044820152631a5c995960e21b606482015260840161113c565b9b949a509398505050505050505050565b5f6001600160e01b0319821663691f343160e01b148061049f575061049f82611a6f565b5f805f80611a558686611a93565b925092509250611a658282611adc565b5090949350505050565b5f6001600160e01b031982166304928c6760e21b148061049f575061049f82611b94565b5f805f8351604103611aca576020840151604085015160608601515f1a611abc88828585611bb8565b955095509550505050611ad5565b505081515f91506002905b9250925092565b5f826003811115611aef57611aef61286c565b03611af8575050565b6001826003811115611b0c57611b0c61286c565b03611b2a5760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115611b3e57611b3e61286c565b03611b5f5760405163fce698f760e01b81526004810182905260240161113c565b6003826003811115611b7357611b7361286c565b036108f6576040516335e2f38360e21b81526004810182905260240161113c565b5f6001600160e01b0319821663bc1c58d160e01b148061049f575061049f82611c80565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115611bf157505f91506003905082611c76565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611c42573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116611c6d57505f925060019150829050611c76565b92505f91508190505b9450945094915050565b5f6001600160e01b03198216631d9dabef60e11b1480611cb057506001600160e01b031982166378e5bf0360e11b145b8061049f575061049f825f6001600160e01b03198216631101d5ab60e11b148061049f575061049f825f6001600160e01b0319821663d700ff3360e01b148061049f575061049f825f6001600160e01b03198216634fbf043360e01b148061049f57506301ffc9a760e01b6001600160e01b031983161461049f565b80356001600160e01b031981168114611d43575f80fd5b919050565b5f60208284031215611d58575f80fd5b610a4782611d2c565b5f8083601f840112611d71575f80fd5b5081356001600160401b03811115611d87575f80fd5b6020830191508360208285010111156108db575f80fd5b5f805f805f60608688031215611db2575f80fd5b8535945060208601356001600160401b0380821115611dcf575f80fd5b611ddb89838a01611d61565b90965094506040880135915080821115611df3575f80fd5b50611e0088828901611d61565b969995985093965092949392505050565b5f8060408385031215611e22575f80fd5b82359150611e3260208401611d2c565b90509250929050565b5f8060408385031215611e4c575f80fd5b50508035926020909101359150565b5f5b83811015611e75578181015183820152602001611e5d565b50505f910152565b5f8151808452611e94816020860160208601611e5b565b601f01601f19169290920160200192915050565b828152604060208201525f610f9f6040830184611e7d565b634e487b7160e01b5f52604160045260245ffd5b5f6001600160401b0380841115611eed57611eed611ec0565b604051601f8501601f19908116603f01168101908282118183101715611f1557611f15611ec0565b81604052809350858152868686011115611f2d575f80fd5b858560208301375f602087830101525050509392505050565b5f60208284031215611f56575f80fd5b81356001600160401b03811115611f6b575f80fd5b8201601f81018413611f7b575f80fd5b610f9f84823560208401611ed4565b5f805f60408486031215611f9c575f80fd5b8335925060208401356001600160401b03811115611fb8575f80fd5b611fc486828701611d61565b9497909650939450505050565b5f60208284031215611fe1575f80fd5b5035919050565b602081525f610a476020830184611e7d565b5f805f806060858703121561200d575f80fd5b843593506020850135925060408501356001600160401b03811115612030575f80fd5b61203c87828801611d61565b95989497509550505050565b6001600160a01b038116811461114e575f80fd5b5f6020828403121561206c575f80fd5b8135610a4781612048565b5f82601f830112612086575f80fd5b610a4783833560208501611ed4565b5f805f606084860312156120a7575f80fd5b833592506020840135915060408401356001600160401b038111156120ca575f80fd5b6120d686828701612077565b9150509250925092565b5f805f604084860312156120f2575f80fd5b83356001600160401b0380821115612108575f80fd5b61211487838801611d61565b9095509350602086013591508082111561212c575f80fd5b506120d686828701612077565b5f8083601f840112612149575f80fd5b5081356001600160401b0381111561215f575f80fd5b6020830191508360208260051b85010111156108db575f80fd5b5f806020838503121561218a575f80fd5b82356001600160401b0381111561219f575f80fd5b6121ab85828601612139565b90969095509350505050565b5f602080830181845280855180835260408601915060408160051b87010192508387015f5b8281101561220a57603f198886030184526121f8858351611e7d565b945092850192908501906001016121dc565b5092979650505050505050565b5f8060408385031215612228575f80fd5b82359150602083013561223a81612048565b809150509250929050565b5f805f60408486031215612257575f80fd5b8335925060208401356001600160401b03811115612273575f80fd5b611fc486828701612139565b5f805f60608486031215612291575f80fd5b833592506122a160208501611d2c565b915060408401356122b181612048565b809150509250925092565b5f805f80604085870312156122cf575f80fd5b84356001600160401b03808211156122e5575f80fd5b6122f188838901611d61565b90965094506020870135915080821115612309575f80fd5b5061203c87828801611d61565b818382375f9101908152919050565b600181811c9082168061233957607f821691505b60208210810361235757634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610f8d575f81815260208120601f850160051c810160208610156123835750805b601f850160051c820191505b818110156123a25782815560010161238f565b505050505050565b6001600160401b038311156123c1576123c1611ec0565b6123d5836123cf8354612325565b8361235d565b5f601f841160018114612406575f85156123ef5750838201355b5f19600387901b1c1916600186901b178355610e95565b5f83815260209020601f19861690835b828110156124365786850135825560209485019460019092019101612416565b5086821015612452575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b604081525f61249f604083018688612464565b8281036020840152610f1c818587612464565b5f82516124c3818460208701611e5b565b9190910192915050565b634e487b7160e01b5f52603260045260245ffd5b81516001600160401b038111156124fa576124fa611ec0565b61250e816125088454612325565b8461235d565b602080601f831160018114612541575f841561252a5750858301515b5f19600386901b1c1916600185901b1785556123a2565b5f85815260208120601f198616915b8281101561256f57888601518255948401946001909101908401612550565b508582101561258c57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b602081525f610f9f602083018486612464565b634e487b7160e01b5f52601160045260245ffd5b5f6001600160401b038083168181036125de576125de6125af565b6001019392505050565b8181038181111561049f5761049f6125af565b5f6020828403121561260b575f80fd5b8151610a4781612048565b5f60208284031215612626575f80fd5b81518015158114610a47575f80fd5b604081525f612648604083018587612464565b82810360208401526111cf8185611e7d565b604081525f61266c6040830185611e7d565b905060018060a01b03831660208301529392505050565b5f60a0820160018060a01b0388168352602060a08185015281885180845260c08601915060c08160051b8701019350828a015f5b828110156126e55760bf198887030184526126d3868351611e7d565b955092840192908401906001016126b7565b505050505082810360408401526126fc8187611e7d565b6001600160e01b031986166060850152905082810360808401526127208185611e7d565b98975050505050505050565b5f808335601e19843603018112612741575f80fd5b8301803591506001600160401b0382111561275a575f80fd5b6020019150368190038213156108db575f80fd5b5f808585111561277c575f80fd5b83861115612788575f80fd5b5050820193919092039150565b8035602083101561049f575f19602084900360031b1b1692915050565b5f600182016127c3576127c36125af565b5060010190565b5f805f606084860312156127dc575f80fd5b83356001600160401b03808211156127f2575f80fd5b6127fe87838801612077565b9450602086013591508082168214612814575f80fd5b9092506040850135908082111561212c575f80fd5b5f806040838503121561283a575f80fd5b82356001600160401b0381111561284f575f80fd5b61285b85828601612077565b925050602083013561223a81612048565b634e487b7160e01b5f52602160045260245ffdfea264697066735822122055b924a645bc9ededdf63b6fa05641b9492bb6bb71b428b07c6d0f58427bf09964736f6c6343000814003300000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e000000000000000000000000d4416b13d2b3a9abae7acd5d6c2bbdbe2568640100000000000000000000000000000000000000000000000000000000000000e00000000000000000000000001fafc6e4105843783cfa75b375ec1b923cc617bc000000000000000000000000ad73eafcac4f4c6755dfc61770875fb8b6bc8a25000000000000000000000000231b0ee14048e9dccd1d247744d114a4eb5e8e630000000000000000000000004976fb03c32e5b8cfe2b6ccb31c09ba78ebaba41000000000000000000000000000000000000000000000000000000000000002f68747470733a2f2f6170692e6f7262697465722e686f73742f6c6f6f6b75702f7b73656e6465727d2f7b646174617d0000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561000f575f80fd5b50600436106101d1575f3560e01c806377372213116100fe578063d700ff331161009e578063f2fde38b1161006e578063f2fde38b1461042f578063f4d4d2f814610442578063f6d4c9f614610455578063f825612114610468575f80fd5b8063d700ff33146103b6578063e32954eb146103f6578063e59d895d14610409578063f1cb7e061461041c575f80fd5b80639061b923116100d95780639061b9231461035d578063ac9650d814610370578063bc1c58d114610390578063d5fa2b00146103a3575f80fd5b806377372213146103265780638b95dd71146103395780638da5cb5b1461034c575f80fd5b80633603d75811610174578063623195b011610144578063623195b0146102e5578063691f3431146102f85780636c19e7831461030b578063715018a61461031e575f80fd5b80633603d758146102975780633b3b57de146102aa5780635600f04f146102bd57806359d1d43c146102d2575f80fd5b80632203ab56116101af5780632203ab561461023d578063238ac9331461025e578063252498a214610271578063304e6ade14610284575f80fd5b806301ffc9a7146101d557806310f13a8c146101fd578063124a319c14610212575b5f80fd5b6101e86101e3366004611d48565b61047b565b60405190151581526020015b60405180910390f35b61021061020b366004611d9e565b6104a5565b005b610225610220366004611e11565b61056f565b6040516001600160a01b0390911681526020016101f4565b61025061024b366004611e3b565b6107b4565b6040516101f4929190611ea8565b600954610225906001600160a01b031681565b61021061027f366004611f46565b6108e2565b610210610292366004611f8a565b6108fa565b6102106102a5366004611fd1565b610981565b6102256102b8366004611fd1565b610a1f565b6102c5610a4e565b6040516101f49190611fe8565b6102c56102e0366004611f8a565b610ada565b6102106102f3366004611ffa565b610bb6565b6102c5610306366004611fd1565b610c4e565b61021061031936600461205c565b610d09565b610210610d33565b610210610334366004611f8a565b610d46565b610210610347366004612095565b610dbf565b6007546001600160a01b0316610225565b6102c561036b3660046120e0565b610e9c565b61038361037e366004612179565b610f27565b6040516101f491906121b7565b6102c561039e366004611fd1565b610f34565b6102106103b1366004612217565b610f6c565b6103de6103c4366004611fd1565b5f602081905290815260409020546001600160401b031681565b6040516001600160401b0390911681526020016101f4565b610383610404366004612245565b610f92565b61021061041736600461227f565b610fa7565b6102c561042a366004611e3b565b61104b565b61021061043d36600461205c565b61110f565b6102c56104503660046122bc565b611151565b600b54610225906001600160a01b031681565b600a54610225906001600160a01b031681565b5f6001600160e01b03198216639061b92360e01b148061049f575061049f826111d9565b92915050565b846104af816111fd565b6104b7575f80fd5b5f86815260208181526040808320546001600160401b0316835260068252808320898452909152908190209051849184916104f59089908990612316565b908152602001604051809103902091826105109291906123aa565b508484604051610521929190612316565b6040518091039020867f448bc014f1536726cf8d54ff3d6481ed3cbc683c2591ca204274009afa09b1a18787878760405161055f949392919061248c565b60405180910390a3505050505050565b5f82815260208181526040808320546001600160401b031683526004825280832085845282528083206001600160e01b0319851684529091528120546001600160a01b031680156105c157905061049f565b5f6105cb85610a1f565b90506001600160a01b0381166105e5575f9250505061049f565b6040516301ffc9a760e01b60248201525f9081906001600160a01b0384169060440160408051601f198184030181529181526020820180516001600160e01b03166301ffc9a760e01b1790525161063c91906124b2565b5f60405180830381855afa9150503d805f8114610674576040519150601f19603f3d011682016040523d82523d5f602084013e610679565b606091505b509150915081158061068c575060208151105b806106b6575080601f815181106106a5576106a56124cd565b01602001516001600160f81b031916155b156106c7575f94505050505061049f565b6040516001600160e01b0319871660248201526001600160a01b0384169060440160408051601f198184030181529181526020820180516001600160e01b03166301ffc9a760e01b1790525161071d91906124b2565b5f60405180830381855afa9150503d805f8114610755576040519150601f19603f3d011682016040523d82523d5f602084013e61075a565b606091505b50909250905081158061076e575060208151105b80610798575080601f81518110610787576107876124cd565b01602001516001600160f81b031916155b156107a9575f94505050505061049f565b509095945050505050565b5f82815260208181526040808320546001600160401b03168352600180835281842086855290925282206060915b8481116108c4578085161580159061081157505f818152602083905260408120805461080d90612325565b9050115b156108bc5780825f8381526020019081526020015f2080805461083390612325565b80601f016020809104026020016040519081016040528092919081815260200182805461085f90612325565b80156108aa5780601f10610881576101008083540402835291602001916108aa565b820191905f5260205f20905b81548152906001019060200180831161088d57829003601f168201915b505050505090509350935050506108db565b60011b6107e2565b505f60405180602001604052805f81525092509250505b9250929050565b6108ea611411565b60086108f682826124e1565b5050565b82610904816111fd565b61090c575f80fd5b5f84815260208181526040808320546001600160401b031683526003825280832087845290915290206109408385836123aa565b50837fe379c1624ed7e714cc0937528a32359d69d5281337765313dba4e081b72d7578848460405161097392919061259c565b60405180910390a250505050565b8061098b816111fd565b610993575f80fd5b5f82815260208190526040812080546001600160401b0316916109b5836125c3565b82546101009290920a6001600160401b038181021990931691831602179091555f84815260208181526040918290205491519190921681528492507fc6621ccb8f3f5a04bb6502154b2caf6adf5983fe76dfef1cfc9c42e3579db444910160405180910390a25050565b5f80610a2c83603c61104b565b905080515f03610a3e57505f92915050565b610a478161143e565b9392505050565b60088054610a5b90612325565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8790612325565b8015610ad25780601f10610aa957610100808354040283529160200191610ad2565b820191905f5260205f20905b815481529060010190602001808311610ab557829003601f168201915b505050505081565b5f83815260208181526040808320546001600160401b031683526006825280832086845290915290819020905160609190610b189085908590612316565b90815260200160405180910390208054610b3190612325565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5d90612325565b8015610ba85780601f10610b7f57610100808354040283529160200191610ba8565b820191905f5260205f20905b815481529060010190602001808311610b8b57829003601f168201915b505050505090509392505050565b83610bc0816111fd565b610bc8575f80fd5b83610bd46001826125e8565b1615610bde575f80fd5b5f85815260208181526040808320546001600160401b031683526001825280832088845282528083208784529091529020610c1a8385836123aa565b50604051849086907faa121bbeef5f32f5961a2a28966e769023910fc9479059ee3495d4c1a696efe3905f90a35050505050565b5f81815260208181526040808320546001600160401b03168352600582528083208484529091529020805460609190610c8690612325565b80601f0160208091040260200160405190810160405280929190818152602001828054610cb290612325565b8015610cfd5780601f10610cd457610100808354040283529160200191610cfd565b820191905f5260205f20905b815481529060010190602001808311610ce057829003601f168201915b50505050509050919050565b610d11611411565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b610d3b611411565b610d445f61145b565b565b82610d50816111fd565b610d58575f80fd5b5f84815260208181526040808320546001600160401b03168352600582528083208784529091529020610d8c8385836123aa565b50837fb7d29e911041e8d9b843369e890bcb72c9388692ba48b65ac54e7214c4c348f7848460405161097392919061259c565b82610dc9816111fd565b610dd1575f80fd5b837f65412581168e88a1e60c6459d7f44ae83ad0832e670826c05a4e2476b57af7528484604051610e03929190611ea8565b60405180910390a2603c8303610e5a57837f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd2610e3e8461143e565b6040516001600160a01b03909116815260200160405180910390a25b5f84815260208181526040808320546001600160401b031683526002825280832087845282528083208684529091529020610e9583826124e1565b5050505050565b60605f610ea930846114ac565b805190915015610eba579050610a47565b600a545f90610ed2906001600160a01b0316856114ac565b805190915015610ee5579150610a479050565b600b545f90610efd906001600160a01b0316866114ac565b805190915015610f11579250610a47915050565b610f1c878787611599565b979650505050505050565b6060610a475f8484611708565b5f81815260208181526040808320546001600160401b03168352600382528083208484529091529020805460609190610c8690612325565b81610f76816111fd565b610f7e575f80fd5b610f8d83603c610347856118d0565b505050565b6060610f9f848484611708565b949350505050565b82610fb1816111fd565b610fb9575f80fd5b5f84815260208181526040808320546001600160401b031683526004825280832087845282528083206001600160e01b031987168085529083529281902080546001600160a01b0319166001600160a01b038716908117909155905190815286917f7c69f06bea0bdef565b709e93a147836b0063ba2dd89f02d0b7e8d931e6a6daa910160405180910390a350505050565b5f82815260208181526040808320546001600160401b03168352600282528083208584528252808320848452909152902080546060919061108b90612325565b80601f01602080910402602001604051908101604052809291908181526020018280546110b790612325565b80156111025780601f106110d957610100808354040283529160200191611102565b820191905f5260205f20905b8154815290600101906020018083116110e557829003601f168201915b5050505050905092915050565b611117611411565b6001600160a01b03811661114557604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61114e8161145b565b50565b60605f8061116185858989611900565b60095491935091506001600160a01b038084169116146111cf5760405162461bcd60e51b815260206004820152602360248201527f5369676e617475726556657269666965723a20496e76616c696420736967617460448201526275726560e81b606482015260840161113c565b9695505050505050565b5f6001600160e01b03198216631674750f60e21b148061049f575061049f82611a23565b6040516302571be360e01b8152600481018290525f9081906001600160a01b037f00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e16906302571be390602401602060405180830381865afa158015611264573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061128891906125fb565b90507f000000000000000000000000d4416b13d2b3a9abae7acd5d6c2bbdbe256864016001600160a01b0316816001600160a01b03161461136c576001600160a01b0381163314801590611367575060405163e985e9c560e01b81526001600160a01b0382811660048301523360248301527f00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e169063e985e9c590604401602060405180830381865afa158015611341573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113659190612616565b155b6113fb565b6040516341415eab60e01b8152600481018490523360248201527f000000000000000000000000d4416b13d2b3a9abae7acd5d6c2bbdbe256864016001600160a01b0316906341415eab90604401602060405180830381865afa1580156113d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113f99190612616565b155b1561140857505f92915050565b50600192915050565b6007546001600160a01b03163314610d445760405163118cdaa760e01b815233600482015260240161113c565b5f815160141461144c575f80fd5b5060200151600160601b900490565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60605f80846001600160a01b0316846040516114c891906124b2565b5f60405180830381855afa9150503d805f8114611500576040519150601f19603f3d011682016040523d82523d5f602084013e611505565b606091505b508051602082012091935091507f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5637f569e75fc77c1a856f6daaf9e69d8a9566ca34aa47f9133711ce065a571af0cfd8480156115615750818314155b801561156d5750808314155b1561157f57839550505050505061049f565b505060408051602081019091525f81529695505050505050565b60605f639061b92360e01b8585856040516024016115b993929190612635565b60408051601f19818403018152918152602080830180516001600160e01b03166001600160e01b03199590951694909417909352805160018082528183019092529193505f9282015b60608152602001906001900390816116025790505090506008805461162690612325565b80601f016020809104026020016040519081016040528092919081815260200182805461165290612325565b801561169d5780601f106116745761010080835404028352916020019161169d565b820191905f5260205f20905b81548152906001019060200180831161168057829003601f168201915b5050505050815f815181106116b4576116b46124cd565b602002602001018190525030818363f4d4d2f860e01b85306040516020016116dd92919061265a565b60408051601f1981840301815290829052630556f18360e41b825261113c9594939291600401612683565b6060816001600160401b0381111561172257611722611ec0565b60405190808252806020026020018201604052801561175557816020015b60608152602001906001900390816117405790505b5090505f5b828110156118c8578415611815575f84848381811061177b5761177b6124cd565b905060200281019061178d919061272c565b61179c9160249160049161276e565b6117a591612795565b90508581146118135760405162461bcd60e51b815260206004820152603460248201527f6d756c746963616c6c3a20416c6c207265636f726473206d7573742068617665604482015273040c240dac2e8c6d0d2dcce40dcc2dacad0c2e6d60631b606482015260840161113c565b505b5f803086868581811061182a5761182a6124cd565b905060200281019061183c919061272c565b60405161184a929190612316565b5f60405180830381855af49150503d805f8114611882576040519150601f19603f3d011682016040523d82523d5f602084013e611887565b606091505b509150915081611895575f80fd5b808484815181106118a8576118a86124cd565b6020026020010181905250505080806118c0906127b2565b91505061175a565b509392505050565b604080516014808252818301909252606091602082018180368337505050600160601b9290920260208301525090565b5f6060818080611912868801886127ca565b919450925090505f806119278a8c018c612829565b81516020808401919091208851828a012060408051601960f81b818601526bffffffffffffffffffffffff19606087901b1660228201526001600160c01b031960c08c901b166036820152603e810193909352605e8084019290925280518084039092018252607e909201909152805191012091935091505f906119ab9085611a47565b905042856001600160401b03161015611a125760405162461bcd60e51b8152602060048201526024808201527f5369676e617475726556657269666965723a205369676e6174757265206578706044820152631a5c995960e21b606482015260840161113c565b9b949a509398505050505050505050565b5f6001600160e01b0319821663691f343160e01b148061049f575061049f82611a6f565b5f805f80611a558686611a93565b925092509250611a658282611adc565b5090949350505050565b5f6001600160e01b031982166304928c6760e21b148061049f575061049f82611b94565b5f805f8351604103611aca576020840151604085015160608601515f1a611abc88828585611bb8565b955095509550505050611ad5565b505081515f91506002905b9250925092565b5f826003811115611aef57611aef61286c565b03611af8575050565b6001826003811115611b0c57611b0c61286c565b03611b2a5760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115611b3e57611b3e61286c565b03611b5f5760405163fce698f760e01b81526004810182905260240161113c565b6003826003811115611b7357611b7361286c565b036108f6576040516335e2f38360e21b81526004810182905260240161113c565b5f6001600160e01b0319821663bc1c58d160e01b148061049f575061049f82611c80565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115611bf157505f91506003905082611c76565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611c42573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116611c6d57505f925060019150829050611c76565b92505f91508190505b9450945094915050565b5f6001600160e01b03198216631d9dabef60e11b1480611cb057506001600160e01b031982166378e5bf0360e11b145b8061049f575061049f825f6001600160e01b03198216631101d5ab60e11b148061049f575061049f825f6001600160e01b0319821663d700ff3360e01b148061049f575061049f825f6001600160e01b03198216634fbf043360e01b148061049f57506301ffc9a760e01b6001600160e01b031983161461049f565b80356001600160e01b031981168114611d43575f80fd5b919050565b5f60208284031215611d58575f80fd5b610a4782611d2c565b5f8083601f840112611d71575f80fd5b5081356001600160401b03811115611d87575f80fd5b6020830191508360208285010111156108db575f80fd5b5f805f805f60608688031215611db2575f80fd5b8535945060208601356001600160401b0380821115611dcf575f80fd5b611ddb89838a01611d61565b90965094506040880135915080821115611df3575f80fd5b50611e0088828901611d61565b969995985093965092949392505050565b5f8060408385031215611e22575f80fd5b82359150611e3260208401611d2c565b90509250929050565b5f8060408385031215611e4c575f80fd5b50508035926020909101359150565b5f5b83811015611e75578181015183820152602001611e5d565b50505f910152565b5f8151808452611e94816020860160208601611e5b565b601f01601f19169290920160200192915050565b828152604060208201525f610f9f6040830184611e7d565b634e487b7160e01b5f52604160045260245ffd5b5f6001600160401b0380841115611eed57611eed611ec0565b604051601f8501601f19908116603f01168101908282118183101715611f1557611f15611ec0565b81604052809350858152868686011115611f2d575f80fd5b858560208301375f602087830101525050509392505050565b5f60208284031215611f56575f80fd5b81356001600160401b03811115611f6b575f80fd5b8201601f81018413611f7b575f80fd5b610f9f84823560208401611ed4565b5f805f60408486031215611f9c575f80fd5b8335925060208401356001600160401b03811115611fb8575f80fd5b611fc486828701611d61565b9497909650939450505050565b5f60208284031215611fe1575f80fd5b5035919050565b602081525f610a476020830184611e7d565b5f805f806060858703121561200d575f80fd5b843593506020850135925060408501356001600160401b03811115612030575f80fd5b61203c87828801611d61565b95989497509550505050565b6001600160a01b038116811461114e575f80fd5b5f6020828403121561206c575f80fd5b8135610a4781612048565b5f82601f830112612086575f80fd5b610a4783833560208501611ed4565b5f805f606084860312156120a7575f80fd5b833592506020840135915060408401356001600160401b038111156120ca575f80fd5b6120d686828701612077565b9150509250925092565b5f805f604084860312156120f2575f80fd5b83356001600160401b0380821115612108575f80fd5b61211487838801611d61565b9095509350602086013591508082111561212c575f80fd5b506120d686828701612077565b5f8083601f840112612149575f80fd5b5081356001600160401b0381111561215f575f80fd5b6020830191508360208260051b85010111156108db575f80fd5b5f806020838503121561218a575f80fd5b82356001600160401b0381111561219f575f80fd5b6121ab85828601612139565b90969095509350505050565b5f602080830181845280855180835260408601915060408160051b87010192508387015f5b8281101561220a57603f198886030184526121f8858351611e7d565b945092850192908501906001016121dc565b5092979650505050505050565b5f8060408385031215612228575f80fd5b82359150602083013561223a81612048565b809150509250929050565b5f805f60408486031215612257575f80fd5b8335925060208401356001600160401b03811115612273575f80fd5b611fc486828701612139565b5f805f60608486031215612291575f80fd5b833592506122a160208501611d2c565b915060408401356122b181612048565b809150509250925092565b5f805f80604085870312156122cf575f80fd5b84356001600160401b03808211156122e5575f80fd5b6122f188838901611d61565b90965094506020870135915080821115612309575f80fd5b5061203c87828801611d61565b818382375f9101908152919050565b600181811c9082168061233957607f821691505b60208210810361235757634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610f8d575f81815260208120601f850160051c810160208610156123835750805b601f850160051c820191505b818110156123a25782815560010161238f565b505050505050565b6001600160401b038311156123c1576123c1611ec0565b6123d5836123cf8354612325565b8361235d565b5f601f841160018114612406575f85156123ef5750838201355b5f19600387901b1c1916600186901b178355610e95565b5f83815260209020601f19861690835b828110156124365786850135825560209485019460019092019101612416565b5086821015612452575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b604081525f61249f604083018688612464565b8281036020840152610f1c818587612464565b5f82516124c3818460208701611e5b565b9190910192915050565b634e487b7160e01b5f52603260045260245ffd5b81516001600160401b038111156124fa576124fa611ec0565b61250e816125088454612325565b8461235d565b602080601f831160018114612541575f841561252a5750858301515b5f19600386901b1c1916600185901b1785556123a2565b5f85815260208120601f198616915b8281101561256f57888601518255948401946001909101908401612550565b508582101561258c57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b602081525f610f9f602083018486612464565b634e487b7160e01b5f52601160045260245ffd5b5f6001600160401b038083168181036125de576125de6125af565b6001019392505050565b8181038181111561049f5761049f6125af565b5f6020828403121561260b575f80fd5b8151610a4781612048565b5f60208284031215612626575f80fd5b81518015158114610a47575f80fd5b604081525f612648604083018587612464565b82810360208401526111cf8185611e7d565b604081525f61266c6040830185611e7d565b905060018060a01b03831660208301529392505050565b5f60a0820160018060a01b0388168352602060a08185015281885180845260c08601915060c08160051b8701019350828a015f5b828110156126e55760bf198887030184526126d3868351611e7d565b955092840192908401906001016126b7565b505050505082810360408401526126fc8187611e7d565b6001600160e01b031986166060850152905082810360808401526127208185611e7d565b98975050505050505050565b5f808335601e19843603018112612741575f80fd5b8301803591506001600160401b0382111561275a575f80fd5b6020019150368190038213156108db575f80fd5b5f808585111561277c575f80fd5b83861115612788575f80fd5b5050820193919092039150565b8035602083101561049f575f19602084900360031b1b1692915050565b5f600182016127c3576127c36125af565b5060010190565b5f805f606084860312156127dc575f80fd5b83356001600160401b03808211156127f2575f80fd5b6127fe87838801612077565b9450602086013591508082168214612814575f80fd5b9092506040850135908082111561212c575f80fd5b5f806040838503121561283a575f80fd5b82356001600160401b0381111561284f575f80fd5b61285b85828601612077565b925050602083013561223a81612048565b634e487b7160e01b5f52602160045260245ffdfea264697066735822122055b924a645bc9ededdf63b6fa05641b9492bb6bb71b428b07c6d0f58427bf09964736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e000000000000000000000000d4416b13d2b3a9abae7acd5d6c2bbdbe2568640100000000000000000000000000000000000000000000000000000000000000e00000000000000000000000001fafc6e4105843783cfa75b375ec1b923cc617bc000000000000000000000000ad73eafcac4f4c6755dfc61770875fb8b6bc8a25000000000000000000000000231b0ee14048e9dccd1d247744d114a4eb5e8e630000000000000000000000004976fb03c32e5b8cfe2b6ccb31c09ba78ebaba41000000000000000000000000000000000000000000000000000000000000002f68747470733a2f2f6170692e6f7262697465722e686f73742f6c6f6f6b75702f7b73656e6465727d2f7b646174617d0000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _ens (address): 0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e
Arg [1] : _nameWrapper (address): 0xD4416b13d2b3a9aBae7AcD5D6C2BbDBE25686401
Arg [2] : _url (string): https://api.orbiter.host/lookup/{sender}/{data}
Arg [3] : _signer (address): 0x1fAfC6e4105843783cFA75B375Ec1b923cC617BC
Arg [4] : _owner (address): 0xaD73eafCAc4F4c6755DFc61770875fb8B6bC8A25
Arg [5] : _publicResolver (address): 0x231b0Ee14048e9dCcD1d247744d114a4EB5E8E63
Arg [6] : _legacyResolver (address): 0x4976fb03C32e5B8cfe2b6cCB31c09Ba78EBaBa41
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e
Arg [1] : 000000000000000000000000d4416b13d2b3a9abae7acd5d6c2bbdbe25686401
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000001fafc6e4105843783cfa75b375ec1b923cc617bc
Arg [4] : 000000000000000000000000ad73eafcac4f4c6755dfc61770875fb8b6bc8a25
Arg [5] : 000000000000000000000000231b0ee14048e9dccd1d247744d114a4eb5e8e63
Arg [6] : 0000000000000000000000004976fb03c32e5b8cfe2b6ccb31c09ba78ebaba41
Arg [7] : 000000000000000000000000000000000000000000000000000000000000002f
Arg [8] : 68747470733a2f2f6170692e6f7262697465722e686f73742f6c6f6f6b75702f
Arg [9] : 7b73656e6465727d2f7b646174617d0000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.