import { Address, Commitment, CompilableTransactionMessage, Rpc, RpcSubscriptions, SolanaRpcApi, SolanaRpcSubscriptionsApi, TransactionMessageWithBlockhashLifetime, TransactionSigner, airdropFactory, appendTransactionMessageInstructions, createSolanaRpc, createSolanaRpcSubscriptions, createTransactionMessage, generateKeyPairSigner, getSignatureFromTransaction, lamports, pipe, sendAndConfirmTransactionFactory, setTransactionMessageFeePayerSigner, setTransactionMessageLifetimeUsingBlockhash, signTransactionMessageWithSigners, } from '@solana/web3.js'; import { TOKEN_PROGRAM_ADDRESS, getInitializeMintInstruction, getMintSize, } from '../src/index.js'; import { getCreateAccountInstruction } from '@solana-program/system'; type Client = { rpc: Rpc; rpcSubscriptions: RpcSubscriptions; }; export const createDefaultSolanaClient = (): Client => { const rpc = createSolanaRpc('http://127.0.0.1:8899'); const rpcSubscriptions = createSolanaRpcSubscriptions('ws://127.0.0.1:8900'); return { rpc, rpcSubscriptions }; }; export const generateKeyPairSignerWithSol = async ( client: Client, putativeLamports: bigint = 1_000_000_000n ) => { const signer = await generateKeyPairSigner(); await airdropFactory(client)({ recipientAddress: signer.address, lamports: lamports(putativeLamports), commitment: 'confirmed', }); return signer; }; export const createDefaultTransaction = async ( client: Client, feePayer: TransactionSigner ) => { const { value: latestBlockhash } = await client.rpc .getLatestBlockhash() .send(); return pipe( createTransactionMessage({ version: 0 }), (tx) => setTransactionMessageFeePayerSigner(feePayer, tx), (tx) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx) ); }; export const signAndSendTransaction = async ( client: Client, transactionMessage: CompilableTransactionMessage & TransactionMessageWithBlockhashLifetime, commitment: Commitment = 'confirmed' ) => { const signedTransaction = await signTransactionMessageWithSigners(transactionMessage); const signature = getSignatureFromTransaction(signedTransaction); await sendAndConfirmTransactionFactory(client)(signedTransaction, { commitment, }); return signature; }; export const getBalance = async (client: Client, address: Address) => (await client.rpc.getBalance(address, { commitment: 'confirmed' }).send()) .value; export const createMint = async ( client: Client, authority: TransactionSigner ): Promise
=> { const space = BigInt(getMintSize()); const [transactionMessage, rent, mint] = await Promise.all([ createDefaultTransaction(client, authority), client.rpc.getMinimumBalanceForRentExemption(space).send(), generateKeyPairSigner(), ]); const instructions = [ getCreateAccountInstruction({ payer: authority, newAccount: mint, lamports: rent, space, programAddress: TOKEN_PROGRAM_ADDRESS, }), getInitializeMintInstruction({ mint: mint.address, decimals: 2, mintAuthority: authority.address, }), ]; await pipe( transactionMessage, (tx) => appendTransactionMessageInstructions(instructions, tx), (tx) => signAndSendTransaction(client, tx) ); return mint.address; };