Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 160 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Prove And Claim | 9293797 | 1710 days ago | IN | 0 ETH | 0.00534799 | ||||
Claim | 9287688 | 1711 days ago | IN | 0 ETH | 0.00031498 | ||||
Claim | 9287248 | 1711 days ago | IN | 0 ETH | 0.00041098 | ||||
Prove And Claim | 9273331 | 1713 days ago | IN | 0 ETH | 0.00295336 | ||||
Claim | 9252888 | 1716 days ago | IN | 0 ETH | 0.00031738 | ||||
Claim | 9247481 | 1717 days ago | IN | 0 ETH | 0.00033838 | ||||
Prove And Claim | 9241484 | 1718 days ago | IN | 0 ETH | 0.00389662 | ||||
Prove And Claim | 9090516 | 1746 days ago | IN | 0 ETH | 0.00146177 | ||||
Prove And Claim | 9044938 | 1754 days ago | IN | 0 ETH | 0.00141023 | ||||
Prove And Claim | 9005157 | 1761 days ago | IN | 0 ETH | 0.01374303 | ||||
Prove And Claim | 8987717 | 1764 days ago | IN | 0 ETH | 0.01170235 | ||||
Prove And Claim | 8982346 | 1765 days ago | IN | 0 ETH | 0.0039311 | ||||
Prove And Claim | 8982281 | 1765 days ago | IN | 0 ETH | 0.00923623 | ||||
Prove And Claim | 8980486 | 1765 days ago | IN | 0 ETH | 0.03148598 | ||||
Prove And Claim | 8966665 | 1767 days ago | IN | 0 ETH | 0.01375752 | ||||
Prove And Claim | 8948507 | 1770 days ago | IN | 0 ETH | 0.00273974 | ||||
Prove And Claim | 8927937 | 1774 days ago | IN | 0 ETH | 0.00124322 | ||||
Prove And Claim | 8923239 | 1774 days ago | IN | 0 ETH | 0.01311978 | ||||
Prove And Claim | 8877331 | 1782 days ago | IN | 0 ETH | 0.00144441 | ||||
Prove And Claim | 8749922 | 1802 days ago | IN | 0 ETH | 0.00557422 | ||||
Claim | 8535091 | 1836 days ago | IN | 0 ETH | 0.00185306 | ||||
Prove And Claim | 8481999 | 1844 days ago | IN | 0 ETH | 0.01914979 | ||||
Prove And Claim | 8433283 | 1852 days ago | IN | 0 ETH | 0.00452544 | ||||
Prove And Claim | 8217059 | 1885 days ago | IN | 0 ETH | 0.00519833 | ||||
Prove And Claim | 8169878 | 1893 days ago | IN | 0 ETH | 0.00240703 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
DNSRegistrar
Compiler Version
v0.4.24+commit.e67f0147
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2018-08-29 */ pragma solidity ^0.4.23; // File: @ensdomains/dnssec-oracle/contracts/BytesUtils.sol library BytesUtils { /* * @dev Returns the keccak-256 hash of a byte range. * @param self The byte string to hash. * @param offset The position to start hashing at. * @param len The number of bytes to hash. * @return The hash of the byte range. */ function keccak(bytes memory self, uint offset, uint len) internal pure returns (bytes32 ret) { require(offset + len <= self.length); assembly { ret := sha3(add(add(self, 32), offset), len) } } /* * @dev Returns a positive number if `other` comes lexicographically after * `self`, a negative number if it comes before, or zero if the * contents of the two bytes are equal. * @param self The first bytes to compare. * @param other The second bytes to compare. * @return The result of the comparison. */ function compare(bytes memory self, bytes memory other) internal pure returns (int) { return compare(self, 0, self.length, other, 0, other.length); } /* * @dev Returns a positive number if `other` comes lexicographically after * `self`, a negative number if it comes before, or zero if the * contents of the two bytes are equal. Comparison is done per-rune, * on unicode codepoints. * @param self The first bytes to compare. * @param offset The offset of self. * @param len The length of self. * @param other The second bytes to compare. * @param otheroffset The offset of the other string. * @param otherlen The length of the other string. * @return The result of the comparison. */ function compare(bytes memory self, uint offset, uint len, bytes memory other, uint otheroffset, uint otherlen) internal pure returns (int) { uint shortest = len; if (otherlen < len) shortest = otherlen; uint selfptr; uint otherptr; assembly { selfptr := add(self, add(offset, 32)) otherptr := add(other, add(otheroffset, 32)) } for (uint idx = 0; idx < shortest; idx += 32) { uint a; uint b; assembly { a := mload(selfptr) b := mload(otherptr) } if (a != b) { // Mask out irrelevant bytes and check again uint mask; if (shortest > 32) { mask = uint256(- 1); // aka 0xffffff.... } else { mask = ~(2 ** (8 * (32 - shortest + idx)) - 1); } uint diff = (a & mask) - (b & mask); if (diff != 0) return int(diff); } selfptr += 32; otherptr += 32; } return int(len) - int(otherlen); } /* * @dev Returns true if the two byte ranges are equal. * @param self The first byte range to compare. * @param offset The offset into the first byte range. * @param other The second byte range to compare. * @param otherOffset The offset into the second byte range. * @param len The number of bytes to compare * @return True if the byte ranges are equal, false otherwise. */ function equals(bytes memory self, uint offset, bytes memory other, uint otherOffset, uint len) internal pure returns (bool) { return keccak(self, offset, len) == keccak(other, otherOffset, len); } /* * @dev Returns true if the two byte ranges are equal with offsets. * @param self The first byte range to compare. * @param offset The offset into the first byte range. * @param other The second byte range to compare. * @param otherOffset The offset into the second byte range. * @return True if the byte ranges are equal, false otherwise. */ function equals(bytes memory self, uint offset, bytes memory other, uint otherOffset) internal pure returns (bool) { return keccak(self, offset, self.length - offset) == keccak(other, otherOffset, other.length - otherOffset); } /* * @dev Compares a range of 'self' to all of 'other' and returns True iff * they are equal. * @param self The first byte range to compare. * @param offset The offset into the first byte range. * @param other The second byte range to compare. * @return True if the byte ranges are equal, false otherwise. */ function equals(bytes memory self, uint offset, bytes memory other) internal pure returns (bool) { return self.length >= offset + other.length && equals(self, offset, other, 0, other.length); } /* * @dev Returns true if the two byte ranges are equal. * @param self The first byte range to compare. * @param other The second byte range to compare. * @return True if the byte ranges are equal, false otherwise. */ function equals(bytes memory self, bytes memory other) internal pure returns(bool) { return self.length == other.length && equals(self, 0, other, 0, self.length); } /* * @dev Returns the 8-bit number at the specified index of self. * @param self The byte string. * @param idx The index into the bytes * @return The specified 8 bits of the string, interpreted as an integer. */ function readUint8(bytes memory self, uint idx) internal pure returns (uint8 ret) { require(idx + 1 <= self.length); assembly { ret := and(mload(add(add(self, 1), idx)), 0xFF) } } /* * @dev Returns the 16-bit number at the specified index of self. * @param self The byte string. * @param idx The index into the bytes * @return The specified 16 bits of the string, interpreted as an integer. */ function readUint16(bytes memory self, uint idx) internal pure returns (uint16 ret) { require(idx + 2 <= self.length); assembly { ret := and(mload(add(add(self, 2), idx)), 0xFFFF) } } /* * @dev Returns the 32-bit number at the specified index of self. * @param self The byte string. * @param idx The index into the bytes * @return The specified 32 bits of the string, interpreted as an integer. */ function readUint32(bytes memory self, uint idx) internal pure returns (uint32 ret) { require(idx + 4 <= self.length); assembly { ret := and(mload(add(add(self, 4), idx)), 0xFFFFFFFF) } } /* * @dev Returns the 32 byte value at the specified index of self. * @param self The byte string. * @param idx The index into the bytes * @return The specified 32 bytes of the string. */ function readBytes32(bytes memory self, uint idx) internal pure returns (bytes32 ret) { require(idx + 32 <= self.length); assembly { ret := mload(add(add(self, 32), idx)) } } /* * @dev Returns the 32 byte value at the specified index of self. * @param self The byte string. * @param idx The index into the bytes * @return The specified 32 bytes of the string. */ function readBytes20(bytes memory self, uint idx) internal pure returns (bytes20 ret) { require(idx + 20 <= self.length); assembly { ret := and(mload(add(add(self, 32), idx)), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000) } } /* * @dev Returns the n byte value at the specified index of self. * @param self The byte string. * @param idx The index into the bytes. * @param len The number of bytes. * @return The specified 32 bytes of the string. */ function readBytesN(bytes memory self, uint idx, uint len) internal pure returns (bytes20 ret) { require(idx + len <= self.length); assembly { let mask := not(sub(exp(256, sub(32, len)), 1)) ret := and(mload(add(add(self, 32), idx)), mask) } } function memcpy(uint dest, uint src, uint len) private pure { // Copy word-length chunks while possible for (; len >= 32; len -= 32) { assembly { mstore(dest, mload(src)) } dest += 32; src += 32; } // Copy remaining bytes uint mask = 256 ** (32 - len) - 1; assembly { let srcpart := and(mload(src), not(mask)) let destpart := and(mload(dest), mask) mstore(dest, or(destpart, srcpart)) } } /* * @dev Copies a substring into a new byte string. * @param self The byte string to copy from. * @param offset The offset to start copying at. * @param len The number of bytes to copy. */ function substring(bytes memory self, uint offset, uint len) internal pure returns(bytes) { require(offset + len <= self.length); bytes memory ret = new bytes(len); uint dest; uint src; assembly { dest := add(ret, 32) src := add(add(self, 32), offset) } memcpy(dest, src, len); return ret; } // Maps characters from 0x30 to 0x7A to their base32 values. // 0xFF represents invalid characters in that range. bytes constant base32HexTable = hex'00010203040506070809FFFFFFFFFFFFFF0A0B0C0D0E0F101112131415161718191A1B1C1D1E1FFFFFFFFFFFFFFFFFFFFF0A0B0C0D0E0F101112131415161718191A1B1C1D1E1F'; /** * @dev Decodes unpadded base32 data of up to one word in length. * @param self The data to decode. * @param off Offset into the string to start at. * @param len Number of characters to decode. * @return The decoded data, left aligned. */ function base32HexDecodeWord(bytes memory self, uint off, uint len) internal pure returns(bytes32) { require(len <= 52); uint ret = 0; for(uint i = 0; i < len; i++) { byte char = self[off + i]; require(char >= 0x30 && char <= 0x7A); uint8 decoded = uint8(base32HexTable[uint(char) - 0x30]); require(decoded <= 0x20); if(i == len - 1) { break; } ret = (ret << 5) | decoded; } uint bitlen = len * 5; if(len % 8 == 0) { // Multiple of 8 characters, no padding ret = (ret << 5) | decoded; } else if(len % 8 == 2) { // Two extra characters - 1 byte ret = (ret << 3) | (decoded >> 2); bitlen -= 2; } else if(len % 8 == 4) { // Four extra characters - 2 bytes ret = (ret << 1) | (decoded >> 4); bitlen -= 4; } else if(len % 8 == 5) { // Five extra characters - 3 bytes ret = (ret << 4) | (decoded >> 1); bitlen -= 1; } else if(len % 8 == 7) { // Seven extra characters - 4 bytes ret = (ret << 2) | (decoded >> 3); bitlen -= 3; } else { revert(); } return bytes32(ret << (256 - bitlen)); } } // File: @ensdomains/dnssec-oracle/contracts/DNSSEC.sol interface DNSSEC { event AlgorithmUpdated(uint8 id, address addr); event DigestUpdated(uint8 id, address addr); event NSEC3DigestUpdated(uint8 id, address addr); event RRSetUpdated(bytes name, bytes rrset); function submitRRSets(bytes memory data, bytes memory proof) public returns (bytes); function submitRRSet(bytes memory input, bytes memory sig, bytes memory proof) public returns(bytes memory rrs); function deleteRRSet(uint16 deleteType, bytes deleteName, bytes memory nsec, bytes memory sig, bytes memory proof) public; function rrdata(uint16 dnstype, bytes memory name) public view returns (uint32, uint64, bytes20); } // File: @ensdomains/buffer/contracts/Buffer.sol /** * @dev A library for working with mutable byte buffers in Solidity. * * Byte buffers are mutable and expandable, and provide a variety of primitives * for writing to them. At any time you can fetch a bytes object containing the * current contents of the buffer. The bytes object should not be stored between * operations, as it may change due to resizing of the buffer. */ library Buffer { /** * @dev Represents a mutable buffer. Buffers have a current value (buf) and * a capacity. The capacity may be longer than the current value, in * which case it can be extended without the need to allocate more memory. */ struct buffer { bytes buf; uint capacity; } /** * @dev Initializes a buffer with an initial capacity. * @param buf The buffer to initialize. * @param capacity The number of bytes of space to allocate the buffer. * @return The buffer, for chaining. */ function init(buffer memory buf, uint capacity) internal pure returns(buffer memory) { if (capacity % 32 != 0) { capacity += 32 - (capacity % 32); } // Allocate space for the buffer data buf.capacity = capacity; assembly { let ptr := mload(0x40) mstore(buf, ptr) mstore(ptr, 0) mstore(0x40, add(ptr, capacity)) } return buf; } /** * @dev Initializes a new buffer from an existing bytes object. * Changes to the buffer may mutate the original value. * @param b The bytes object to initialize the buffer with. * @return A new buffer. */ function fromBytes(bytes b) internal pure returns(buffer memory) { buffer memory buf; buf.buf = b; buf.capacity = b.length; return buf; } function resize(buffer memory buf, uint capacity) private pure { bytes memory oldbuf = buf.buf; init(buf, capacity); append(buf, oldbuf); } function max(uint a, uint b) private pure returns(uint) { if (a > b) { return a; } return b; } /** * @dev Sets buffer length to 0. * @param buf The buffer to truncate. * @return The original buffer, for chaining.. */ function truncate(buffer memory buf) internal pure returns (buffer memory) { assembly { let bufptr := mload(buf) mstore(bufptr, 0) } return buf; } /** * @dev Writes a byte string to a buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param off The start offset to write to. * @param data The data to append. * @param len The number of bytes to copy. * @return The original buffer, for chaining. */ function write(buffer memory buf, uint off, bytes data, uint len) internal pure returns(buffer memory) { require(len <= data.length); if (off + len + buf.buf.length > buf.capacity) { resize(buf, max(buf.capacity, len + off) * 2); } uint dest; uint src; assembly { // Memory address of the buffer data let bufptr := mload(buf) // Length of existing buffer data let buflen := mload(bufptr) // Start address = buffer address + offset + sizeof(buffer length) dest := add(add(bufptr, 32), off) // Update buffer length if we're extending it if gt(add(len, off), buflen) { mstore(bufptr, add(len, off)) } src := add(data, 32) } // Copy word-length chunks while possible for (; len >= 32; len -= 32) { assembly { mstore(dest, mload(src)) } dest += 32; src += 32; } // Copy remaining bytes uint mask = 256 ** (32 - len) - 1; assembly { let srcpart := and(mload(src), not(mask)) let destpart := and(mload(dest), mask) mstore(dest, or(destpart, srcpart)) } return buf; } /** * @dev Appends a byte string to a buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @param len The number of bytes to copy. * @return The original buffer, for chaining. */ function append(buffer memory buf, bytes data, uint len) internal pure returns (buffer memory) { return write(buf, buf.buf.length, data, len); } /** * @dev Appends a byte string to a buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @return The original buffer, for chaining. */ function append(buffer memory buf, bytes data) internal pure returns (buffer memory) { return write(buf, buf.buf.length, data, data.length); } /** * @dev Writes a byte to the buffer. Resizes if doing so would exceed the * capacity of the buffer. * @param buf The buffer to append to. * @param off The offset to write the byte at. * @param data The data to append. * @return The original buffer, for chaining. */ function writeUint8(buffer memory buf, uint off, uint8 data) internal pure returns(buffer memory) { if (off > buf.capacity) { resize(buf, buf.capacity * 2); } assembly { // Memory address of the buffer data let bufptr := mload(buf) // Length of existing buffer data let buflen := mload(bufptr) // Address = buffer address + sizeof(buffer length) + off let dest := add(add(bufptr, off), 32) mstore8(dest, data) // Update buffer length if we extended it if eq(off, buflen) { mstore(bufptr, add(buflen, 1)) } } return buf; } /** * @dev Appends a byte to the buffer. Resizes if doing so would exceed the * capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @return The original buffer, for chaining. */ function appendUint8(buffer memory buf, uint8 data) internal pure returns(buffer memory) { return writeUint8(buf, buf.buf.length, data); } /** * @dev Writes up to 32 bytes to the buffer. Resizes if doing so would * exceed the capacity of the buffer. * @param buf The buffer to append to. * @param off The offset to write at. * @param data The data to append. * @param len The number of bytes to write (left-aligned). * @return The original buffer, for chaining. */ function write(buffer memory buf, uint off, bytes32 data, uint len) private pure returns(buffer memory) { if (len + off > buf.capacity) { resize(buf, max(buf.capacity, len) * 2); } uint mask = 256 ** len - 1; // Right-align data data = data >> (8 * (32 - len)); assembly { // Memory address of the buffer data let bufptr := mload(buf) // Address = buffer address + sizeof(buffer length) + off + len let dest := add(add(bufptr, off), len) mstore(dest, or(and(mload(dest), not(mask)), data)) // Update buffer length if we extended it if gt(add(off, len), mload(bufptr)) { mstore(bufptr, add(off, len)) } } return buf; } /** * @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the * capacity of the buffer. * @param buf The buffer to append to. * @param off The offset to write at. * @param data The data to append. * @return The original buffer, for chaining. */ function writeBytes20(buffer memory buf, uint off, bytes20 data) internal pure returns (buffer memory) { return write(buf, off, bytes32(data), 20); } /** * @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @return The original buffer, for chhaining. */ function appendBytes20(buffer memory buf, bytes20 data) internal pure returns (buffer memory) { return write(buf, buf.buf.length, bytes32(data), 20); } /** * @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @return The original buffer, for chaining. */ function appendBytes32(buffer memory buf, bytes32 data) internal pure returns (buffer memory) { return write(buf, buf.buf.length, data, 32); } /** * @dev Writes an integer to the buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param off The offset to write at. * @param data The data to append. * @param len The number of bytes to write (right-aligned). * @return The original buffer, for chaining. */ function writeInt(buffer memory buf, uint off, uint data, uint len) private pure returns(buffer memory) { if (len + off > buf.capacity) { resize(buf, max(buf.capacity, len + off) * 2); } uint mask = 256 ** len - 1; assembly { // Memory address of the buffer data let bufptr := mload(buf) // Address = buffer address + off + sizeof(buffer length) + len let dest := add(add(bufptr, off), len) mstore(dest, or(and(mload(dest), not(mask)), data)) // Update buffer length if we extended it if gt(add(off, len), mload(bufptr)) { mstore(bufptr, add(off, len)) } } return buf; } } // File: @ensdomains/dnssec-oracle/contracts/RRUtils.sol /** * @dev RRUtils is a library that provides utilities for parsing DNS resource records. */ library RRUtils { using BytesUtils for *; using Buffer for *; /** * @dev Returns the number of bytes in the DNS name at 'offset' in 'self'. * @param self The byte array to read a name from. * @param offset The offset to start reading at. * @return The length of the DNS name at 'offset', in bytes. */ function nameLength(bytes memory self, uint offset) internal pure returns(uint) { uint idx = offset; while (true) { assert(idx < self.length); uint labelLen = self.readUint8(idx); idx += labelLen + 1; if (labelLen == 0) { break; } } return idx - offset; } /** * @dev Returns a DNS format name at the specified offset of self. * @param self The byte array to read a name from. * @param offset The offset to start reading at. * @return The name. */ function readName(bytes memory self, uint offset) internal pure returns(bytes memory ret) { uint len = nameLength(self, offset); return self.substring(offset, len); } /** * @dev Returns the number of labels in the DNS name at 'offset' in 'self'. * @param self The byte array to read a name from. * @param offset The offset to start reading at. * @return The number of labels in the DNS name at 'offset', in bytes. */ function labelCount(bytes memory self, uint offset) internal pure returns(uint) { uint count = 0; while (true) { assert(offset < self.length); uint labelLen = self.readUint8(offset); offset += labelLen + 1; if (labelLen == 0) { break; } count += 1; } return count; } /** * @dev An iterator over resource records. */ struct RRIterator { bytes data; uint offset; uint16 dnstype; uint16 class; uint32 ttl; uint rdataOffset; uint nextOffset; } /** * @dev Begins iterating over resource records. * @param self The byte string to read from. * @param offset The offset to start reading at. * @return An iterator object. */ function iterateRRs(bytes memory self, uint offset) internal pure returns (RRIterator memory ret) { ret.data = self; ret.nextOffset = offset; next(ret); } /** * @dev Returns true iff there are more RRs to iterate. * @param iter The iterator to check. * @return True iff the iterator has finished. */ function done(RRIterator memory iter) internal pure returns(bool) { return iter.offset >= iter.data.length; } /** * @dev Moves the iterator to the next resource record. * @param iter The iterator to advance. */ function next(RRIterator memory iter) internal pure { iter.offset = iter.nextOffset; if (iter.offset >= iter.data.length) { return; } // Skip the name uint off = iter.offset + nameLength(iter.data, iter.offset); // Read type, class, and ttl iter.dnstype = iter.data.readUint16(off); off += 2; iter.class = iter.data.readUint16(off); off += 2; iter.ttl = iter.data.readUint32(off); off += 4; // Read the rdata uint rdataLength = iter.data.readUint16(off); off += 2; iter.rdataOffset = off; iter.nextOffset = off + rdataLength; } /** * @dev Returns the name of the current record. * @param iter The iterator. * @return A new bytes object containing the owner name from the RR. */ function name(RRIterator memory iter) internal pure returns(bytes memory) { return iter.data.substring(iter.offset, nameLength(iter.data, iter.offset)); } /** * @dev Returns the rdata portion of the current record. * @param iter The iterator. * @return A new bytes object containing the RR's RDATA. */ function rdata(RRIterator memory iter) internal pure returns(bytes memory) { return iter.data.substring(iter.rdataOffset, iter.nextOffset - iter.rdataOffset); } /** * @dev Checks if a given RR type exists in a type bitmap. * @param self The byte string to read the type bitmap from. * @param offset The offset to start reading at. * @param rrtype The RR type to check for. * @return True if the type is found in the bitmap, false otherwise. */ function checkTypeBitmap(bytes memory self, uint offset, uint16 rrtype) internal pure returns (bool) { uint8 typeWindow = uint8(rrtype >> 8); uint8 windowByte = uint8((rrtype & 0xff) / 8); uint8 windowBitmask = uint8(uint8(1) << (uint8(7) - uint8(rrtype & 0x7))); for (uint off = offset; off < self.length;) { uint8 window = self.readUint8(off); uint8 len = self.readUint8(off + 1); if (typeWindow < window) { // We've gone past our window; it's not here. return false; } else if (typeWindow == window) { // Check this type bitmap if (len * 8 <= windowByte) { // Our type is past the end of the bitmap return false; } return (self.readUint8(off + windowByte + 2) & windowBitmask) != 0; } else { // Skip this type bitmap off += len + 2; } } return false; } function compareNames(bytes memory self, bytes memory other) internal pure returns (int) { if (self.equals(other)) { return 0; } uint off; uint otheroff; uint prevoff; uint otherprevoff; uint counts = labelCount(self, 0); uint othercounts = labelCount(other, 0); // Keep removing labels from the front of the name until both names are equal length while (counts > othercounts) { prevoff = off; off = progress(self, off); counts--; } while (othercounts > counts) { otherprevoff = otheroff; otheroff = progress(other, otheroff); othercounts--; } // Compare the last nonequal labels to each other while (counts > 0 && !self.equals(off, other, otheroff)) { prevoff = off; off = progress(self, off); otherprevoff = otheroff; otheroff = progress(other, otheroff); counts -= 1; } if (off == 0) { return -1; } if(otheroff == 0) { return 1; } return self.compare(prevoff + 1, self.readUint8(prevoff), other, otherprevoff + 1, other.readUint8(otherprevoff)); } function progress(bytes memory body, uint off) internal pure returns(uint) { return off + 1 + body.readUint8(off); } } // File: @ensdomains/ens/contracts/ENS.sol 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); function setSubnodeOwner(bytes32 node, bytes32 label, address owner) public; function setResolver(bytes32 node, address resolver) public; function setOwner(bytes32 node, address owner) public; function setTTL(bytes32 node, uint64 ttl) public; function owner(bytes32 node) public view returns (address); function resolver(bytes32 node) public view returns (address); function ttl(bytes32 node) public view returns (uint64); } // File: @ensdomains/ens/contracts/ENSRegistry.sol /** * The ENS registry contract. */ contract ENSRegistry is ENS { struct Record { address owner; address resolver; uint64 ttl; } mapping (bytes32 => Record) records; // Permits modifications only by the owner of the specified node. modifier only_owner(bytes32 node) { require(records[node].owner == msg.sender); _; } /** * @dev Constructs a new ENS registrar. */ function ENSRegistry() public { records[0x0].owner = msg.sender; } /** * @dev Transfers ownership of a node to a new address. May only be called by the current owner of the node. * @param node The node to transfer ownership of. * @param owner The address of the new owner. */ function setOwner(bytes32 node, address owner) public only_owner(node) { Transfer(node, owner); records[node].owner = owner; } /** * @dev Transfers ownership of a subnode keccak256(node, label) to a new address. May only be called by the owner of the parent node. * @param node The parent node. * @param label The hash of the label specifying the subnode. * @param owner The address of the new owner. */ function setSubnodeOwner(bytes32 node, bytes32 label, address owner) public only_owner(node) { var subnode = keccak256(node, label); NewOwner(node, label, owner); records[subnode].owner = owner; } /** * @dev Sets the resolver address for the specified node. * @param node The node to update. * @param resolver The address of the resolver. */ function setResolver(bytes32 node, address resolver) public only_owner(node) { NewResolver(node, resolver); records[node].resolver = resolver; } /** * @dev Sets the TTL for the specified node. * @param node The node to update. * @param ttl The TTL in seconds. */ function setTTL(bytes32 node, uint64 ttl) public only_owner(node) { NewTTL(node, ttl); records[node].ttl = ttl; } /** * @dev Returns the address that owns the specified node. * @param node The specified node. * @return address of the owner. */ function owner(bytes32 node) public view returns (address) { return records[node].owner; } /** * @dev Returns the address of the resolver for the specified node. * @param node The specified node. * @return address of the resolver. */ function resolver(bytes32 node) public view returns (address) { return records[node].resolver; } /** * @dev Returns the TTL of a node, and any records associated with it. * @param node The specified node. * @return ttl of the node. */ function ttl(bytes32 node) public view returns (uint64) { return records[node].ttl; } } // File: contracts/DNSRegistrar.sol /** * @dev An ENS registrar that allows the owner of a DNS name to claim the * corresponding name in ENS. */ contract DNSRegistrar { using BytesUtils for bytes; using RRUtils for *; using Buffer for Buffer.buffer; uint16 constant CLASS_INET = 1; uint16 constant TYPE_TXT = 16; DNSSEC public oracle; ENS public ens; bytes public rootDomain; bytes32 public rootNode; event Claim(bytes32 indexed node, address indexed owner, bytes dnsname); constructor(DNSSEC _dnssec, ENS _ens, bytes _rootDomain, bytes32 _rootNode) public { oracle = _dnssec; ens = _ens; rootDomain = _rootDomain; rootNode = _rootNode; } /** * @dev Claims a name by proving ownership of its DNS equivalent. * @param name The name to claim, in DNS wire format. * @param proof A DNS RRSet proving ownership of the name. Must be verified * in the DNSSEC oracle before calling. This RRSET must contain a TXT * record for '_ens.' + name, with the value 'a=0x...'. Ownership of * the name will be transferred to the address specified in the TXT * record. */ function claim(bytes name, bytes proof) public { bytes32 labelHash = getLabelHash(name); address addr = getOwnerAddress(name, proof); ens.setSubnodeOwner(rootNode, labelHash, addr); emit Claim(keccak256(rootNode, labelHash), addr, name); } /** * @dev Submits proofs to the DNSSEC oracle, then claims a name using those proofs. * @param name The name to claim, in DNS wire format. * @param input The data to be passed to the Oracle's `submitProofs` function. The last * proof must be the TXT record required by the registrar. * @param proof The proof record for the first element in input. */ function proveAndClaim(bytes name, bytes input, bytes proof) public { proof = oracle.submitRRSets(input, proof); claim(name, proof); } function getLabelHash(bytes memory name) internal view returns(bytes32) { uint len = name.readUint8(0); // Check this name is a direct subdomain of the one we're responsible for require(name.equals(len + 1, rootDomain)); return name.keccak(1, len); } function getOwnerAddress(bytes memory name, bytes memory proof) internal view returns(address) { // Add "_ens." to the front of the name. Buffer.buffer memory buf; buf.init(name.length + 5); buf.append("\x04_ens"); buf.append(name); bytes20 hash; uint64 inserted; // Check the provided TXT record has been validated by the oracle (, inserted, hash) = oracle.rrdata(TYPE_TXT, buf.buf); if(hash == bytes20(0) && proof.length == 0) return 0; require(hash == bytes20(keccak256(proof))); for(RRUtils.RRIterator memory iter = proof.iterateRRs(0); !iter.done(); iter.next()) { require(inserted + iter.ttl >= now, "DNS record is stale; refresh or delete it before proceeding."); address addr = parseRR(proof, iter.rdataOffset); if(addr != 0) { return addr; } } return 0; } function parseRR(bytes memory rdata, uint idx) internal pure returns(address) { while(idx < rdata.length) { uint len = rdata.readUint8(idx); idx += 1; address addr = parseString(rdata, idx, len); if(addr != 0) return addr; idx += len; } return 0; } function parseString(bytes memory str, uint idx, uint len) internal pure returns(address) { // TODO: More robust parsing that handles whitespace and multiple key/value pairs if(str.readUint32(idx) != 0x613d3078) return 0; // 0x613d3078 == 'a=0x' if(len < 44) return 0; return hexToAddress(str, idx + 4); } function hexToAddress(bytes memory str, uint idx) internal pure returns(address) { if(str.length - idx < 40) return 0; uint ret = 0; for(uint i = idx; i < idx + 40; i++) { ret <<= 4; uint x = str.readUint8(i); if(x >= 48 && x < 58) { ret |= x - 48; } else if(x >= 65 && x < 71) { ret |= x - 55; } else if(x >= 97 && x < 103) { ret |= x - 87; } else { return 0; } } return address(ret); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[],"name":"ens","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rootDomain","outputs":[{"name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"oracle","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"name","type":"bytes"},{"name":"proof","type":"bytes"}],"name":"claim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"name","type":"bytes"},{"name":"input","type":"bytes"},{"name":"proof","type":"bytes"}],"name":"proveAndClaim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"rootNode","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_dnssec","type":"address"},{"name":"_ens","type":"address"},{"name":"_rootDomain","type":"bytes"},{"name":"_rootNode","type":"bytes32"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":true,"name":"owner","type":"address"},{"indexed":false,"name":"dnsname","type":"bytes"}],"name":"Claim","type":"event"}]
Contract Creation Code
608060405234801561001057600080fd5b50604051620011a8380380620011a8833981016040908152815160208084015192840151606085015160008054600160a060020a03808716600160a060020a0319928316179092556001805492881692909116919091179055940180519294909290916100829160029185019061008f565b506003555061012a915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100d057805160ff19168380011785556100fd565b828001600101855582156100fd579182015b828111156100fd5782518255916020019190600101906100e2565b5061010992915061010d565b5090565b61012791905b808211156101095760008155600101610113565b90565b61106e806200013a6000396000f3006080604052600436106100775763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633f15457f811461007c57806340ff38b2146100ad5780637dc0d1d014610137578063be27b22c1461014c578063d94585bd146101e5578063faff50a8146102ba575b600080fd5b34801561008857600080fd5b506100916102e1565b60408051600160a060020a039092168252519081900360200190f35b3480156100b957600080fd5b506100c26102f0565b6040805160208082528351818301528351919283929083019185019080838360005b838110156100fc5781810151838201526020016100e4565b50505050905090810190601f1680156101295780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561014357600080fd5b5061009161037b565b34801561015857600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526101e394369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375094975061038a9650505050505050565b005b3480156101f157600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526101e394369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506104f89650505050505050565b3480156102c657600080fd5b506102cf6106c4565b60408051918252519081900360200190f35b600154600160a060020a031681565b6002805460408051602060018416156101000260001901909316849004601f810184900484028201840190925281815292918301828280156103735780601f1061034857610100808354040283529160200191610373565b820191906000526020600020905b81548152906001019060200180831161035657829003601f168201915b505050505081565b600054600160a060020a031681565b600080610396846106ca565b91506103a284846107b8565b600154600354604080517f06ab5923000000000000000000000000000000000000000000000000000000008152600481019290925260248201869052600160a060020a0380851660448401529051939450909116916306ab59239160648082019260009290919082900301818387803b15801561041e57600080fd5b505af1158015610432573d6000803e3d6000fd5b5050600354604080519182526020808301879052815192839003820183208184528951848301528951600160a060020a03881696509094507fa2e66ce20e6fb2c4f61339c364ad79f15160cf5307230c8bc4d628adbca2ba39938a9390928392918301919085019080838360005b838110156104b85781810151838201526020016104a0565b50505050905090810190601f1680156104e55780820380516001836020036101000a031916815260200191505b509250505060405180910390a350505050565b60008054604080517f76a14d1d00000000000000000000000000000000000000000000000000000000815260048101918252855160448201528551600160a060020a03909316936376a14d1d9387938793909283926024830192606401916020880191908190849084905b8381101561057b578181015183820152602001610563565b50505050905090810190601f1680156105a85780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156105db5781810151838201526020016105c3565b50505050905090810190601f1680156106085780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561062957600080fd5b505af115801561063d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561066657600080fd5b81019080805164010000000081111561067e57600080fd5b8201602081018481111561069157600080fd5b81516401000000008111828201871017156106ab57600080fd5b505092919050505090506106bf838261038a565b505050565b60035481565b6000806106dd838263ffffffff610b0916565b60ff1690506107948160010160028054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561077f5780601f106107545761010080835404028352916020019161077f565b820191906000526020600020905b81548152906001019060200180831161076257829003601f168201915b505050505085610b299092919063ffffffff16565b151561079f57600080fd5b6107b18360018363ffffffff610b5116565b9392505050565b60006107c2610fde565b6000806107cd610ff6565b60006107e6885160050186610b6e90919063ffffffff16565b5060408051808201909152600581527f045f656e73000000000000000000000000000000000000000000000000000000602082015261082c90869063ffffffff610baa16565b5061083d858963ffffffff610baa16565b50600080548651604080517f087991bc00000000000000000000000000000000000000000000000000000000815260106004820181815260248301938452845160448401528451600160a060020a039096169663087991bc969295949193919260649092019160208601918190849084905b838110156108c75781810151838201526020016108af565b50505050905090810190601f1680156108f45780820380516001836020036101000a031916815260200191505b509350505050606060405180830381600087803b15801561091457600080fd5b505af1158015610928573d6000803e3d6000fd5b505050506040513d606081101561093e57600080fd5b506020810151604090910151945092506bffffffffffffffffffffffff19841615801561096a57508651155b156109785760009550610afe565b866040518082805190602001908083835b602083106109a85780518252601f199092019160209182019101610989565b5181516020939093036101000a600019018019909116921691909117905260405192018290039091206bffffffffffffffffffffffff199081169088161492506109f491505057600080fd5b610a0587600063ffffffff610bc416565b91505b610a1182610bdf565b1515610af95742826080015163ffffffff16840167ffffffffffffffff1610151515610ac457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f444e53207265636f7264206973207374616c653b2072656672657368206f722060448201527f64656c657465206974206265666f72652070726f63656564696e672e00000000606482015290519081900360840190fd5b610ad2878360a00151610bed565b9050600160a060020a03811615610aeb57809550610afe565b610af482610c51565b610a08565b600095505b505050505092915050565b8151600090600183011115610b1d57600080fd5b50016001015160ff1690565b600081518301845110158015610b495750610b4984848460008651610d25565b949350505050565b82516000908383011115610b6457600080fd5b5091016020012090565b610b76610fde565b6020820615610b8b5760208206602003820191505b5060208201819052604080518084526000815282019052815b92915050565b610bb2610fde565b6107b183846000015151848551610d48565b610bcc610ff6565b82815260c08101829052610ba481610c51565b805151602090910151101590565b60008060005b8451841015610c4457610c0c858563ffffffff610b0916565b60ff169150600184019350610c22858584610e02565b9050600160a060020a03811615610c3b57809250610c49565b92810192610bf3565b600092505b505092915050565b60c081015160208201819052815151600091829111610c6f576106bf565b610c8183600001518460200151610e4c565b6020840151845191019250610c9c908363ffffffff610e9316565b61ffff166040840152825160029290920191610cbe908363ffffffff610e9316565b61ffff166060840152825160029290920191610ce0908363ffffffff610eb416565b63ffffffff9081166080850152835160049390930192610d02918490610e9316565b600283810160a086015261ffff9190911690920190910160c09092019190915250565b6000610d32848484610b51565b610d3d878785610b51565b149695505050505050565b610d50610fde565b600080600085518511151515610d6557600080fd5b6020880151885151888701011115610d9357610d9388610d8b8a602001518a8901610ed7565b600202610eee565b875180518860208301019450808988011115610daf5788870182525b60208801935050505b60208510610dda5781518352601f199094019360209283019290910190610db8565b505181516020949094036101000a600019018019909116931692909217909152509192915050565b6000610e14848463ffffffff610eb416565b63ffffffff1663613d3078141515610e2e575060006107b1565b602c821015610e3f575060006107b1565b610b498484600401610f0b565b600081815b84518210610e5b57fe5b610e6b858363ffffffff610b0916565b60ff16918201600101919050801515610e8357610e88565b610e51565b509190910392915050565b8151600090600283011115610ea757600080fd5b50016002015161ffff1690565b8151600090600483011115610ec857600080fd5b50016004015163ffffffff1690565b600081831115610ee8575081610ba4565b50919050565b8151610efa8383610b6e565b50610f058382610baa565b50505050565b6000806000806028858751031015610f265760009350610fd5565b600092508491505b84602801821015610fd157601090920291610f4f868363ffffffff610b0916565b60ff16905060308110158015610f655750603a81105b15610f77576030810383179250610fc6565b60418110158015610f885750604781105b15610f9a576037810383179250610fc6565b60618110158015610fab5750606781105b15610fbd576057810383179250610fc6565b60009350610fd5565b600190910190610f2e565b8293505b50505092915050565b60408051808201909152606081526000602082015290565b60e0604051908101604052806060815260200160008152602001600061ffff168152602001600061ffff168152602001600063ffffffff168152602001600081526020016000815250905600a165627a7a7230582039228740a9bc7f698899398b4c6e19f4424135acad1c0572f09436351ff9b479002900000000000000000000000058a6618b3049c113460ab4ec62f2c68996e9ed7c000000000000000000000000314159265dd8dbb310642f98f50c066173c1259b0000000000000000000000000000000000000000000000000000000000000080a87a11c7f15e38a7398517fda2ae1b40d870aa24b34b4b09aa09afc71f2c9d2600000000000000000000000000000000000000000000000000000000000000050378797a00000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106100775763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633f15457f811461007c57806340ff38b2146100ad5780637dc0d1d014610137578063be27b22c1461014c578063d94585bd146101e5578063faff50a8146102ba575b600080fd5b34801561008857600080fd5b506100916102e1565b60408051600160a060020a039092168252519081900360200190f35b3480156100b957600080fd5b506100c26102f0565b6040805160208082528351818301528351919283929083019185019080838360005b838110156100fc5781810151838201526020016100e4565b50505050905090810190601f1680156101295780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561014357600080fd5b5061009161037b565b34801561015857600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526101e394369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375094975061038a9650505050505050565b005b3480156101f157600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526101e394369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506104f89650505050505050565b3480156102c657600080fd5b506102cf6106c4565b60408051918252519081900360200190f35b600154600160a060020a031681565b6002805460408051602060018416156101000260001901909316849004601f810184900484028201840190925281815292918301828280156103735780601f1061034857610100808354040283529160200191610373565b820191906000526020600020905b81548152906001019060200180831161035657829003601f168201915b505050505081565b600054600160a060020a031681565b600080610396846106ca565b91506103a284846107b8565b600154600354604080517f06ab5923000000000000000000000000000000000000000000000000000000008152600481019290925260248201869052600160a060020a0380851660448401529051939450909116916306ab59239160648082019260009290919082900301818387803b15801561041e57600080fd5b505af1158015610432573d6000803e3d6000fd5b5050600354604080519182526020808301879052815192839003820183208184528951848301528951600160a060020a03881696509094507fa2e66ce20e6fb2c4f61339c364ad79f15160cf5307230c8bc4d628adbca2ba39938a9390928392918301919085019080838360005b838110156104b85781810151838201526020016104a0565b50505050905090810190601f1680156104e55780820380516001836020036101000a031916815260200191505b509250505060405180910390a350505050565b60008054604080517f76a14d1d00000000000000000000000000000000000000000000000000000000815260048101918252855160448201528551600160a060020a03909316936376a14d1d9387938793909283926024830192606401916020880191908190849084905b8381101561057b578181015183820152602001610563565b50505050905090810190601f1680156105a85780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156105db5781810151838201526020016105c3565b50505050905090810190601f1680156106085780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561062957600080fd5b505af115801561063d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561066657600080fd5b81019080805164010000000081111561067e57600080fd5b8201602081018481111561069157600080fd5b81516401000000008111828201871017156106ab57600080fd5b505092919050505090506106bf838261038a565b505050565b60035481565b6000806106dd838263ffffffff610b0916565b60ff1690506107948160010160028054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561077f5780601f106107545761010080835404028352916020019161077f565b820191906000526020600020905b81548152906001019060200180831161076257829003601f168201915b505050505085610b299092919063ffffffff16565b151561079f57600080fd5b6107b18360018363ffffffff610b5116565b9392505050565b60006107c2610fde565b6000806107cd610ff6565b60006107e6885160050186610b6e90919063ffffffff16565b5060408051808201909152600581527f045f656e73000000000000000000000000000000000000000000000000000000602082015261082c90869063ffffffff610baa16565b5061083d858963ffffffff610baa16565b50600080548651604080517f087991bc00000000000000000000000000000000000000000000000000000000815260106004820181815260248301938452845160448401528451600160a060020a039096169663087991bc969295949193919260649092019160208601918190849084905b838110156108c75781810151838201526020016108af565b50505050905090810190601f1680156108f45780820380516001836020036101000a031916815260200191505b509350505050606060405180830381600087803b15801561091457600080fd5b505af1158015610928573d6000803e3d6000fd5b505050506040513d606081101561093e57600080fd5b506020810151604090910151945092506bffffffffffffffffffffffff19841615801561096a57508651155b156109785760009550610afe565b866040518082805190602001908083835b602083106109a85780518252601f199092019160209182019101610989565b5181516020939093036101000a600019018019909116921691909117905260405192018290039091206bffffffffffffffffffffffff199081169088161492506109f491505057600080fd5b610a0587600063ffffffff610bc416565b91505b610a1182610bdf565b1515610af95742826080015163ffffffff16840167ffffffffffffffff1610151515610ac457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f444e53207265636f7264206973207374616c653b2072656672657368206f722060448201527f64656c657465206974206265666f72652070726f63656564696e672e00000000606482015290519081900360840190fd5b610ad2878360a00151610bed565b9050600160a060020a03811615610aeb57809550610afe565b610af482610c51565b610a08565b600095505b505050505092915050565b8151600090600183011115610b1d57600080fd5b50016001015160ff1690565b600081518301845110158015610b495750610b4984848460008651610d25565b949350505050565b82516000908383011115610b6457600080fd5b5091016020012090565b610b76610fde565b6020820615610b8b5760208206602003820191505b5060208201819052604080518084526000815282019052815b92915050565b610bb2610fde565b6107b183846000015151848551610d48565b610bcc610ff6565b82815260c08101829052610ba481610c51565b805151602090910151101590565b60008060005b8451841015610c4457610c0c858563ffffffff610b0916565b60ff169150600184019350610c22858584610e02565b9050600160a060020a03811615610c3b57809250610c49565b92810192610bf3565b600092505b505092915050565b60c081015160208201819052815151600091829111610c6f576106bf565b610c8183600001518460200151610e4c565b6020840151845191019250610c9c908363ffffffff610e9316565b61ffff166040840152825160029290920191610cbe908363ffffffff610e9316565b61ffff166060840152825160029290920191610ce0908363ffffffff610eb416565b63ffffffff9081166080850152835160049390930192610d02918490610e9316565b600283810160a086015261ffff9190911690920190910160c09092019190915250565b6000610d32848484610b51565b610d3d878785610b51565b149695505050505050565b610d50610fde565b600080600085518511151515610d6557600080fd5b6020880151885151888701011115610d9357610d9388610d8b8a602001518a8901610ed7565b600202610eee565b875180518860208301019450808988011115610daf5788870182525b60208801935050505b60208510610dda5781518352601f199094019360209283019290910190610db8565b505181516020949094036101000a600019018019909116931692909217909152509192915050565b6000610e14848463ffffffff610eb416565b63ffffffff1663613d3078141515610e2e575060006107b1565b602c821015610e3f575060006107b1565b610b498484600401610f0b565b600081815b84518210610e5b57fe5b610e6b858363ffffffff610b0916565b60ff16918201600101919050801515610e8357610e88565b610e51565b509190910392915050565b8151600090600283011115610ea757600080fd5b50016002015161ffff1690565b8151600090600483011115610ec857600080fd5b50016004015163ffffffff1690565b600081831115610ee8575081610ba4565b50919050565b8151610efa8383610b6e565b50610f058382610baa565b50505050565b6000806000806028858751031015610f265760009350610fd5565b600092508491505b84602801821015610fd157601090920291610f4f868363ffffffff610b0916565b60ff16905060308110158015610f655750603a81105b15610f77576030810383179250610fc6565b60418110158015610f885750604781105b15610f9a576037810383179250610fc6565b60618110158015610fab5750606781105b15610fbd576057810383179250610fc6565b60009350610fd5565b600190910190610f2e565b8293505b50505092915050565b60408051808201909152606081526000602082015290565b60e0604051908101604052806060815260200160008152602001600061ffff168152602001600061ffff168152602001600063ffffffff168152602001600081526020016000815250905600a165627a7a7230582039228740a9bc7f698899398b4c6e19f4424135acad1c0572f09436351ff9b4790029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000058a6618b3049c113460ab4ec62f2c68996e9ed7c000000000000000000000000314159265dd8dbb310642f98f50c066173c1259b0000000000000000000000000000000000000000000000000000000000000080a87a11c7f15e38a7398517fda2ae1b40d870aa24b34b4b09aa09afc71f2c9d2600000000000000000000000000000000000000000000000000000000000000050378797a00000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _dnssec (address): 0x58a6618b3049C113460AB4eC62f2c68996E9eD7C
Arg [1] : _ens (address): 0x314159265dD8dbb310642f98f50C066173C1259b
Arg [2] : _rootDomain (bytes): 0x0378797a00
Arg [3] : _rootNode (bytes32): 0xa87a11c7f15e38a7398517fda2ae1b40d870aa24b34b4b09aa09afc71f2c9d26
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 00000000000000000000000058a6618b3049c113460ab4ec62f2c68996e9ed7c
Arg [1] : 000000000000000000000000314159265dd8dbb310642f98f50c066173c1259b
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [3] : a87a11c7f15e38a7398517fda2ae1b40d870aa24b34b4b09aa09afc71f2c9d26
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [5] : 0378797a00000000000000000000000000000000000000000000000000000000
Swarm Source
bzzr://39228740a9bc7f698899398b4c6e19f4424135acad1c0572f09436351ff9b479
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.