Tokenize domain name into Metaplex NFTs
Mainnet program ID nftD3vbNkNqfj2Sd3HZwbpw4BxxKWr4AjGb9X38JeZk
This program allows people to tokenize their domain name in NFTs that follow the Metaplex standard with a creation/redemption mechanism.
A reproducible build script (build.sh
) can be used to build the program using docker
For security disclosures or to report a bug, please visit ImmuneFi for more information on our bug bounty program.
NFTs are all part of a verified collection E5ZnBpH9DYcxRkumKdS4ayJ3Ftb6o3E8wSbXw4N92GWg
.
NFT mints are PDAs derived from the domain name key they represent. The derivation is made as follow:
pub const MINT_PREFIX: &[u8; 14] = b"tokenized_name";
// ...
let (mint, mint_nonce) = Pubkey::find_program_address(
&[MINT_PREFIX, &accounts.name_account.key.to_bytes()],
program_id,
);
When a domain name is tokenized its ownership is transfered to a PDA that will be holding the domain while it's tokenized. In exchange, the program mints an NFT for the user. When redeeming the domain is transfered back to the NFT holder and the NFT burned.
During the tokenization process an NftRecord
is created with the following state:
pub struct NftRecord {
/// Tag
pub tag: Tag,
/// Nonce
pub nonce: u8,
/// Name account of the record
pub name_account: Pubkey,
/// Record owner
pub owner: Pubkey,
/// NFT mint
pub nft_mint: Pubkey,
}
If funds are sent by mistake to the NftRecord
instead of the NFT holder while the domain is tokenized the owner has the possibility to withdraw them. The "correct owner" is determined as follow:
- If the
NftRecord
is active i.e domain is tokenized: The correct owner is the NFT holder - If
NftRecord
is inactive i.e the NFT has been redeemed: The correct owner is the last person who redeemed (owner
field in theNftRecord
)
Functional Rust tests can be run with
cargo test-bpf --features devnet
End to end tests can be run with
yarn jest