
Anatomy of a token report: USDT and USDC
Snapshot time: 2026-11-04T19:45:13Z for USDT and 19:45:20Z for USDC on Ethereum. The other tokens here were read within the next minute. This note reads two real reports line by line. They are useful examples because both tokens are large and long established, and even so neither report is clean. That is the correct result. The checks report contract features, and they do not judge a token.
#The call
curl -s "https://farbeamlabs.com/api/v1/tokens/ethereum/0xdAC17F958D2ee523a2206206994597C13D831ec7"
curl -s "https://farbeamlabs.com/api/v1/tokens/ethereum/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"const addr = "0xdAC17F958D2ee523a2206206994597C13D831ec7";
const { data } = await (await fetch(`https://farbeamlabs.com/api/v1/tokens/ethereum/${addr}`)).json();
console.log(data.counts);
for (const c of data.checks) console.log(c.id, c.status, c.source, c.field);import requests
addr = "0xdAC17F958D2ee523a2206206994597C13D831ec7"
data = requests.get(f"https://farbeamlabs.com/api/v1/tokens/ethereum/{addr}", timeout=30).json()["data"]
print(data["counts"])
for c in data["checks"]:
print(c["id"], c["status"], c["source"], c["field"])#Side by side
| Check | Source field | USDT | USDC |
|---|---|---|---|
liquidity | liquidity.usd | pass, $66,975,773 in 30 pools | pass, $223,484,788 in 30 pools |
pool_age | pairCreatedAt | pass, 1987 days | pass, 2361 days |
open_source | is_open_source | pass | pass |
honeypot | is_honeypot | pass | pass |
mintable | is_mintable | warn | unknown |
proxy | is_proxy | pass | warn |
balance_change | owner_change_balance | fail | unknown |
hidden_owner | hidden_owner | pass | unknown |
pausable | transfer_pausable | warn | unknown |
blacklist | is_blacklisted | warn | unknown |
buy_tax | buy_tax | pass, 0% | pass, 0% |
sell_tax | sell_tax | pass, 0% | pass, 0% |
top10 | holders[].percent | warn, 46.2% | pass, 24.6% |
lp_locked | lp_holders[].is_locked | unknown | unknown |
| Counts | 8 pass, 4 warn, 1 fail, 1 unknown | 7 pass, 1 warn, 0 fail, 6 unknown |
The contract and holder fields come from GoPlus, and the market fields from DexScreener. The thresholds are on token checks.
#Why USDT shows a fail
GoPlus returned owner_change_balance as true for USDT, and the report maps that to fail with the text "Owner can edit balances." The mapping is fixed. It does not know who the owner is.
USDT is a centrally issued token, and its published contract gives the issuer several powers. These correspond to the flagged fields:
| Field | Result | What it reflects |
|---|---|---|
is_mintable | warn | The issuer can create new supply |
transfer_pausable | warn | The owner can pause transfers |
is_blacklisted | warn | The contract can block addresses |
owner_change_balance | fail | The contract has a function that removes funds of blocked addresses, which the field describes as a balance change |
For a small token with an anonymous deployer, these same fields would be a serious concern. For USDT they describe a known design of a centrally issued token. The report shows the same result either way, because it reads a field and does not rate an issuer. The reader has to add that context.
#Why USDC shows mostly unknown
USDC is deployed behind a proxy. GoPlus returned is_proxy as true, and it left out is_mintable, owner_change_balance, hidden_owner, transfer_pausable and is_blacklisted.
The report shows these as unknown. It would be a mistake to read that as a clean result. The published USDC contract has roles for minting, pausing and blocking addresses, so the powers exist even though the source did not return them. The USDC report has 0 fails and the USDT report has 1, and that difference comes from what the source returned. It does not show that one token gives its issuer fewer powers. This is why Farbeam has no composite score.
The proxy warning is a separate fact: "Logic can change through a proxy." An upgrade can change contract behaviour.
#Holders
| Field | USDT | USDC |
|---|---|---|
total_supply | 84,298,550,181 | 46,832,426,791 |
holder_count | 15,929,358 | 9,409,681 |
owner | 0xc6cd...a828 | null |
| Largest holder | Binance 8, 16.845% | Unlabeled, 7.361% |
| Second largest | Unlabeled, 10.896% | Unlabeled contract, 3.377% |
| Top 10 share | 46.2% | 24.6% |
The top10 check includes exchanges and contracts. USDT is in warn partly because exchange wallets hold customer balances. A high share does not prove concentrated ownership, and a low one does not rule it out. The owner value of null for USDC is what the source returned for this proxy.
#Same issuers on Solana
Solana reports read authorities directly from the mint account by RPC, so this part does not depend on GoPlus.
| Mint | mint_authority | freeze_authority | top10 | Read at |
|---|---|---|---|---|
| USDC | warn, BJE5...5ruG | warn, 7dGb...Crar | unknown | 19:46:04Z |
| USDT | warn, Q6Xp...69Gi | warn, Q6Xp...69Gi | unknown | 19:46:15Z |
Both authorities are present, so the issuer powers appear as direct facts here. top10 is unknown because the getTokenLargestAccounts call failed for these mints in this run, and sources shows solana-holders with ok: false. See authorities in major Solana mints.
#For contrast
| Token | Counts | Warnings and fails |
|---|---|---|
| WETH on Ethereum | 12 pass, 1 warn, 0 fail, 1 unknown | top10 warn only |
| DAI on Ethereum | 12 pass, 1 warn, 0 fail, 1 unknown | mintable warn only |
#Limits
liquiditysums the 30 pools the source returned. A pool's liquidity includes both sides, so it is not all USDT or all USDC. It also understates liquidity on a token with more than 30 pools.- The explanations of issuer powers come from the published contracts. The report itself has only the field values.
- GoPlus fields can change or disappear without notice.
- This is a snapshot. Reports are cached for up to 5 minutes.
A report is a set of field readings. It is not a safety rating, and it is not financial advice. Run your own in the token report tool.