# 2.3 Burning Mechanism

The handle/sub-handle gets burned and are issued a new token ID when another user mints an expired handle/sub-handle using the `mintHandle` or `mintSubhandle` function. It's crucial for owners to renew before the expiration date to prevent reclamation through the mint function. \
\
When a parent handle gets reclaimed by another user, the previous parent handle owner loses any upcoming revenue share from sub-handle owners, which is then transferred to the new owner of the handle.\
\
Burn Handle:

{% code overflow="wrap" %}

```solidity

/**
    * Function to burn an expired handle.
    * @param tokenId The token ID associated with the handle.
    */
    function burnHandle(uint256 tokenId) internal {
        // Get the handle name with suffix and the corresponding handle.
        string memory handleWithSuffix = handleNames[tokenId];
        Handle storage handle = handles[handleWithSuffix];

        // Check if the handle is registered.
        require(handle.tokenId != 0, "Handle not registered");
        // Check if the handle is expired.
        require(handle.expirationTimestamp <= block.timestamp, "Handle is not expired");

        address owner = ownerOf(tokenId); // Get the owner of the token.

        // Mark the token as burned
        burnedTokenIds[tokenId] = true;

        // Burn the token
        _burn(tokenId);

        emit HandleBurned(owner, handleWithSuffix, tokenId);
    }
                                                                
```

{% endcode %}

Burn Sub-Handle:

{% code overflow="wrap" %}

```solidity

/**
    * Function to burn an expired subhandle.
    * @param subhandleAndParent The combined name of the subhandle and its parent handle.
    */
    function burnSubhandle(string memory subhandleAndParent) internal {
        // Split the combined handle name into subhandle name and parent handle name.
        (string memory subhandleName, string memory parentHandleName) = StringUtil.splitCombinedHandleName(subhandleAndParent);
        // Construct the parent handle name with suffix.
        string memory parentHandleWithSuffix = string(abi.encodePacked(parentHandleName, ".", string(HANDLE_SUFFIX)));
        // Get the subhandle from the parent handle's subhandles mapping.
        Subhandle storage subhandle = handles[parentHandleWithSuffix].subhandles[subhandleName];

        // Check if the subhandle is registered.
        require(subhandle.tokenId != 0, "Subhandle not registered");
        // Check if the subhandle is expired.
        require(subhandle.expirationTimestamp <= block.timestamp, "Subhandle is not expired");

        // Mark the token as burned
        burnedTokenIds[subhandle.tokenId] = true;

        // Burn the token
        _burn(subhandle.tokenId);

        // Construct the subhandle name with suffix.
        string memory subhandleWithSuffix = string(abi.encodePacked(subhandleName, ".", parentHandleWithSuffix));

        emit SubhandleBurned(msg.sender, subhandleWithSuffix, subhandle.tokenId);
    }
```

{% endcode %}

\
Example:

{% code overflow="wrap" fullWidth="false" %}

```solidity

logs	[
	{
		"from": "0xF27374C91BF602603AC5C9DaCC19BE431E3501cb",
		"topic": "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
		"event": "Transfer",
		"args": {
			"0": "0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2",
			"1": "0x0000000000000000000000000000000000000000",
			"2": "1",
			"from": "0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2",
			"to": "0x0000000000000000000000000000000000000000",
			"tokenId": "1"
		}
	},
	{
		"from": "0xF27374C91BF602603AC5C9DaCC19BE431E3501cb",
		"topic": "0x5c1f7b3601e4cd4a1078139c2f4b0099777ade51b09f3f9ea8f0ad4af6d601bf",
		"event": "HandleBurned",
		"args": {
			"0": "0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2",
			"1": "testing123.₿",
			"2": "1",
			"owner": "0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2",
			"handleName": "testing123.₿",
			"tokenId": "1"
		}
	},
	{
		"from": "0xF27374C91BF602603AC5C9DaCC19BE431E3501cb",
		"topic": "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
		"event": "Transfer",
		"args": {
			"0": "0x0000000000000000000000000000000000000000",
			"1": "0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db",
			"2": "2",
			"from": "0x0000000000000000000000000000000000000000",
			"to": "0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db",
			"tokenId": "2"
		}
	},
	{
		"from": "0xF27374C91BF602603AC5C9DaCC19BE431E3501cb",
		"topic": "0xbca2d57eabab381fa4ab39218b0b9ddc157bae88693c3a180a5451dac48303a0",
		"event": "HandleRegistered",
		"args": {
			"0": "0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db",
			"1": "testing123.₿",
			"2": "1746466030",
			"3": "2",
			"owner": "0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db",
			"handleName": "testing123.₿",
			"expirationTimestamp": "1746466030",
			"tokenId": "2"
		}
	}
]
```

{% endcode %}

*0xAb...835cb2 < Token Id 1 = testing123.₿ < Burned < Minted < Token Id 2 Issued = testing123.₿ < 0x4B...2C02db*


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://studybitcoin.gitbook.io/hndl-bitcoin-handle-naming-system/2.3-burning-mechanism.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
