UNPKG

gill

Version:

a modern javascript/typescript client library for interacting with the Solana blockchain

1 lines 16 kB
{"version":3,"sources":["../../src/node/const.ts","../../src/node/load-keypair.ts","../../src/core/keypairs-extractable.ts","../../src/core/keypairs-base58.ts","../../src/node/load-keypair-base58.ts","../../src/node/save-keypair.ts"],"names":["resolve","homedir","createKeyPairFromBytes","readFileSync","createSignerFromKeyPair","assertKeyExporterIsAvailable","getBase58Encoder","writeFileSync","createKeyPairSignerFromBytes","appendFileSync"],"mappings":"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","file":"index.node.cjs","sourcesContent":["/** Default Solana tool suite local keypair path */\nexport const DEFAULT_CLI_KEYPAIR_PATH = \"~/.config/solana/id.json\";\n","import { readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { resolve } from \"node:path\";\n\nimport { createKeyPairFromBytes, createSignerFromKeyPair, type KeyPairSigner } from \"@solana/kit\";\nimport { DEFAULT_CLI_KEYPAIR_PATH } from \"./const\";\nimport type { loadKeypairFromEnvironmentBase58, loadKeypairSignerFromEnvironmentBase58 } from \"./load-keypair-base58\";\n\n/**\n * Load a `CryptoKeyPair` from a filesystem wallet json file\n * (i.e. those generated by the `solana-keygen` command)\n *\n * @param filePath - file path to a json keypair file, default={@link DEFAULT_CLI_KEYPAIR_PATH}\n */\nexport async function loadKeypairFromFile(filePath: string = DEFAULT_CLI_KEYPAIR_PATH): Promise<CryptoKeyPair> {\n const resolvedPath = resolve(filePath.startsWith(\"~\") ? filePath.replace(\"~\", homedir()) : filePath);\n return createKeyPairFromBytes(Uint8Array.from(JSON.parse(readFileSync(resolvedPath, \"utf8\"))));\n}\n\n/**\n * Load a `KeyPairSigner` from a filesystem wallet json file\n * (i.e. those generated by the `solana-keygen` command)\n *\n * @param filePath - file path to a json keypair file, default={@link DEFAULT_CLI_KEYPAIR_PATH}\n */\nexport async function loadKeypairSignerFromFile(filePath: string = DEFAULT_CLI_KEYPAIR_PATH): Promise<KeyPairSigner> {\n return createSignerFromKeyPair(await loadKeypairFromFile(filePath));\n}\n\n/**\n * Load a `CryptoKeyPair` from an environment variable\n * (i.e. those generated by the `solana-keygen` command)\n *\n * Note: for base58 encoded keypairs in environment variables use {@link loadKeypairFromEnvironmentBase58}\n *\n * @param variableName - environment variable name accessible via `process.env[variableName]`\n */\nexport async function loadKeypairFromEnvironment<TName extends keyof NodeJS.ProcessEnv | string>(\n variableName: TName,\n): Promise<CryptoKeyPair> {\n if (!process.env[variableName]) {\n throw new Error(`Environment variable '${variableName}' not set`);\n }\n return createKeyPairFromBytes(Uint8Array.from(JSON.parse(process.env[variableName])));\n}\n\n/**\n * Load a `KeyPairSigner` from a environment variable\n * (i.e. those generated by the `solana-keygen` command)\n *\n * Note: for base58 encoded keypairs in environment variables use {@link loadKeypairSignerFromEnvironmentBase58}\n *\n * @param variableName - environment variable name accessible via `process.env[variableName]`\n */\nexport async function loadKeypairSignerFromEnvironment<TName extends keyof NodeJS.ProcessEnv | string>(\n variableName: TName,\n): Promise<KeyPairSigner> {\n return createSignerFromKeyPair(await loadKeypairFromEnvironment(variableName));\n}\n","import { assertKeyExporterIsAvailable, assertKeyGenerationIsAvailable } from \"@solana/assertions\";\nimport type { KeyPairSigner, createKeyPairFromBytes, createKeyPairSignerFromBytes } from \"@solana/kit\";\nimport { createSignerFromKeyPair } from \"@solana/kit\";\n\nexport function assertKeyPairIsExtractable(keyPair: CryptoKeyPair): asserts keyPair is ExtractableCryptoKeyPair {\n assertKeyExporterIsAvailable();\n\n if (!keyPair.privateKey) {\n throw new Error(\"Keypair is missing private key\");\n }\n\n if (!keyPair.publicKey) {\n throw new Error(\"Keypair is missing public key\");\n }\n\n if (!keyPair.privateKey.extractable) {\n throw new Error(\"Private key is not extractable\");\n }\n}\n\ntype Extractable = { \"~extractable\": true };\n\ntype ExtractableCryptoKeyPair = CryptoKeyPair & Extractable;\ntype ExtractableKeyPairSigner = KeyPairSigner & Extractable;\n\n/**\n * Generates an extractable Ed25519 `CryptoKeyPair` capable of signing messages and transactions\n * */\nexport async function generateExtractableKeyPair(): Promise<ExtractableCryptoKeyPair> {\n await assertKeyGenerationIsAvailable();\n return crypto.subtle.generateKey(\n /* algorithm */ \"Ed25519\", // Native implementation status: https://github.com/WICG/webcrypto-secure-curves/issues/20\n /* extractable */ true,\n /* allowed uses */ [\"sign\", \"verify\"],\n ) as Promise<ExtractableCryptoKeyPair>;\n}\n\n/**\n * Generates an extractable signer capable of signing messages and transactions using a Crypto KeyPair.\n * */\nexport async function generateExtractableKeyPairSigner(): Promise<ExtractableKeyPairSigner> {\n return createSignerFromKeyPair(await generateExtractableKeyPair()) as Promise<ExtractableKeyPairSigner>;\n}\n\n/**\n * Extracts the raw key material from an extractable Ed25519 CryptoKeyPair.\n *\n * @remarks\n * - Requires a keypair generated with extractable=true. See {@link generateExtractableKeyPair}.\n * - The extracted bytes can be used to reconstruct the `CryptoKeyPair` with {@link createKeyPairFromBytes}.\n *\n * @param keypair An extractable Ed25519 `CryptoKeyPair`\n * @returns Raw key bytes as `Uint8Array`\n */\nexport async function extractBytesFromKeyPair(keypair: ExtractableCryptoKeyPair | CryptoKeyPair): Promise<Uint8Array> {\n assertKeyPairIsExtractable(keypair);\n\n const [publicKeyBytes, privateKeyJwk] = await Promise.all([\n crypto.subtle.exportKey(\"raw\", keypair.publicKey),\n crypto.subtle.exportKey(\"jwk\", keypair.privateKey),\n ]);\n\n if (!privateKeyJwk.d) throw new Error(\"Failed to get private key bytes\");\n\n return new Uint8Array([...Buffer.from(privateKeyJwk.d, \"base64\"), ...new Uint8Array(publicKeyBytes)]);\n}\n\n/**\n * Extracts the raw key material from an extractable Ed25519 KeyPairSigner.\n *\n * @remarks\n * - Requires a keypair generated with extractable=true. See {@link generateExtractableKeyPairSigner}.\n * - The extracted bytes can be used to reconstruct the `CryptoKeyPair` with {@link createKeyPairSignerFromBytes}.\n *\n * @param keypairSigner An extractable Ed25519 `KeyPairSigner`\n * @returns Raw key bytes as `Uint8Array`\n */\nexport async function extractBytesFromKeyPairSigner(\n keypairSigner: ExtractableKeyPairSigner | KeyPairSigner,\n): Promise<Uint8Array> {\n return extractBytesFromKeyPair(keypairSigner.keyPair);\n}\n","import { createKeyPairFromBytes, createSignerFromKeyPair, getBase58Encoder, type KeyPairSigner } from \"@solana/kit\";\n\n/**\n * Create a `CryptoKeyPair` from as base58 encoded secret key\n */\nexport async function createKeypairFromBase58(punitiveSecretKey: string): Promise<CryptoKeyPair> {\n return createKeyPairFromBytes(getBase58Encoder().encode(punitiveSecretKey));\n}\n\n/**\n * Create a `KeyPairSigner` from as base58 encoded secret key\n */\nexport async function createKeypairSignerFromBase58(punitiveSecretKey: string): Promise<KeyPairSigner> {\n return createSignerFromKeyPair(await createKeypairFromBase58(punitiveSecretKey));\n}\n","import { createSignerFromKeyPair, type KeyPairSigner } from \"@solana/kit\";\nimport { createKeypairFromBase58 } from \"../core\";\n\n/**\n * Load a `CryptoKeyPair` from an environment variable containing a base58 encoded keypair\n *\n * @param variableName - environment variable name accessible via `process.env[variableName]`\n */\nexport async function loadKeypairFromEnvironmentBase58<TName extends keyof NodeJS.ProcessEnv | string>(\n variableName: TName,\n): Promise<CryptoKeyPair> {\n if (!process.env[variableName]) {\n throw new Error(`Environment variable '${variableName}' not set`);\n }\n return createKeypairFromBase58(process.env[variableName]);\n}\n\n/**\n * Load a `KeyPairSigner` from an environment variable containing a base58 encoded keypair\n *\n * @param variableName - environment variable name accessible via `process.env[variableName]`\n */\nexport async function loadKeypairSignerFromEnvironmentBase58<TName extends keyof NodeJS.ProcessEnv | string>(\n variableName: TName,\n): Promise<KeyPairSigner> {\n return createSignerFromKeyPair(await loadKeypairFromEnvironmentBase58(variableName));\n}\n","import { appendFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { resolve } from \"node:path\";\n\nimport { createKeyPairSignerFromBytes, type KeyPairSigner } from \"@solana/kit\";\nimport { extractBytesFromKeyPair } from \"../core\";\nimport { loadKeypairSignerFromFile } from \"./load-keypair\";\n\n/**\n * Save an extractable `CryptoKeyPair` to a filesystem wallet json file\n * (i.e. same format as those generated by the `solana-keygen` command)\n *\n * @param keypair - an extractable `CryptoKeyPair`\n * @param filePath - path to file where the keypair will be saved\n */\nexport async function saveKeypairToFile(keypair: CryptoKeyPair, filePath: string): Promise<boolean> {\n if (!filePath.endsWith(\".json\")) {\n throw new Error(\"Must provide a json file path to save keypair to\");\n }\n\n const resolvedPath = resolve(filePath.startsWith(\"~\") ? filePath.replace(\"~\", homedir()) : filePath);\n\n // initialized in multiple steps to help deallocate the bytes faster\n let bytes: Uint8Array | null;\n bytes = await extractBytesFromKeyPair(keypair);\n writeFileSync(resolvedPath, \"[\" + Array.from(bytes).toString() + \"]\", \"utf8\");\n\n // attempt to reload the saved file to ensure the save was correctly formatted\n const [input, output] = await Promise.all([\n createKeyPairSignerFromBytes(bytes),\n loadKeypairSignerFromFile(resolvedPath),\n ]);\n\n // help force the key bytes to be deallocated faster\n bytes = null;\n\n return input.address === output.address;\n}\n\n/**\n * Save an extractable `KeyPairSigner` to a filesystem wallet json file\n * (i.e. same format as those generated by the `solana-keygen` command)\n *\n * @param keypairSigner - an extractable `KeyPairSigner`\n * @param filePath - path to file where the keypair will be saved\n */\nexport async function saveKeypairSignerToFile(keypairSigner: KeyPairSigner, filePath: string): Promise<boolean> {\n return saveKeypairToFile(keypairSigner.keyPair, filePath);\n}\n\n/**\n * Save an extractable `CryptoKeyPair` to a local environment file (e.g. `.env`)\n * (i.e. same format as those generated by the `solana-keygen` command)\n *\n * @param keypair - an extractable `CryptoKeyPair`\n * @param variableName - environment variable name accessible via `process.env[variableName]` after env file is loaded\n * @param envFilePath - environment variable file path, default = `.env` in the current working directory\n */\nexport async function saveKeypairToEnvFile(\n keypair: CryptoKeyPair,\n variableName: string,\n envFilePath: string = \".env\",\n): Promise<void> {\n if (process.env[variableName]) {\n throw new Error(`Environment variable '${variableName}' already exist.`);\n }\n\n const resolvedPath = resolve(envFilePath.startsWith(\"~\") ? envFilePath.replace(\"~\", homedir()) : envFilePath);\n\n // initialized in multiple steps to help deallocate the bytes faster\n let bytes: Uint8Array | null;\n bytes = await extractBytesFromKeyPair(keypair);\n const signer = await createKeyPairSignerFromBytes(bytes);\n\n appendFileSync(\n resolvedPath,\n `\\n# Solana Address: ${signer.address}` + `\\n${variableName}=[${Array.from(bytes).toString()}]`,\n \"utf8\",\n );\n\n // help force the key bytes to be deallocated faster\n bytes = null;\n}\n\n/**\n * Save an extractable `KeyPairSigner` to a filesystem wallet json file\n * (i.e. same format as those generated by the `solana-keygen` command)\n *\n * @param keypairSigner - an extractable `KeyPairSigner`\n * @param variableName - environment variable name accessible via `process.env[variableName]` after env file is loaded\n * @param envFilePath - environment variable file path, default = `.env` in the current working directory\n */\nexport async function saveKeypairSignerToEnvFile(\n keypairSigner: KeyPairSigner,\n variableName: string,\n envFilePath: string = \".env\",\n): Promise<void> {\n return saveKeypairToEnvFile(keypairSigner.keyPair, variableName, envFilePath);\n}\n"]}