Essentials

Security

Octo is non-custodial. Each wallet's private key is generated in your browser (or the SDK), never transmitted to Octo, and never stored on our servers. We build nothing that can move your funds — every transaction is signed on your device.

Key management

  • Keys are generated client-side from a BIP-39 recovery phrase and derived via SEP-0005 (SLIP-0010 ed25519). The mnemonic is shown once at creation — store it out-of-band.
  • Your key is backed up as an opaque blob encrypted under your password (PBKDF2-SHA256 → AES-256-GCM, in the browser). Octo stores this blob for recovery but cannot decrypt it — only your password can, and your password never leaves your device.
  • Because we never hold your key, a full compromise of Octo's database and servers cannot move your funds.

Deposits & transactions

  • Deposits are credited only when the transaction is successful on-chain, and are idempotenton the immutable operation id — a replay or reorg can't double-credit.
  • Outbound transfers are built and signed on your device; Octo validates the signed transaction (source must be your wallet; operation-type allowlist) and relays it to the network. It cannot alter or forge a transaction — it has no key to do so.
  • Gas sponsorship is paid from a per-wallet gas tank: a separate, Octo-held account that holds only fee float. Worst-case exposure there is the gas budget — never customer balances.

Credentials

  • Passwords are hashed with argon2id; API keys are stored only as a SHA-256 hash(a leak can't expose them).
  • An API key can relay a transaction you signed, but it cannot sign one — moving funds always requires your key.
Trade-off of true non-custodial: if you lose both your password and your recovery phrase, your funds are unrecoverable — Octo cannot reset them for you. Report vulnerabilities responsibly — do not open public issues for security reports.