DCL Registrar
About
Stats
                Public Functions
                38
            
            
                Event Types
                16
            
            
                Code Size
                70,836 bytes
            
        Library Use
Uses Address for address.
        Events (16) keyboard_arrow_up
Constants (6) keyboard_arrow_up
State Variables (24) keyboard_arrow_up
Functions
owner keyboard_arrow_up
isOwner keyboard_arrow_up
renounceOwnership keyboard_arrow_up
transferOwnership keyboard_arrow_up
Modifiers help
onlyOwner checks for the following:
null
                                Source Code
function transferOwnership(address newOwner) public onlyOwner {
  _transferOwnership(newOwner);
}
                balanceOf keyboard_arrow_up
Source Code
function balanceOf(address owner) public view returns (uint256) {
  require(owner != address(0), "ERC721: balance query for the zero address");
  return _ownedTokensCount[owner].current();
}
                ownerOf keyboard_arrow_up
Source Code
function ownerOf(uint256 tokenId) public view returns (address) {
  address owner = _tokenOwner[tokenId];
  require(owner != address(0), "ERC721: owner query for nonexistent token");
  return owner;
}
                safeTransferFrom keyboard_arrow_up
Requirements help
Source Code
function safeTransferFrom(
  address from,
  address to,
  uint256 tokenId
) public {
  safeTransferFrom(from, to, tokenId, "");
}
                transferFrom keyboard_arrow_up
Requirements help
Source Code
function transferFrom(
  address from,
  address to,
  uint256 tokenId
) public {
  //solhint-disable-next-line max-line-length
  require(
    _isApprovedOrOwner(_msgSender(), tokenId),
    "ERC721: transfer caller is not owner nor approved"
  );
  _transferFrom(from, to, tokenId);
}
                approve keyboard_arrow_up
Requirements help
Source Code
function approve(address to, uint256 tokenId) public {
  address owner = ownerOf(tokenId);
  require(to != owner, "ERC721: approval to current owner");
  require(
    _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
    "ERC721: approve caller is not owner nor approved for all"
  );
  _tokenApprovals[tokenId] = to;
  emit Approval(owner, to, tokenId);
}
                getApproved keyboard_arrow_up
Requirements help
null
                    Source Code
function getApproved(uint256 tokenId) public view returns (address) {
  require(_exists(tokenId), "ERC721: approved query for nonexistent token");
  return _tokenApprovals[tokenId];
}
                setApprovalForAll keyboard_arrow_up
Requirements help
Source Code
function setApprovalForAll(address to, bool approved) public {
  require(to != _msgSender(), "ERC721: approve to caller");
  _operatorApprovals[_msgSender()][to] = approved;
  emit ApprovalForAll(_msgSender(), to, approved);
}
                isApprovedForAll keyboard_arrow_up
safeTransferFrom keyboard_arrow_up
Requirements help
Source Code
function safeTransferFrom(
  address from,
  address to,
  uint256 tokenId,
  bytes memory _data
) public {
  require(
    _isApprovedOrOwner(_msgSender(), tokenId),
    "ERC721: transfer caller is not owner nor approved"
  );
  _safeTransferFrom(from, to, tokenId, _data);
}
                name keyboard_arrow_up
symbol keyboard_arrow_up
tokenURI keyboard_arrow_up
Requirements help
null
                    Source Code
function tokenURI(uint256 _tokenId) external view returns (string memory) {
  if (bytes(baseURI).length == 0) {
    return "";
  }
  require(
    _exists(_tokenId),
    "ERC721Metadata: received a URI query for a nonexistent token"
  );
  return
    string(
      abi.encodePacked(baseURI, _toLowerCase(subdomains[bytes32(_tokenId)]))
    );
}
                supportsInterface keyboard_arrow_up
totalSupply keyboard_arrow_up
tokenOfOwnerByIndex keyboard_arrow_up
Source Code
function tokenOfOwnerByIndex(address owner, uint256 index)
  public
  view
  returns (uint256)
{
  require(
    index < balanceOf(owner),
    "ERC721Enumerable: owner index out of bounds"
  );
  return _ownedTokens[owner][index];
}
                tokenByIndex keyboard_arrow_up
Requirements help
Source Code
function tokenByIndex(uint256 index) public view returns (uint256) {
  require(
    index < totalSupply(),
    "ERC721Enumerable: global index out of bounds"
  );
  return _allTokens[index];
}
                migrateNames keyboard_arrow_up
Parameters help
Modifiers help
onlyOwner checks for the following:
null
                                isNotMigrated checks for the following:
Source Code
function migrateNames(
  bytes32[] calldata _names,
  address[] calldata _beneficiaries,
  uint256[] calldata _createdDates
) external onlyOwner isNotMigrated {
  for (uint256 i = 0; i < _names.length; i++) {
    string memory name = _bytes32ToString(_names[i]);
    _register(
      name,
      keccak256(abi.encodePacked(_toLowerCase(name))),
      _beneficiaries[i],
      _createdDates[i]
    );
  }
}
                register keyboard_arrow_up
Modifiers help
onlyController checks for the following:
isMigrated checks for the following:
migrated must be true
                                Requirements help
Source Code
function register(string calldata _subdomain, address _beneficiary)
  external
  onlyController
  isMigrated
{
  // Make sure this contract owns the domain
  _checkOwnerOfDomain();
  // Create labelhash for the subdomain
  bytes32 subdomainLabelHash = keccak256(
    abi.encodePacked(_toLowerCase(_subdomain))
  );
  // Make sure it is free
  require(_available(subdomainLabelHash), "Subdomain already owned");
  // solium-disable-next-line security/no-block-members
  _register(_subdomain, subdomainLabelHash, _beneficiary, now);
}
                reclaim keyboard_arrow_up
Modifiers help
onlyController checks for the following:
Source Code
function reclaim(uint256 _tokenId) public onlyController {
  address owner = ownerOf(_tokenId);
  registry.setSubnodeOwner(
    domainNameHash,
    bytes32(_tokenId),
    ownerOf(_tokenId)
  );
  emit Reclaimed(msg.sender, owner, _tokenId);
}
                reclaim keyboard_arrow_up
Requirements help
null
                    Source Code
function reclaim(uint256 _tokenId, address _owner) public {
  // Check if the sender is authorized to manage the subdomain
  require(
    _isApprovedOrOwner(msg.sender, _tokenId),
    "Only an authorized account can change the subdomain settings"
  );
  registry.setSubnodeOwner(domainNameHash, bytes32(_tokenId), _owner);
  emit Reclaimed(msg.sender, _owner, _tokenId);
}
                onERC721Received keyboard_arrow_up
Requirements help
Source Code
function onERC721Received(
  address, /* _operator */
  address, /* _from */
  uint256 _tokenId,
  bytes memory /* _data */
) public returns (bytes4) {
  require(
    msg.sender == address(base),
    "Only base can send NFTs to this contract"
  );
  // Re-claim to update the owner at the ENS Registry
  base.reclaim(_tokenId, address(this));
  return ERC721_RECEIVED;
}
                available keyboard_arrow_up
Source Code
function available(string memory _subdomain) public view returns (bool) {
  // Create labelhash for the subdomain
  bytes32 subdomainLabelHash = keccak256(
    abi.encodePacked(_toLowerCase(_subdomain))
  );
  return _available(subdomainLabelHash);
}
                getTokenId keyboard_arrow_up
Requirements help
null
                    Source Code
function getTokenId(string memory _subdomain) public view returns (uint256) {
  string memory subdomain = _toLowerCase(_subdomain);
  bytes32 subdomainLabelHash = keccak256(abi.encodePacked(subdomain));
  uint256 tokenId = uint256(subdomainLabelHash);
  require(_exists(tokenId), "The subdomain is not registered");
  return tokenId;
}
                getOwnerOf keyboard_arrow_up
reclaimDomain keyboard_arrow_up
Modifiers help
onlyOwner checks for the following:
null
                                Source Code
function reclaimDomain(uint256 _tokenId) public onlyOwner {
  base.reclaim(_tokenId, address(this));
  emit DomainReclaimed(_tokenId);
}
                transferDomainOwnership keyboard_arrow_up
Modifiers help
onlyOwner checks for the following:
null
                                Source Code
function transferDomainOwnership(address _owner, uint256 _tokenId)
  public
  onlyOwner
{
  base.transferFrom(address(this), _owner, _tokenId);
  emit DomainTransferred(_owner, _tokenId);
}
                setResolver keyboard_arrow_up
Modifiers help
onlyOwner checks for the following:
null
                                Requirements help
Source Code
function setResolver(address _resolver) public onlyOwner {
  address resolver = registry.resolver(domainNameHash);
  require(_resolver.isContract(), "New resolver should be a contract");
  require(_resolver != resolver, "New resolver should be different from old");
  _checkNotAllowedAddresses(_resolver);
  registry.setResolver(domainNameHash, _resolver);
  emit ResolverUpdated(resolver, _resolver);
}
                forwardToResolver keyboard_arrow_up
Modifiers help
onlyOwner checks for the following:
null
                                Requirements help
Source Code
function forwardToResolver(bytes memory _data) public onlyOwner {
  address resolver = registry.resolver(domainNameHash);
  _checkNotAllowedAddresses(resolver);
  (bool success, bytes memory res) = resolver.call(_data);
  require(success, "Call failed");
  // Make sure this contract is still the owner of the domain
  _checkOwnerOfDomain();
  emit CallForwarwedToResolver(resolver, _data, res);
}
                addController keyboard_arrow_up
removeController keyboard_arrow_up
Modifiers help
onlyOwner checks for the following:
null
                                Source Code
function removeController(address controller) external onlyOwner {
  require(controllers[controller], "The controller is already disabled");
  controllers[controller] = false;
  emit ControllerRemoved(controller);
}
                updateRegistry keyboard_arrow_up
Modifiers help
onlyOwner checks for the following:
null
                                Source Code
function updateRegistry(IENSRegistry _registry) public onlyOwner {
  require(registry != _registry, "New registry should be different from old");
  require(address(_registry).isContract(), "New registry should be a contract");
  emit RegistryUpdated(registry, _registry);
  registry = _registry;
}
                updateBase keyboard_arrow_up
Modifiers help
onlyOwner checks for the following:
null
                                Source Code
function updateBase(IBaseRegistrar _base) public onlyOwner {
  require(base != _base, "New base should be different from old");
  require(address(_base).isContract(), "New base should be a contract");
  emit BaseUpdated(base, _base);
  base = _base;
}
                updateBaseURI keyboard_arrow_up
Modifiers help
onlyOwner checks for the following:
null
                                Requirements help
Source Code
function updateBaseURI(string memory _baseURI) public onlyOwner {
  require(
    keccak256(abi.encodePacked((baseURI))) !=
      keccak256(abi.encodePacked((_baseURI))),
    "Base URI should be different from old"
  );
  emit BaseURI(baseURI, _baseURI);
  baseURI = _baseURI;
}
                migrationFinished keyboard_arrow_up
Internal Functions
Internal functions are parts of the contract that can't be used directly, but instead are used by the public functions listed above.
internal DCLRegistrar._register keyboard_arrow_up
Parameters help
Requirements help
Source Code
function _register(
  string memory _subdomain,
  bytes32 subdomainLabelHash,
  address _beneficiary,
  uint256 _createdDate
) internal {
  // Create new subdomain and assign the _beneficiary as the owner
  registry.setSubnodeOwner(domainNameHash, subdomainLabelHash, _beneficiary);
  // Mint an ERC721 token with the sud domain label hash as its id
  _mint(_beneficiary, uint256(subdomainLabelHash));
  // Map the ERC721 token id with the subdomain for reversion.
  subdomains[subdomainLabelHash] = _subdomain;
  // Emit registered name event
  emit NameRegistered(
    msg.sender,
    _beneficiary,
    subdomainLabelHash,
    _subdomain,
    _createdDate
  );
}
                internal DCLRegistrar._available keyboard_arrow_up
Source Code
function _available(bytes32 _subdomainLabelHash) internal view returns (bool) {
  // Create namehash for the subdomain (node)
  bytes32 subdomainNameHash = keccak256(
    abi.encodePacked(domainNameHash, _subdomainLabelHash)
  );
  // Make sure it is free
  return
    registry.owner(subdomainNameHash) == address(0) &&
    !_exists(uint256(_subdomainLabelHash));
}
                internal DCLRegistrar._checkOwnerOfDomain keyboard_arrow_up
Parameters help
This function has no parameters.
Requirements help
                    UNKNOWN VALUE
                 must be equal to 
                    UNKNOWN VALUE
                
                            
                    UNKNOWN VALUE
                 must be equal to 
                    UNKNOWN VALUE
                
                    Source Code
function _checkOwnerOfDomain() internal view {
  require(
    registry.owner(domainNameHash) == address(this) &&
      base.ownerOf(uint256(keccak256(abi.encodePacked(domain)))) ==
      address(this),
    "The contract does not own the domain"
  );
}
                internal DCLRegistrar._checkNotAllowedAddresses keyboard_arrow_up
Requirements help
Source Code
function _checkNotAllowedAddresses(address _address) internal view {
  require(
    _address != address(base) &&
      _address != address(registry) &&
      _address != address(this),
    "Invalid address"
  );
}
                internal DCLRegistrar._bytes32ToString keyboard_arrow_up
Source Code
function _bytes32ToString(bytes32 _x) internal pure returns (string memory) {
  uint256 charCount = 0;
  for (uint256 j = 0; j <= 256; j += 8) {
    byte char = byte(_x << j);
    if (char == 0) {
      break;
    }
    charCount++;
  }
  string memory out = new string(charCount);
  // solium-disable-next-line security/no-inline-assembly
  assembly {
    mstore(add(0x20, out), _x)
  }
  return out;
}
                internal DCLRegistrar._toLowerCase keyboard_arrow_up
Source Code
function _toLowerCase(string memory _str)
  internal
  pure
  returns (string memory)
{
  bytes memory bStr = bytes(_str);
  bytes memory bLower = new bytes(bStr.length);
  for (uint256 i = 0; i < bStr.length; i++) {
    // Uppercase character...
    if ((bStr[i] >= 0x41) && (bStr[i] <= 0x5A)) {
      // So we add 0x20 to make it lowercase
      bLower[i] = bytes1(uint8(bStr[i]) + 0x20);
    } else {
      bLower[i] = bStr[i];
    }
  }
  return string(bLower);
}
                internal ERC721._safeTransferFrom keyboard_arrow_up
Requirements help
Source Code
function _safeTransferFrom(
  address from,
  address to,
  uint256 tokenId,
  bytes memory _data
) internal {
  _transferFrom(from, to, tokenId);
  require(
    _checkOnERC721Received(from, to, tokenId, _data),
    "ERC721: transfer to non ERC721Receiver implementer"
  );
}
                internal ERC721._exists keyboard_arrow_up
internal ERC721._isApprovedOrOwner keyboard_arrow_up
Requirements help
null
                    Source Code
function _isApprovedOrOwner(address spender, uint256 tokenId)
  internal
  view
  returns (bool)
{
  require(_exists(tokenId), "ERC721: operator query for nonexistent token");
  address owner = ownerOf(tokenId);
  return (spender == owner ||
    getApproved(tokenId) == spender ||
    isApprovedForAll(owner, spender));
}
                internal ERC721._safeMint keyboard_arrow_up
Requirements help
Source Code
function _safeMint(address to, uint256 tokenId) internal {
  _safeMint(to, tokenId, "");
}
                internal ERC721._safeMint keyboard_arrow_up
Requirements help
Source Code
function _safeMint(
  address to,
  uint256 tokenId,
  bytes memory _data
) internal {
  _mint(to, tokenId);
  require(
    _checkOnERC721Received(address(0), to, tokenId, _data),
    "ERC721: transfer to non ERC721Receiver implementer"
  );
}
                internal ERC721._mint keyboard_arrow_up
Requirements help
Source Code
function _mint(address to, uint256 tokenId) internal {
  require(to != address(0), "ERC721: mint to the zero address");
  require(!_exists(tokenId), "ERC721: token already minted");
  _tokenOwner[tokenId] = to;
  _ownedTokensCount[to].increment();
  emit Transfer(address(0), to, tokenId);
}
                internal ERC721._burn keyboard_arrow_up
Source Code
function _burn(address owner, uint256 tokenId) internal {
  require(ownerOf(tokenId) == owner, "ERC721: burn of token that is not own");
  _clearApproval(tokenId);
  _ownedTokensCount[owner].decrement();
  _tokenOwner[tokenId] = address(0);
  emit Transfer(owner, address(0), tokenId);
}
                internal ERC721._burn keyboard_arrow_up
Requirements help
Source Code
function _burn(uint256 tokenId) internal {
  _burn(ownerOf(tokenId), tokenId);
}
                internal ERC721._transferFrom keyboard_arrow_up
Requirements help
Source Code
function _transferFrom(
  address from,
  address to,
  uint256 tokenId
) internal {
  require(
    ownerOf(tokenId) == from,
    "ERC721: transfer of token that is not own"
  );
  require(to != address(0), "ERC721: transfer to the zero address");
  _clearApproval(tokenId);
  _ownedTokensCount[from].decrement();
  _ownedTokensCount[to].increment();
  _tokenOwner[tokenId] = to;
  emit Transfer(from, to, tokenId);
}
                internal ERC721._checkOnERC721Received keyboard_arrow_up
Source Code
function _checkOnERC721Received(
  address from,
  address to,
  uint256 tokenId,
  bytes memory _data
) internal returns (bool) {
  if (!to.isContract()) {
    return true;
  }
  bytes4 retval = IERC721Receiver(to).onERC721Received(
    _msgSender(),
    from,
    tokenId,
    _data
  );
  return (retval == _ERC721_RECEIVED);
}
                internal ERC721._clearApproval keyboard_arrow_up
internal Context.constructor keyboard_arrow_up
internal Context._msgSender keyboard_arrow_up
internal Context._msgData keyboard_arrow_up
Parameters help
This function has no parameters.
Source Code
function _msgData() internal view returns (bytes memory) {
  this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
  return msg.data;
}
                internal ERC165.constructor keyboard_arrow_up
internal ERC165._registerInterface keyboard_arrow_up
Requirements help
Source Code
function _registerInterface(bytes4 interfaceId) internal {
  require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
  _supportedInterfaces[interfaceId] = true;
}
                internal ERC721Enumerable._transferFrom keyboard_arrow_up
Requirements help
Source Code
function _transferFrom(
  address from,
  address to,
  uint256 tokenId
) internal {
  super._transferFrom(from, to, tokenId);
  _removeTokenFromOwnerEnumeration(from, tokenId);
  _addTokenToOwnerEnumeration(to, tokenId);
}
                internal ERC721Enumerable._mint keyboard_arrow_up
Requirements help
Source Code
function _mint(address to, uint256 tokenId) internal {
  super._mint(to, tokenId);
  _addTokenToOwnerEnumeration(to, tokenId);
  _addTokenToAllTokensEnumeration(tokenId);
}
                internal ERC721Enumerable._burn keyboard_arrow_up
Requirements help
Source Code
function _burn(address owner, uint256 tokenId) internal {
  super._burn(owner, tokenId);
  _removeTokenFromOwnerEnumeration(owner, tokenId);
  // Since tokenId will be deleted, we can clear its slot in _ownedTokensIndex to trigger a gas refund
  _ownedTokensIndex[tokenId] = 0;
  _removeTokenFromAllTokensEnumeration(tokenId);
}
                internal ERC721Enumerable._tokensOfOwner keyboard_arrow_up
internal ERC721Enumerable._addTokenToOwnerEnumeration keyboard_arrow_up
Source Code
function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
  _ownedTokensIndex[tokenId] = _ownedTokens[to].length;
  _ownedTokens[to].push(tokenId);
}
                internal ERC721Enumerable._addTokenToAllTokensEnumeration keyboard_arrow_up
internal ERC721Enumerable._removeTokenFromOwnerEnumeration keyboard_arrow_up
Source Code
function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId)
  private
{
  // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
  // then delete the last slot (swap and pop).
  uint256 lastTokenIndex = _ownedTokens[from].length.sub(1);
  uint256 tokenIndex = _ownedTokensIndex[tokenId];
  // When the token to delete is the last token, the swap operation is unnecessary
  if (tokenIndex != lastTokenIndex) {
    uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];
    _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
    _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
  }
  // This also deletes the contents at the last position of the array
  _ownedTokens[from].length--;
  // Note that _ownedTokensIndex[tokenId] hasn't been cleared: it still points to the old slot (now occupied by
  // lastTokenId, or just over the end of the array if the token was the last one).
}
                internal ERC721Enumerable._removeTokenFromAllTokensEnumeration keyboard_arrow_up
Source Code
function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
  // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
  // then delete the last slot (swap and pop).
  uint256 lastTokenIndex = _allTokens.length.sub(1);
  uint256 tokenIndex = _allTokensIndex[tokenId];
  // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
  // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
  // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
  uint256 lastTokenId = _allTokens[lastTokenIndex];
  _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
  _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
  // This also deletes the contents at the last position of the array
  _allTokens.length--;
  _allTokensIndex[tokenId] = 0;
}
                internal Context.constructor keyboard_arrow_up
internal Context._msgSender keyboard_arrow_up
internal Context._msgData keyboard_arrow_up
Parameters help
This function has no parameters.
Source Code
function _msgData() internal view returns (bytes memory) {
  this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
  return msg.data;
}
                internal ERC165.constructor keyboard_arrow_up
internal ERC165._registerInterface keyboard_arrow_up
Requirements help
Source Code
function _registerInterface(bytes4 interfaceId) internal {
  require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
  _supportedInterfaces[interfaceId] = true;
}
                internal ERC721._safeTransferFrom keyboard_arrow_up
Requirements help
Source Code
function _safeTransferFrom(
  address from,
  address to,
  uint256 tokenId,
  bytes memory _data
) internal {
  _transferFrom(from, to, tokenId);
  require(
    _checkOnERC721Received(from, to, tokenId, _data),
    "ERC721: transfer to non ERC721Receiver implementer"
  );
}
                internal ERC721._exists keyboard_arrow_up
internal ERC721._isApprovedOrOwner keyboard_arrow_up
Requirements help
null
                    Source Code
function _isApprovedOrOwner(address spender, uint256 tokenId)
  internal
  view
  returns (bool)
{
  require(_exists(tokenId), "ERC721: operator query for nonexistent token");
  address owner = ownerOf(tokenId);
  return (spender == owner ||
    getApproved(tokenId) == spender ||
    isApprovedForAll(owner, spender));
}
                internal ERC721._safeMint keyboard_arrow_up
Requirements help
Source Code
function _safeMint(address to, uint256 tokenId) internal {
  _safeMint(to, tokenId, "");
}
                internal ERC721._safeMint keyboard_arrow_up
Requirements help
Source Code
function _safeMint(
  address to,
  uint256 tokenId,
  bytes memory _data
) internal {
  _mint(to, tokenId);
  require(
    _checkOnERC721Received(address(0), to, tokenId, _data),
    "ERC721: transfer to non ERC721Receiver implementer"
  );
}
                internal ERC721._mint keyboard_arrow_up
Requirements help
Source Code
function _mint(address to, uint256 tokenId) internal {
  require(to != address(0), "ERC721: mint to the zero address");
  require(!_exists(tokenId), "ERC721: token already minted");
  _tokenOwner[tokenId] = to;
  _ownedTokensCount[to].increment();
  emit Transfer(address(0), to, tokenId);
}
                internal ERC721._burn keyboard_arrow_up
Requirements help
Source Code
function _burn(address owner, uint256 tokenId) internal {
  require(ownerOf(tokenId) == owner, "ERC721: burn of token that is not own");
  _clearApproval(tokenId);
  _ownedTokensCount[owner].decrement();
  _tokenOwner[tokenId] = address(0);
  emit Transfer(owner, address(0), tokenId);
}
                internal ERC721._burn keyboard_arrow_up
Requirements help
Source Code
function _burn(uint256 tokenId) internal {
  _burn(ownerOf(tokenId), tokenId);
}
                internal ERC721._transferFrom keyboard_arrow_up
Requirements help
Source Code
function _transferFrom(
  address from,
  address to,
  uint256 tokenId
) internal {
  require(
    ownerOf(tokenId) == from,
    "ERC721: transfer of token that is not own"
  );
  require(to != address(0), "ERC721: transfer to the zero address");
  _clearApproval(tokenId);
  _ownedTokensCount[from].decrement();
  _ownedTokensCount[to].increment();
  _tokenOwner[tokenId] = to;
  emit Transfer(from, to, tokenId);
}
                internal ERC721._checkOnERC721Received keyboard_arrow_up
Source Code
function _checkOnERC721Received(
  address from,
  address to,
  uint256 tokenId,
  bytes memory _data
) internal returns (bool) {
  if (!to.isContract()) {
    return true;
  }
  bytes4 retval = IERC721Receiver(to).onERC721Received(
    _msgSender(),
    from,
    tokenId,
    _data
  );
  return (retval == _ERC721_RECEIVED);
}
                internal ERC721._clearApproval keyboard_arrow_up
internal Context.constructor keyboard_arrow_up
internal Context._msgSender keyboard_arrow_up
internal Context._msgData keyboard_arrow_up
Parameters help
This function has no parameters.
Source Code
function _msgData() internal view returns (bytes memory) {
  this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
  return msg.data;
}
                internal ERC165.constructor keyboard_arrow_up
internal ERC165._registerInterface keyboard_arrow_up
Requirements help
Source Code
function _registerInterface(bytes4 interfaceId) internal {
  require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
  _supportedInterfaces[interfaceId] = true;
}
                internal ERC721Metadata._setTokenURI keyboard_arrow_up
Requirements help
null
                    Source Code
function _setTokenURI(uint256 tokenId, string memory uri) internal {
  require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
  _tokenURIs[tokenId] = uri;
}
                internal ERC721Metadata._burn keyboard_arrow_up
Requirements help
Source Code
function _burn(address owner, uint256 tokenId) internal {
  super._burn(owner, tokenId);
  // Clear metadata (if any)
  if (bytes(_tokenURIs[tokenId]).length != 0) {
    delete _tokenURIs[tokenId];
  }
}
                internal Context.constructor keyboard_arrow_up
internal Context._msgSender keyboard_arrow_up
internal Context._msgData keyboard_arrow_up
Parameters help
This function has no parameters.
Source Code
function _msgData() internal view returns (bytes memory) {
  this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
  return msg.data;
}
                internal ERC165.constructor keyboard_arrow_up
internal ERC165._registerInterface keyboard_arrow_up
Requirements help
Source Code
function _registerInterface(bytes4 interfaceId) internal {
  require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
  _supportedInterfaces[interfaceId] = true;
}
                internal ERC721._safeTransferFrom keyboard_arrow_up
Requirements help
Source Code
function _safeTransferFrom(
  address from,
  address to,
  uint256 tokenId,
  bytes memory _data
) internal {
  _transferFrom(from, to, tokenId);
  require(
    _checkOnERC721Received(from, to, tokenId, _data),
    "ERC721: transfer to non ERC721Receiver implementer"
  );
}
                internal ERC721._exists keyboard_arrow_up
internal ERC721._isApprovedOrOwner keyboard_arrow_up
Requirements help
null
                    Source Code
function _isApprovedOrOwner(address spender, uint256 tokenId)
  internal
  view
  returns (bool)
{
  require(_exists(tokenId), "ERC721: operator query for nonexistent token");
  address owner = ownerOf(tokenId);
  return (spender == owner ||
    getApproved(tokenId) == spender ||
    isApprovedForAll(owner, spender));
}
                internal ERC721._safeMint keyboard_arrow_up
Requirements help
Source Code
function _safeMint(address to, uint256 tokenId) internal {
  _safeMint(to, tokenId, "");
}
                internal ERC721._safeMint keyboard_arrow_up
Requirements help
Source Code
function _safeMint(
  address to,
  uint256 tokenId,
  bytes memory _data
) internal {
  _mint(to, tokenId);
  require(
    _checkOnERC721Received(address(0), to, tokenId, _data),
    "ERC721: transfer to non ERC721Receiver implementer"
  );
}
                internal ERC721._mint keyboard_arrow_up
Requirements help
Source Code
function _mint(address to, uint256 tokenId) internal {
  require(to != address(0), "ERC721: mint to the zero address");
  require(!_exists(tokenId), "ERC721: token already minted");
  _tokenOwner[tokenId] = to;
  _ownedTokensCount[to].increment();
  emit Transfer(address(0), to, tokenId);
}
                internal ERC721._burn keyboard_arrow_up
Requirements help
Source Code
function _burn(address owner, uint256 tokenId) internal {
  require(ownerOf(tokenId) == owner, "ERC721: burn of token that is not own");
  _clearApproval(tokenId);
  _ownedTokensCount[owner].decrement();
  _tokenOwner[tokenId] = address(0);
  emit Transfer(owner, address(0), tokenId);
}
                internal ERC721._burn keyboard_arrow_up
Requirements help
Source Code
function _burn(uint256 tokenId) internal {
  _burn(ownerOf(tokenId), tokenId);
}
                internal ERC721._transferFrom keyboard_arrow_up
Requirements help
Source Code
function _transferFrom(
  address from,
  address to,
  uint256 tokenId
) internal {
  require(
    ownerOf(tokenId) == from,
    "ERC721: transfer of token that is not own"
  );
  require(to != address(0), "ERC721: transfer to the zero address");
  _clearApproval(tokenId);
  _ownedTokensCount[from].decrement();
  _ownedTokensCount[to].increment();
  _tokenOwner[tokenId] = to;
  emit Transfer(from, to, tokenId);
}
                internal ERC721._checkOnERC721Received keyboard_arrow_up
Source Code
function _checkOnERC721Received(
  address from,
  address to,
  uint256 tokenId,
  bytes memory _data
) internal returns (bool) {
  if (!to.isContract()) {
    return true;
  }
  bytes4 retval = IERC721Receiver(to).onERC721Received(
    _msgSender(),
    from,
    tokenId,
    _data
  );
  return (retval == _ERC721_RECEIVED);
}
                internal ERC721._clearApproval keyboard_arrow_up
internal Context.constructor keyboard_arrow_up
internal Context._msgSender keyboard_arrow_up
internal Context._msgData keyboard_arrow_up
Parameters help
This function has no parameters.
Source Code
function _msgData() internal view returns (bytes memory) {
  this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
  return msg.data;
}
                internal ERC165.constructor keyboard_arrow_up
internal ERC165._registerInterface keyboard_arrow_up
Requirements help
Source Code
function _registerInterface(bytes4 interfaceId) internal {
  require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
  _supportedInterfaces[interfaceId] = true;
}
                internal Ownable.constructor keyboard_arrow_up
internal Ownable._transferOwnership keyboard_arrow_up
Source Code
function _transferOwnership(address newOwner) internal {
  require(newOwner != address(0), "Ownable: new owner is the zero address");
  emit OwnershipTransferred(_owner, newOwner);
  _owner = newOwner;
}
                internal Context.constructor keyboard_arrow_up
internal Context._msgSender keyboard_arrow_up
internal Context._msgData keyboard_arrow_up
Parameters help
This function has no parameters.
Source Code
function _msgData() internal view returns (bytes memory) {
  this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
  return msg.data;
}
                
        
    



