@solana/keychain-cdp
v0.6.1
Published
Coinbase Developer Platform (CDP) signer for Solana transactions
Downloads
157
Maintainers
Readme
@solana/keychain-cdp
Coinbase Developer Platform (CDP) signer for Solana transactions using CDP's managed wallet infrastructure.
Installation
pnpm add @solana/keychain-cdpUsage
Create and Initialize
import { createCdpSigner } from '@solana/keychain-cdp';
// API keys are created at https://portal.cdp.coinbase.com
const signer = await createCdpSigner({
cdpApiKeyId: process.env.CDP_API_KEY_ID!,
cdpApiKeySecret: process.env.CDP_API_KEY_SECRET!,
cdpWalletSecret: process.env.CDP_WALLET_SECRET!,
address: process.env.CDP_SOLANA_ADDRESS!,
});
console.log('Signer address:', signer.address);Sign Messages
import { createSignableMessage } from '@solana/signers';
const message = createSignableMessage('Hello, CDP!');
const [signatures] = await signer.signMessages([message]);Sign Transactions
import {
createTransactionMessage,
pipe,
setTransactionMessageFeePayerSigner,
setTransactionMessageLifetimeUsingBlockhash,
signTransactionMessageWithSigners,
} from '@solana/kit';
const transaction = pipe(
createTransactionMessage({ version: 0 }),
tx => setTransactionMessageFeePayerSigner(signer, tx),
tx => setTransactionMessageLifetimeUsingBlockhash({ blockhash, lastValidBlockHeight }, tx),
);
const signed = await signTransactionMessageWithSigners(transaction);Check Availability
const available = await signer.isAvailable();
console.log('CDP API available:', available);API Reference
createCdpSigner(config)
Creates and initializes a new CdpSigner instance.
Config options:
cdpApiKeyId(string, required): CDP API key IDcdpApiKeySecret(string, required): Base64-encoded Ed25519 key (64 bytes: seed || pubkey)cdpWalletSecret(string, required): Base64-encoded PKCS#8 DER EC (P-256) private keyaddress(string, required): Solana account address managed by CDPbaseUrl(string, optional): Custom API base URL (defaults tohttps://api.cdp.coinbase.com)requestDelayMs(number, optional): Delay in ms between concurrent signing requests to avoid rate limits (default: 0)
Returns: Promise<CdpSigner>
Methods
signMessages(messages): Signs one or more messages (UTF-8 strings only)signTransactions(transactions): Signs one or more transactionsisAvailable(): Checks if the CDP API is reachableaddress: Read-only property containing the signer's Solana address
How It Works
- Initialization: Validates Ed25519 API key (seed/pubkey match) and loads P-256 wallet key
- Authentication: Every signing request sends two JWTs — an Ed25519 auth JWT and an ES256 wallet JWT with request body hash
- Signing: Sends transactions/messages to CDP's signing API endpoint
- Extraction: For transactions, uses
extractSignatureFromWireTransactionto extract the signer's signature from CDP's signed wire transaction. For messages, decodes the base58-encoded signature directly from the response.
Security Notes
- Store your
cdpApiKeySecretandcdpWalletSecretsecurely (use environment variables) - Never expose credentials in client-side code
- This signer is intended for server-side use or secure environments
- CDP handles key management — your signing keys never leave CDP's infrastructure
