Subdomains
Subdomains in Solana Name Service (SNS) are similar to .sol
domains but have a different parent. They can be considered as normal domains but from a different Top-Level Domain (TLD). For instance, something.example.sol
can be considered the something subdomain of example.sol
or a domain from the TLD example.sol
.
Key Characteristics of Subdomains
-
Parent Ownership: The owner of the parent domain retains the ability to transfer subdomains without the signature from the owner of the subdomains. This is a unique feature of subdomains in SNS.
-
Limited Wallet Support: Subdomains have limited wallet support. This means that not all wallets may support transactions involving subdomains.
-
Feature Support: Subdomains support the same features as main domains. This includes the ability to transfer and update data.
Creating a subdomain
This code snippet creates a subdomain and its reverse lookup account:
import { createSubdomain } from "@bonfida/spl-name-service";
// The subdomain to create with or without .sol e.g something.bonfida.sol or something.bonfida
const subdomain = "something.bonfida.sol";
// The owner of the parent domain
const owner = new PublicKey("...");
const ix = createSubdomain(connection, subdomain, owner);
// Sign and send the tx...
The created subdomains will initially be owned by the parent owner. A subdomain can be created and transfered inside the same transaction.
Transferring a Subdomain
Subdomains can be transferred using the transferSubdomain
instruction. Here is an example of how the subdomain owner can transfer a subdomain:
import { transferSubdomain } from "@bonfida/spl-name-service";
// ..
// Subdomains to transfer
const subdomain = "something.bonfida.sol";
// New owner of the domain
const newOwner = new PublicKey("...");
// Whether the parent name owner is signing the transfer
const isParentSigner = false;
const ix = await transferSubdomain(
connection,
subdomain,
newOwner,
isParentSigner
);
// sign and send instruction
The parent name owner can trigger a transfer by setting the isParentSigner
flag to true
and signing the transaction.
Resolving Subdomains
Subdomains of a .sol
domain can be resolved using the findSubdomains
function. Here is an example of how to resolve subdomains:
import { findSubdomains } from "@bonfida/spl-name-service";
// Public key of bonfida.sol
const parentKey = new PublicKey("Crf8hzfthWGbGbLTVCiqRqV5MVnbpHB1L9KQMd6gsinb");
// Assuming that bonfida.sol has the following subdomains
// - sub_1.bonfida.sol
// - sub_2.bonfida.sol
const subdomains: string[] = await findSubdomains(connection, parentKey); // [sub_1, sub_2]
Deleting a Subdomain
Subdomains can be deleted using the deleteInstruction
function. Here is an example of how to delete a subdomain:
import { Keypair, clusterApiUrl } from "@solana/web3.js";
import {
getDomainKey,
NAME_PROGRAM_ID,
deleteInstruction,
} from "@bonfida/spl-name-service";
import { signAndSendInstructions } from "@bonfida/utils";
// dex.bonfida.sol
const domain = "dex.bonfida.sol"; // With or without .sol
const wallet = Keypair.fromSecretKey(...);
const deleteSubDomain = async () => {
const { pubkey } = await getDomainKey(domain);
const ix = deleteInstruction(
NAME_PROGRAM_ID,
pubkey,
wallet.publicKey,
wallet.publicKey
);
const tx = await signAndSendInstructions(connection, [], wallet, [ix]);
console.log(`Deleted subdomain ${tx}`);
};
deleteSubDomain();
💡 While the deletion of a subdomain is a reversible action, it's important to be mindful of potential unintended consequences.
In conclusion, subdomains in SNS are a powerful feature that allows for more granular control and organization of domain names. However, they come with their own set of considerations such as limited wallet support and different ownership rules.