What gets tracked
One Sure account is created per asset, per address, per network. A wallet holding ETH and USDC on Ethereum becomes two accounts, both Crypto accounts with the “wallet” subtype. For each asset Sure records:- The quantity held, read from the chain
- A holding valued at the current price, or at zero when no price is available
- The transfers in and out, as investment trades when the price for that day is known, so cost basis and the value chart reconstruct back to acquisition. When that day’s price is not known, the transfer still appears as an excluded, zero-amount entry — and it is upgraded to a trade on the first sync after the price becomes available
Prices need two settings, not one
On-chain data sources report quantities, not values. Prices come from Sure’s market data providers, and the only provider that can quote bare crypto symbols is Binance public (keyless). If no crypto-capable market data provider is enabled, every on-chain wallet is tracked by quantity and valued at zero. This is the most common support report for this feature, and it is a settings issue rather than a sync failure. The settings panel and the linking modal both warn you before you link anything. On a self-hosted instance an admin can fix it from the warning itself with Enable crypto prices — that addsbinance_public to the enabled providers and leaves the others alone. Otherwise, enable it under Settings → Self hosting → Market data providers, or set SECURITIES_PROVIDERS to a comma-separated list including binance_public.
Exchange rates for non-USD families
The crypto provider quotes in USD, so valuing a wallet in any other family currency needs an exchange rate. Sure’s default exchange rate provider (twelve_data) requires an API key. With no key and a non-USD family, every on-chain wallet is valued at zero for this second, separate reason.
Set EXCHANGE_RATE_PROVIDER (or Settings → Self hosting) to a provider you can use; frankfurter needs no API key. The linking UI warns about this gap specifically, naming your currency. A USD family never sees this warning.
When an asset ends up valued at zero for either reason, it is recorded in Settings → Debug logs under the onchain_wallet provider with the reasons listed.
Data sources
Optional Etherscan key
Ethereum, and only Ethereum, can be read through Etherscan instead of Blockscout. A key buys nothing except a higher rate limit. Add it under Settings → Providers → On-chain wallets → Advanced; it is stored encrypted, per family. A key only moves transfer history onto Etherscan. Balances and network detection always come from the keyless indexer. Leave the field empty unless you are being rate limited.Rate limits and request cost
All the default endpoints are free and shared, so they throttle. Per sync, per address, the cost is roughly:ONCHAIN_HISTORY_MAX_PAGES (default 10, maximum 200); the Solana budget scales proportionally.
History is best effort; balances are not. If a source refuses or times out on paginated history, the balances are still recorded and the history is marked incomplete. When a cap is hit, the affected address says so in Manage wallets, and the event is recorded in Settings → Debug logs under the onchain_wallet provider.
Token limits per address
Real addresses are airdrop dumping grounds. One read surfaces at most 200 tokens per address, settable withONCHAIN_MAX_TOKENS_PER_ADDRESS (maximum 5,000).
The native coin is never affected, and anything already tracked keeps syncing regardless. On EVM networks the tokens kept are ranked by market cap, so real assets survive the cap and airdrops fall off the end. On Solana the order is by mint address — arbitrary, but identical between syncs, which stops the cap from reshuffling a wallet every night.
Linking a wallet
Go to Settings → Providers → On-chain wallets → Add wallet.Paste the public address
Confirm the network
0x address is valid on all six EVM networks, and Bitcoin’s Base58 shape overlaps Solana’s — Sure probes each and asks you to choose, marking the ones where it found activity.Choose assets to track
Managing a wallet
Go to Settings → Providers → On-chain wallets → Manage wallets.- Review tokens — reopens the asset selection with the address unchanged. Use this to start tracking a token that arrived later, or stop tracking one you no longer want.
- Stop tracking (per asset) — drops one asset.
- Change address — corrects the address while keeping the accounts, holdings, and balance history attached to it.
- Disconnect wallet — drops every asset at one address.
Limitations
Only tokens the crypto price provider quotes get a value, and it quotes by symbol. Valuation goes through aCRYPTO:<SYMBOL> ticker, and a symbol is not a token’s identity — its contract is. In practice the provider covers major assets and little else: measured on a real Ethereum address, of its ten largest token positions it quoted two. The other eight — including holdings worth roughly 141,000 and $74,000 — showed a value of zero while their quantities were tracked correctly.
A zero next to a token you know is worth something almost always means the provider does not list that token, not that the balance is wrong. Check the quantity, which is read straight from the chain. Native coins (BTC, ETH, SOL, POL, XDAI) and large-cap tokens are the well-covered case.
DeFi positions are not seen at all. Staked ETH, liquidity-pool tokens, lending positions, and Solana stake accounts are invisible. A wallet holding most of its value in a staking or lending protocol will report a fraction of it.
Bitcoin is one address at a time. Extended keys (xpub, ypub, zpub) are not supported and are rejected as addresses. Most Bitcoin wallets are HD wallets, where one extended key derives thousands of addresses and change is sent to derived ones. Tracking a single address of such a wallet reports only that address’s balance.
Solana token names depend on a token list. RPC returns mints, not names, so names come from Jupiter’s token search — and only for mints it reports as verified. An unverified or unknown mint keeps a label built from its mint address and is tracked by quantity only. Names are cached for 24 hours per mint.
Fees are not itemised. Network fees are included in the net effect of each transfer rather than recorded separately. On Solana, native balance changes below 0.0001 SOL are treated as fees and ignored.
Bridged assets are normalised. USDC.e, USDbC, USDT0, WETH, and similar 1:1-redeemable forms are tracked as their canonical asset, so the same asset held on two networks is one Security rather than two.
Prices are daily and USD-quoted. Values are converted into your family currency using Sure’s exchange rates. A transfer whose day has no price becomes a zero-amount excluded entry rather than a trade.
NFTs are not tracked. They are filtered out by token standard, so an NFT is never mistaken for a balance of one fungible token.
Troubleshooting
Every wallet shows a value of zero
Every wallet shows a value of zero
One token shows zero while the others in the same wallet are fine
One token shows zero while the others in the same wallet are fine
A Bitcoin balance is much lower than my wallet app shows
A Bitcoin balance is much lower than my wallet app shows
Sync says the explorer could not be reached
Sync says the explorer could not be reached
*_URL override at your own instance.Solana shows balances but no transfers
Solana shows balances but no transfers
SOLANA_RPC_URL to your own node or a paid endpoint to get the transfers.A token I received is not showing up
A token I received is not showing up
A Solana token shows as SPL:abcd…wxyz
A Solana token shows as SPL:abcd…wxyz
Transfers appear with a value of 0 and are excluded from totals
Transfers appear with a value of 0 and are excluded from totals
Manage wallets says the history is incomplete
Manage wallets says the history is incomplete
ONCHAIN_HISTORY_MAX_PAGES if you need the full history and can afford the extra requests.Balances are correct but nothing updates
Balances are correct but nothing updates
onchain_wallet provider for recorded failures.