FAQ & troubleshooting

The short answers to the questions Chainbook users hit most often — sync gaps, missing prices, categories, filters, backups, login. If something still doesn't add up, the answer below probably points you to the right button in Settings.

Syncing wallets

Why don't I see my older transfers?

A routine Sync only walks back as far as the page cap allows (~5,000 transactions). Very active wallets blow past that quickly. Open Settings → Wallets, click the menu next to the wallet, then Force collect all… — this digs through up to ~500,000 transactions and rebuilds the ledger from scratch. For active whales it can take 10–30 minutes.

Sync, Rebuild from chain, Force collect all, Backfill prices — what's the difference?

  • ↻ Sync — incremental. Picks up new transactions since the last sync. Fast, safe, runs whenever you add a wallet and on demand. Doesn't touch existing rows.
  • ⟳ Rebuild from chain — destructive. Wipes every transfer for that wallet and re-imports them from on-chain history with the routine page cap. Notes and category assignments on this wallet's transfers are deleted. Use it to recover from data corruption.
  • ⟳ Force collect all — same as Rebuild but with a much higher page cap (up to ~500k transfers). Slow. Use it when Rebuild still leaves a drift warning because the wallet's history is deeper than the routine ceiling.
  • $ Backfill prices — non-destructive. Re-asks DefiLlama for USD prices on rows that landed without one. Only fills empty cells; never overwrites a price that's already set. Safe to click any time.

What does "Out of sync by X SOL" mean?

Chainbook reconstructs your SOL balance from the transfers ledger. If that reconstruction differs from the actual on-chain balance by more than 0.05 SOL, you'll see a warning chip in Settings → Wallets. The usual cause is missing legs from an old sync. Click Rebuild from chain in the warning popover — or use Force collect all if the wallet has very deep history.

The sync seems stuck.

Syncs run one-at-a-time per user (a queue), so the second wallet waits while the first is finishing. The SYNCING pill in the header shows how many are in flight. If a wallet finishes with SYNC ERROR, click the pill — it jumps you to Settings → Wallets where the row shows the actual error message.

USD prices

Why is the Value column empty (—) on some rows?

The price comes from DefiLlama. For very fresh transactions (last few hours) and low-liquidity LSTs (JSOL, niche stake-pool tokens), DefiLlama sometimes doesn't have a datapoint when we sync. Open Settings → Wallets and click $ Backfill prices on the row — it re-asks DefiLlama for every NULL price for that wallet. Each routine sync also re-tries the last 30 days automatically.

A SWAP shows $0.0000 — why?

A SWAP's value is borrowed from the leg that has a price (e.g. SOL → USDC = $value of USDC leg). When both legs are non-stable mints DefiLlama hasn't priced (typical for LST-to-LST trades on fresh blocks), Chainbook has nothing to borrow from and falls back to zero. Backfill prices usually fixes this after the indexer catches up.

My USDC transfer shows $0.99, not $1.00.

Stablecoins are pinned to $1.00 in Chainbook (USDC, USDT, PYUSD, DAI, USDS, USDH, USDG). If a legacy row still shows the drifted oracle price, run Backfill prices — it re-pins those rows to $1.00.

Categories

How do I auto-categorize every transfer from one counterparty?

Open Settings → Address Book, click Edit on the contact, pick a category in the Default category dropdown, click Save. Every transfer where this contact is the counterparty — past and future — gets that category assigned automatically.

I changed the contact's default category but old transfers still show the old one.

Switching the category triggers a re-mirror — the previous category is removed from matching rows and the new one is inserted. If you don't see the change immediately, refresh the Transfers page. Manual category assignments (the ones you set by clicking the category cell on a row) are not touched — those stay regardless of contact-level changes.

How do I categorize many rows at once?

The fastest way is the contact route above. Otherwise, click the "Not assigned" cell on any single row to pick a category from a popover — once you assign a category to a counterparty, future transfers from the same counterparty automatically mirror the last 5 assignments. No bulk-select UI yet.

Filters & visibility

What do the HIDE toggles on Transfers actually hide?

  • Spoofing — incoming dust transfers from addresses that look like (lookalike of) one of your real counterparties. Anti-phishing heuristic.
  • Blocked — addresses you've explicitly marked blocked in the Address Book.
  • Fees — the ~0.000005 SOL transaction fee row on every transaction. Real movement, but visually noisy.
  • Swaps — symmetric SWAP pairs (both legs have USD value > $1). Asymmetric SWAPs (e.g. 55 JSOL in + ~0.002 SOL rent out) stay visible because they're economically deposits, not balanced trades.
  • System — protocol housekeeping dust: stake-account rent (~0.00228 SOL), ATA rent (~0.00204 SOL), wSOL sync. Real movement, never material.

I want to permanently hide one token (scam airdrop).

Go to Settings → Rules → enable Mark spam mint, paste the token's mint address (or its symbol) into the corresponding list, save. Every existing row using that mint flips to spam, and future transfers are flagged on insert. The HIDE → Spoofing toggle hides them.

My SWAP doesn't show up.

The default Transfers view hides symmetric SWAPs (both legs priced > $1). Untick the HIDE → Swaps toggle to see them. If a SWAP is asymmetric (one leg priced, other near-zero), it stays visible by default.

Backups

I restored a backup and all my transfers disappeared.

Backups in Chainbook are settings-only — wallets, contacts, rules, categories, notes. The transfer ledger itself isn't bundled (it would balloon the file and become stale the second you closed your phone). After restore, open Settings → Wallets and click ↻ Sync all (N) to refetch the ledger from chain.

Sign-in

Can I use both my Solana wallet and email login?

Yes. Multiple identities (wallet, Google, GitHub, email+password) can be linked to the same account. They're auto-linked by email when the email matches; otherwise contact support to link.

I lost my Solana wallet — can I still get in?

If your account is linked to an email (Google, GitHub, or email+password), use that. If your only identity was the wallet, the account can't be recovered — Chainbook never touches your private key, so we have nothing to reset.

DeFi positions

I have positions in Kamino / Meteora / Jupiter, but I don't see them.

The Dashboards → DeFi tab discovers positions live (no DB cache). Each protocol is queried independently with an 8-second timeout, so an upstream rate-limit on one (e.g. Kamino) doesn't sink the whole tab. If a card stays empty, refresh after a minute or check the protocol's own frontend.

Why is the Portfolio tab slower than the others?

Portfolio enriches every held mint with a fresh DefiLlama price, a logo, and a Jupiter "verified" flag, and folds wSOL + stake-account SOL into the native SOL row. First load can take a few seconds; subsequent reloads in the same session hit in-memory caches.

Troubleshooting playbook

When something looks wrong and the cause isn't obvious, work through these steps in order — most issues resolve before step 4.

  1. Hard-refresh the page. Hit Cmd/Ctrl + Shift + R. Chainbook deploys multiple times a day; an open tab can still point at stale JS chunks. The hard refresh forces the browser to grab the current build.
  2. Click ↻ Sync on the affected wallet. Picks up anything new since last sync. Cheap, safe, fast. If the wallet shows SYNC ERROR, hover the chip — the message names the upstream culprit (transaction history provider rate-limited, RPC timeout, …) so you know whether to retry or wait.
  3. Click $ Backfill prices. Re-asks DefiLlama for every row with a missing USD value on that wallet. Fixes empty Value column and SWAP $0.0000. Won't touch rows that already have a price.
  4. Rebuild from chain. Wipes that wallet's transfers and re-imports from chain. Fixes drift warnings and dedup-key bugs from old builds. Notes and category assignments on this wallet are lost — but every contact-level rule re-applies on the next sync, so labels and default-category mappings come back automatically.
  5. Force collect all. Same as Rebuild but with deeper history (~500k tx, several minutes to half an hour). Use it when Rebuild still leaves drift — the wallet is older than the routine page cap.
  6. Sign out and back in. Resets every in-memory store (wallets list, sync poller, category cache, dashboard filters, onboarding flag) without touching server-side data. Use it if the UI looks internally inconsistent (e.g. the Wallets dropdown disagrees with what Settings shows).
  7. Clear local UI state. Open DevTools → Application → Local Storage → delete the chainbook.* keys (filters, dashboard tab, dismissed-onboarding flag). Your wallets, transfers, contacts, and categories live in Postgres — none of them are in localStorage. After clearing, reload and sign in again.
  8. Try a different browser. Wallet extensions and aggressive ad-blockers occasionally break the Solana Wallet Standard discovery flow or rate-limit DefiLlama calls. A clean Chromium profile is the quickest A/B test.
  9. Open DevTools → Console / Network. Red errors in Console or 5xx responses in Network usually point straight at the broken endpoint. Screenshot those and share when reporting.

None of these steps touch on-chain assets or your wallet private key. Chainbook is read-only against Solana and never signs transactions.

Tax exports & jurisdictions

What's the difference between the four jurisdictions?

Capital-gains rules differ by country in how they match a sale against the lots you bought, and whether the gain is even taxable. Chainbook runs the right cost-basis model per jurisdiction; all four read the same ledger. Amounts are exported in USD with a note to convert to your filing currency at the official rate — Chainbook doesn't do the FX for you yet.

United States — Form 8949 (FIFO)

First-in, first-out: a sale consumes your oldest lots first. Pooled per wallet — each wallet is its own inventory. Gains are split short-term (held ≤ 1 year, Box I) vs long-term (held > 1 year, Box L) since the holding period changes the tax rate.

Germany — Anlage SO (§23 EStG, FIFO)

FIFO, but pooled per person — all your tracked wallets share one inventory. The headline rule is the one-year line: a lot held longer than a year is steuerfrei (tax-free) and excluded from the taxable total. Lots sold within a year are private-sale income.

United Kingdom — SA108 (Section 104 pooling)

Not FIFO. HMRC matches a disposal in a strict order: same-day acquisitions first, then anything re-bought within 30 days (the "bed & breakfasting" anti-avoidance rule), and only the remainder against the Section 104 pool — a single running average cost per asset across all your wallets. There's no short/long split; UK CGT is a flat rate.

Switzerland — wealth valuation (coming soon)

Different in kind: for a private investor, capital gains are not taxed at all. What the tax office wants is a year-end wealth valuation (Steuerwert) — what your holdings were worth on 31 December — not a gains report. That export is still on the roadmap; the option shows as "coming soon" for now.

Is this tax advice?

No. Chainbook is a best-effort accounting tool, not a tax advisor. It flags rows it couldn't price or assign a cost basis so you can review them, but the numbers still need a look — and the filing — from you or your accountant. See the Reports page to generate an export.

Label encryption

What gets encrypted?

Only your wallet and contact labels — the names you give them. Addresses, amounts, dates, and categories stay readable (addresses are public on-chain anyway). Turn it on under Settings → Backup.

Who can read my labels?

Only you, in your browser, after unlocking. The server stores only ciphertext — the operator or anyone with the database cannot read your labels.

How does it work?

A random key encrypts your labels. That key is itself locked by your passphrase and a backup recovery code (using strong Argon2id password-hashing). The key never leaves your browser — the server never sees it.

What if I forget my passphrase?

Use your recovery code — it's shown once when you turn encryption on, so save it somewhere safe. If you lose both the passphrase and the recovery code, your labels can't be recovered, not even by us. That's the trade-off of real end-to-end encryption.

What is NOT protected?

Anyone with access to your unlocked browser or device sees the decrypted labels. This protects against the server side — not against someone using your computer or malware on it. Addresses and amounts are never encrypted.

Does it break search?

While unlocked, label search and sort happen in your browser. Until you unlock on a new device (or after you log out), labels show as 🔒 <address>.

Does my backup stay encrypted?

Yes. An encrypted account's settings backup contains only ciphertext, and restoring it keeps your keys so you can still decrypt your labels.

Activity Log

What does the Activity Log show?

Recent events on your wallets: sync runs (started, completed, any errors), price-data lookups, DeFi position checks, and any warnings the system emitted along the way. The log is per-user and covers only your own activity.

Where do I find it?

Open Settings → Activity Log. You can filter by severity level (Info / Warning / Error) or search by message text. Entries are shown newest-first.

How do I share the log when reporting a problem?

Use the Copy all button to paste the filtered log into a support message, or Download .txt to save a file to attach to a ticket. The downloaded file contains one entry per line in ISO timestamp format. Messages deliberately name roles like "transaction history provider" or "price data provider" rather than internal service names.

How long are entries kept?

The log stores up to 1,000 recent entries per user. Older entries are automatically dropped as new ones arrive; only your own entries are ever affected.

Still stuck? Share the wallet address and a screenshot with JPool — the team behind Chainbook.