Custody architecture

How Kassa holds your assets

Kassa runs its own custody stack. Every address, every private key, every deposit credit and every outgoing transaction is produced, encrypted, verified and signed by infrastructure we operate — with no third-party wallet provider between you and the chain. This page describes that stack as it is built, down to the algorithms.

AES-256-GCM key wrapping secp256k1 ECDSA BIP-32 · 39 · 44 · 84 HMAC-SHA-256 signed events 12–15 block confirmations exactly-once crediting
01 — KEY HIERARCHY

One root. A unique key for every address.

Kassa uses hierarchical deterministic (HD) key derivation. A single high-entropy root produces an unlimited tree of independent key pairs — one for every deposit address we issue — and any of them can be reproduced from the root alone. No address is ever shared between customers, and none is ever reused across networks.

Root seedBIP-39 · 512-bit TRONnetwork branch Ethereum · BNB Chainnetwork branch Bitcoinnetwork branch key 1 key 2 key n key 1 key 2 key n key 1 key 2 key n one index = one key pair = one customer address hardened at purpose / coin / account — a leaked child cannot climb the tree
  • Root. A BIP-39 mnemonic is stretched with PBKDF2-HMAC-SHA512 (2,048 rounds) into a 512-bit seed. It is the only secret from which anything can be derived, and it never exists in our database, our source code, our logs or our backups.
  • Derivation. BIP-32 child-key derivation (HMAC-SHA512) with hardened steps at the purpose, coin-type and account levels. A compromised child key reveals nothing about its siblings or its parent.
  • Addresses. secp256k1 public key → Keccak-256 → EIP-55 checksummed address (Ethereum, BNB Chain); the same key material with a 0x41 prefix and Base58Check for TRON; HASH160 → bech32 native SegWit (P2WPKH) for Bitcoin.
  • One key, one network. Ethereum and BNB Chain share an address format, so they draw from one shared index counter — a key issued on one network is never issued again on the other.
NetworkAssets heldAddress type
TRONUSDT · TRC-20Base58Check
EthereumETH · USDC ERC-20EIP-55 checksummed
BNB ChainUSDT · BEP-20EIP-55 checksummed
BitcoinBTCNative SegWit (bech32)
02 — PRIVATE KEYS AT REST

No private key is ever stored in the clear

Kassa uses envelope encryption. Each address key is sealed individually with AES-256-GCM under a separate 256-bit key-encryption key (KEK). The database holds ciphertext only; the KEK and the root live in a different system entirely. Stealing one without the other yields nothing.

Address private key · in memory only

—
AES-256-GCM
under KEK

What the database stores

—
Fresh 96-bit nonce per keyGenerated by the platform CSPRNG; never reused under the same KEK.
128-bit authentication tagAny bit flipped in storage makes decryption fail outright — there is no "slightly wrong" key.
Bound to its address (AAD)The address is authenticated data. A ciphertext moved to another row will not decrypt.

Illustration only — the values above are random bytes generated in your browser, not Kassa key material.

Root seedencrypted secret store
Held as a write-only secret on Cloudflare's platform: encrypted at rest, not readable back through any dashboard or API once set, and injected only into the running code at execution time. It is loaded by the company's principal directly — it has never passed through a developer's hands, a chat, a ticket or a repository.
Key-encryption keyencrypted secret store
A separate 256-bit AES key, stored the same way and never alongside the data it protects. It can be rotated without downtime: every stored key is decrypted, checked against its address, and re-sealed under the new KEK before the old one is retired.
Address keysdatabase · ciphertext only
One sealed record per address. A full copy of the database — including every backup we take — contains no usable key. Keys are decrypted only inside the signing routine, for the lifetime of one transaction, in an isolated runtime with no disk.
Human accesssecond factor · audit log
No API returns a private key to a customer application, and no operator screen shows one by default. The single recovery path for an individual key requires an operator session plus a time-based one-time code, and every use is written to the operator event log.
Integrity auditautomated
A full audit decrypts every stored key and proves two things: that it produces exactly the address it is filed under, and that the root re-derives the same key at the same index. The report contains addresses only. It runs after any change to key material, before a single coin moves.
Recoverydeterministic
Because every key is a pure function of the root and an index, the loss of a server, a database or even the KEK is never a loss of funds. The whole tree can be rebuilt from the root on clean infrastructure.
03 — SIGNING MODEL

How this compares with MPC custody

Threshold multi-party computation (MPC) splits one signing key into shares so that no single machine ever holds it whole. Kassa's model today is different, and we would rather say so than let a logo imply it: keys are hierarchical-deterministic, sealed with authenticated encryption, and surrounded by independent authorisation gates. Below is how each approach answers the same threats.

ThreatThreshold MPCKassa today
The database is stolenKey shares are held by separate parties; one share is useless.The database contains AES-256-GCM ciphertext only. The KEK and the root are held in a separate encrypted secret store and are in no backup.
One insider tries to move fundsA quorum of share-holders must co-sign.A customer payout needs the customer's own passkey, a paid network fee, operator approval and four automatic limits. Operator treasury movements need an additional secret on every send; changing a cold-storage destination needs a second factor.
A key is lost or corruptedShares are refreshed or re-dealt by the quorum.Every key is re-derivable from the root at its index; the integrity audit detects a bad record before it is ever needed.
A signing server is compromisedThe attacker holds one share, below threshold.There is no server: code runs in short-lived, memory-only isolates with no shell, no disk and no inbound management port. A request that does not pass every gate never reaches the signer.
Blast radius of a single leaked keyOne wallet.One customer deposit address — balances are swept into treasury on a schedule, and child keys cannot derive their siblings or parent.
04 — MONEY IN

A deposit is credited once, and only from the chain

Notifications are hints; the blockchain is the record. Nothing a third party sends us can create a balance — every credit comes from our own read of the chain, after finality, and the database itself refuses to book the same transaction twice.

A dedicated address

Every customer receives their own addresses on every network — a permanent one to reuse, fresh one-time addresses for privacy, and labelled sub-wallets. Funds are attributed by receiving address alone; there are no memos or tags to get wrong.

Two independent detection paths

Active TRON and BNB Chain addresses are read directly from the chain every 30 seconds. Ethereum activity arrives as signed event notifications from a separate blockchain data provider. Behind both, every network is polled and reconciled on a fixed schedule — no single path has to work for a deposit to be found.

Signed — and still not trusted

Event notifications are verified with HMAC-SHA-256 over the raw request body; an unsigned or altered message is rejected. A valid one still credits nothing: it only schedules our own re-read of that address.

Finality before credit

A transfer is counted only after the network's confirmation depth, and only when the token's contract address matches — look-alike tokens with a copied name or symbol are ignored.

Exactly-once booking

The ledger carries a unique database constraint on (transaction hash, address). Hashes are canonicalised before the check, so however many detectors see a deposit, it can be written once and never twice.

Reconciliation that repairs

Every ten minutes a separate process reads the chain for every issued address and compares it with the ledger. A missing credit is booked automatically; a discrepancy is surfaced to operators.

Confirmation depth before a credit

0
blocksEthereum
0
blocksBNB Chain
SOLID
confirmed onlyTRON
UTXO
confirmed onlyBitcoin

Four detectors, one ledger entry

The constraint lives in the database, not in application logic — a race between detectors is resolved by the storage engine, not by luck.

30 s scansigned event5 min pollreconcile →1 credit

Provider independence

Each network is read through several independent endpoints with automatic fail-over, rate-aware pacing and back-off. When one source is degraded the next answers, and reconciliation always goes to the chain itself — never to an intermediary's account of it.

05 — MONEY OUT

Twelve gates between a request and a signature

A withdrawal is the only moment funds can leave custody, so it is the most heavily defended path in the system. The operator safety valves are evaluated when the request is made and again at the moment of settlement. There is one settlement path, and nothing bypasses it.

Own balance only

The ledger must hold the amount, net of anything locked or already reserved. The amount is reserved the instant the request is accepted.

Tamper detection

Negative amounts, scientific notation, injected status fields or repeated over-balance attempts block the account automatically.

Withdrawal passkey

A second secret, separate from the login password and stored only as a salted PBKDF2 hash. A session token alone cannot move money.

Root account only

Sub-accounts can hold and receive; only the root of an account tree can withdraw.

Destination checks

The address is validated for its network, and a destination that is one of our own custody addresses is refused before any fee is asked.

Fee to a single-use address

The measured network cost is paid to an address created for that one request. The address identifies the payment; nothing proceeds until it is seen on-chain.

Operator approval

A human reviews the request. Optional auto-approval relaxes only who clicks — never what is allowed — and has its own 24-hour cap.

Freeze switch

One control halts every outgoing movement platform-wide, instantly, including requests already approved.

Custody float check

The treasury wallet's on-chain balance is read live; a payout larger than what is physically there is refused, not queued.

24-hour ceiling

A platform-wide limit per asset that cannot be raised through the API. It bounds the damage of any bug or stolen operator session.

Atomic single-send

The request is claimed with a compare-and-set before broadcast. Of any number of simultaneous attempts, exactly one can win.

Local signing + receipt

Signing happens inside our runtime — EIP-1559 on EVM networks, P2WPKH on Bitcoin, and on TRON the transaction hash is recomputed locally before it is signed — then tracked to a receipt.

Verified by attacking itEight simultaneous withdrawals against a single balance: one accepted, seven refused.
Failure is safeIf a broadcast fails, the request returns to review with the reason recorded and the customer's reservation intact. Nothing is retried blindly.
Cancellation cannot double-creditA cancelled or expired request voids its reservation in place; no compensating entry is ever written.
06 — TREASURY

Where funds rest

Customer addresses are entry points, not vaults. Balances above a threshold are consolidated into the custody treasury by transactions signed with each address's own key; the customer's balance is unaffected because it lives on the ledger, not on the address.

Customer addresssigns its own sweep Customer addressabove threshold One-time addressgas returned after use Custody treasuryon-chain float · read live Customer payoutsafter all twelve gates Cold reserveexcess above float

Every movement is a record

Sweeps, gas top-ups, gas returns and cold transfers are each written with their transaction hash, fee and outcome, and followed to a receipt.

Customers never handle gas

Network fuel is supplied by the treasury only for the measured cost of a movement, and unused fuel on single-use addresses is returned.

Cold destination under second factor

Funds above the operating float can be moved to an offline reserve address. Changing that address requires an operator's time-based one-time code.

07 — INFRASTRUCTURE

No servers to break into

Kassa's backend runs on Cloudflare's global network as isolated, memory-only functions. There is no operating system to patch, no SSH port, no long-lived machine holding state — and the secrets that matter are not reachable from the places an attacker usually lands.

Isolated execution

Each request runs in a sandboxed V8 isolate with no filesystem and no shell. Key material exists in memory for the duration of one signing call and is gone when it returns.

Edge protection

All traffic terminates on Cloudflare: TLS 1.3, network-layer DDoS mitigation, and per-IP rate limits on sign-in, sign-up and account recovery.

Zero-trust operator console

The operator console lives on a separate origin behind identity-aware access: an unauthenticated visitor never even reaches its sign-in page. Operator sessions support TOTP, and sensitive actions demand it.

Durable ledger

The ledger database offers 30-day point-in-time recovery, and a full export is taken off-platform every day. Any private key inside those copies is still AES-256-GCM ciphertext.

Credentials

Passwords and passkeys are stored as PBKDF2-HMAC-SHA256 hashes — 100,000 iterations, a random salt per value, constant-time comparison. Three wrong attempts lock that address out of that account for 15 minutes.

No e-mail reset for the account that can withdraw

A root account is recovered only with its 12-word phase key. A compromised mailbox is therefore never enough to take an account that can move funds.

08 — CONTINUOUS VERIFICATION

The system checks itself, all day

Custody is not a state you reach; it is something you keep proving. These processes run on a schedule whether or not anyone is watching. The scheduler writes a heartbeat on every pass, and the operator console marks the whole platform unhealthy the moment it goes quiet.

30 s
Hot-address scanDirect chain reads of every recently active address.
60 s
Settlement passFee payments matched, queued chain checks executed, heartbeat written.
10 min
Ledger ↔ chain reconciliationEvery issued address compared with the ledger; gaps healed.
60 min
On-chain custody auditEvery treasury wallet and customer address read from the chain and laid against the ledger for operators.
09 — SPECIFICATION

Cryptographic specification

Root entropy & seedBIP-39 mnemonic → PBKDF2-HMAC-SHA512 ×2048 → 512-bit seed
Key derivationBIP-32 CKD (HMAC-SHA512) · BIP-44 / BIP-84 account structure · hardened upper levels
Signature schemeECDSA over secp256k1, deterministic nonces (RFC 6979), low-S
Address encodingsKeccak-256 + EIP-55 · Base58Check (double SHA-256) · bech32 P2WPKH
Transaction formatsEIP-1559 type-2 (RLP) · TRON TriggerSmartContract, txID = SHA-256(raw_data) verified locally · SegWit v0
Key wrapping at restAES-256-GCM · 96-bit random IV · 128-bit tag · AAD = address
Key-encryption key256-bit, held outside the database, rotatable with verify-before-write
Inbound event authenticationHMAC-SHA-256 over the raw body, verified before parsing
Credential hashingPBKDF2-HMAC-SHA256 · 100,000 iterations · per-value salt · constant-time compare
Operator second factorTOTP (RFC 6238)
Deposit idempotencyUNIQUE (tx_hash, address) enforced by the database
Finality thresholdsETH 12 blocks · BSC 15 blocks · TRON confirmed · BTC confirmed UTXO
TransportTLS 1.3 at the edge

Custody you can read the blueprint of

Open an account and receive your own addresses on TRON, Ethereum, BNB Chain and Bitcoin in seconds.