Getting Started for Developers
Welcome to SSP Development
SSP Wallet lets your web app or dApp request payments and signatures from a user whose funds are protected by a 2-of-2 multisignature (SSP Wallet browser extension + SSP Key mobile). This guide covers the two integration surfaces and their real APIs.
ποΈ SSP Development Stack
// SSP Wallet Browser Extension (Current: v2.0.0)
React 19 + TypeScript + Vite
Manifest v3 Web Extension (Chrome 110+, Firefox 110+, Edge)
BIP48 HD Key Derivation (@scure/bip32, @scure/bip39)
Schnorr Multisig (@runonflux/aa-schnorr-multisig-sdk) for EVM ERC-4337
Injected global: window.ssp (request/response only β no events)
// SSP Key Mobile App (Current: v2.0.0)
React Native + TypeScript, iOS 15.1+ / Android 7+
Package: io.runonflux.sspkey
// SSP Relay Server (coordination only)
Node.js + TypeScript + MongoDB, WebSocket + REST
Zero-knowledge design (no private key / seed access)Architecture Overview
π Option 1 β WalletConnect (for EIP-1193 / eth_* dApps)
Best for: existing EVM dApps, DeFi, NFT marketplaces that already use EIP-1193.
SSP Wallet pairs over WalletConnect v2 and handles the standard EVM method set: eth_requestAccounts, eth_accounts, eth_sendTransaction, eth_sendRawTransaction, eth_sign, personal_sign, eth_signTypedData / _v3 / _v4, wallet_switchEthereumChain, wallet_addEthereumChain, wallet_watchAsset, eth_chainId, net_version, plus chainChanged / accountsChanged events.
π Option 2 β Injected window.ssp provider (SSP-native)
Best for: web apps that want SSP-native payment and signature requests, across UTXO and EVM chains, without WalletConnect.
The provider
Response shape
On success the promise resolves to an object:
{ status: 'SUCCESS', ...methodFields }(e.g.payβ{ status, txid }). Always checkres.status === 'SUCCESS'.On failure the promise rejects with an
Error(error.codedefaults to4001for user rejection). Wrap calls intry/catch.The injected provider is request/response only β no event listeners (no
accountsChanged/chainChanged). Use WalletConnect if you need events.
Supported methods
pay
Request a payment / asset send
{ address, amount, chain, message?, contract? }
{ status, txid }
sign_message
Sign a message with a chain address
{ message, address?, chain? }
{ status, signature, address, message }
sspwid_sign_message
Sign with the SSP Wallet Identity (FluxID)
{ message }
{ status, signature, address, message }
wk_sign_message
2-of-2 WK-Identity (P2WSH) message signing
{ message, authMode?, origin, siteName?, description?, iconUrl? }
{ status, result: { walletSignature, walletPubKey, keySignature?, keyPubKey?, witnessScript, wkIdentity, message } }
chains_info
List all chains SSP supports
(none)
{ status, chains: [{ id, name, symbol, decimals, chainId? }] }
chain_tokens
List tokens for a chain
{ chain }
{ status, tokens: [{ contract, name, symbol, decimals }] }
user_chains_info
Chains the user has synced
(none)
{ status, chains }
user_addresses
User's addresses for a chain (user consents)
{ chain }
{ status, addresses: [string] }
user_chains_addresses_all
User-approved addresses across synced chains
(none)
{ status, chains: [{ id, name, symbol, decimals, addresses }] }
amountis in whole units (e.g.'4.124'),chainis a chain id ('btc','flux','eth','ltc','doge','zec','bch','rvn', β¦ β callchains_infofor the live list). See the authoritative reference in the SSP Wallet repo'sSSP_Wallet_API.md. Enterprise integrators have additionalenterprise_*methods (vault xpub / signing) that require the wallet to be synced with the SSP Key.
Requesting a payment
Reading the user's addresses
Signing a message
π Security Considerations
Best practices
Guidelines
β Validate user inputs before requesting a
pay/ signature.β Always check
res.status === 'SUCCESS'andtry/catchfor rejection (error.code === 4001).β Use HTTPS and never log signatures, keys, or seed phrases.
β Expect a mobile approval step β do not assume immediate confirmation.
β Don't call
eth_*onwindow.sspβ those are WalletConnect-only.β Don't reference
window.sspwalletβ the global iswindow.ssp.β Don't bypass SSP's 2-of-2 confirmations.
π§ͺ Testing & Development
Debugging
π Example: Send button
For EVM contract interactions (swaps, approvals, arbitrary data), use the WalletConnect path with standard eth_sendTransaction β the injected window.ssp provider intentionally exposes only the high-level methods above.
π Support & Resources
API Reference β SSP Relay API
SSP_Wallet_API.md(in the ssp-wallet repo) β authoritative injected-provider reference + a workingSSP_Wallet_API_Example.htmlGitHub Issues: Report bugs / request features
GitHub Discussions: Ask questions
Two surfaces, one wallet: WalletConnect for EIP-1193 eth_*, or the injected window.ssp provider for SSP-native pay / sign_message requests β both enforce 2-of-2 approval.
Last updated