@solana/spl-name-service
Version:
SPL Name Service JavaScript API
134 lines • 6.16 kB
JavaScript
import { PublicKey, SystemProgram, } from '@solana/web3.js';
import { createInstruction, deleteInstruction, reallocInstruction, transferInstruction, updateInstruction, } from './instructions';
import { NameRegistryState } from './state';
import { Numberu64 } from './utils';
import { getHashedName, getNameAccountKey, getNameOwner, Numberu32, } from './utils';
////////////////////////////////////////////////////////////
export const NAME_PROGRAM_ID = new PublicKey('namesLPneVptA9Z5rqUDD9tMTWEJwofgaYwp8cawRkX');
export const HASH_PREFIX = 'SPL Name Service';
////////////////////////////////////////////////////////////
/**
* Creates a name account with the given rent budget, allocated space, owner and class.
*
* @param connection The solana connection object to the RPC node
* @param name The name of the new account
* @param space The space in bytes allocated to the account
* @param payerKey The allocation cost payer
* @param nameOwner The pubkey to be set as owner of the new name account
* @param lamports The budget to be set for the name account. If not specified, it'll be the minimum for rent exemption
* @param nameClass The class of this new name
* @param parentName The parent name of the new name. If specified its owner needs to sign
* @returns
*/
export async function createNameRegistry(connection, name, space, payerKey, nameOwner, lamports, nameClass, parentName) {
const hashed_name = await getHashedName(name);
const nameAccountKey = await getNameAccountKey(hashed_name, nameClass, parentName);
const balance = lamports
? lamports
: await connection.getMinimumBalanceForRentExemption(space);
let nameParentOwner;
if (parentName) {
const parentAccount = await getNameOwner(connection, parentName);
nameParentOwner = parentAccount.owner;
}
const createNameInstr = createInstruction(NAME_PROGRAM_ID, SystemProgram.programId, nameAccountKey, nameOwner, payerKey, hashed_name, new Numberu64(balance), new Numberu32(space), nameClass, parentName, nameParentOwner);
return createNameInstr;
}
/**
* Overwrite the data of the given name registry.
*
* @param connection The solana connection object to the RPC node
* @param name The name of the name registry to update
* @param offset The offset to which the data should be written into the registry
* @param input_data The data to be written
* @param nameClass The class of this name, if it exsists
* @param nameParent The parent name of this name, if it exists
*/
export async function updateNameRegistryData(connection, name, offset, input_data, nameClass, nameParent) {
const hashed_name = await getHashedName(name);
const nameAccountKey = await getNameAccountKey(hashed_name, nameClass, nameParent);
let signer;
if (nameClass) {
signer = nameClass;
}
else {
signer = (await NameRegistryState.retrieve(connection, nameAccountKey))
.owner;
}
const updateInstr = updateInstruction(NAME_PROGRAM_ID, nameAccountKey, new Numberu32(offset), input_data, signer, nameParent);
return updateInstr;
}
/**
* Change the owner of a given name account.
*
* @param connection The solana connection object to the RPC node
* @param name The name of the name account
* @param newOwner The new owner to be set
* @param curentNameOwner the current name Owner
* @param nameClass The class of this name, if it exsists
* @param nameParent The parent name of this name, if it exists
* @returns
*/
export async function transferNameOwnership(connection, name, newOwner, nameClass, nameParent) {
const hashed_name = await getHashedName(name);
const nameAccountKey = await getNameAccountKey(hashed_name, nameClass, nameParent);
let curentNameOwner;
if (nameClass) {
curentNameOwner = nameClass;
}
else {
curentNameOwner = (await NameRegistryState.retrieve(connection, nameAccountKey)).owner;
}
const transferInstr = transferInstruction(NAME_PROGRAM_ID, nameAccountKey, newOwner, curentNameOwner, nameClass, nameParent);
return transferInstr;
}
/**
* Delete the name account and transfer the rent to the target.
*
* @param connection The solana connection object to the RPC node
* @param name The name of the name account
* @param refundTargetKey The refund destination address
* @param nameClass The class of this name, if it exsists
* @param nameParent The parent name of this name, if it exists
* @returns
*/
export async function deleteNameRegistry(connection, name, refundTargetKey, nameClass, nameParent) {
const hashed_name = await getHashedName(name);
const nameAccountKey = await getNameAccountKey(hashed_name, nameClass, nameParent);
let nameOwner;
if (nameClass) {
nameOwner = nameClass;
}
else {
nameOwner = (await NameRegistryState.retrieve(connection, nameAccountKey))
.owner;
}
const changeAuthoritiesInstr = deleteInstruction(NAME_PROGRAM_ID, nameAccountKey, refundTargetKey, nameOwner);
return changeAuthoritiesInstr;
}
/**
* Realloc the name account space.
*
* @param connection The solana connection object to the RPC node
* @param name The name of the name account
* @param space The new space to be allocated
* @param payerKey The allocation cost payer if new space is larger than current or the refund destination if smaller
* @param nameClass The class of this name, if it exsists
* @param nameParent The parent name of this name, if it exists
* @returns
*/
export async function reallocNameAccount(connection, name, space, payerKey, nameClass, nameParent) {
const hashedName = await getHashedName(name);
const nameAccountKey = await getNameAccountKey(hashedName, nameClass, nameParent);
let nameOwner;
if (nameClass) {
nameOwner = nameClass;
}
else {
nameOwner = (await NameRegistryState.retrieve(connection, nameAccountKey))
.owner;
}
const reallocInstr = reallocInstruction(NAME_PROGRAM_ID, SystemProgram.programId, payerKey, nameAccountKey, nameOwner, new Numberu32(space));
return reallocInstr;
}
//# sourceMappingURL=bindings.js.map