pay.sh docs
SDKTypeScript

Signers

Load the operator wallet that fee-pays and settles payments — local keypairs or remote signing backends — via the Signer factory.

The operator signer fee-pays and co-signs settlement. Pass it as operator.signer to createPayKit. Key handling is built on Solana Keychain: local constructors ride on @solana/keychain-memory, and remote backends plug in through Signer.from.

Local key material

import { Signer } from '@solana/pay-kit';

const fromFile = await Signer.file('config/operator.json'); // Solana CLI JSON keypair
const fromEnv = await Signer.env('OPERATOR_KEY'); // JSON / hex / base58, auto-detected
const ephemeral = await Signer.generate(); // a fresh key, for tests

const pay = await createPayKit({
  network: 'devnet',
  operator: { signer: fromFile, recipient: MERCHANT },
  pricing: { report: usd('0.10') },
});

Remote signing

For AWS KMS, GCP KMS, Vault, Privy, Turnkey, and other backends, build a keychain signer and wrap it with Signer.from:

import { Signer } from '@solana/pay-kit';
import { createKeychainSigner } from '@solana/keychain';

const remote = Signer.from(await createKeychainSigner({ backend: 'vault' /* … */ }), { feePayer: false });

The demo signer

Signer.demo() is a published keypair that is byte-for-byte identical across the Ruby, Python, PHP, and Lua SDKs, so processes running different SDKs can exchange traffic during local development. It is the zero-config default recipient on localnet.

It is public by design and refused on mainnet at boot — solana_mainnet plus the demo signer throws DemoSignerOnMainnetError so real funds never route to a known address by accident.

On this page