Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ pnpm add @solana/keychain-dfns # Dfns
pnpm add @solana/keychain-openfort # Openfort
pnpm add @solana/keychain-para # Para
pnpm add @solana/keychain-utila # Utila

# Kit client plugins (keychainSigner / keychainPayer / keychainIdentity)
pnpm add @solana/keychain-kit-plugin
```

## Basic Usage
Expand Down Expand Up @@ -96,14 +99,74 @@ async function signWithKeychain(signer: SolanaSigner) {
}
```

### Using with a Kit Client (keychainSigner plugin)

`@solana/keychain-kit-plugin` installs a keychain signer directly on a
[Kit client](https://github.com/anza-xyz/kit), wiring it up as the `payer` and
`identity` so you skip the manual `pipe` setup shown above:

```typescript
import { createClient } from "@solana/kit";
import { keychainSigner } from "@solana/keychain-kit-plugin";

const client = await createClient().use(
keychainSigner({
backend: "privy",
appId: process.env.PRIVY_APP_ID!,
appSecret: process.env.PRIVY_APP_SECRET!,
walletId: process.env.PRIVY_WALLET_ID!
})
);

client.payer; // SolanaSigner — also a Kit TransactionSigner
client.identity; // same signer instance
```

The plugin accepts the same backend-tagged config as `createKeychainSigner`, and
only the backend it dispatches to is bundled (backend packages load via dynamic
`import()`).

Use `keychainPayer` or `keychainIdentity` to set just one role, and mix backends
on a single client:

```typescript
import { createClient } from "@solana/kit";
import { keychainIdentity, keychainPayer } from "@solana/keychain-kit-plugin";

const client = await createClient()
.use(
keychainPayer({
backend: "memory",
privateKeyPath: "~/.config/solana/id.json"
})
Comment thread
amilz marked this conversation as resolved.
)
.use(keychainIdentity({ backend: "turnkey", ...turnkeyConfig }));
```

Already have a `SolanaSigner`? Every keychain signer is a valid Kit
`TransactionSigner`, so you can install an existing one with
[`@solana/kit-plugin-signer`](https://github.com/anza-xyz/kit-plugins/tree/main/packages/kit-plugin-signer)
instead (`pnpm add @solana/kit-plugin-signer`):

```typescript
import { signer } from "@solana/kit-plugin-signer";
import { createKeychainSigner } from "@solana/keychain";

const mySigner = await createKeychainSigner({
backend: "vault",
...vaultConfig
});
const client = createClient().use(signer(mySigner));
```
Comment thread
amilz marked this conversation as resolved.

## Backend Configuration

### HashiCorp Vault

```typescript
import { VaultSigner } from "@solana/keychain-vault";
import { createVaultSigner } from "@solana/keychain-vault";

const signer = new VaultSigner({
const signer = createVaultSigner({
vaultAddr: "https://vault.example.com:8200",
vaultToken: "hvs.xxxxx",
keyName: "my-solana-key",
Expand All @@ -114,9 +177,9 @@ const signer = new VaultSigner({
### AWS KMS

```typescript
import { AwsKmsSigner } from "@solana/keychain-aws-kms";
import { createAwsKmsSigner } from "@solana/keychain-aws-kms";

const signer = new AwsKmsSigner({
const signer = createAwsKmsSigner({
keyId: "alias/my-solana-key",
publicKey: "base58_public_key",
region: "us-east-1" // optional
Expand All @@ -126,9 +189,9 @@ const signer = new AwsKmsSigner({
### Privy

```typescript
import { PrivySigner } from "@solana/keychain-privy";
import { createPrivySigner } from "@solana/keychain-privy";

const signer = await PrivySigner.create({
const signer = await createPrivySigner({
appId: "app_id",
appSecret: "app_secret",
walletId: "wallet_id"
Expand All @@ -138,9 +201,9 @@ const signer = await PrivySigner.create({
### Turnkey

```typescript
import { TurnkeySigner } from "@solana/keychain-turnkey";
import { createTurnkeySigner } from "@solana/keychain-turnkey";

const signer = new TurnkeySigner({
const signer = createTurnkeySigner({
apiPublicKey: "api_public_key",
apiPrivateKey: "api_private_key",
organizationId: "org_id",
Expand All @@ -152,15 +215,14 @@ const signer = new TurnkeySigner({
### Fireblocks

```typescript
import { FireblocksSigner } from "@solana/keychain-fireblocks";
import { createFireblocksSigner } from "@solana/keychain-fireblocks";

const signer = new FireblocksSigner({
const signer = await createFireblocksSigner({
apiKey: "api_key",
privateKeyPem: "-----BEGIN RSA PRIVATE KEY-----\n...",
vaultAccountId: "0",
assetId: "SOL" // or "SOL_TEST" for devnet
});
await signer.init();
```

### CDP (Coinbase Developer Platform)
Expand Down
Loading