Token Listing System Development
A token listing system is the process and infrastructure for adding new trading assets to an exchange. Includes application form, due diligence checks, technical integrations (new deposit/withdrawal channel), configuring trading pairs, and finally public announcement. Each stage requires both technical and operational work.
Listing Process
Stages from Application to Trading
1. Submission (1-2 days)
└── Project team fills listing form
└── Uploads documentation
2. Initial Review (3-7 days)
└── Document completeness check
└── Basic AML screening of contracts/wallets
3. Due Diligence (7-21 days)
└── Technical contract audit
└── Team verification
└── Legal/compliance check
└── Market analysis
4. Commercial Terms (2-5 days)
└── Listing fee (or not)
└── Market making obligations
└── Team token lock-up terms
5. Technical Integration (3-10 days)
└── Deposit/withdrawal setup
└── Trading pair configuration
└── Staging testing
6. Soft Launch (1-2 days)
└── Deposits opening
└── Pre-market pricing (optional)
7. Trading Start
└── Trading opening
└── Public announcement
Listing Form
class ListingApplication(BaseModel):
# Basic info
project_name: str
token_symbol: str
token_name: str
website: str
whitepaper_url: str
# Contract
blockchain: str # 'ethereum', 'bsc', 'solana', etc.
contract_address: str
token_standard: str # 'ERC-20', 'BEP-20', 'SPL'
decimals: int
total_supply: int
circulating_supply: int
# Market data
current_price_usd: float
market_cap_usd: float
volume_24h_usd: float
current_exchanges: list[str] # Where already traded
# Team
team_members: list[TeamMember]
github_url: str
audit_reports: list[str] # URLs to audits
# Requested pairs
requested_pairs: list[str] # ['TOKEN/USDT', 'TOKEN/BTC']
# Additional
short_description: str
use_case: str
roadmap: str
token_unlock_schedule: dict # when team tokens unlock
Due Diligence Checks
Smart Contract Analysis
class SmartContractAnalyzer:
async def analyze(self, contract_address: str, blockchain: str) -> ContractReport:
checks = {}
# 1. Source verification check
checks['source_verified'] = await self.is_source_verified(contract_address, blockchain)
# 2. Honeypot detection — can't sell token?
checks['honeypot'] = await self.check_honeypot(contract_address, blockchain)
# 3. Ownership renounced?
checks['owner_address'] = await self.get_owner(contract_address, blockchain)
checks['ownership_renounced'] = checks['owner_address'] in [
'0x0000000000000000000000000000000000000000',
'0x000000000000000000000000000000000000dead'
]
# 4. Liquidity lock check
checks['liquidity_locked'] = await self.check_liquidity_lock(contract_address)
# 5. Dangerous functions (mint, blacklist, pause)
checks['has_mint'] = await self.check_function_exists(contract_address, 'mint')
checks['has_blacklist'] = await self.check_function_exists(contract_address, 'blacklist')
checks['has_pause'] = await self.check_function_exists(contract_address, 'pause')
# 6. External audit results
checks['audit_reports'] = await self.find_audit_reports(contract_address)
# Overall assessment
risk_score = self.calculate_risk_score(checks)
return ContractReport(
address=contract_address,
checks=checks,
risk_score=risk_score,
recommendation='approve' if risk_score < 30 else 'reject' if risk_score > 70 else 'review'
)
Token Distribution Analysis
Concentration among few wallets — sign of possible rug pull:
async def analyze_token_distribution(self, contract: str, blockchain: str) -> dict:
top_holders = await self.get_top_holders(contract, blockchain, limit=100)
total_supply = await self.get_total_supply(contract, blockchain)
# Exclude known addresses (exchanges, DEX pools, burn addresses)
filtered_holders = [
h for h in top_holders
if h.address not in self.known_exchange_addresses
]
top_10_percent = sum(h.balance for h in filtered_holders[:10]) / total_supply * 100
top_20_percent = sum(h.balance for h in filtered_holders[:20]) / total_supply * 100
return {
"top_10_holders_percent": top_10_percent,
"top_20_holders_percent": top_20_percent,
"risk": "HIGH" if top_10_percent > 50 else "MEDIUM" if top_10_percent > 30 else "LOW",
"holders_count": await self.get_holders_count(contract, blockchain)
}
Technical Integration
Blockchain Node / API Integration
For each new blockchain, integration with node or API provider is needed:
| Blockchain | Node / API | Deposit detection | Withdrawal |
|---|---|---|---|
| Ethereum | geth/infura | ERC-20 Transfer events | web3.eth.sendSignedTransaction |
| Solana | solana-validator / Quicknode | SPL token transfers | solana-web3.js |
| BSC | geth-bsc | BEP-20 Transfer events | web3 (BSC fork) |
| Tron | tron-node / TronGrid | TRC-20 Transfer events | tronweb |
class NewTokenIntegration:
async def setup_erc20_token(self, token_config: TokenConfig):
# Add ABI and contract address
contract = self.web3.eth.contract(
address=token_config.contract_address,
abi=ERC20_ABI
)
# Verify basic parameters match application
on_chain_symbol = contract.functions.symbol().call()
on_chain_decimals = contract.functions.decimals().call()
assert on_chain_symbol == token_config.symbol, "Symbol mismatch"
assert on_chain_decimals == token_config.decimals, "Decimals mismatch"
# Register in system
await self.db.register_token({
'symbol': token_config.symbol,
'contract_address': token_config.contract_address,
'decimals': token_config.decimals,
'blockchain': 'ethereum',
'is_active': True,
'min_deposit': token_config.min_deposit,
'withdrawal_fee': token_config.withdrawal_fee,
'confirmations_required': token_config.confirmations
})
# Configure monitoring
await self.deposit_monitor.add_token(token_config)
logger.info(f"Token {token_config.symbol} registered successfully")
Admin Panel for Listing
Interface for exchange includes:
- List of applications with statuses and progress
- Due diligence checklist (each item with owner and status)
- Trading pair management: enable/disable, set fee tier
- Pre-launch configuration: min/max order, price band on first hours
- Announcement scheduler: date/time of publication, text for all channels
Price band on first hours of trading is critical: without restrictions, extreme manipulations possible at low liquidity on start. Standard: ±50% from opening in first 5 minutes, then widens.
A well-structured listing process is exchange reputation. Listing poor-quality projects leads to rug pull → affected users → regulatory attention.







