Identify
The call
import { identify } from "@agntn/chains";
const { matches, unchecked } = identify("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");
matches.map((chain) => chain.key); // ["solana"]
unchecked; // []
identify("0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984").matches.length; // 13, every EVM chain
identify("0x1").matches.map((chain) => chain.key); // ["aptos", "sui"]
identify(address) partitions the registry: matches holds every chain whose assertAddress accepted the string, unchecked holds every chain that carries no validator and so couldn't be asked. Only InvalidAddressError counts as a miss. Anything else a validator throws is a bug and comes back out.
What a match means
Format only. Every EVM chain shares one format, so a 0x address with 40 hex digits matches all fourteen, and that's the honest answer. A match narrows the family rather than naming the chain an address is used on. Same for 0x1 on Aptos and Sui: both write the framework address that way, and nothing in the string can tell them apart.
A miss on a chain says the string doesn't fit that format. A miss everywhere says no registered format fits, which isn't the same as the address being wrong. It could be a chain this package doesn't know.
Unchecked isn't no
A chain without a validator is named as unchecked rather than skipped, because a silent skip would let "matches none" read as "belongs to no registered chain". The list is empty right now, every built-in chain validates, but a custom chain that skips assertAddress lands there.
On the CLI and in the tools
chains identify 0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984
chains identify EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v --json
identify exits 0 even when nothing matches, because that's an answer too. It prints a warning line in that case and the matching chains otherwise, one per line with the family and the name. --json gives { matches, unchecked } as arrays of keys.
chains_identify_address is the same thing for a model, grouped by family, with the reach of a match spelled out in the text:
"0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984" matches 14 of 36 checked chains.
evm (14): ethereum, base, arbitrum, optimism, polygon, bsc, avalanche, fantom, gnosis, linea, zksync, scroll, berachain, arc
A format match narrows the family; it does not prove the address is used on any of these chains.
The Playground runs the same partition in your browser and lights up the families as you type.
Address validation
assertAddress on every chain. What each family decodes and which checksums are verified and which are left alone. A format check and nothing more.
Metadata
Every field on a chain class. Which ones may be missing and why. Where each decimals value, magic and proof-of-work hash was checked.