Use ALT
Use Address Lookup Tables in a Instruction / Transaction
New Way
Note - remember to install @solana-program/address-lookup-table
import {
address,
AddressesByLookupTableAddress,
createKeyPairSignerFromBytes,
createSolanaRpc,
createSolanaRpcSubscriptions,
compressTransactionMessageUsingAddressLookupTables,
createTransactionMessage,
getSignatureFromTransaction,
IInstruction,
KeyPairSigner,
pipe,
sendAndConfirmTransactionFactory,
setTransactionMessageFeePayerSigner,
setTransactionMessageLifetimeUsingBlockhash,
signTransactionMessageWithSigners,
appendTransactionMessageInstructions,
lamports
} from "@solana/web3.js";
import { fetchAddressLookupTable } from "@solana-program/address-lookup-table";
import walletSecret from "./wallet.json";
import { getTransferSolInstruction } from "@solana-program/system";
type Client = {
rpc: any;
rpcSubscriptions: any;
}
export async function sendTransactionWithAlt(
client: Client,
payer: KeyPairSigner,
instructions: IInstruction[],
addressesByLookupTableAddress: AddressesByLookupTableAddress
) {
const { value: latestBlockhash } = await client.rpc.getLatestBlockhash().send();
const tx = pipe(
createTransactionMessage({ version: 0 }),
(tx) => setTransactionMessageFeePayerSigner(payer, tx),
(tx) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx),
(tx) => appendTransactionMessageInstructions(instructions, tx),
(tx) => compressTransactionMessageUsingAddressLookupTables(tx, addressesByLookupTableAddress),
);
const signedTransaction = await signTransactionMessageWithSigners(tx);
const signature = getSignatureFromTransaction(signedTransaction);
await sendAndConfirmTransactionFactory(client)(signedTransaction, {
commitment: 'confirmed',
skipPreflight: false
});
return signature;
}
const main = async () => {
const rpc = createSolanaRpc('https://api.devnet.solana.com');
const wss = createSolanaRpcSubscriptions('wss://api.devnet.solana.com');
const client = { rpc, rpcSubscriptions: wss };
const keypairBytes = new Uint8Array(walletSecret);
const authority = await createKeyPairSignerFromBytes(keypairBytes);
const alt = address('24uisJYVAt3NhdeyAVJA1y5MERAia42LTTLiRGtrQNmw');
const altAccount = await fetchAddressLookupTable(client.rpc, alt);
const addresses = altAccount.data.addresses;
console.log(addresses);
const txInstructions: IInstruction[] = [];
for (let i = 0; i < addresses.length; i++) {
txInstructions.push(getTransferSolInstruction({
amount: lamports(BigInt(1)),
source: authority,
destination: addresses[i],
}))
}
const result = await sendTransactionWithAlt(client, authority, txInstructions, { [alt]: addresses });
console.log("Success:", result);
}
main();
Old Way
const messageV0 = new web3.TransactionMessage({
payerKey: payer.publicKey,
recentBlockhash: blockhash,
instructions: arrayOfInstructions, // note this is an array of instructions
}).compileToV0Message([lookupTableAccount]);
const transactionV0 = new web3.VersionedTransaction(messageV0);
transactionV0.sign([payer]);
const txid = await web3.sendAndConfirmTransaction(connection, transactionV0);
console.log(txid);