Skip to main content

Tok{In} API (beta)

The Tok{In} API offers an array of features that can help determine whether a token is malicious or not. From storage checks, to simulation and static analysis features. The Tok{In} API supports all ERC20 contracts on Ethereum, Binance Smart Chain, Arbitrum, Base, and Avalanche. The features cover all Uniswap V2/V3/V4 forks, Aerodrome V2/Slipstream (Base), and launchpad bonding curves (four.meme, flap.sh on BSC).

Usage

curl -X 'GET' \
'https://tokin-api.dedaub.com/token/{chain}/{token_address}' \
-H 'accept: application/json' \
-H 'X-API-Key: YOUR-API-KEY'

chain: The chain of the token token_address: The address of the token

User Interface

A Swagger UI for easier interaction with the API is available at https://tokin-api.dedaub.com .

Available Chains

ChainSlug
Ethereumethereum
Binance Smart Chainbinance
Arbitrumarbitrum
Basebase
Avalancheavalanche

DEX coverage is most complete on Ethereum, with more pools being added to the other chains over time.

Response Formats

The Tok{In} API supports multiple response formats via the response_format query parameter.

Available Formats

FormatDescription
dedaubDefault format
goplusGoPlus-compatible format

Usage

# Default (Dedaub format)
GET /token/{chain}/{token_address}

# GoPlus format
GET /token/{chain}/{token_address}?response_format=goplus

GoPlus Format Mapping

The GoPlus format transforms the default Tok{In} schema to a GoPlus-compatible one, with the following caveats.

Direct Mappings

Dedaub FieldGoPlus FieldNotes
is_open_sourceis_open_sourceBoolean → "1"/"0" string
is_proxyis_proxyBoolean → "1"/"0" string
mint_or_burn_functionis_mintableBoolean → "1"/"0" string
owner_addressowner_addressDirect string
can_selfdestructselfdestructBoolean → "1"/"0" string
external_callexternal_callBoolean → "1"/"0" string
is_in_dexis_in_dexBoolean → "1"/"0" string
receive_taxbuy_taxDecimal as string
send_taxsell_taxDecimal as string
cannot_buycannot_buyBoolean → "1"/"0" string
tax_can_be_modifiedslippage_modifiableBoolean → "1"/"0" string
trading_cooldowntrading_cooldownBoolean → "1"/"0" string
creator_addresscreator_addressDirect string
creator_percentcreator_percentDecimal as string
is_launchpad_tokenlaunchpad_tokenBoolean → "1"/"0" string

Computed Mappings

GoPlus FieldDerived FromLogic
transfer_pausablecannot_buy, pause_status_can_be_modifiedTrue if either is True
is_blacklistedhas_blacklist_or_whitelistSame value (temporary)
is_whitelistedhas_blacklist_or_whitelistSame value (temporary)
is_anti_whalehas_trading_cap, has_position_capTrue if either is True
anti_whale_modifiabletrading_cap_can_be_modified, position_cap_can_be_modifiedTrue if either is True

Fields Without Direct Equivalent (returns null)

GoPlus FieldReason
hidden_ownerNot currently tracked
cannot_sell_allNot currently tracked
can_take_back_ownershipNot currently tracked
owner_change_balanceNot currently tracked
gas_abuseNot currently tracked
personal_slippage_modifiableNot currently tracked
lp_total_supplyNot currently tracked
is_airdrop_scamNot currently tracked
trust_listNot currently tracked
holder_countNot currently tracked
owner_balanceNot currently tracked
owner_percentNot currently tracked

Caveats

  1. is_blacklisted / is_whitelisted: Currently both map from has_blacklist_or_whitelist. We cannot distinguish between blacklist-only, whitelist-only, or both.

  2. Boolean Format: GoPlus uses string format ("1" / "0") instead of booleans. All boolean fields are converted accordingly.

  3. Tax Terminology: Our send_tax maps to GoPlus sell_tax, and our receive_tax maps to GoPlus buy_tax.

Static Analysis Features

We leverage the Gigahorse decompiler to analyze contracts whose source code is unavailable. The decompiled bytecode is checked for patterns commonly associated with undesirable behaviors in ERC20 tokens.

mint_or_burn_function:

There is a public function that changes the token's total supply.

can_selfdestruct:

The contract contains a selfdestruct call. (Note: The EVM no longer supports the SELFDESTRUCT opcode, so this is now a no-op.)

transfer_guarded_by_storage:

The transfer function's execution depends on a storage variable (e.g., a flag or mapping check). This is a signal that transfers can be conditionally blocked by the contract owner or via some internal logic.

transfer_from_guarded_by_storage:

The transferFrom function's execution depends on a storage variable. Same implications as transfer_guarded_by_storage — indicates that delegated transfers can be conditionally blocked.

trading_cooldown:

An address must wait for a certain period after its last transfer before it can transfer tokens again.

view_function_modifies_state:

A function with the signature of one of the view functions defined by EIP-20 updates a storage variable.

has_trading_cap:

The amount of tokens transferred by a single call to transfer cannot exceed a value, either constant or held in storage.

has_trading_cap_functionality:

There is code that could enforce a trading cap. This can be true even if the cap is disabled.

trading_cap_can_be_modified:

The transfer amount cap is held in storage and there is a function that can update it.

has_position_cap:

The amount of tokens an address can hold cannot exceed a value, either constant or held in storage.

has_position_cap_functionality:

There is code that could enforce a position cap. This can be true even if the cap is disabled.

position_cap_can_be_modified:

The position cap is held in storage and there is a function that can update it.

has_owner_functionality:

There is functionality that could let one or more addresses have access to functionality of the token that the rest do not. This can be true even if the owner has been renounced.

owner_address:

The address of the owner.

has_pause_functionality:

The token has code that could pause trading. Can be true even if the current state of the contract does not allow pausing functionality to be re-enabled.

pause_status_can_be_modified:

The pause status can be changed in the future.

has_blacklist_or_whitelist:

Addresses can be restricted from trading the token.

external_call:

There is a call to another contract, whose target is not statically known and/or returns arbitrary data that are used by the token.

timebomb:

Certain functionality is only enabled after a specific timestamp.

has_tax_functionality:

This token has a tax functionality implemented. This could be true even if the current tax is 0 as the taxes could have been wiped.

tax_can_be_modified:

Tax value can be updated.

is_open_source:

This indicates whether the contract's source code is available.

has_open_source_implementation:

For proxy contracts: indicates whether the implementation contract's source code is verified. Only relevant when is_proxy is true. null for non-proxy contracts.

is_proxy:

Indicates if the contract is a proxy contract.

balance_update_function:

A list of function selectors (e.g., "0xa9059cbb") that modify the token's balance storage slot. Expected selectors are transfer and transferFrom; additional selectors may indicate hidden mint/burn or fee-skimming logic.

"balance_update_function": [
"0xa9059cbb",
"0x23b872dd"
]

allowance_update_function:

A list of function selectors that modify the token's allowance storage slot. Expected selectors include approve, transferFrom, increaseAllowance, and decreaseAllowance; unexpected selectors may indicate allowance manipulation.

"allowance_update_function": [
"0x095ea7b3",
"0x23b872dd",
"0x39509351",
"0xa457c2d7"
]

Simulation Features

transfer_success:

A test transfer was simulated on-chain. If false, the transfer failed — the token may block transfers entirely (potential honeypot).

transfer_tax:

  • send_tax (%): Calculated as the percentage loss from the sender's balance — e.g., if the sender sent 100 tokens and 110 were deducted, the send tax is 10%.
  • receive_tax (%): Calculated as the percentage the recipient received — e.g., if the sender sent 100 tokens and the recipient only received 90, the receive tax is 10%.
  • All values are expressed as percentages (e.g., 0.0 means 0%).

dex:

An array of liquidity pools where the token is paired with WETH, USDC, or USDT, along with details on liquidity and trading behavior.

{
"pair": "0x...",
"liquidity_type": "UniV2",
"liquidity": 2455608.22,
"buy_success": true,
"buy_tax": 0.0,
"sell_success": true,
"sell_tax": 0.0,
"errorMessage": null,
"errorCode": null,
"pool_id": null,
"is_launchpad": null
}
  • pair: Address of the liquidity pair.

  • liquidity_type: Type of the pool:

    TypeDescription
    UniV2Uniswap V2 or compatible fork
    UniV3Uniswap V3 or compatible fork
    UniV4Uniswap V4 or compatible fork
    SolidlyAerodrome (more Solidly forks coming!)
    SolidlyV3Aerodrome Slipstream
    four.memeFour.Meme bonding curve (BSC)
    flapFlap.sh bonding curve (BSC)
  • liquidity: USD value of the pool's known-token reserves:

    • Estimated using balanceOf() on the known token — while not exact, it is a practical approximation that serves as a useful indicator of pool health and liquidity status.
  • buy_success: Whether buying the token (e.g., WETH -> token) succeeded during simulation.

  • buy_tax (%): Tax incurred on a buy.

  • sell_success: Whether selling the token succeeded.

  • sell_tax (%): Tax incurred on a sell.

  • errorMessage / errorCode: Populated for failed queries (e.g., low liquidity, failed swaps).

  • pool_id: ID of the pool in case of Uniswap V4, otherwise null.

  • is_launchpad: true if this pool is from a launchpad bonding curve (e.g., four.meme, flap.sh). null otherwise.

is_liquid:

This boolean indicates if the token is liquid, i.e. if at least one pool has more than $100 (in WETH/USDC/USDT) value in it.

Notes on liquidity

  • For V2 pools, using the known token side (e.g., WETH in WETH/XYZ) is reliable since the reserves are fixed.
  • For V3 pools, the balanceOf() method on the known token offers a fast heuristic to assess pool liquidity. While it has some limitations — such as including uncollected fees or dust and not reflecting active price ranges — it still provides a strong signal of pool activity and health. In most cases, very low balances are a reliable indicator of illiquidity or abandoned pools.
  • For V4 pools, balanceOf() on the pool address is not viable — all token balances are held by a single PoolManager contract, not per-pool contracts. Liquidity is currently fetched via the CoinGecko API using the pool ID (Base token Liquidity $ / Quote token Liquidity $).
  • For launchpad bonding curve pools (four.meme, flap.sh), liquidity is derived from the on-chain reserve data of the bonding curve contract, converted to USD using the quote token price.

Launchpad Detection

Tok{In} detects tokens launched via bonding curve platforms and reports their launchpad origin. Currently supported platforms:

PlatformSlugChain
Four.Memefour.memeBSC
Flap.shflapBSC

How It Works

  • Active bonding curve: If a token is still on a launchpad bonding curve, its pool appears in the dex array with liquidity_type set to the launchpad slug (e.g., "four.meme", "flap") and is_launchpad set to true.
  • Graduated tokens: Tokens that have graduated from a bonding curve to a standard DEX (e.g., PancakeSwap) are still identified via address pattern matching. The is_launchpad_token flag remains true and launchpad_name retains the platform slug.
  • is_launchpad_token: true if the token was launched via a launchpad/bonding-curve platform. null if not detected.
  • launchpad_name: The launchpad platform slug (e.g., "four.meme", "flap"). null if not a launchpad token.
  • is_launchpad (per pool): true if the specific pool is a launchpad bonding curve. null otherwise.

Supply & Burn Features

decimals:

Number of decimal places the token uses (e.g., 18 for most ERC20 tokens). Used to convert between raw and human-readable amounts.

supply:

Total supply of the token, normalized by decimals (raw_supply / 10^decimals). This is the human-readable value (e.g., 1000000000 for a token with 1 billion supply).

burned_supply:

Total supply held by known burn addresses (0x000...0000 and 0x000...dead), normalized by decimals. The value is verified on-chain via multicall. 0 if no tokens have been sent to burn addresses.

burned_supply_pct:

Percentage of the total supply held by known burn addresses, capped to 2 decimal places (e.g., 6.13). 0 if no tokens have been burned.

circulating_supply:

Circulating supply of the token, calculated as supply - burned_supply. Represents the tokens that are still in active circulation.

burn_addresses:

An array of burn address balances. Each entry is a holder object with the burn address and its token balance. Only addresses with a balance > 0 are included.

"burn_addresses": [
{
"owner_address": "0x000000000000000000000000000000000000dead",
"token_amount": 61256610.0,
"pct_held": 6.13
}
]

normalized_supply (deprecated):

Use supply instead. Returns the same value as supply. Kept for backwards compatibility.

Other Features

name:

Name of the token.

symbol:

Symbol of the token.

creator_address:

Address of the creator (EOA) of the token.

creator_balance:

Amount of tokens held by the creator (normalized by decimals).

creator_percent:

Percentage of the total supply held by the creator of the token, capped to 2 decimal places.

top_holders:

Top 10 token holders, returned as an array of holder objects. Balances are verified on-chain via multicall.

[
{
"owner_address": "0x...",
"token_amount": 1234567.89,
"pct_held": 12.34
}
]

Each entry in top_holders has the following fields:

  • owner_address: Address of the token holder.
  • token_amount: Amount of tokens held by that address (normalized by decimals).
  • pct_held: Percentage of the total token supply held by that address.

is_in_dex:

The token is in at least one DEX.

cannot_buy:

Returns true if the token cannot be bought through any of the listed pools or if all the pools are too illiquid (less than $100).

is_launchpad_token:

true if the token was launched via a launchpad/bonding-curve platform (e.g., four.meme on BSC, flap.sh on BSC). null if not detected.

launchpad_name:

The launchpad platform slug (e.g., "four.meme", "flap"). null if not a launchpad token.

last_scanned_at:

ISO 8601 UTC timestamp of when this token was last analyzed (e.g., "2025-01-15T12:30:00Z").

Example

curl -X 'GET' \
'https://tokin-api.dedaub.com/token/ethereum/0x2328434559f7dec44373822cf68052de0d671b7f' \
-H 'accept: application/json' \
-H 'X-API-Key: YOUR-API-KEY'

Result:

{
"chain": "ethereum",
"contract_address": "0x2328434559f7dec44373822cf68052de0d671b7f",
"features": {
"mint_or_burn_function": true,
"can_selfdestruct": false,
"transfer_guarded_by_storage": true,
"transfer_from_guarded_by_storage": true,
"trading_cooldown": false,
"view_function_modifies_state": false,
"has_blacklist_or_whitelist": true,
"external_call": true,
"timebomb": true,
"has_pause_functionality": true,
"pause_status_can_be_modified": false,
"has_owner_functionality": true,
"has_tax_functionality": true,
"tax_can_be_modified": false,
"has_trading_cap_functionality": true,
"trading_cap_can_be_modified": false,
"has_position_cap_functionality": true,
"position_cap_can_be_modified": false,
"balance_update_function": [
"0xa9059cbb",
"0x23b872dd",
"0xcd05e4ad",
"0x3bd5d173"
],
"allowance_update_function": [
"0xa9059cbb",
"0x23b872dd",
"0x39509351",
"0xa457c2d7",
"0x95ea7b3"
],
"name": "Simon the Gator",
"symbol": "SIMON",
"decimals": 18,
"supply": 690000000.0,
"normalized_supply": 690000000.0,
"burned_supply": 0.0,
"burned_supply_pct": 0.0,
"circulating_supply": 690000000.0,
"is_open_source": true,
"has_open_source_implementation": null,
"is_liquid": true,
"is_proxy": true,
"owner_address": "0x0000000000000000000000000000000000000000",
"send_tax": 0,
"receive_tax": 1,
"transfer_success": true,
"creator_address": "0x9cb1a958ad57f59a91582b81ac88378c1c12ee58",
"creator_balance": 400000,
"creator_percent": 0.0,
"is_in_dex": true,
"cannot_buy": false,
"is_launchpad_token": false,
"launchpad_name": null,
"has_trading_cap": true,
"has_position_cap": false,
"last_scanned_at": "2025-06-15T10:22:33Z",
"dex": [
{
"errorMessage": null,
"errorCode": null,
"pair": "0xa954213fb0F410c8f1b2fca9B65F11A63ab3fFdb",
"liquidity_type": "UniV2",
"liquidity": 59292.7097022566,
"buy_success": true,
"buy_tax": 1,
"sell_success": true,
"sell_tax": 1,
"pool_id": null,
"is_launchpad": null
}
],
"top_holders": [],
"burn_addresses": []
},
"error": ""
}