Source Code
Latest 25 from a total of 171 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Buy Star | 36845064 | 147 days ago | IN | 0.000001 ETH | 0.00000117 | ||||
| Buy Star | 36056028 | 165 days ago | IN | 0.000001 ETH | 0.00000049 | ||||
| Buy Star | 35283551 | 183 days ago | IN | 0.000001 ETH | 0.0000003 | ||||
| Buy Star | 35021820 | 189 days ago | IN | 0.000001 ETH | 0.00000011 | ||||
| Buy Star | 34980496 | 190 days ago | IN | 0.000001 ETH | 0.00000004 | ||||
| Buy Star | 34980487 | 190 days ago | IN | 0.000001 ETH | 0.00000004 | ||||
| Buy Star | 34980479 | 190 days ago | IN | 0.000001 ETH | 0.00000011 | ||||
| Buy Star | 34710835 | 196 days ago | IN | 0.000001 ETH | 0.00000026 | ||||
| Buy Star | 34710751 | 196 days ago | IN | 0.000001 ETH | 0.00000026 | ||||
| Buy Star | 34710719 | 196 days ago | IN | 0.000001 ETH | 0.00000027 | ||||
| Buy Star | 34710702 | 196 days ago | IN | 0.000001 ETH | 0.00000035 | ||||
| Buy Star | 34219619 | 207 days ago | IN | 0.000001 ETH | 0.00000016 | ||||
| Buy Star | 34208003 | 208 days ago | IN | 0.000001 ETH | 0.00000032 | ||||
| Buy Star | 34207946 | 208 days ago | IN | 0.000001 ETH | 0.00000061 | ||||
| Buy Star | 34163014 | 209 days ago | IN | 0.000001 ETH | 0.00000034 | ||||
| Buy Star | 33962884 | 213 days ago | IN | 0.000001 ETH | 0.0000005 | ||||
| Buy Star | 33945657 | 214 days ago | IN | 0.000001 ETH | 0.00000034 | ||||
| Buy Star | 33945653 | 214 days ago | IN | 0.000001 ETH | 0.00000034 | ||||
| Buy Star | 33945649 | 214 days ago | IN | 0.000001 ETH | 0.00000089 | ||||
| Buy Star | 33931095 | 214 days ago | IN | 0.000001 ETH | 0.00000065 | ||||
| Buy Star | 33931060 | 214 days ago | IN | 0.000001 ETH | 0.00000076 | ||||
| Buy Star | 33895046 | 215 days ago | IN | 0.000001 ETH | 0.00000194 | ||||
| Buy Star | 33894066 | 215 days ago | IN | 0.000001 ETH | 0.00000457 | ||||
| Buy Star | 33891152 | 215 days ago | IN | 0.000001 ETH | 0.00000093 | ||||
| Buy Star | 33875776 | 215 days ago | IN | 0.000001 ETH | 0.00000027 |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
StarNameResolver
Compiler Version
v0.8.27+commit.40a35a09
Optimization Enabled:
No with 200 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.27;
import "@openzeppelin/contracts/access/AccessControl.sol";
import "../../ICredentialResolver.sol";
import "../../utils/NameCoder.sol";
/**
* @title StarNameResolver
* @dev A star counting resolver for domain names.
* Anyone can buy stars for any domain name.
* Name format: domain.com.name.ecs.eth (DNS encoded)
*/
contract StarNameResolver is ICredentialResolver, AccessControl {
/* --- Roles --- */
bytes32 public constant ADMIN_ROLE = keccak256(bytes("ADMIN_ROLE"));
/* --- Events --- */
event StarPurchased(bytes32 indexed namehash, bytes domainIdentifier, address indexed buyer, uint256 newStarCount);
event TextRecordKeyUpdated(string oldKey, string newKey);
event StarPriceUpdated(uint256 oldPrice, uint256 newPrice);
/* --- Storage --- */
// The configurable text record key
string public textRecordKey = "eth.ecs.ethstars.stars"; // Slot 1 * Accesess Control uses slot 0
// The star price (updateable by admin)
uint256 public starPrice = 0.000001 ether; // Testnet: 1000x cheaper // Slot 2
// The star counts: namehash -> count
mapping(bytes32 namehash => uint256 count) public starCounts; // Slot 3
// Track if a buyer has already starred a domain
mapping(address buyer => mapping(bytes32 namehash => bool hasStarred)) public hasStarred; // Slot 4
/* --- Errors --- */
error InsufficientPayment();
error AlreadyStarred();
error WithdrawalFailed();
/* --- Constructor --- */
constructor() {
_grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
_grantRole(ADMIN_ROLE, msg.sender);
}
/* --- Star Functions --- */
/**
* @dev Buy a star for a specific domain identifier
* @param domainIdentifier The DNS-encoded domain identifier (e.g., "example.com")
*/
function buyStar(bytes calldata domainIdentifier) external payable {
if (msg.value != starPrice) revert InsufficientPayment();
// Compute namehash from the domain identifier
bytes32 namehash = NameCoder.namehash(domainIdentifier, 0);
if (hasStarred[msg.sender][namehash]) {
revert AlreadyStarred();
}
starCounts[namehash]++;
hasStarred[msg.sender][namehash] = true;
uint256 newCount = starCounts[namehash];
emit StarPurchased(namehash, domainIdentifier, msg.sender, newCount);
}
/* --- View Functions --- */
/**
* @dev Check if an address has already starred a specific domain identifier
* @param addr The address to check
* @param domainIdentifier The DNS-encoded domain identifier to check
* @return True if the address has already starred this domain
*/
function hasStarredName(address addr, bytes memory domainIdentifier) external view returns (bool) {
bytes32 namehash = NameCoder.namehash(domainIdentifier, 0);
return hasStarred[addr][namehash];
}
/**
* @dev Returns credential data for the configured text record key
* @param identifier The DNS-encoded identifier containing domain
* @param key The credential key to look up
* @return The star count as a string if key matches, empty string otherwise
*/
function credential(bytes calldata identifier, string calldata key) external view override returns (string memory) {
if (keccak256(bytes(key)) != keccak256(bytes(textRecordKey))) {
return "";
}
// Compute namehash directly from DNS-encoded identifier using NameCoder
bytes32 namehash = NameCoder.namehash(identifier, 0);
return _uint256ToString(starCounts[namehash]);
}
/* --- Admin Functions --- */
/**
* @dev Change the text record key (admin only)
* @param newKey The new text record key
*/
function setTextRecordKey(string memory newKey) external onlyRole(ADMIN_ROLE) {
string memory oldKey = textRecordKey;
textRecordKey = newKey;
emit TextRecordKeyUpdated(oldKey, newKey);
}
/**
* @dev Update the star price (admin only)
* @param newPrice The new star price in wei
*/
function updateStarPrice(uint256 newPrice) external onlyRole(ADMIN_ROLE) {
uint256 oldPrice = starPrice;
starPrice = newPrice;
emit StarPriceUpdated(oldPrice, newPrice);
}
/* --- Withdrawal --- */
/**
* @dev Withdraw collected ETH (admin only)
*/
function withdraw() external onlyRole(ADMIN_ROLE) {
uint256 balance = address(this).balance;
(bool success, ) = payable(msg.sender).call{value: balance}("");
if (!success) revert WithdrawalFailed();
}
/* --- Internal Helper Functions --- */
/**
* @dev Convert uint256 to string
* @param value The number to convert
* @return The string representation
*/
function _uint256ToString(uint256 value) internal pure returns (string memory) {
if (value == 0) return "0";
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.3.0) (access/AccessControl.sol)
pragma solidity ^0.8.20;
import {IAccessControl} from "./IAccessControl.sol";
import {Context} from "../utils/Context.sol";
import {ERC165} from "../utils/introspection/ERC165.sol";
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```solidity
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```solidity
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
* roles. More complex role relationships can be created by using
* {_setRoleAdmin}.
*
* WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}
* to enforce additional security measures for this role.
*/
abstract contract AccessControl is Context, IAccessControl, ERC165 {
struct RoleData {
mapping(address account => bool) hasRole;
bytes32 adminRole;
}
mapping(bytes32 role => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev Modifier that checks that an account has a specific role. Reverts
* with an {AccessControlUnauthorizedAccount} error including the required role.
*/
modifier onlyRole(bytes32 role) {
_checkRole(role);
_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view virtual returns (bool) {
return _roles[role].hasRole[account];
}
/**
* @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`
* is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.
*/
function _checkRole(bytes32 role) internal view virtual {
_checkRole(role, _msgSender());
}
/**
* @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`
* is missing `role`.
*/
function _checkRole(bytes32 role, address account) internal view virtual {
if (!hasRole(role, account)) {
revert AccessControlUnauthorizedAccount(account, role);
}
}
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {
return _roles[role].adminRole;
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*
* May emit a {RoleGranted} event.
*/
function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
_grantRole(role, account);
}
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*
* May emit a {RoleRevoked} event.
*/
function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
_revokeRole(role, account);
}
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been revoked `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `callerConfirmation`.
*
* May emit a {RoleRevoked} event.
*/
function renounceRole(bytes32 role, address callerConfirmation) public virtual {
if (callerConfirmation != _msgSender()) {
revert AccessControlBadConfirmation();
}
_revokeRole(role, callerConfirmation);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*
* Emits a {RoleAdminChanged} event.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
bytes32 previousAdminRole = getRoleAdmin(role);
_roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
/**
* @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.
*
* Internal function without access restriction.
*
* May emit a {RoleGranted} event.
*/
function _grantRole(bytes32 role, address account) internal virtual returns (bool) {
if (!hasRole(role, account)) {
_roles[role].hasRole[account] = true;
emit RoleGranted(role, account, _msgSender());
return true;
} else {
return false;
}
}
/**
* @dev Attempts to revoke `role` from `account` and returns a boolean indicating if `role` was revoked.
*
* Internal function without access restriction.
*
* May emit a {RoleRevoked} event.
*/
function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {
if (hasRole(role, account)) {
_roles[role].hasRole[account] = false;
emit RoleRevoked(role, account, _msgSender());
return true;
} else {
return false;
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.27;
/**
* @title ICredentialResolver
* @dev Interface for ECS credential resolvers that handle credential resolution.
*/
interface ICredentialResolver {
/**
* @dev Returns credential data for the given identifier and key.
* @param identifier The DNS-encoded identifier to resolve.
* @param key The credential key to look up.
* @return The credential data, or empty string if not found.
*/
function credential(bytes calldata identifier, string calldata key) external view returns (string memory);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {HexUtils} from "./HexUtils.sol";
/// @dev Library for encoding/decoding names.
///
/// An ENS name is stop-separated labels, eg. "aaa.bb.c".
///
/// A DNS-encoded name is composed of byte length-prefixed labels with a terminator byte.
/// eg. "\x03aaa\x02bb\x01c\x00".
/// - maximum label length is 255 bytes.
/// - length = 0 is reserved for the terminator (root).
///
/// To encode a label larger than 255 bytes, use a hashed label.
/// A label of any length can be converted to a hashed label.
///
/// A hashed label is encoded as "[" + toHex(keccak256(label)) + "]".
/// eg. [af2caa1c2ca1d027f1ac823b529d0a67cd144264b2789fa2ea4d63a67c7103cc] = "vitalik".
/// - always 66 bytes.
/// - matches: `/^\[[0-9a-f]{64}\]$/`.
///
/// w/o hashed labels: `dns.length == 2 + ens.length` and the mapping is injective.
/// w/ hashed labels: `dns.length == 2 + ens.split('.').map(x => x.utf8Length).sum(n => n > 255 ? 66 : n)`.
library NameCoder {
/// @dev The DNS-encoded name is malformed.
error DNSDecodingFailed(bytes dns);
/// @dev A label of the ENS name has an invalid size.
error DNSEncodingFailed(string ens);
/// @dev Same as `BytesUtils.readLabel()` but supports hashed labels.
/// Only the last labelHash is zero.
/// Disallows hashed label of zero (eg. `[0..0]`) to prevent confusion with terminator.
/// Reverts `DNSDecodingFailed`.
/// @param name The DNS-encoded name.
/// @param idx The offset into `name` to start reading.
/// @return labelHash The resulting labelhash.
/// @return newIdx The offset into `name` of the next label.
function readLabel(
bytes memory name,
uint256 idx
) internal pure returns (bytes32 labelHash, uint256 newIdx) {
if (idx >= name.length) revert DNSDecodingFailed(name); // "readLabel: expected length"
uint256 len = uint256(uint8(name[idx++]));
newIdx = idx + len;
if (newIdx > name.length) revert DNSDecodingFailed(name); // "readLabel: expected label"
if (len == 66 && name[idx] == "[" && name[newIdx - 1] == "]") {
bool valid;
(labelHash, valid) = HexUtils.hexStringToBytes32(
name,
idx + 1,
newIdx - 1
); // will not revert
if (!valid || labelHash == bytes32(0)) {
revert DNSDecodingFailed(name); // "readLabel: malformed" or null literal
}
} else if (len > 0) {
assembly {
labelHash := keccak256(add(add(name, idx), 32), len)
}
}
}
/// @dev Same as `BytesUtils.namehash()` but supports hashed labels.
/// Reverts `DNSDecodingFailed`.
/// @param name The DNS-encoded name.
/// @param idx The offset into name start hashing.
/// @return hash The resulting namehash.
function namehash(
bytes memory name,
uint256 idx
) internal pure returns (bytes32 hash) {
(hash, idx) = readLabel(name, idx);
if (hash == bytes32(0)) {
if (idx != name.length) revert DNSDecodingFailed(name); // "namehash: Junk at end of name"
} else {
bytes32 parent = namehash(name, idx);
assembly {
mstore(0, parent)
mstore(32, hash)
hash := keccak256(0, 64)
}
}
}
/// @dev Convert DNS-encoded name to ENS name.
/// Reverts `DNSDecodingFailed`.
/// @param dns The DNS-encoded name to convert, eg. `\x03aaa\x02bb\x01c\x00`.
/// @return ens The equivalent ENS name, eg. `aaa.bb.c`.
function decode(
bytes memory dns
) internal pure returns (string memory ens) {
unchecked {
uint256 n = dns.length;
if (n == 1 && dns[0] == 0) return ""; // only valid answer is root
if (n < 3) revert DNSDecodingFailed(dns);
bytes memory v = new bytes(n - 2); // always 2-shorter
uint256 src;
uint256 dst;
while (src < n) {
uint8 len = uint8(dns[src++]);
if (len == 0) break;
uint256 end = src + len;
if (end > dns.length) revert DNSDecodingFailed(dns); // overflow
if (dst > 0) v[dst++] = "."; // skip first stop
while (src < end) {
bytes1 x = dns[src++]; // read byte
if (x == ".") revert DNSDecodingFailed(dns); // malicious label
v[dst++] = x; // write byte
}
}
if (src != dns.length) revert DNSDecodingFailed(dns); // junk at end
return string(v);
}
}
/// @dev Convert ENS name to DNS-encoded name.
/// Hashes labels longer than 255 bytes.
/// Reverts `DNSEncodingFailed`.
/// @param ens The ENS name to convert, eg. `aaa.bb.c`.
/// @return dns The corresponding DNS-encoded name, eg. `\x03aaa\x02bb\x01c\x00`.
function encode(
string memory ens
) internal pure returns (bytes memory dns) {
unchecked {
uint256 n = bytes(ens).length;
if (n == 0) return hex"00"; // root
dns = new bytes(n + 2);
uint256 start;
assembly {
start := add(dns, 32) // first byte of output
}
uint256 end = start; // remember position to write length
for (uint256 i; i < n; i++) {
bytes1 x = bytes(ens)[i]; // read byte
if (x == ".") {
start = _createHashedLabel(start, end);
if (start == 0) revert DNSEncodingFailed(ens);
end = start; // jump to next position
} else {
assembly {
end := add(end, 1) // increase length
mstore(end, x) // write byte
}
}
}
start = _createHashedLabel(start, end);
if (start == 0) revert DNSEncodingFailed(ens);
assembly {
mstore8(start, 0) // terminal byte
mstore(dns, sub(start, add(dns, 31))) // truncate length
}
}
}
/// @dev Write the label length.
/// If longer than 255, writes a hashed label instead.
/// @param start The memory offset of the length-prefixed label.
/// @param end The memory offset at the end of the label.
/// @return next The memory offset for the next label.
/// Returns 0 if label is empty (handled by caller).
function _createHashedLabel(
uint256 start,
uint256 end
) internal pure returns (uint256 next) {
uint256 size = end - start; // length of label
if (size > 255) {
assembly {
mstore(0, keccak256(add(start, 1), size)) // compute hash of label
}
HexUtils.unsafeHex(0, start + 2, 64); // override label with hex(hash)
assembly {
mstore8(add(start, 1), 0x5B) // "["
mstore8(add(start, 66), 0x5D) // "]"
}
size = 66;
}
if (size > 0) {
assembly {
mstore8(start, size) // update length
}
next = start + 1 + size; // advance
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.3.0) (access/IAccessControl.sol)
pragma solidity ^0.8.20;
/**
* @dev External interface of AccessControl declared to support ERC-165 detection.
*/
interface IAccessControl {
/**
* @dev The `account` is missing a role.
*/
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);
/**
* @dev The caller of a function is not the expected one.
*
* NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.
*/
error AccessControlBadConfirmation();
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted to signal this.
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call. This account bears the admin role (for the granted role).
* Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) external view returns (bool);
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {AccessControl-_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) external view returns (bytes32);
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `callerConfirmation`.
*/
function renounceRole(bytes32 role, address callerConfirmation) external;
}// 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/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
pragma solidity ^0.8.4;
library HexUtils {
/// @dev Convert `hexString[pos:end]` to `bytes32`.
/// Accepts 0-64 hex-chars.
/// Uses right alignment: `1` → `0000000000000000000000000000000000000000000000000000000000000001`.
/// @param hexString The string to parse.
/// @param pos The index to start parsing.
/// @param end The (exclusive) index to stop parsing.
/// @return word The parsed bytes32.
/// @return valid True if the parse was successful.
function hexStringToBytes32(
bytes memory hexString,
uint256 pos,
uint256 end
) internal pure returns (bytes32 word, bool valid) {
if (end < pos) return ("", false); // invalid range
uint256 nibbles = end - pos;
if (nibbles > 64 || end > hexString.length) {
return (bytes32(0), false); // too large or out of bounds
}
uint256 src;
assembly {
src := add(add(hexString, 32), pos)
}
valid = unsafeBytes(src, 0, nibbles);
assembly {
let pad := sub(32, shr(1, add(nibbles, 1))) // number of bytes
word := shr(shl(3, pad), mload(0)) // right align
}
}
/// @dev Convert `hexString[pos:end]` to `address`.
/// Accepts exactly 40 hex-chars.
/// @param hexString The string to parse.
/// @param pos The index to start parsing.
/// @param end The (exclusive) index to stop parsing.
/// @return addr The parsed address.
/// @return valid True if the parse was successful.
function hexToAddress(
bytes memory hexString,
uint256 pos,
uint256 end
) internal pure returns (address addr, bool valid) {
if (pos + 40 != end) return (address(0), false); // wrong length
bytes32 word;
(word, valid) = hexStringToBytes32(hexString, pos, end);
addr = address(uint160(uint256(word)));
}
/// @dev Convert `hexString[pos:end]` to `bytes`.
/// Accepts 0+ hex-chars.
/// @param pos The index to start parsing.
/// @param end The (exclusive) index to stop parsing.
/// @return v The parsed bytes.
/// @return valid True if the parse was successful.
function hexToBytes(
bytes memory hexString,
uint256 pos,
uint256 end
) internal pure returns (bytes memory v, bool valid) {
if (end < pos) return ("", false); // invalid range
uint256 nibbles = end - pos;
v = new bytes((1 + nibbles) >> 1); // round up
uint256 src;
uint256 dst;
assembly {
src := add(add(hexString, 32), pos)
dst := add(v, 32)
}
valid = unsafeBytes(src, dst, nibbles);
}
/// @dev Convert arbitrary hex-encoded memory to bytes.
/// If nibbles is odd, leading hex-char is padded, eg. `F` → `0x0F`.
/// Matches: /^[0-9a-f]*$/i.
/// @param src The memory offset of first hex-char of input.
/// @param dst The memory offset of first byte of output (cannot alias `src`).
/// @param nibbles The number of hex-chars to convert.
/// @return valid True if all characters were hex.
function unsafeBytes(
uint256 src,
uint256 dst,
uint256 nibbles
) internal pure returns (bool valid) {
assembly {
function getHex(c, i) -> ascii {
c := byte(i, c)
// chars 48-57: 0-9
if and(gt(c, 47), lt(c, 58)) {
ascii := sub(c, 48)
leave
}
// chars 65-70: A-F
if and(gt(c, 64), lt(c, 71)) {
ascii := add(sub(c, 65), 10)
leave
}
// chars 97-102: a-f
if and(gt(c, 96), lt(c, 103)) {
ascii := add(sub(c, 97), 10)
leave
}
// invalid char
ascii := 0x100
}
valid := true
let end := add(src, nibbles)
if and(nibbles, 1) {
let b := getHex(mload(src), 0) // "f" -> 15
mstore8(dst, b) // write ascii byte
src := add(src, 1) // update pointers
dst := add(dst, 1)
if gt(b, 255) {
valid := false
src := end // terminate loop
}
}
for {} lt(src, end) {
src := add(src, 2) // 2 nibbles
dst := add(dst, 1) // per byte
} {
let word := mload(src) // read word (left aligned)
let b := or(shl(4, getHex(word, 0)), getHex(word, 1)) // "ff" -> 255
if gt(b, 255) {
valid := false
break
}
mstore8(dst, b) // write ascii byte
}
}
}
/// @dev Format `address` as a hex string.
/// @param addr The address to format.
/// @return hexString The corresponding hex string w/o a 0x-prefix.
function addressToHex(
address addr
) internal pure returns (string memory hexString) {
// return bytesToHex(abi.encodePacked(addr));
hexString = new string(40);
uint256 dst;
assembly {
mstore(0, addr)
dst := add(hexString, 32)
}
unsafeHex(12, dst, 40);
}
/// @dev Format `uint256` as a variable-length hex string without zero padding.
/// * unpaddedUintToHex(0, true) = "0"
/// * unpaddedUintToHex(1, true) = "1"
/// * unpaddedUintToHex(0, false) = "00"
/// * unpaddedUintToHex(1, false) = "01"
/// @param value The number to format.
/// @param dropZeroNibble If true, the leading byte will use one nibble if less than 16.
/// @return hexString The corresponding hex string w/o an 0x-prefix.
function unpaddedUintToHex(
uint256 value,
bool dropZeroNibble
) internal pure returns (string memory hexString) {
uint256 temp = value;
uint256 shift;
for (uint256 b = 128; b >= 8; b >>= 1) {
if (temp < (1 << b)) {
shift += b; // number of zero upper bits
} else {
temp >>= b; // shift away lower half
}
}
if (dropZeroNibble && temp < 16) shift += 4;
uint256 nibbles = 64 - (shift >> 2);
hexString = new string(nibbles);
uint256 dst;
assembly {
mstore(0, shl(shift, value)) // left-align
dst := add(hexString, 32)
}
unsafeHex(0, dst, nibbles);
}
/// @dev Format `bytes` as a hex string.
/// @param v The bytes to format.
/// @return hexString The corresponding hex string w/o a 0x-prefix.
function bytesToHex(
bytes memory v
) internal pure returns (string memory hexString) {
uint256 nibbles = v.length << 1;
hexString = new string(nibbles);
uint256 src;
uint256 dst;
assembly {
src := add(v, 32)
dst := add(hexString, 32)
}
unsafeHex(src, dst, nibbles);
}
/// @dev Converts arbitrary memory to a hex string.
/// @param src The memory offset of first nibble of input.
/// @param dst The memory offset of first hex-char of output (can alias `src`).
/// @param nibbles The number of nibbles to convert and the byte-length of the output.
function unsafeHex(
uint256 src,
uint256 dst,
uint256 nibbles
) internal pure {
unchecked {
for (uint256 end = dst + nibbles; dst < end; src += 32) {
uint256 word;
assembly {
word := mload(src)
}
for (uint256 shift = 256; dst < end && shift > 0; dst++) {
uint256 b = (word >> (shift -= 4)) & 15; // each nibble
b = b < 10 ? b + 0x30 : b + 0x57; // ("a" - 10) => 0x57
assembly {
mstore8(dst, b)
}
}
}
}
}
}// 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);
}{
"remappings": [
"@unruggable/=lib/unruggable-gateways/",
"@eth-optimism/=lib/unruggable-gateways/lib/optimism/packages/",
"@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
"ds-test/=lib/unruggable-gateways/lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/",
"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/",
"optimism/=lib/unruggable-gateways/lib/optimism/packages/contracts-bedrock/src/",
"unruggable-gateways/=lib/unruggable-gateways/contracts/"
],
"optimizer": {
"enabled": false,
"runs": 200
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "cancun",
"viaIR": false,
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"AlreadyStarred","type":"error"},{"inputs":[{"internalType":"bytes","name":"dns","type":"bytes"}],"name":"DNSDecodingFailed","type":"error"},{"inputs":[],"name":"InsufficientPayment","type":"error"},{"inputs":[],"name":"WithdrawalFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"StarPriceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"namehash","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"domainIdentifier","type":"bytes"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"newStarCount","type":"uint256"}],"name":"StarPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"oldKey","type":"string"},{"indexed":false,"internalType":"string","name":"newKey","type":"string"}],"name":"TextRecordKeyUpdated","type":"event"},{"inputs":[],"name":"ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"domainIdentifier","type":"bytes"}],"name":"buyStar","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"identifier","type":"bytes"},{"internalType":"string","name":"key","type":"string"}],"name":"credential","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"buyer","type":"address"},{"internalType":"bytes32","name":"namehash","type":"bytes32"}],"name":"hasStarred","outputs":[{"internalType":"bool","name":"hasStarred","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bytes","name":"domainIdentifier","type":"bytes"}],"name":"hasStarredName","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newKey","type":"string"}],"name":"setTextRecordKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"namehash","type":"bytes32"}],"name":"starCounts","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"starPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"textRecordKey","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"updateStarPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040526040518060400160405280601681526020017f6574682e6563732e65746873746172732e73746172730000000000000000000081525060019081610048919061045f565b5064e8d4a5100060025534801561005d575f5ffd5b506100705f5f1b336100c360201b60201c565b506100bd6040518060400160405280600a81526020017f41444d494e5f524f4c450000000000000000000000000000000000000000000081525080519060200120336100c360201b60201c565b5061052e565b5f6100d483836101b860201b60201c565b6101ae5760015f5f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061014b61021b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4600190506101b2565b5f90505b92915050565b5f5f5f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f33905090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061029d57607f821691505b6020821081036102b0576102af610259565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026103127fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826102d7565b61031c86836102d7565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61036061035b61035684610334565b61033d565b610334565b9050919050565b5f819050919050565b61037983610346565b61038d61038582610367565b8484546102e3565b825550505050565b5f5f905090565b6103a4610395565b6103af818484610370565b505050565b5b818110156103d2576103c75f8261039c565b6001810190506103b5565b5050565b601f821115610417576103e8816102b6565b6103f1846102c8565b81016020851015610400578190505b61041461040c856102c8565b8301826103b4565b50505b505050565b5f82821c905092915050565b5f6104375f198460080261041c565b1980831691505092915050565b5f61044f8383610428565b9150826002028217905092915050565b61046882610222565b67ffffffffffffffff8111156104815761048061022c565b5b61048b8254610286565b6104968282856103d6565b5f60209050601f8311600181146104c7575f84156104b5578287015190505b6104bf8582610444565b865550610526565b601f1984166104d5866102b6565b5f5b828110156104fc578489015182556001820191506020850194506020810190506104d7565b868310156105195784890151610515601f891682610428565b8355505b6001600288020188555050505b505050505050565b61238e8061053b5f395ff3fe608060405260043610610108575f3560e01c8063730176991161009457806391d148541161006357806391d148541461035e578063a217fddf1461039a578063a34a80cd146103c4578063bc1e8001146103ee578063d547741f1461042a57610108565b8063730176991461029457806375b238fc146102bc57806381b1c26a146102e6578063876d2cd11461032257610108565b806336568abe116100db57806336568abe146101c85780633a33e13d146101f05780633ccfd60b1461021857806340cd39f11461022e578063603c2a941461026a57610108565b806301ffc9a71461010c57806310aaaf0f14610148578063248a9ca3146101645780632f2ff15d146101a0575b5f5ffd5b348015610117575f5ffd5b50610132600480360381019061012d91906115bd565b610452565b60405161013f9190611602565b60405180910390f35b610162600480360381019061015d919061167c565b6104cb565b005b34801561016f575f5ffd5b5061018a600480360381019061018591906116fa565b6106de565b6040516101979190611734565b60405180910390f35b3480156101ab575f5ffd5b506101c660048036038101906101c191906117a7565b6106fa565b005b3480156101d3575f5ffd5b506101ee60048036038101906101e991906117a7565b61071c565b005b3480156101fb575f5ffd5b5061021660048036038101906102119190611818565b610797565b005b348015610223575f5ffd5b5061022c610828565b005b348015610239575f5ffd5b50610254600480360381019061024f9190611843565b610916565b6040516102619190611602565b60405180910390f35b348015610275575f5ffd5b5061027e610940565b60405161028b9190611890565b60405180910390f35b34801561029f575f5ffd5b506102ba60048036038101906102b591906119e1565b610946565b005b3480156102c7575f5ffd5b506102d0610a66565b6040516102dd9190611734565b60405180910390f35b3480156102f1575f5ffd5b5061030c60048036038101906103079190611ac6565b610aa6565b6040516103199190611602565b60405180910390f35b34801561032d575f5ffd5b5061034860048036038101906103439190611b75565b610b16565b6040516103559190611c53565b60405180910390f35b348015610369575f5ffd5b50610384600480360381019061037f91906117a7565b610bd8565b6040516103919190611602565b60405180910390f35b3480156103a5575f5ffd5b506103ae610c3b565b6040516103bb9190611734565b60405180910390f35b3480156103cf575f5ffd5b506103d8610c41565b6040516103e59190611c53565b60405180910390f35b3480156103f9575f5ffd5b50610414600480360381019061040f91906116fa565b610ccd565b6040516104219190611890565b60405180910390f35b348015610435575f5ffd5b50610450600480360381019061044b91906117a7565b610ce2565b005b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104c457506104c382610d04565b5b9050919050565b6002543414610506576040517fcd1c886700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61055483838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050505f610d6d565b905060045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8281526020019081526020015f205f9054906101000a900460ff16156105e6576040517ffb5f99e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035f8281526020019081526020015f205f81548092919061060790611ca0565b9190505550600160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f205f6101000a81548160ff0219169083151502179055505f60035f8381526020019081526020015f205490503373ffffffffffffffffffffffffffffffffffffffff16827f7e1e31d0b49333230209b35969c2393dd58057967c41207a7e5d046acce63ff58686856040516106d093929190611d23565b60405180910390a350505050565b5f5f5f8381526020019081526020015f20600101549050919050565b610703826106de565b61070c81610df5565b6107168383610e09565b50505050565b610724610ef2565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610788576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107928282610ef9565b505050565b6040518060400160405280600a81526020017f41444d494e5f524f4c4500000000000000000000000000000000000000000000815250805190602001206107dd81610df5565b5f6002549050826002819055507fa268306b2231ce2664b48730f5fe3c67f8ecf87f63521eb2743ebd592d03be82818460405161081b929190611d53565b60405180910390a1505050565b6040518060400160405280600a81526020017f41444d494e5f524f4c45000000000000000000000000000000000000000000008152508051906020012061086e81610df5565b5f4790505f3373ffffffffffffffffffffffffffffffffffffffff168260405161089790611da7565b5f6040518083038185875af1925050503d805f81146108d1576040519150601f19603f3d011682016040523d82523d5f602084013e6108d6565b606091505b5050905080610911576040517f27fcd9d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b6004602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b60025481565b6040518060400160405280600a81526020017f41444d494e5f524f4c45000000000000000000000000000000000000000000008152508051906020012061098c81610df5565b5f6001805461099a90611de8565b80601f01602080910402602001604051908101604052809291908181526020018280546109c690611de8565b8015610a115780601f106109e857610100808354040283529160200191610a11565b820191905f5260205f20905b8154815290600101906020018083116109f457829003601f168201915b505050505090508260019081610a279190611fb8565b507f7fe974f2973c673d1c46952ceeda43623e52d7176d20c92eebd4d990a014b7428184604051610a59929190612087565b60405180910390a1505050565b6040518060400160405280600a81526020017f41444d494e5f524f4c45000000000000000000000000000000000000000000008152508051906020012081565b5f5f610ab2835f610d6d565b905060045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8281526020019081526020015f205f9054906101000a900460ff1691505092915050565b60606001604051610b27919061214e565b60405180910390208383604051610b3f929190612188565b604051809103902014610b625760405180602001604052805f8152509050610bd0565b5f610bb086868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050505f610d6d565b9050610bcc60035f8381526020019081526020015f2054610fe2565b9150505b949350505050565b5f5f5f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f5f1b81565b60018054610c4e90611de8565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7a90611de8565b8015610cc55780601f10610c9c57610100808354040283529160200191610cc5565b820191905f5260205f20905b815481529060010190602001808311610ca857829003601f168201915b505050505081565b6003602052805f5260405f205f915090505481565b610ceb826106de565b610cf481610df5565b610cfe8383610ef9565b50505050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f610d78838361113b565b80935081925050505f5f1b8103610dd35782518214610dce57826040517fba4adc23000000000000000000000000000000000000000000000000000000008152600401610dc591906121e2565b60405180910390fd5b610def565b5f610dde8484610d6d565b9050805f528160205260405f209150505b92915050565b610e0681610e01610ef2565b611390565b50565b5f610e148383610bd8565b610ee85760015f5f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550610e85610ef2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019050610eec565b5f90505b92915050565b5f33905090565b5f610f048383610bd8565b15610fd8575f5f5f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550610f75610ef2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a460019050610fdc565b5f90505b92915050565b60605f8203611028576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611136565b5f8290505f5b5f821461105757808061104090611ca0565b915050600a82611050919061222f565b915061102e565b5f8167ffffffffffffffff811115611072576110716118bd565b5b6040519080825280601f01601f1916602001820160405280156110a45781602001600182028036833780820191505090505b5090505b5f851461112f576001826110bc919061225f565b9150600a856110cb9190612292565b60306110d791906122c2565b60f81b8183815181106110ed576110ec6122f5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a85611128919061222f565b94506110a8565b8093505050505b919050565b5f5f8351831061118257836040517fba4adc2300000000000000000000000000000000000000000000000000000000815260040161117991906121e2565b60405180910390fd5b5f84848061118f90611ca0565b9550815181106111a2576111a16122f5565b5b602001015160f81c60f81b60f81c60ff16905080846111c191906122c2565b9150845182111561120957846040517fba4adc2300000000000000000000000000000000000000000000000000000000815260040161120091906121e2565b60405180910390fd5b60428114801561127757507f5b00000000000000000000000000000000000000000000000000000000000000858581518110611248576112476122f5565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80156112ed57507f5d00000000000000000000000000000000000000000000000000000000000000856001846112ad919061225f565b815181106112be576112bd6122f5565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b15611374575f6113168660018761130491906122c2565b600186611311919061225f565b6113e1565b809250819550505080158061132c57505f5f1b84145b1561136e57856040517fba4adc2300000000000000000000000000000000000000000000000000000000815260040161136591906121e2565b60405180910390fd5b50611388565b5f81111561138757806020858701012092505b5b509250929050565b61139a8282610bd8565b6113dd5780826040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526004016113d4929190612331565b60405180910390fd5b5050565b5f5f838310156113f7575f5f9091509150611455565b5f8484611404919061225f565b905060408111806114155750855184115b15611428575f5f1b5f9250925050611455565b5f856020880101905061143c815f8461145d565b92506001820160011c6020035f518160031b1c94505050505b935093915050565b5f6114c6565b5f81831a9150603a8210602f83111615611482576030820390506114c0565b6047821060408311161561149e57600a604183030190506114c0565b606782106060831116156114ba57600a606183030190506114c0565b61010090505b92915050565b600190508184016001831615611502576114e15f8651611463565b80855360018601955060018501945060ff811115611500575f92508195505b505b5b8085101561154f578451611518600182611463565b6115225f83611463565b60041b1760ff811115611539575f9350505061154f565b8086535050600285019450600184019350611503565b509392505050565b5f604051905090565b5f5ffd5b5f5ffd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61159c81611568565b81146115a6575f5ffd5b50565b5f813590506115b781611593565b92915050565b5f602082840312156115d2576115d1611560565b5b5f6115df848285016115a9565b91505092915050565b5f8115159050919050565b6115fc816115e8565b82525050565b5f6020820190506116155f8301846115f3565b92915050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f84011261163c5761163b61161b565b5b8235905067ffffffffffffffff8111156116595761165861161f565b5b60208301915083600182028301111561167557611674611623565b5b9250929050565b5f5f6020838503121561169257611691611560565b5b5f83013567ffffffffffffffff8111156116af576116ae611564565b5b6116bb85828601611627565b92509250509250929050565b5f819050919050565b6116d9816116c7565b81146116e3575f5ffd5b50565b5f813590506116f4816116d0565b92915050565b5f6020828403121561170f5761170e611560565b5b5f61171c848285016116e6565b91505092915050565b61172e816116c7565b82525050565b5f6020820190506117475f830184611725565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6117768261174d565b9050919050565b6117868161176c565b8114611790575f5ffd5b50565b5f813590506117a18161177d565b92915050565b5f5f604083850312156117bd576117bc611560565b5b5f6117ca858286016116e6565b92505060206117db85828601611793565b9150509250929050565b5f819050919050565b6117f7816117e5565b8114611801575f5ffd5b50565b5f81359050611812816117ee565b92915050565b5f6020828403121561182d5761182c611560565b5b5f61183a84828501611804565b91505092915050565b5f5f6040838503121561185957611858611560565b5b5f61186685828601611793565b9250506020611877858286016116e6565b9150509250929050565b61188a816117e5565b82525050565b5f6020820190506118a35f830184611881565b92915050565b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6118f3826118ad565b810181811067ffffffffffffffff82111715611912576119116118bd565b5b80604052505050565b5f611924611557565b905061193082826118ea565b919050565b5f67ffffffffffffffff82111561194f5761194e6118bd565b5b611958826118ad565b9050602081019050919050565b828183375f83830152505050565b5f61198561198084611935565b61191b565b9050828152602081018484840111156119a1576119a06118a9565b5b6119ac848285611965565b509392505050565b5f82601f8301126119c8576119c761161b565b5b81356119d8848260208601611973565b91505092915050565b5f602082840312156119f6576119f5611560565b5b5f82013567ffffffffffffffff811115611a1357611a12611564565b5b611a1f848285016119b4565b91505092915050565b5f67ffffffffffffffff821115611a4257611a416118bd565b5b611a4b826118ad565b9050602081019050919050565b5f611a6a611a6584611a28565b61191b565b905082815260208101848484011115611a8657611a856118a9565b5b611a91848285611965565b509392505050565b5f82601f830112611aad57611aac61161b565b5b8135611abd848260208601611a58565b91505092915050565b5f5f60408385031215611adc57611adb611560565b5b5f611ae985828601611793565b925050602083013567ffffffffffffffff811115611b0a57611b09611564565b5b611b1685828601611a99565b9150509250929050565b5f5f83601f840112611b3557611b3461161b565b5b8235905067ffffffffffffffff811115611b5257611b5161161f565b5b602083019150836001820283011115611b6e57611b6d611623565b5b9250929050565b5f5f5f5f60408587031215611b8d57611b8c611560565b5b5f85013567ffffffffffffffff811115611baa57611ba9611564565b5b611bb687828801611627565b9450945050602085013567ffffffffffffffff811115611bd957611bd8611564565b5b611be587828801611b20565b925092505092959194509250565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f611c2582611bf3565b611c2f8185611bfd565b9350611c3f818560208601611c0d565b611c48816118ad565b840191505092915050565b5f6020820190508181035f830152611c6b8184611c1b565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611caa826117e5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611cdc57611cdb611c73565b5b600182019050919050565b5f82825260208201905092915050565b5f611d028385611ce7565b9350611d0f838584611965565b611d18836118ad565b840190509392505050565b5f6040820190508181035f830152611d3c818587611cf7565b9050611d4b6020830184611881565b949350505050565b5f604082019050611d665f830185611881565b611d736020830184611881565b9392505050565b5f81905092915050565b50565b5f611d925f83611d7a565b9150611d9d82611d84565b5f82019050919050565b5f611db182611d87565b9150819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611dff57607f821691505b602082108103611e1257611e11611dbb565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302611e747fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611e39565b611e7e8683611e39565b95508019841693508086168417925050509392505050565b5f819050919050565b5f611eb9611eb4611eaf846117e5565b611e96565b6117e5565b9050919050565b5f819050919050565b611ed283611e9f565b611ee6611ede82611ec0565b848454611e45565b825550505050565b5f5f905090565b611efd611eee565b611f08818484611ec9565b505050565b5b81811015611f2b57611f205f82611ef5565b600181019050611f0e565b5050565b601f821115611f7057611f4181611e18565b611f4a84611e2a565b81016020851015611f59578190505b611f6d611f6585611e2a565b830182611f0d565b50505b505050565b5f82821c905092915050565b5f611f905f1984600802611f75565b1980831691505092915050565b5f611fa88383611f81565b9150826002028217905092915050565b611fc182611bf3565b67ffffffffffffffff811115611fda57611fd96118bd565b5b611fe48254611de8565b611fef828285611f2f565b5f60209050601f831160018114612020575f841561200e578287015190505b6120188582611f9d565b86555061207f565b601f19841661202e86611e18565b5f5b8281101561205557848901518255600182019150602085019450602081019050612030565b86831015612072578489015161206e601f891682611f81565b8355505b6001600288020188555050505b505050505050565b5f6040820190508181035f83015261209f8185611c1b565b905081810360208301526120b38184611c1b565b90509392505050565b5f819050815f5260205f209050919050565b5f81546120da81611de8565b6120e48186611d7a565b9450600182165f81146120fe576001811461211357612145565b60ff1983168652811515820286019350612145565b61211c856120bc565b5f5b8381101561213d5781548189015260018201915060208101905061211e565b838801955050505b50505092915050565b5f61215982846120ce565b915081905092915050565b5f61216f8385611d7a565b935061217c838584611965565b82840190509392505050565b5f612194828486612164565b91508190509392505050565b5f81519050919050565b5f6121b4826121a0565b6121be8185611ce7565b93506121ce818560208601611c0d565b6121d7816118ad565b840191505092915050565b5f6020820190508181035f8301526121fa81846121aa565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612239826117e5565b9150612244836117e5565b92508261225457612253612202565b5b828204905092915050565b5f612269826117e5565b9150612274836117e5565b925082820390508181111561228c5761228b611c73565b5b92915050565b5f61229c826117e5565b91506122a7836117e5565b9250826122b7576122b6612202565b5b828206905092915050565b5f6122cc826117e5565b91506122d7836117e5565b92508282019050808211156122ef576122ee611c73565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b61232b8161176c565b82525050565b5f6040820190506123445f830185612322565b6123516020830184611725565b939250505056fea26469706673582212204ba2a5b4bd046986b805fa811e1097a261873def3f312414ac7c50ef4358820864736f6c634300081b0033
Deployed Bytecode
0x608060405260043610610108575f3560e01c8063730176991161009457806391d148541161006357806391d148541461035e578063a217fddf1461039a578063a34a80cd146103c4578063bc1e8001146103ee578063d547741f1461042a57610108565b8063730176991461029457806375b238fc146102bc57806381b1c26a146102e6578063876d2cd11461032257610108565b806336568abe116100db57806336568abe146101c85780633a33e13d146101f05780633ccfd60b1461021857806340cd39f11461022e578063603c2a941461026a57610108565b806301ffc9a71461010c57806310aaaf0f14610148578063248a9ca3146101645780632f2ff15d146101a0575b5f5ffd5b348015610117575f5ffd5b50610132600480360381019061012d91906115bd565b610452565b60405161013f9190611602565b60405180910390f35b610162600480360381019061015d919061167c565b6104cb565b005b34801561016f575f5ffd5b5061018a600480360381019061018591906116fa565b6106de565b6040516101979190611734565b60405180910390f35b3480156101ab575f5ffd5b506101c660048036038101906101c191906117a7565b6106fa565b005b3480156101d3575f5ffd5b506101ee60048036038101906101e991906117a7565b61071c565b005b3480156101fb575f5ffd5b5061021660048036038101906102119190611818565b610797565b005b348015610223575f5ffd5b5061022c610828565b005b348015610239575f5ffd5b50610254600480360381019061024f9190611843565b610916565b6040516102619190611602565b60405180910390f35b348015610275575f5ffd5b5061027e610940565b60405161028b9190611890565b60405180910390f35b34801561029f575f5ffd5b506102ba60048036038101906102b591906119e1565b610946565b005b3480156102c7575f5ffd5b506102d0610a66565b6040516102dd9190611734565b60405180910390f35b3480156102f1575f5ffd5b5061030c60048036038101906103079190611ac6565b610aa6565b6040516103199190611602565b60405180910390f35b34801561032d575f5ffd5b5061034860048036038101906103439190611b75565b610b16565b6040516103559190611c53565b60405180910390f35b348015610369575f5ffd5b50610384600480360381019061037f91906117a7565b610bd8565b6040516103919190611602565b60405180910390f35b3480156103a5575f5ffd5b506103ae610c3b565b6040516103bb9190611734565b60405180910390f35b3480156103cf575f5ffd5b506103d8610c41565b6040516103e59190611c53565b60405180910390f35b3480156103f9575f5ffd5b50610414600480360381019061040f91906116fa565b610ccd565b6040516104219190611890565b60405180910390f35b348015610435575f5ffd5b50610450600480360381019061044b91906117a7565b610ce2565b005b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104c457506104c382610d04565b5b9050919050565b6002543414610506576040517fcd1c886700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61055483838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050505f610d6d565b905060045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8281526020019081526020015f205f9054906101000a900460ff16156105e6576040517ffb5f99e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035f8281526020019081526020015f205f81548092919061060790611ca0565b9190505550600160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f205f6101000a81548160ff0219169083151502179055505f60035f8381526020019081526020015f205490503373ffffffffffffffffffffffffffffffffffffffff16827f7e1e31d0b49333230209b35969c2393dd58057967c41207a7e5d046acce63ff58686856040516106d093929190611d23565b60405180910390a350505050565b5f5f5f8381526020019081526020015f20600101549050919050565b610703826106de565b61070c81610df5565b6107168383610e09565b50505050565b610724610ef2565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610788576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107928282610ef9565b505050565b6040518060400160405280600a81526020017f41444d494e5f524f4c4500000000000000000000000000000000000000000000815250805190602001206107dd81610df5565b5f6002549050826002819055507fa268306b2231ce2664b48730f5fe3c67f8ecf87f63521eb2743ebd592d03be82818460405161081b929190611d53565b60405180910390a1505050565b6040518060400160405280600a81526020017f41444d494e5f524f4c45000000000000000000000000000000000000000000008152508051906020012061086e81610df5565b5f4790505f3373ffffffffffffffffffffffffffffffffffffffff168260405161089790611da7565b5f6040518083038185875af1925050503d805f81146108d1576040519150601f19603f3d011682016040523d82523d5f602084013e6108d6565b606091505b5050905080610911576040517f27fcd9d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b6004602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b60025481565b6040518060400160405280600a81526020017f41444d494e5f524f4c45000000000000000000000000000000000000000000008152508051906020012061098c81610df5565b5f6001805461099a90611de8565b80601f01602080910402602001604051908101604052809291908181526020018280546109c690611de8565b8015610a115780601f106109e857610100808354040283529160200191610a11565b820191905f5260205f20905b8154815290600101906020018083116109f457829003601f168201915b505050505090508260019081610a279190611fb8565b507f7fe974f2973c673d1c46952ceeda43623e52d7176d20c92eebd4d990a014b7428184604051610a59929190612087565b60405180910390a1505050565b6040518060400160405280600a81526020017f41444d494e5f524f4c45000000000000000000000000000000000000000000008152508051906020012081565b5f5f610ab2835f610d6d565b905060045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8281526020019081526020015f205f9054906101000a900460ff1691505092915050565b60606001604051610b27919061214e565b60405180910390208383604051610b3f929190612188565b604051809103902014610b625760405180602001604052805f8152509050610bd0565b5f610bb086868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050505f610d6d565b9050610bcc60035f8381526020019081526020015f2054610fe2565b9150505b949350505050565b5f5f5f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f5f1b81565b60018054610c4e90611de8565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7a90611de8565b8015610cc55780601f10610c9c57610100808354040283529160200191610cc5565b820191905f5260205f20905b815481529060010190602001808311610ca857829003601f168201915b505050505081565b6003602052805f5260405f205f915090505481565b610ceb826106de565b610cf481610df5565b610cfe8383610ef9565b50505050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f610d78838361113b565b80935081925050505f5f1b8103610dd35782518214610dce57826040517fba4adc23000000000000000000000000000000000000000000000000000000008152600401610dc591906121e2565b60405180910390fd5b610def565b5f610dde8484610d6d565b9050805f528160205260405f209150505b92915050565b610e0681610e01610ef2565b611390565b50565b5f610e148383610bd8565b610ee85760015f5f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550610e85610ef2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019050610eec565b5f90505b92915050565b5f33905090565b5f610f048383610bd8565b15610fd8575f5f5f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550610f75610ef2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a460019050610fdc565b5f90505b92915050565b60605f8203611028576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611136565b5f8290505f5b5f821461105757808061104090611ca0565b915050600a82611050919061222f565b915061102e565b5f8167ffffffffffffffff811115611072576110716118bd565b5b6040519080825280601f01601f1916602001820160405280156110a45781602001600182028036833780820191505090505b5090505b5f851461112f576001826110bc919061225f565b9150600a856110cb9190612292565b60306110d791906122c2565b60f81b8183815181106110ed576110ec6122f5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a85611128919061222f565b94506110a8565b8093505050505b919050565b5f5f8351831061118257836040517fba4adc2300000000000000000000000000000000000000000000000000000000815260040161117991906121e2565b60405180910390fd5b5f84848061118f90611ca0565b9550815181106111a2576111a16122f5565b5b602001015160f81c60f81b60f81c60ff16905080846111c191906122c2565b9150845182111561120957846040517fba4adc2300000000000000000000000000000000000000000000000000000000815260040161120091906121e2565b60405180910390fd5b60428114801561127757507f5b00000000000000000000000000000000000000000000000000000000000000858581518110611248576112476122f5565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80156112ed57507f5d00000000000000000000000000000000000000000000000000000000000000856001846112ad919061225f565b815181106112be576112bd6122f5565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b15611374575f6113168660018761130491906122c2565b600186611311919061225f565b6113e1565b809250819550505080158061132c57505f5f1b84145b1561136e57856040517fba4adc2300000000000000000000000000000000000000000000000000000000815260040161136591906121e2565b60405180910390fd5b50611388565b5f81111561138757806020858701012092505b5b509250929050565b61139a8282610bd8565b6113dd5780826040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526004016113d4929190612331565b60405180910390fd5b5050565b5f5f838310156113f7575f5f9091509150611455565b5f8484611404919061225f565b905060408111806114155750855184115b15611428575f5f1b5f9250925050611455565b5f856020880101905061143c815f8461145d565b92506001820160011c6020035f518160031b1c94505050505b935093915050565b5f6114c6565b5f81831a9150603a8210602f83111615611482576030820390506114c0565b6047821060408311161561149e57600a604183030190506114c0565b606782106060831116156114ba57600a606183030190506114c0565b61010090505b92915050565b600190508184016001831615611502576114e15f8651611463565b80855360018601955060018501945060ff811115611500575f92508195505b505b5b8085101561154f578451611518600182611463565b6115225f83611463565b60041b1760ff811115611539575f9350505061154f565b8086535050600285019450600184019350611503565b509392505050565b5f604051905090565b5f5ffd5b5f5ffd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61159c81611568565b81146115a6575f5ffd5b50565b5f813590506115b781611593565b92915050565b5f602082840312156115d2576115d1611560565b5b5f6115df848285016115a9565b91505092915050565b5f8115159050919050565b6115fc816115e8565b82525050565b5f6020820190506116155f8301846115f3565b92915050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f84011261163c5761163b61161b565b5b8235905067ffffffffffffffff8111156116595761165861161f565b5b60208301915083600182028301111561167557611674611623565b5b9250929050565b5f5f6020838503121561169257611691611560565b5b5f83013567ffffffffffffffff8111156116af576116ae611564565b5b6116bb85828601611627565b92509250509250929050565b5f819050919050565b6116d9816116c7565b81146116e3575f5ffd5b50565b5f813590506116f4816116d0565b92915050565b5f6020828403121561170f5761170e611560565b5b5f61171c848285016116e6565b91505092915050565b61172e816116c7565b82525050565b5f6020820190506117475f830184611725565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6117768261174d565b9050919050565b6117868161176c565b8114611790575f5ffd5b50565b5f813590506117a18161177d565b92915050565b5f5f604083850312156117bd576117bc611560565b5b5f6117ca858286016116e6565b92505060206117db85828601611793565b9150509250929050565b5f819050919050565b6117f7816117e5565b8114611801575f5ffd5b50565b5f81359050611812816117ee565b92915050565b5f6020828403121561182d5761182c611560565b5b5f61183a84828501611804565b91505092915050565b5f5f6040838503121561185957611858611560565b5b5f61186685828601611793565b9250506020611877858286016116e6565b9150509250929050565b61188a816117e5565b82525050565b5f6020820190506118a35f830184611881565b92915050565b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6118f3826118ad565b810181811067ffffffffffffffff82111715611912576119116118bd565b5b80604052505050565b5f611924611557565b905061193082826118ea565b919050565b5f67ffffffffffffffff82111561194f5761194e6118bd565b5b611958826118ad565b9050602081019050919050565b828183375f83830152505050565b5f61198561198084611935565b61191b565b9050828152602081018484840111156119a1576119a06118a9565b5b6119ac848285611965565b509392505050565b5f82601f8301126119c8576119c761161b565b5b81356119d8848260208601611973565b91505092915050565b5f602082840312156119f6576119f5611560565b5b5f82013567ffffffffffffffff811115611a1357611a12611564565b5b611a1f848285016119b4565b91505092915050565b5f67ffffffffffffffff821115611a4257611a416118bd565b5b611a4b826118ad565b9050602081019050919050565b5f611a6a611a6584611a28565b61191b565b905082815260208101848484011115611a8657611a856118a9565b5b611a91848285611965565b509392505050565b5f82601f830112611aad57611aac61161b565b5b8135611abd848260208601611a58565b91505092915050565b5f5f60408385031215611adc57611adb611560565b5b5f611ae985828601611793565b925050602083013567ffffffffffffffff811115611b0a57611b09611564565b5b611b1685828601611a99565b9150509250929050565b5f5f83601f840112611b3557611b3461161b565b5b8235905067ffffffffffffffff811115611b5257611b5161161f565b5b602083019150836001820283011115611b6e57611b6d611623565b5b9250929050565b5f5f5f5f60408587031215611b8d57611b8c611560565b5b5f85013567ffffffffffffffff811115611baa57611ba9611564565b5b611bb687828801611627565b9450945050602085013567ffffffffffffffff811115611bd957611bd8611564565b5b611be587828801611b20565b925092505092959194509250565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f611c2582611bf3565b611c2f8185611bfd565b9350611c3f818560208601611c0d565b611c48816118ad565b840191505092915050565b5f6020820190508181035f830152611c6b8184611c1b565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611caa826117e5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611cdc57611cdb611c73565b5b600182019050919050565b5f82825260208201905092915050565b5f611d028385611ce7565b9350611d0f838584611965565b611d18836118ad565b840190509392505050565b5f6040820190508181035f830152611d3c818587611cf7565b9050611d4b6020830184611881565b949350505050565b5f604082019050611d665f830185611881565b611d736020830184611881565b9392505050565b5f81905092915050565b50565b5f611d925f83611d7a565b9150611d9d82611d84565b5f82019050919050565b5f611db182611d87565b9150819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611dff57607f821691505b602082108103611e1257611e11611dbb565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302611e747fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611e39565b611e7e8683611e39565b95508019841693508086168417925050509392505050565b5f819050919050565b5f611eb9611eb4611eaf846117e5565b611e96565b6117e5565b9050919050565b5f819050919050565b611ed283611e9f565b611ee6611ede82611ec0565b848454611e45565b825550505050565b5f5f905090565b611efd611eee565b611f08818484611ec9565b505050565b5b81811015611f2b57611f205f82611ef5565b600181019050611f0e565b5050565b601f821115611f7057611f4181611e18565b611f4a84611e2a565b81016020851015611f59578190505b611f6d611f6585611e2a565b830182611f0d565b50505b505050565b5f82821c905092915050565b5f611f905f1984600802611f75565b1980831691505092915050565b5f611fa88383611f81565b9150826002028217905092915050565b611fc182611bf3565b67ffffffffffffffff811115611fda57611fd96118bd565b5b611fe48254611de8565b611fef828285611f2f565b5f60209050601f831160018114612020575f841561200e578287015190505b6120188582611f9d565b86555061207f565b601f19841661202e86611e18565b5f5b8281101561205557848901518255600182019150602085019450602081019050612030565b86831015612072578489015161206e601f891682611f81565b8355505b6001600288020188555050505b505050505050565b5f6040820190508181035f83015261209f8185611c1b565b905081810360208301526120b38184611c1b565b90509392505050565b5f819050815f5260205f209050919050565b5f81546120da81611de8565b6120e48186611d7a565b9450600182165f81146120fe576001811461211357612145565b60ff1983168652811515820286019350612145565b61211c856120bc565b5f5b8381101561213d5781548189015260018201915060208101905061211e565b838801955050505b50505092915050565b5f61215982846120ce565b915081905092915050565b5f61216f8385611d7a565b935061217c838584611965565b82840190509392505050565b5f612194828486612164565b91508190509392505050565b5f81519050919050565b5f6121b4826121a0565b6121be8185611ce7565b93506121ce818560208601611c0d565b6121d7816118ad565b840191505092915050565b5f6020820190508181035f8301526121fa81846121aa565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612239826117e5565b9150612244836117e5565b92508261225457612253612202565b5b828204905092915050565b5f612269826117e5565b9150612274836117e5565b925082820390508181111561228c5761228b611c73565b5b92915050565b5f61229c826117e5565b91506122a7836117e5565b9250826122b7576122b6612202565b5b828206905092915050565b5f6122cc826117e5565b91506122d7836117e5565b92508282019050808211156122ef576122ee611c73565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b61232b8161176c565b82525050565b5f6040820190506123445f830185612322565b6123516020830184611725565b939250505056fea26469706673582212204ba2a5b4bd046986b805fa811e1097a261873def3f312414ac7c50ef4358820864736f6c634300081b0033
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.34
Net Worth in ETH
0.000166
Token Allocations
ETH
100.00%
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| BASE | 100.00% | $2,028.53 | 0.000166 | $0.336737 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.