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
| Chain | Slug |
|---|---|
| Ethereum | ethereum |
| Binance Smart Chain | binance |
| Arbitrum | arbitrum |
| Base | base |
| Avalanche | avalanche |
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
| Format | Description |
|---|---|
dedaub | Default format |
goplus | GoPlus-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 Field | GoPlus Field | Notes |
|---|---|---|
is_open_source | is_open_source | Boolean → "1"/"0" string |
is_proxy | is_proxy | Boolean → "1"/"0" string |
mint_or_burn_function | is_mintable | Boolean → "1"/"0" string |
owner_address | owner_address | Direct string |
can_selfdestruct | selfdestruct | Boolean → "1"/"0" string |
external_call | external_call | Boolean → "1"/"0" string |
is_in_dex | is_in_dex | Boolean → "1"/"0" string |
receive_tax | buy_tax | Decimal as string |
send_tax | sell_tax | Decimal as string |
cannot_buy | cannot_buy | Boolean → "1"/"0" string |
tax_can_be_modified | slippage_modifiable | Boolean → "1"/"0" string |
trading_cooldown | trading_cooldown | Boolean → "1"/"0" string |
creator_address | creator_address | Direct string |
creator_percent | creator_percent | Decimal as string |
is_launchpad_token | launchpad_token | Boolean → "1"/"0" string |
Computed Mappings
| GoPlus Field | Derived From | Logic |
|---|---|---|
transfer_pausable | cannot_buy, pause_status_can_be_modified | True if either is True |
is_blacklisted | has_blacklist_or_whitelist | Same value (temporary) |
is_whitelisted | has_blacklist_or_whitelist | Same value (temporary) |
is_anti_whale | has_trading_cap, has_position_cap | True if either is True |
anti_whale_modifiable | trading_cap_can_be_modified, position_cap_can_be_modified | True if either is True |
Fields Without Direct Equivalent (returns null)
| GoPlus Field | Reason |
|---|---|
hidden_owner | Not currently tracked |
cannot_sell_all | Not currently tracked |
can_take_back_ownership | Not currently tracked |
owner_change_balance | Not currently tracked |
gas_abuse | Not currently tracked |
personal_slippage_modifiable | Not currently tracked |
lp_total_supply | Not currently tracked |
is_airdrop_scam | Not currently tracked |
trust_list | Not currently tracked |
holder_count | Not currently tracked |
owner_balance | Not currently tracked |
owner_percent | Not currently tracked |
Caveats
-
is_blacklisted/is_whitelisted: Currently both map fromhas_blacklist_or_whitelist. We cannot distinguish between blacklist-only, whitelist-only, or both. -
Boolean Format: GoPlus uses string format (
"1"/"0") instead of booleans. All boolean fields are converted accordingly. -
Tax Terminology: Our
send_taxmaps to GoPlussell_tax, and ourreceive_taxmaps to GoPlusbuy_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:Type Description 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.
- Estimated using
-
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, otherwisenull. -
is_launchpad:trueif this pool is from a launchpad bonding curve (e.g., four.meme, flap.sh).nullotherwise.
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 singlePoolManagercontract, not per-pool contracts. Liquidity is currently fetched via theCoinGeckoAPI 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:
| Platform | Slug | Chain |
|---|---|---|
| Four.Meme | four.meme | BSC |
| Flap.sh | flap | BSC |
How It Works
- Active bonding curve: If a token is still on a launchpad bonding curve, its pool appears in the
dexarray withliquidity_typeset to the launchpad slug (e.g.,"four.meme","flap") andis_launchpadset totrue. - 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_tokenflag remainstrueandlaunchpad_nameretains the platform slug.
Related Fields
is_launchpad_token:trueif the token was launched via a launchpad/bonding-curve platform.nullif not detected.launchpad_name: The launchpad platform slug (e.g.,"four.meme","flap").nullif not a launchpad token.is_launchpad(per pool):trueif the specific pool is a launchpad bonding curve.nullotherwise.
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": ""
}