Hot and cold wallets describe where signing keys live and whether they can be reached by an internet-connected process, not which brand of device you bought. A hot wallet keeps keys in software that an online machine can use directly; a cold wallet keeps keys in an environment that is offline at signing time and moves only signed payloads across the boundary. This article gives you a mental model of the boundary, runnable checks to confirm which model you actually run, a results-table procedure for measuring exposure, and troubleshooting for the most common misconfigurations. It deliberately avoids naming specific wallet products, because the custody model matters more than the label on the box.
Direct answer and scope
A hot wallet is any wallet whose private keys are held in software on a machine that is connected to the internet while signing, so an online process can reach the key material. A cold wallet is any wallet whose private keys are held in an environment that is offline at the moment of signing, with only transactions or signed payloads crossing the boundary. The distinction is about the key boundary, not about whether the product is called an app, a browser extension, a hardware device, or a piece of paper.
This article covers the custody model, the threat boundaries each model creates, and reproducible ways to verify which model you are actually operating. It does not recommend specific wallet vendors, and it does not claim any measured security outcome for OnFinality or any other provider. Where a number would be useful, the article gives you a procedure to measure it on your own setup rather than inventing a value.
- Hot wallet: key reachable by an internet-connected process at signing time.
- Cold wallet: key held offline at signing time; only payloads cross the boundary.
- Warm or hybrid setups: keys are online but signing is gated by policy, approval, or a second factor.
- The label on the product does not determine the model; the runtime boundary does.
Assumptions and prerequisites
The procedures below assume you have a self-custody wallet where you control the key material, a terminal with curl and Python 3 available, and access to a JSON-RPC endpoint for the network you use. Replace RPC_URL with your own endpoint; do not paste real private keys into any command in this article. If you need a managed endpoint for read-only checks, see the multi-chain RPC endpoints guide and the RPC endpoints guide for how endpoints are structured.
You should also know which network and chain ID your wallet targets, because a wallet pointed at the wrong chain can appear to work while signing transactions for a different network. The networks directory lists supported networks if you are unsure which chain ID applies.
The key-boundary mental model
Think of a wallet as three separable parts: key storage, signing, and broadcast. In a hot wallet, all three can run in the same online process. In a cold wallet, key storage and signing happen in an offline environment, and only the signed transaction is carried to an online machine for broadcast. This separation is what changes the threat model: an attacker who compromises your online machine can usually reach a hot key, but should not be able to reach a cold key without also compromising the offline environment or the transfer step.
The boundary is only as strong as its weakest crossing. If you photograph a seed phrase, type it into an online password manager, or sign on a device that has ever been connected to the internet while the key was unlocked, you have effectively moved the key into the hot zone. A useful test is to ask: at the instant a transaction is signed, can an internet-connected process read or use the key without a human physically moving data across an air gap? If yes, treat the wallet as hot regardless of its marketing.
- Key storage: where the secret material lives at rest.
- Signing: the process that turns a transaction into a signed payload.
- Broadcast: the online step that submits the payload to a node or RPC endpoint.
- A cold model requires signing to occur without the key being reachable by the broadcast machine.
Verifying which model you actually run
Before trusting a label, confirm the runtime facts. The checks below are read-only and use a placeholder endpoint. They verify chain identity and account state, which is the foundation for any custody decision; they do not prove key isolation by themselves, but they catch the common failure where a wallet is pointed at the wrong network or an unexpected account.
curl -s -X POST "$RPC_URL" \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"eth_chainId","params":[]}'
curl -s -X POST "$RPC_URL" \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":2,"method":"eth_getBalance","params":["0xYOUR_ADDRESS","latest"]}'A reproducible exposure-check procedure
Use the following procedure to record, for each wallet you operate, whether the key boundary is hot or cold at signing time. Run it once per wallet and store the results in a table. Do not invent values; record what you observe.
The table below is a template. Fill each row from your own observation, and keep the table with your operational notes so you can re-run the check after any configuration change.
- Step 1: Identify the signing environment (phone, laptop, browser extension, hardware device, air-gapped machine).
- Step 2: At signing time, record whether that environment has an active network connection.
- Step 3: Record how the signed payload reaches the broadcast step (same process, QR code, USB file, manual copy).
- Step 4: Record whether the key material was ever typed, photographed, or synced into an online system.
- Step 5: Classify the wallet as hot, cold, or hybrid based on steps 2–4, not on the product name.
Runnable diagnostic: checking a signing request before broadcast
A practical way to reduce hot-wallet risk is to inspect a transaction before it is broadcast. The Python snippet below builds a minimal JSON-RPC call to estimate gas and fetch the nonce for an address, which lets you confirm the transaction targets the chain you expect. It uses placeholders only and does not sign anything.
Run it against your own endpoint and compare the returned chain ID with the network your wallet displays. A mismatch is a strong signal that the wallet is misconfigured and should be treated as unsafe until corrected.
import json, urllib.request
RPC_URL = "RPC_URL"
ADDRESS = "0xYOUR_ADDRESS"
def rpc(method, params):
body = json.dumps({"jsonrpc": "2.0", "id": 1, "method": method, "params": params}).encode()
req = urllib.request.Request(RPC_URL, data=body, headers={"Content-Type": "application/json"})
with urllib.request.urlopen(req, timeout=10) as resp:
return json.loads(resp.read())
print("chainId:", rpc("eth_chainId", []))
print("nonce:", rpc("eth_getTransactionCount", [ADDRESS, "pending"]))
print("gasPrice:", rpc("eth_gasPrice", []))Expected verification result
When the checks above succeed, you should see a chain ID that matches the network you intend to use, a nonce that increases only when you send transactions, and a gas price that is plausible for current network conditions. If the chain ID differs from what your wallet shows, stop and fix the configuration before signing anything. If the nonce is unexpectedly high, another signer may be using the same address, which is a custody red flag.
For cold setups, the verification result also includes a human-observable fact: the signing environment had no network connection at the moment of signing, and the payload crossed the boundary through a channel you can describe. If you cannot describe that channel, treat the wallet as hot.
Troubleshooting common misconfigurations
Most custody failures are configuration failures, not cryptographic breaks. The list below covers the patterns that most often turn a nominally cold wallet into a hot one, or cause a hot wallet to sign on the wrong chain.
If a hardware device is connected to an online computer while its key is unlocked, the boundary is weakened for the duration of that session. If a seed phrase was entered into an online recovery tool, the key should be considered exposed and rotated. If a wallet shows a balance on one network but transactions fail on another, verify the chain ID with the diagnostic above before assuming a node problem.
- Seed phrase typed into an online password manager or cloud note: treat as hot and rotate.
- Hardware device left unlocked and connected during browsing: boundary weakened.
- Wallet pointed at the wrong chain ID: transactions may sign for an unintended network.
- Shared address across multiple signers: nonce conflicts and unclear custody.
- Backup stored unencrypted on a networked drive: key material is reachable online.
Limitations and tradeoffs
Cold custody reduces online attack surface but adds operational friction: every transaction requires a physical step, and lost or damaged devices can mean permanent loss if backups are inadequate. Hot custody is convenient and appropriate for small operating balances, but it concentrates risk in the online machine. Hybrid models try to balance the two by keeping keys online behind approval policy, which reduces casual exposure but does not eliminate the online boundary.
No custody model removes the need to verify what you are signing. A cold wallet that signs a malicious payload is still a loss. Pair the boundary with transaction inspection, address allowlists, and periodic reconciliation against a trusted endpoint. For teams running dedicated infrastructure, the dedicated node service and API service pages describe how managed access fits into an operational setup, and the RPC pricing page explains how endpoint usage is metered.
Next steps
Start by classifying every wallet you operate using the exposure-check procedure, then fix any wallet that is labeled cold but fails the boundary test. Rotate keys that were ever exposed online, and document the payload-transfer channel for each cold setup so the boundary is auditable. If you need a reliable endpoint for the read-only checks in this article, review the multi-chain RPC endpoints guide and the RPC endpoints guide, then choose an endpoint that matches your network from the networks directory. For concrete endpoint and provider recommendations, consult RPC Assistant rather than treating this article as a provider list.