Integration

Use your Bitcoin wallet

Connect a wallet you already use on BTC, BCH, or BSV. Sign once. You get a Sigma identity derived from the key you already hold, and nothing new to write down.

No new seed phraseOne signatureThe key never leaves your wallet

Two layers, and they are worth keeping apart. Your identity attestation hashes are written to BSV. That is the anchor chain, and it does not move. Generating the identity is the other layer, and for that any Bitcoin family key you already hold will do.

Why this works

One key, whichever fork you followed

The forks split the ledger. They did not split the cryptography.

One private key produces the same identity on BTC, BCH, and BSVThe Bitcoin forks inherited the same secp256k1 cryptography, so one private key produces the same public key and the same public key hash on all three. Only the address encoding and the derivation path conventions wallets follow are different.Your private keysecp256k1same public key hashBitcoin (BTC)Base58 P2PKH addressBitcoin Cash (BCH)Same key hash, re-encoded as CashAddrBitcoin SV (BSV)Base58 P2PKH, the same string as BTC

BTC, BCH, and BSV all inherited secp256k1 and the Bitcoin Signed Message convention from the same codebase. One private key produces the same public key, and the same public key hash, on all three.

Which layer lives where. The identity attestation hashes are written to BSV through BAP. BSV is the anchor chain, and that holds no matter which wallet you connect. What varies is the key you generate the identity with, which can be one you already hold on Ethereum, Bitcoin, Bitcoin Cash, Bitcoin SV, Litecoin, Avalanche, ICP, or Solana.
The fork question

Your existing Bitcoin key already works

People ask which fork Sigma wants. The honest answer is that the question does not apply at the layer where the key is used.

The same curve

secp256k1 everywhere

Every Bitcoin fork kept the elliptic curve from the original release. A private key is a number on that same curve in each of them, so the public key it produces is identical whichever client you generated it in.

The same signature

Bitcoin Signed Message, unchanged

The signed message convention predates the forks and all three kept it. A signature produced by a BCH wallet recovers the same public key that a BTC or BSV wallet would have produced from that key.

What actually differs

Encoding and wallet conventions

BTC and BSV print a P2PKH address as the same base58 string. BCH re-encodes that same key hash as CashAddr. Wallets also differ on which derivation paths they use by default. None of that reaches the key.

Why it does not matter here

Sigma derives from the key

Identity comes from the key itself, not from the address format your wallet prefers or the chain its balance sits on. So your existing Bitcoin key already works, whichever fork you followed.

Wallets

Wallets that can sign

Every wallet listed here supports Bitcoin signed messages. Grouped by the fork it was built for.

Sign from a legacy address. A legacy P2PKH address produces the classic signature format that verifies everywhere, while signatures made from a segwit address are nonstandard in some wallets and may not verify.
BTC
Bitcoin CoreElectrumTrezor SuiteBlueWalletCoinomi
BCH
Electron CashCoinomi
BSV
ElectrumSVYours Wallet1Sat

Coinomi signs on mobile only. 1Sat signs through the @1sat/actions package rather than a menu in a wallet. Hardware devices sign through the Electrum family rather than through their own desktop app, and Trezor Suite signs directly.

Quickstart

The Bitcoin path in three calls

Client side. Nothing here sends a private key anywhere.

On the server, the route this posts to is provided by @sigma-auth/better-auth-plugin, so a project already running Better Auth wires this path up as a plugin rather than as a separate SDK.

connect-wallet.ts (illustrative)
// 1. Build the connection challenge for the address being connected
const message = 'sigma-auth-connect:1:' + address;

// 2. Sign it as a Bitcoin Signed Message. This is the only signature required,
//    and any wallet that implements the convention can produce it.
const signature = await wallet.signMessage(message);

// 3. Hand the signature to Sigma. The private key never leaves the wallet.
await fetch('/api/wallet/connect', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ address, message, signature }),
});

What Sigma does with the signature

The public key is recovered from the signature and the identity is derived from it. Sigma never sees the private key, because it never needs to.

derive-identity.ts (illustrative)
// Recover the public key from the Bitcoin Signed Message signature
const pubkey = recoverPublicKey(message, signature);

// The identity is derived from that key, not from the address format
// your wallet happens to prefer. Which fork the wallet followed
// changes how the address is printed, and nothing else.

Leaving without asking us

The claim is only worth something if you can walk away from it. This is the whole procedure.

recover.sh
# Your Bitcoin private key controls the identity directly.

# 1. Export it from whichever wallet holds it today

# 2. Import that same key into any other Bitcoin family wallet

# 3. The wallet derives the same public key hash. Nothing was
#    delegated, so there is no permission to ask anyone for.
Requirements

What your wallet needs to do

To sign in

Produce a Bitcoin Signed Message

That is the whole requirement. Any wallet implementing the convention can sign the connection challenge, whichever fork it was built for.

To leave

Export or import a private key

Needed only if you want to move the identity to a different wallet later. If your wallet can import a key, it can take this identity with it.

Next step

Connect a wallet and look at the result

The full derivation and recovery procedure is in the wallet recovery documentation. If your key lives on an EVM chain instead, that path is documented separately.