solana-token-extension-boost
Version:
SDK for Solana Token Extensions with wallet adapter support
97 lines (96 loc) • 4.26 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ConfidentialTransferToken = void 0;
const web3_js_1 = require("@solana/web3.js");
const spl_token_1 = require("@solana/spl-token");
const token_1 = require("../../core/token");
class ConfidentialTransferToken extends token_1.Token {
/**
* Create a new ConfidentialTransferToken instance
*
* @param connection - Connection to Solana cluster
* @param mintAddress - Public key of the token mint
*/
constructor(connection, mintAddress) {
super(connection, mintAddress);
}
/**
* Create instructions to create a new token with confidential transfer extension
*
* @param connection - Connection to Solana cluster
* @param payer - Public key of the transaction fee payer
* @param options - Creation options including:
* - decimals: Number of decimals for the token
* - mintAuthority: Authority allowed to mint tokens
* - freezeAuthority: Authority allowed to freeze accounts (optional)
* - autoEnable?: Whether to auto-enable confidential transfers
* @returns Instructions, signers and mint address
*/
static async createInstructions(connection, payer, options) {
const { decimals, mintAuthority, freezeAuthority = null } = options;
const mintLen = (0, spl_token_1.getMintLen)([spl_token_1.ExtensionType.ConfidentialTransferMint]);
const mintKeypair = web3_js_1.Keypair.generate();
const mint = mintKeypair.publicKey;
const lamports = await connection.getMinimumBalanceForRentExemption(mintLen);
const instructions = [
web3_js_1.SystemProgram.createAccount({
fromPubkey: payer,
newAccountPubkey: mint,
space: mintLen,
lamports,
programId: spl_token_1.TOKEN_2022_PROGRAM_ID,
}),
(0, spl_token_1.createInitializeMintInstruction)(mint, decimals, mintAuthority, freezeAuthority, spl_token_1.TOKEN_2022_PROGRAM_ID)
];
return {
instructions,
signers: [mintKeypair],
mint
};
}
/**
* Create instructions to configure an account for confidential transfers
*
* @param owner - Public key of the token account owner
* @param tokenAccount - Public key of the token account to configure (optional)
* @returns Transaction instruction
*/
async createConfigureAccountInstruction(owner, tokenAccount) {
const account = tokenAccount || await (0, spl_token_1.getAssociatedTokenAddress)(this.mint, owner, false, spl_token_1.TOKEN_2022_PROGRAM_ID);
return (0, spl_token_1.createTransferInstruction)(account, account, owner, BigInt(0), [], spl_token_1.TOKEN_2022_PROGRAM_ID);
}
/**
* Create instruction for a confidential transfer
*
* @param source - Public key of the source account
* @param destination - Public key of the destination account
* @param owner - Public key of the source account owner
* @param amount - Amount to transfer
* @returns Transaction instruction
*/
createConfidentialTransferInstruction(source, destination, owner, amount) {
return (0, spl_token_1.createTransferInstruction)(source, destination, owner, amount, [], spl_token_1.TOKEN_2022_PROGRAM_ID);
}
/**
* Check if an account is configured for confidential transfers
*
* @param tokenAccount - Public key of the token account to check
* @returns Boolean indicating if the account is configured for confidential transfers
*/
async isConfiguredForConfidentialTransfers(tokenAccount) {
try {
const accountInfo = await this.connection.getAccountInfo(tokenAccount);
if (!accountInfo) {
return false;
}
// In a real implementation, we would check if the account
// has the confidential transfer extension initialized
// For now, we'll just return true if the account exists
return true;
}
catch (error) {
return false;
}
}
}
exports.ConfidentialTransferToken = ConfidentialTransferToken;