Skip to content

Commit ea4a850

Browse files
authored
docs: update keychain TypeScript signers (#1576)
* docs: update keychain TS to create*Signer factories and add kit-plugin demo * docs: add @solana/kit-plugin-signer install note
1 parent 0ccc6ec commit ea4a850

1 file changed

Lines changed: 73 additions & 11 deletions

File tree

  • apps/docs/content/docs/en/tools/keychain/getting-started

apps/docs/content/docs/en/tools/keychain/getting-started/typescript.mdx

Lines changed: 73 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ pnpm add @solana/keychain-dfns # Dfns
2626
pnpm add @solana/keychain-openfort # Openfort
2727
pnpm add @solana/keychain-para # Para
2828
pnpm add @solana/keychain-utila # Utila
29+
30+
# Kit client plugins (keychainSigner / keychainPayer / keychainIdentity)
31+
pnpm add @solana/keychain-kit-plugin
2932
```
3033

3134
## Basic Usage
@@ -96,14 +99,74 @@ async function signWithKeychain(signer: SolanaSigner) {
9699
}
97100
```
98101

102+
### Using with a Kit Client (keychainSigner plugin)
103+
104+
`@solana/keychain-kit-plugin` installs a keychain signer directly on a
105+
[Kit client](https://github.com/anza-xyz/kit), wiring it up as the `payer` and
106+
`identity` so you skip the manual `pipe` setup shown above:
107+
108+
```typescript
109+
import { createClient } from "@solana/kit";
110+
import { keychainSigner } from "@solana/keychain-kit-plugin";
111+
112+
const client = await createClient().use(
113+
keychainSigner({
114+
backend: "privy",
115+
appId: process.env.PRIVY_APP_ID!,
116+
appSecret: process.env.PRIVY_APP_SECRET!,
117+
walletId: process.env.PRIVY_WALLET_ID!
118+
})
119+
);
120+
121+
client.payer; // SolanaSigner — also a Kit TransactionSigner
122+
client.identity; // same signer instance
123+
```
124+
125+
The plugin accepts the same backend-tagged config as `createKeychainSigner`, and
126+
only the backend it dispatches to is bundled (backend packages load via dynamic
127+
`import()`).
128+
129+
Use `keychainPayer` or `keychainIdentity` to set just one role, and mix backends
130+
on a single client:
131+
132+
```typescript
133+
import { createClient } from "@solana/kit";
134+
import { keychainIdentity, keychainPayer } from "@solana/keychain-kit-plugin";
135+
136+
const client = await createClient()
137+
.use(
138+
keychainPayer({
139+
backend: "memory",
140+
privateKeyPath: "~/.config/solana/id.json"
141+
})
142+
)
143+
.use(keychainIdentity({ backend: "turnkey", ...turnkeyConfig }));
144+
```
145+
146+
Already have a `SolanaSigner`? Every keychain signer is a valid Kit
147+
`TransactionSigner`, so you can install an existing one with
148+
[`@solana/kit-plugin-signer`](https://github.com/anza-xyz/kit-plugins/tree/main/packages/kit-plugin-signer)
149+
instead (`pnpm add @solana/kit-plugin-signer`):
150+
151+
```typescript
152+
import { signer } from "@solana/kit-plugin-signer";
153+
import { createKeychainSigner } from "@solana/keychain";
154+
155+
const mySigner = await createKeychainSigner({
156+
backend: "vault",
157+
...vaultConfig
158+
});
159+
const client = createClient().use(signer(mySigner));
160+
```
161+
99162
## Backend Configuration
100163

101164
### HashiCorp Vault
102165

103166
```typescript
104-
import { VaultSigner } from "@solana/keychain-vault";
167+
import { createVaultSigner } from "@solana/keychain-vault";
105168

106-
const signer = new VaultSigner({
169+
const signer = createVaultSigner({
107170
vaultAddr: "https://vault.example.com:8200",
108171
vaultToken: "hvs.xxxxx",
109172
keyName: "my-solana-key",
@@ -114,9 +177,9 @@ const signer = new VaultSigner({
114177
### AWS KMS
115178

116179
```typescript
117-
import { AwsKmsSigner } from "@solana/keychain-aws-kms";
180+
import { createAwsKmsSigner } from "@solana/keychain-aws-kms";
118181

119-
const signer = new AwsKmsSigner({
182+
const signer = createAwsKmsSigner({
120183
keyId: "alias/my-solana-key",
121184
publicKey: "base58_public_key",
122185
region: "us-east-1" // optional
@@ -126,9 +189,9 @@ const signer = new AwsKmsSigner({
126189
### Privy
127190

128191
```typescript
129-
import { PrivySigner } from "@solana/keychain-privy";
192+
import { createPrivySigner } from "@solana/keychain-privy";
130193

131-
const signer = await PrivySigner.create({
194+
const signer = await createPrivySigner({
132195
appId: "app_id",
133196
appSecret: "app_secret",
134197
walletId: "wallet_id"
@@ -138,9 +201,9 @@ const signer = await PrivySigner.create({
138201
### Turnkey
139202

140203
```typescript
141-
import { TurnkeySigner } from "@solana/keychain-turnkey";
204+
import { createTurnkeySigner } from "@solana/keychain-turnkey";
142205

143-
const signer = new TurnkeySigner({
206+
const signer = createTurnkeySigner({
144207
apiPublicKey: "api_public_key",
145208
apiPrivateKey: "api_private_key",
146209
organizationId: "org_id",
@@ -152,15 +215,14 @@ const signer = new TurnkeySigner({
152215
### Fireblocks
153216

154217
```typescript
155-
import { FireblocksSigner } from "@solana/keychain-fireblocks";
218+
import { createFireblocksSigner } from "@solana/keychain-fireblocks";
156219

157-
const signer = new FireblocksSigner({
220+
const signer = await createFireblocksSigner({
158221
apiKey: "api_key",
159222
privateKeyPem: "-----BEGIN RSA PRIVATE KEY-----\n...",
160223
vaultAccountId: "0",
161224
assetId: "SOL" // or "SOL_TEST" for devnet
162225
});
163-
await signer.init();
164226
```
165227

166228
### CDP (Coinbase Developer Platform)

0 commit comments

Comments
 (0)