Token security checks
A token's risk checks on BSC and Solana, each saying how it was established, the flags they raise, and what unknown means.
The token carries security: a block of checks, each saying how it was established (how). A check that could not be established is null, with the reason under its name in unknown: an absent answer is never a pass. Token lists carry the same checks' flags for each row.
| Check | Chain | How it is established |
|---|---|---|
contract.owner, renounced | BSC | owner() or getOwner() at a block; renounced when it is the zero or dead address. |
contract.proxy | BSC | The EIP-1967 implementation, admin and beacon slots, OpenZeppelin's legacy slot, EIP-1822, and EIP-1167 minimal-proxy code. upgradeable when an admin or an upgrade function can change the code. |
contract.functions | BSC | The known mint, pause, blacklist and trading-toggle signatures the bytecode (the implementation's, behind a proxy) dispatches; each one present is called once from an address that is not the owner, and nonOwnerCall says whether it succeeded. |
taxes | BSC | Measured from indexed swaps and their transfers over 24 h: what the recipient got against what the pool sent (buys), what the pool received against what the seller sent (sells). The median per side, with the number of swaps. Not measured for a token in more than 50 pools (a quote token). |
lp | BSC | The token's most traded constant-product pool, which is its own LP token, at one block. burnedShare: held by the zero and dead addresses. lockedShare: held by verified lockers (PinkLock V2 and V1, UNCX's PancakeSwap V2 and Uniswap V2 lockers, Team Finance, GemPad), less locks PinkLock or UNCX list as already past their end. lockers lists each locker holding LP with its share; counted: false marks DxSale's legacy locker, whose flaw lets an owner withdraw a lock again. unlock: the soonest end of a listed lock (unix seconds) and the share it frees. A custom timelock is not seen. |
lp | Solana | The token's most traded pool in 24 h with a fungible LP (PumpSwap, Raydium AMM v4, Raydium CPMM) or permanently locked liquidity (Meteora DAMM v2). burnedShare: the LP the pool issued (its own count, which misses burns outside a withdrawal) less the mint's supply, plus what the incinerator holds; null on DAMM v2. lockedShare: what Raydium's LP lock (Burn & Earn) holds of a CPMM pool's LP, or a DAMM v2 pool's permanently locked liquidity; null where no lock program is verified (PumpSwap, AMM v4). |
mintAuthority, freezeAuthority, mint | Solana | The mint account: its authorities (null is none: revoked), its program, and its Token-2022 extensions (transfer fee, permanent delegate, transfer hook, non-transferable, default frozen, pausable). |
metadata | Solana | The Metaplex metadata account's is_mutable, or the Token-2022 metadata's update authority. |
honeypot | Both | Distinct wallets that bought and that sold in 24 h, leaving out the creator and its pools' creators. likely when 10 or more bought and none sold; not once any sold; null below 10 buyers. |
top10Share | Both | From the last complete holders list; null without one. |
logoReuses | Both | Other tokens whose logo is the same image; null for a token without a logo. |
Flags
flags names each finding that is a risk: upgradeable, mintable, pausable, blacklist, trading_toggle (a function present and either callable by anyone or the owner not renounced), buy_tax, sell_tax (a median of 0.5% or more over 3+ swaps), mint_authority, freeze_authority, transfer_fee, permanent_delegate, transfer_hook, non_transferable, default_frozen, mutable_metadata, honeypot, logo_reused, lp_unlocked (both LP shares known, and less than half the LP burned, locked, or held by a known locker). A check that could not run raises none: read unknown before calling a token clean.
Unknown is not revoked
On Solana, mintAuthority and freezeAuthority are null both when revoked and when unknown. They are revoked only when unknown does not name them. When the chain could not be read, the authorities the indexer stored last are shown, and unknown.mint says so.
Freshness
A block is kept 5 minutes (30 s while it lacks its chain facts); chain facts 10 minutes; a contract's bytecode facts 30 days (code does not change). A request waits at most 1.5 s for a chain read; a slower one finishes in the background and the block says so in unknown. A list row's flags is null until the token was checked: listing it queues a check, and flags older than an hour are checked again.
BSC, a four.meme token (security block of the token example), captured on a test instance:
{
"checkedAt": 1790618614169,
"flags": [
"buy_tax",
"sell_tax"
],
"honeypot": {
"likely": false,
"buyers": 8,
"sellers": 7,
"window": "24h",
"how": "Distinct wallets that bought, and that sold, in the last 24h (the transaction's sender), leaving out the token's creator and its pools' creators where Aurelia saw them. Likely a honeypot when 10+ wallets bought and none of them sold; not one once any sold"
},
"lp": {
"pool": "0x702e6533e0182381606adbe3ccbb77f682ccc58b",
"lockedShare": null,
"burnedShare": 1,
"how": "The pool is its own LP token: totalSupply() and balanceOf() of the zero and dead addresses at block 124557783. Locked LP is not counted: Aurelia has no trustworthy list of lockers"
},
"top10Share": 0.30010822,
"logoReuses": null,
"unknown": {
"logoReuses": "the token has no logo"
},
"contract": {
"block": 124557783,
"owner": "0x0000000000000000000000000000000000000000",
"renounced": true,
"proxy": {
"kind": "minimal",
"implementation": "0x024f18294970b5c76c0691b87f138a0317156422",
"admin": null,
"upgradeable": false
},
"functions": {
"mint": {
"present": false,
"signatures": [],
"nonOwnerCall": null
},
"pause": {
"present": false,
"signatures": [],
"nonOwnerCall": null
},
"blacklist": {
"present": false,
"signatures": [],
"nonOwnerCall": null
},
"tradingToggle": {
"present": false,
"signatures": [],
"nonOwnerCall": null
}
},
"how": "At block 124557783: owner() or getOwner(); the EIP-1967, OpenZeppelin and EIP-1822 proxy slots and EIP-1167 code; the known mint, pause, blacklist and trading-toggle signatures the implementation's bytecode dispatches, each present one called once through Multicall3 (eth_call from a caller that is not the owner)"
},
"taxes": {
"buy": 0.02,
"sell": 0.02,
"buys": 69,
"sells": 33,
"window": "24h",
"how": "Median over the swaps of the last 24h in transactions with one swap of the token: what the pool's Transfer logs delivered to the recipient against what the pool sent (buys), what the pool received against what its sender sent in all (sells)"
}
}
Solana, a pump.fun coin, captured on a test instance (chain facts from recorded replies):
{
"checkedAt": 1790618353852,
"flags": [],
"honeypot": {
"likely": false,
"buyers": 2,
"sellers": 2,
"window": "24h",
"how": "Distinct wallets that bought, and that sold, in the last 24h (the transaction's sender), leaving out the token's creator and its pools' creators where Aurelia saw them. Likely a honeypot when 10+ wallets bought and none of them sold; not one once any sold"
},
"lp": null,
"top10Share": null,
"logoReuses": null,
"unknown": {
"top10Share": "no complete holders list read yet (GET /tokens/:chain/:address/holders)",
"logoReuses": "the token has no logo",
"lp": "not covered on Solana: each protocol keeps its LP mint differently, and Aurelia does not read them yet"
},
"mintAuthority": null,
"freezeAuthority": null,
"mint": {
"slot": 451374423,
"program": "token",
"mintAuthority": null,
"freezeAuthority": null,
"extensions": [],
"transferFee": null,
"permanentDelegate": null,
"transferHook": null,
"nonTransferable": false,
"defaultFrozen": false,
"pausable": null,
"closeAuthority": null,
"metadataAuthority": null,
"how": "The mint account at slot 451374423: its authorities and Token-2022 extensions"
},
"metadata": {
"source": "metaplex",
"updateAuthority": "TSLvdd1pWpHVjahSpsvCXUbgwsL3JAcvokwaKt1eokM",
"mutable": false,
"how": "The Metaplex metadata account's is_mutable at slot 451374423"
}
}