For the complete documentation index, see llms.txt. This page is also available as Markdown.

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: v1.40.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: v1.28.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.

On EVM, SSP accounts are ERC-4337 smart accounts (not EOAs). eth_signTransaction (raw offline signing) is therefore rejected โ€” use eth_sendTransaction, which submits a UserOperation signed by both keys.

๐Ÿ”Œ 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 check res.status === 'SUCCESS'.

  • On failure the promise rejects with an Error (error.code defaults to 4001 for user rejection). Wrap calls in try/catch.

  • The injected provider is request/response only โ€” no event listeners (no accountsChanged/chainChanged). Use WalletConnect if you need events.

Supported methods

Method
Purpose
Key params (object)
Resolves

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 }] }

amount is in whole units (e.g. '4.124'), chain is a chain id ('btc', 'flux', 'eth', 'ltc', 'doge', 'zec', 'bch', 'rvn', โ€ฆ โ€” call chains_info for the live list). See the authoritative reference in the SSP Wallet repo's SSP_Wallet_API.md. Enterprise integrators have additional enterprise_* 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' and try/catch for 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_* on window.ssp โ€” those are WalletConnect-only.

  • โŒ Don't reference window.sspwallet โ€” the global is window.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


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