Solana CookbookDevelopment
Load a local json file keypair
When running your local project you probably want to use a file json keypair.
This can be very useful for all the cookbook examples as well. You can grind
yourself a keypair using solana-keygen grind --starts-with a23:1
and then load
and use this one for your projects using the loadKeypairFromFile
function.
load-keypair-from-file.ts
import {airdropFactory,createKeyPairSignerFromBytes,createSolanaRpc,createSolanaRpcSubscriptions,devnet,generateKeyPair,getAddressFromPublicKey,KeyPairSigner,lamports,} from "@solana/web3.js";import fs from "fs";import path from "path";import os from "os";// The new library takes a brand-new approach to Solana key pairs and addresses,// which will feel quite different from the classes PublicKey and Keypair from version 1.x.// All key operations now use the native Ed25519 implementation in JavaScript’s// Web Crypto API.async function createKeypair() {const newKeypair: CryptoKeyPair = await generateKeyPair();const publicAddress = await getAddressFromPublicKey(newKeypair.publicKey);console.log(`Public key: ${publicAddress}`);}export async function loadDefaultKeypair(): Promise<KeyPairSigner<string>> {return await loadKeypairFromFile("~/.config/solana/id.json");}export async function loadDefaultKeypairWithAirdrop(cluster: string,): Promise<KeyPairSigner<string>> {const keypair = await loadDefaultKeypair();const rpc = createSolanaRpc(devnet(`https://api.${cluster}.solana.com`));const rpcSubscriptions = createSolanaRpcSubscriptions(devnet(`wss://api.${cluster}.solana.com`),);try {const result = await rpc.getBalance(keypair.address).send();console.log(`Balance: ${result.value} lamports`);if (result.value < lamports(500_000n)) {console.log(`Balance low requesting airdrop`);const airdrop = airdropFactory({ rpc, rpcSubscriptions });await airdrop({commitment: "confirmed",lamports: lamports(1_000_000_000n),recipientAddress: keypair.address,});}} catch (err) {console.error("Error fetching balance:", err);}return keypair;}export async function loadKeypairFromFile(filePath: string,): Promise<KeyPairSigner<string>> {// This is here so you can also load the default keypair from the file system.const resolvedPath = path.resolve(filePath.startsWith("~") ? filePath.replace("~", os.homedir()) : filePath,);const loadedKeyBytes = Uint8Array.from(JSON.parse(fs.readFileSync(resolvedPath, "utf8")),);// Here you can also set the second parameter to true in case you need to extract your private key.const keypairSigner = await createKeyPairSignerFromBytes(loadedKeyBytes);return keypairSigner;}createKeypair();