How it works
Wallet Insights
Read-only checks beyond the score: Wallet Health on Token Approvals, the account type and first funder, the Transactions tab, Wallet Flow in the Transaction Visualizer, the Journey tab with the Activity Fingerprint, the Identity tab, and the Unclaimed tab.
Updated 2026-10-10
Overview
Wallet Insights are read-only checks on a wallet that are not part of the score. They reuse data zkCodex already reads, so they add little or no waiting, and none of them asks for a signature.
- Wallet Health, at the top of Token Approvals and of a wallet's Approvals tab: one verdict on approvals, account code and holdings.
- Account type and first funder, at the top of the Identity tab: whether the address is a plain wallet, an EIP-7702 smart account or a contract, and who first sent it native coin.
- Transactions, on the Transactions tab: every transaction 20 a page, with filters, an explanation of each one from the explorer and a question to Ask zkCodex about them.
- Wallet Flow, the Flow tab of the Transaction Visualizer: where the wallet's coins and tokens came from and where they went, starting from its first funder.
- Journey and the Activity Fingerprint, on the Journey tab: the wallet's milestones on the network, and six activity axes scored on their own.
- Identity, on the Identity tab: the wallet's public names, social accounts and reputation, its web3.bio profiles and name records, its EAS attestations, its funding trail, the wallets it funded and its activity hours.
- Unclaimed, on the Unclaimed tab: bridge withdrawals never finished, rewards, vested and streamed tokens, fees and locks the wallet left on the network, and on request the deposits still sitting in other contracts it used.
Wallet Health
Wallet Health opens Token Approvals (every network you scan) and the Approvals tab of a wallet analysis (that network). It gives one of three levels with the findings behind it. There is no 0-100 health score.
| Level | When |
|---|---|
| At risk | At least one critical finding |
| Review | No critical finding, at least one review finding |
| Looks fine | Only information, or nothing to flag |
| Severity | Findings |
|---|---|
| Critical | An approval to a contract flagged as malicious; an approval to a plain wallet; a dangerous or unidentified EIP-7702 delegate on the account |
| Review | Unlimited or collection-wide approvals; approvals to contracts that are not verified or could not be identified |
| Information | Approvals older than 180 days; delegate.xyz delegations; spam and unlisted tokens in the wallet |
Approvals hidden as spam (worthless tokens, empty balances) never raise a finding. While some networks are still being scanned, problems already found show at once and Looks fine waits for the rest. A check or network that could not be read is shown as such and raises nothing, so a missing answer never looks like a problem or like a clean bill.
No extra scan
Wallet Health reads the approval scan the page already runs, with its EIP-7702 and delegate.xyz checks. Only the holdings check adds a request: the priced portfolio, shared with the Portfolio tab and kept for 30 minutes.
Holdings are checked on mainnets only; testnets have no prices. The value spenders could move is in the totals right below the panel.
Account type and first funder
| Type | Meaning |
|---|---|
| Wallet (EOA) | An address with no code, controlled by a private key |
| Smart account (EIP-7702) | A wallet whose key holder delegated it to a contract's code |
| Contract | An address with deployed code |
| Self-destructed contract | No code today, but its history starts with its own deployment |
Both sit in a strip at the top of the Identity tab of a wallet analysis; the lookup starts once the strip is on screen. The funder links to its own wallet page and the funding transaction to the explorer. The type comes from one read of the address's code on the network. The first funder is the sender of the first transfer of native coin into a wallet, found in the oldest 25 rows of its transaction list and of its internal transaction list (transfers paid out by contracts, such as bridge fills). Contracts are not looked up; their type links to the contract page (Contract Details), and Safe multisigs and ERC-4337 smart accounts are named as such.
| Label | When |
|---|---|
| Same address (bridged from L1) | The first funding came from the same address: an L1 deposit keeps the sender's address on the L2 |
| L2 Standard Bridge / L2 Cross Domain Messenger | The OP Stack system contracts that pay out L1 deposits |
| Bridge name | A bridge contract from zkCodex's app list on that network, such as Relay or Across |
When no funder is shown
If the oldest rows hold no incoming value (a wallet that only received tokens, or one with many outgoing transactions first), no funder is guessed. Failed and zero-value transfers never count.
A funder never changes once found, so the server keeps it and your browser stores it for 30 days. The account type is checked again on every visit, because an EIP-7702 delegation can be set or removed with one signature.
A funder gets a name when one is known: the same address (bridged from L1), a network system contract or a bridge from zkCodex's own list, or otherwise a name tag from Blockscout Metadata, such as an exchange hot wallet. A wallet first funded by "Binance: Hot Wallet" was most likely funded by a withdrawal from that exchange. Hover a tagged name to see where it came from.
For a smart account (EIP-7702) the strip also names the contract the wallet delegates to, with the same verdict Wallet Health gives: known code, unknown code to review, or flagged as malicious. It shows on every network, including the ones where token approvals cannot be scanned and Wallet Health is not available.
Transactions tab
The Transactions tab lists every transaction the analysis loaded, newest first, 20 a page. Each row says what it did (a swap, a buy or sell, coins sent or received, an approval, a mint, a bridge, a deploy) with the assets in and out, the app or counterparty, the time, the value and the fee.
- Filters: free text (a hash, an address, a method, a token or an app), the type, the direction (sent by the wallet or received), the period (any time, or the last 24 hours to the last year), a token and an app. The type, token and app choices come from this wallet's own history, each with its count; the direction and period choices are fixed.
- A hash, or the file icon on a row, opens what the transaction did right under the row without leaving the list: it is read from the network's explorer (Etherscan or Blockscout) and says in one sentence what happened, with its status, the approvals it granted and the signals worth a look. Open the transaction page, under that summary, opens its full page in a new tab.
- Ask AI about these opens Ask zkCodex with a question about the period and the type the filters show. With Any time it asks about the last 30 days; Ask reads at most the last 90.
Wallet Flow
Flow is the fifth tab of the Transaction Visualizer on the wallet page. It reads left to right: Origin (the first funder from the account lookup), Sources (addresses that sent the wallet native coin or tokens), the wallet, and Destinations (addresses it sent to). Line weight follows the number of transfers. On phones it opens as a table with the same rows; the Graph and Table switch changes it anywhere.
- Each side shows up to eight addresses, ranked by number of transfers; past that, the top seven stay and the rest fold into one Other row.
- Direction (both, in, out), asset (the native coin, a token or an NFT collection) and period (30D, 90D, 1Y, All) filter the scan already on the page, so they never wait for a request.
- Tokens minted to the wallet come from a Mint node and tokens it burned go to a Burn node.
- Drag the graph with the mouse to move it and zoom with the buttons in its corner. Full screen gives it the whole window, where the wheel, a finger and a pinch move and zoom it too; on a phone it opens zoomed on the wallet.
- Each node is one line: the address (or its known name) and the number of transfers. Hovering shows the address and what moved.
- Clicking a node shows what moved, when, and links to that address's wallet page (its contract details page for a contract), the explorer and the latest transaction's page (Transaction Details).
| Hidden and counted | Why |
|---|---|
| Transfers to itself | They move nothing in or out |
| Zero-value transfers | Bare zero-value sends and zero-amount token transfers; a zero-value call into a contract is not a transfer at all |
| Spam tokens | Tokens Blockscout marks as scam, and tokens whose name or symbol carries a link or a claim bait |
| Look-alike addresses | An address that only left zero-value or spam transfers and shares the first and last four characters of an address the wallet paid |
Look-alike addresses
Look-alikes are how address poisoning works: they plant a near copy of an address you paid in your history and wait for you to copy it. Flow names how many it found. Always check the whole address before sending. A look-alike the wallet really paid is never hidden.
Sources and destinations are named from zkCodex's protocol list and the scan first. The busiest 50 counterparties left without a name are looked up once in Blockscout Metadata, so exchanges, bridges and routers the list does not know still show a name. A name tag says who an address belongs to, not that it is safe.
What Flow cannot see
Native coin paid out by contracts (internal transactions, such as bridge fills and withdrawals) is not part of the wallet scan, so those senders do not appear as sources. The first funder comes from a separate lookup that does read internal transactions, so a wallet funded by a bridge still shows its origin.
Journey
The Journey tab of a wallet analysis opens with the wallet in numbers on that network (onchain since, transactions, active days and months, longest streak, busiest month, apps used), then lists its milestones grouped by year, oldest first. Each one shows its date (UTC) and links the transaction that proves it in the explorer. Under them, Apps over time lists every app from zkCodex's list the wallet used, in the order it first used each, with its transaction count and first and last date. It reads the transaction history the page already loaded; only the first funder comes from the account lookup above.
| Milestone | When it is reached |
|---|---|
| First funded | The first native coin sent into the wallet (see first funder above). It opens the timeline but is never under Still ahead: being funded is not something the wallet does |
| First successful transaction | The oldest transaction the wallet sent that succeeded |
| First swap | Tokens went out and other tokens came back in one transaction, or a swap call into a DeFi app zkCodex knows |
| First bridge | A bridge call, or a transaction to a bridge from zkCodex's app list or the network's native bridge |
| First liquidity or staking | Adding or removing liquidity, staking, unstaking or claiming, or a transaction to a staking or yield app zkCodex knows |
| First name or social action | A transaction to a naming or social app zkCodex knows, such as a GM |
| First NFT mint | An NFT arrived from the zero address in a transaction the wallet sent; on networks without NFT transfer data, a mint call |
| First contract deployed | A transaction that created a contract |
| 10th, 100th and 1,000th successful transaction | Counted in the order the wallet sent them |
| 10th and 100th active day | The first transaction of the 10th (100th) UTC day with at least one sent transaction |
| 5th and 10th app used | The first transaction with the 5th (10th) different app from zkCodex's list; the network's native bridge does not count here |
| Longest streak | The most UTC days in a row with at least one sent transaction (two or more). It sits on the streak's last day |
Milestones not reached yet are listed under Still ahead, with a link where zkCodex has the tool (bridge and swap, NFT mint, contract deploy, GM). For counts, only the next step is shown there, with how many are left. On a network zkCodex has no app list for, the app milestones are left out instead of shown as ahead, and Apps used reads n/a.
Successful transactions only
Explorers leave failed transactions out of the history zkCodex reads, so the counts say successful: the 100th successful transaction can come later than nonce 99.
Activity Fingerprint
The Activity Fingerprint, under Journey, scores six axes from 0 to 100, each on its own. They are not shares of one whole and there is no total. Value, fees and USD prices are never an input, so the Fingerprint does not measure how much money a wallet moves. Open an axis to see its inputs, their curve and weight. The score details no longer label wallets with behaviour patterns; this describes the mix instead.
| Axis | Inputs (curve, target, weight) |
|---|---|
| Explorer | Different contracts called (log, 150, 40%); different apps used (linear, 25, 35%); active months (linear, 18, 25%) |
| DeFi | Swaps (log, 200, 30%); transactions with DeFi apps (log, 300, 25%); different DeFi apps (linear, 10, 20%); liquidity and staking (log, 50, 15%); months with DeFi (linear, 12, 10%) |
| Bridge | Bridge transactions (log, 50, 40%); different labeled bridges (linear, 5, 30%); months with bridging (linear, 12, 30%) |
| NFT | Mints (log, 100, 35%); collections minted (log, 50, 25%); transactions moving NFTs (log, 200, 25%); months with NFTs (linear, 12, 15%). Without NFT transfer data: mint calls (45%), contracts minted from (35%), months with mints (20%) |
| Developer | Contracts deployed (log, 20, 60%); own contracts called after deploying them (log, 10, 40%) |
| Social | Transactions with social and naming apps, zkCodex GM included (log, 50, 45%); different social apps (linear, 5, 35%); months with social activity (linear, 12, 20%) |
Linear is min(1, value / target). Log is log10(1 + value) / log10(1 + target), capped at 1, so a single action already counts. An axis is 100 times the weighted sum, rounded.
| Score | Shown as |
|---|---|
| n/a | The network cannot measure the axis: DeFi or Social with fewer than 2 such apps labeled there, Bridge with no bridge labeled |
| - | Measured, nothing found |
| 1-24 | Light |
| 25-59 | Active |
| 60-100 | Strong |
The line on top reads Light activity so far when no axis reaches 25, Mostly X when one axis leads by 10 or more, and X + Y when the top two are both 25 or more and within 10 of each other. Axes showing n/a are left out.
Identity tab
The Identity tab of a wallet analysis starts with the account (a plain wallet or an EIP-7702 smart account, the code it delegates to, and its first funder) and gathers what public sources say about a wallet: its names, the social accounts tied to it, its reputation, its profiles and the registry records of its names, the attestations it received or made, where its first coin came from, the wallets it funded and when it is active. Each source is read on its own; one that does not answer is named as such and the rest still show.
| Card | What it shows | Source |
|---|---|---|
| Identity | The display name and bio the owner published, ENS and Basename primary names (only when the name resolves back to this wallet), the Farcaster account that lists the wallet, linked social accounts with their strength and the services web3.bio saw each on, other wallets a source ties to this one, and search links for X and Google | ENS on Ethereum, Basenames on Base, Farcaster's public API (web3.bio finds the account, which must have signed a verification for the wallet), web3.bio, Ethos, EAS attestations, Blockscout Metadata name tags |
| Reputation | Ethos score, level, human verification and review counts; whether Coinbase verified the account (yes or no) and Coinbase One; humanity, risk and spam credentials with their issuer, what each proves and when it was last updated | Ethos, Coinbase Verifications on Base (EAS), web3.bio credentials |
| Profiles and name records | Every profile web3.bio's identity graph holds for the wallet (ENS, Basenames, Farcaster, Lens...) with its bio, followers, creation date and links; the registry side of the wallet's ENS name and Basename (a different wallet that owns or manages it, registration and expiry dates, records, addresses on other chains); and the PGP key or keywords the owner published on them | web3.bio profiles and its domain records |
| Attestations | EAS attestations the wallet received or made, by kind (KYC, humanity, role, project, vouch, profile, governance, activity), each with its issuer, chain, date and the facts it states (never a country, city, e-mail, phone, birth date or a person's name); revoked and expired ones are marked. Leads written into them (a GitHub handle, a Farcaster id, a project's accounts, unknown issuers who vouched for it) are listed under them | EAS on Ethereum, Base, Optimism, Arbitrum and Linea |
| Funding trail | The wallet's first funder, that funder's first funder and so on, up to three hops, each with its name tag, amount and date | The first-funder lookup above, hop by hop |
| Funded wallets | Wallets this wallet sent native coin to, with what each sent back and the days the tie spans. Two-way ties (coin went both ways) show first, then repeat ones (sent more than once), and all of them a click away, six rows at a time; totals sent and sent back, a link to compare the two wallets, and on request which of the 10 largest it funded first and bursts of fresh wallets it funded within five minutes of each other | The transaction history the page already loaded, plus the first-funder lookup |
| Activity hours | Sent transactions per UTC hour and weekday, and the quietest six hours | The transaction history the page already loaded |
| Strength | Meaning |
|---|---|
| Platform verified | The platform made the owner prove the account: a signed Farcaster verification or an account connected on Ethos |
| Corroborated | Two or more independent sources name the account, such as an ENS record and a web3.bio identity |
| Single source | One source names the account; it is the owner's own claim |
Every account lists the source and the name or profile it came from. web3.bio's copy of an ENS or Basename record is not counted as a second source when zkCodex read that record itself, so one record cannot corroborate itself.
An attestation is its issuer's word. zkCodex names the schemas it knows by chain and schema id (Coinbase Verifications, Optimism Citizen, Gitcoin Passport, Optimism Retro Funding, Karma GAP, DeVouch, Gitcoin Grants), so a lookalike schema name cannot pose as one; any other schema is read by its registered name and fields. A project record's own website and documents are shown as text; only the platforms' own pages are links. Wallets an attestation ties to this one (wallets it listed as its own in a statement about itself, a grant's payout wallet) and a wallet that holds this wallet's primary name join the linked wallets with that source.
The funding trail stops at an exchange, a bridge, a mixer, a protocol or a contract, at the wallet's own address bridged from L1, at a wallet with no funder in its first transactions, when it comes back to a wallet already on it, or after three hops. An exchange at the end says where the coin entered, not who withdrew it.
Funded wallets leave out exchanges, bridges, protocols and DEXs named by Blockscout Metadata or zkCodex's app list, contracts and calls, and amounts under 0.0002 of the native coin. At most 25 are listed, two-way and repeat ones before one-off ones. A burner batch is three or more wallets this wallet funded first, each within 300 seconds of the one before. Activity hours need at least 10 sent transactions; the quiet window needs 40 and is shown in UTC only. zkCodex does not turn it into a guess at where the owner lives.
Public data only
The tab reads public onchain records and public profiles from the sources above; nothing is stored about the people behind a wallet, and X's paid API is not used (the X and Google links open those sites' own search). A link between two wallets names the source that ties them and never says they belong to the same person. Answers are cached for six hours (a minute when a source did not answer, and a few minutes when an attestation network did not), so a profile changed just now can show the older state for a while. What reaches a person rather than a wallet is never read or shown: the country Coinbase recorded, and a real name, e-mail, phone number, location or time zone on a name's records or a profile.
Unclaimed tab
The Unclaimed tab of a wallet analysis looks for value the wallet left behind on that network: a bridge withdrawal started and never proven or finalized, a USDC transfer burned and never minted, a reward never claimed, tokens vested or streamed and never withdrawn, LP fees never collected, a lock past its unlock time, creator fees a launchpad holds. It runs the checks of Beachcomb (yusufky63/beachcomb), ported into zkCodex and run on zkCodex's own server, explorer keys and RPC endpoints. The tab shows only on networks at least one check covers: Ethereum, Base, Arbitrum, OP Mainnet, Linea, Scroll, ZKsync Era, Polygon, BNB Chain, Avalanche, Unichain, Soneium, Ink, World Chain, Celo, Shape, Abstract, Robinhood Chain and Plume.
| Part | What it shows |
|---|---|
| Totals | Recoverable now (claim or withdraw it today) and Pending (yours, not claimable yet) in USD, and how many positions have no trustworthy price |
| Findings | Each position with its state, amount, USD value, how sure the check is, the block it was read at, the protocol's own app and the steps to claim it |
| Deposits in other contracts | On request: every other verified contract the wallet used here, asked whether it still holds a deposit or a reward for it |
| What was checked | Every check that covers the network and how it ended; a check that could not finish is listed as not checked |
A finding is read from the contract's current state, or from the protocol's own API where there is no onchain state (Merkl, Hyperliquid, Lighter, Circle's attestation service). Explorer history only finds candidates; it is never the proof. A finding counts in the totals only at Onchain confirmed, Multi-source confirmed or Official API confidence; Likely means the amount or timing is an estimate and Needs review is never counted. A position without a trustworthy price shows USD unavailable, never $0, and a priced one under $1 is hidden and counted.
The deposit check simulates, from the wallet at the latest block, every call that could pay it (a withdrawal of its own deposit, or a claim of something owed on top). Only a call a simulation paid is exact; a contract that only returned a number is a hint. Its answers are leads, never findings: no one has reviewed those contracts, and leads are never added to the totals. A tab view asks the 40 contracts the wallet put the most into, within 40 seconds, and lists what it could not ask.
A lead a simulation paid can be sent from the tab, and only from the wallet it belongs to: zkCodex simulates the exact call again on its server, shows the contract, the function and what it pays, and says it sends 0 and approves nothing. The transaction goes straight from the wallet to the contract, with no fee and nothing in between. Approvals and transfers are never sent from here, and neither is a call that would also take tokens from the wallet. Findings are claimed in the protocol's own app.
Nothing found is not always nothing
An explorer or a protocol API that did not answer leaves its check as not checked, and the tab says so; try Refresh. A complete scan is shared for ten minutes, one with a check that did not finish for a minute. Token names and symbols are text whoever deployed the token chose. No real service asks for a seed phrase, an approval or a fee to unlock funds.