Skip to main content
The central idea behind Buckspay signers: the payment flow never changes. Whether the user authenticates with a browser wallet, a device passkey, a social login, or a mobile secure enclave, every signer factory returns a BuckspaySigner value that drops into the same createBuckspayClient call and the same prepare -> sign -> send pipeline.
// The ONLY line that changes across all signer types:
const signer = walletsKit({ network: "testnet" });
//             passkey({ rpId: "app.example.com" })
//             socialSigner({ provider: "web3auth", clientId, network, proxyUrl })
//             emailSigner({ proxyUrl, network })
//             nativePasskey({ rpId: "app.example.com" })   // @buckspay/react-native

// Everything below is identical regardless of which signer you chose:
const client = createBuckspayClient({ network, account, signer, relayer, gas });
await client.connect();
const receipt = await client.pay([client.transfer({ token, to, amount })]);

How it works

A signer factory is a function that returns a BuckspaySigner object. The object implements two methods the engine calls internally:
  • getPublicKey() - resolves the Stellar account address backing this signer.
  • signAuthEntry(payload) - signs a Soroban authorization entry for the current payment.
The engine calls these during sign() (the second phase of prepare -> sign -> send). All user interaction - wallet pop-ups, WebAuthn prompts, OAuth redirects, OTP verification - happens inside this one call. The rest of the pipeline is silent. Some signers also expose an optional authenticate?() step for social and email flows, which runs the identity-resolution phase before the payment itself.

Choosing a signer

SignerPackageBest for
Wallets Kit@buckspay/signers/wallets-kitUsers with Freighter, xBull, or LOBSTR
Passkey@buckspay/signers/passkeyPasswordless new-user flows (browser)
Social login@buckspay/signers/socialSign in with Google/Apple/Discord via web3auth
Email OTP@buckspay/signers/emailEmail-code verification without a wallet
Native passkey@buckspay/react-nativeiOS and Android (secure enclave)

Wallets Kit

Browser injected wallets - Freighter, xBull, LOBSTR.

Passkey

WebAuthn / secp256r1 on a smart contract account.

Social login

Google, Apple, Discord via web3auth - secrets stay server-side.

Email OTP

One-time code over email - no wallet, no seed phrase.

Native passkey

iOS/Android secure enclave via @buckspay/react-native.

Prepare -> Sign -> Send

The shared flow every signer feeds into.