Clanker SDK
Deploy production-ready ERC20 tokens with built-in liquidity pools using the official Clanker TypeScript SDK.
Overview
Clanker is a token deployment protocol that creates ERC20 tokens with Uniswap V4 liquidity pools in a single transaction. The SDK provides a TypeScript interface for deploying tokens with advanced features like vesting, airdrops, and customizable reward distribution.
Quick Start
Installation
bashnpm install clanker-sdk viem # or yarn add clanker-sdk viem # or pnpm add clanker-sdk viem
Environment Setup
Create a .env file with your private key:
bashPRIVATE_KEY=0x...your_private_key_here
Basic Token Deployment
typescriptimport { Clanker } from 'clanker-sdk'; import { createPublicClient, createWalletClient, http, type PublicClient } from 'viem'; import { privateKeyToAccount } from 'viem/accounts'; import { base } from 'viem/chains'; const PRIVATE_KEY = process.env.PRIVATE_KEY as `0x${string}`; const account = privateKeyToAccount(PRIVATE_KEY); const publicClient = createPublicClient({ chain: base, transport: http(), }) as PublicClient; const wallet = createWalletClient({ account, chain: base, transport: http(), }); const clanker = new Clanker({ wallet, publicClient }); const { txHash, waitForTransaction, error } = await clanker.deploy({ name: 'My Token', symbol: 'TKN', image: 'ipfs://bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi', tokenAdmin: account.address, metadata: { description: 'My awesome token', }, context: { interface: 'Clanker SDK', }, vanity: true, }); if (error) throw error; const { address: tokenAddress } = await waitForTransaction(); console.log('Token deployed at:', tokenAddress);
Core Capabilities
1. Token Deployment
Deploy tokens with full customization including metadata, social links, and pool configuration.
Basic deployment:
- Token name, symbol, and image (IPFS)
- Description and social media links
- Vanity address generation
- Custom pool configurations
Reference: references/deployment.md
2. Vault (Token Vesting)
Lock a percentage of tokens with lockup and vesting periods:
typescriptvault: { percentage: 10, // 10% of token supply lockupDuration: 2592000, // 30 days cliff (in seconds) vestingDuration: 2592000, // 30 days linear vesting recipient: account.address, }
Reference: references/vesting.md
3. Airdrops
Distribute tokens to multiple addresses using Merkle tree proofs:
typescriptimport { createAirdrop, registerAirdrop } from 'clanker-sdk/v4/extensions'; const { tree, airdrop } = createAirdrop([ { account: '0x...', amount: 200_000_000 }, { account: '0x...', amount: 50_000_000 }, ]); // Include in deployment airdrop: { ...airdrop, lockupDuration: 86_400, // 1 day vestingDuration: 86_400, // 1 day }
Reference: references/airdrops.md
4. Rewards Configuration
Configure trading fee distribution:
typescriptrewards: { recipients: [ { recipient: account.address, admin: account.address, bps: 5000, // 50% of fees token: 'Both', // Receive both tokens }, { recipient: '0x...', admin: '0x...', bps: 5000, // 50% of fees token: 'Both', }, ], }
Token Type Options
Choose which tokens each recipient receives from trading fees:
| Token Type | Description |
|---|---|
'Clanker' | Receive only the deployed token |
'Paired' | Receive only the paired token (e.g., WETH) |
'Both' | Receive both tokens |
Default Bankr Interface Fee
When deploying via Bankr, use this default rewards configuration with 20% interface fee:
typescript// Bankr interface fee recipient const BANKR_INTERFACE_ADDRESS = '0xF60633D02690e2A15A54AB919925F3d038Df163e'; rewards: { recipients: [ { recipient: account.address, // Creator admin: account.address, bps: 8000, // 80% to creator token: 'Paired', // Receive paired token (WETH) }, { recipient: BANKR_INTERFACE_ADDRESS, // Bankr interface admin: BANKR_INTERFACE_ADDRESS, bps: 2000, // 20% to Bankr token: 'Paired', // Receive paired token (WETH) }, ], }
Reference: references/rewards.md
5. Dev Buy
Include an initial token purchase in the deployment:
typescriptdevBuy: { ethAmount: 0.1, // Buy with 0.1 ETH recipient: account.address, }
6. Custom Market Cap
Set initial token price/market cap:
typescriptimport { getTickFromMarketCap } from 'clanker-sdk'; const customPool = getTickFromMarketCap(5); // 5 ETH market cap pool: { ...customPool, positions: [ { tickLower: customPool.tickIfToken0IsClanker, tickUpper: -120000, positionBps: 10_000, }, ], }
Reference: references/pool-config.md
7. Anti-Sniper Protection
Configure fee decay to protect against snipers:
typescriptsniperFees: { startingFee: 666_777, // 66.6777% starting fee endingFee: 41_673, // 4.1673% ending fee secondsToDecay: 15, // 15 seconds decay }
Contract Limits & Constants
| Parameter | Value | Notes |
|---|---|---|
| Token Supply | 100 billion | Fixed at 100,000,000,000 with 18 decimals |
| Max Extension BPS | 9000 (90%) | Max tokens to extensions, min 10% to LP |
| Max Extensions | 10 | Maximum number of extensions per deployment |
| Vault Min Lockup | 7 days | Minimum lockup duration for vesting |
| Airdrop Min Lockup | 1 day | Minimum lockup duration for airdrops |
| Max LP Fee | 10% | Normal trading fee cap |
| Max Sniper Fee | 80% | Maximum MEV/sniper protection fee |
| Sniper Fee Decay | 2 minutes max | Maximum time for sniper fee decay |
| Max Reward Recipients | 7 | Maximum fee distribution recipients |
| Max LP Positions | 7 | Maximum liquidity positions |
Supported Chains
| Chain | Chain ID | Native Token | Status |
|---|---|---|---|
| Base | 8453 | ETH | ✅ Full support |
| Ethereum | 1 | ETH | ✅ Full support |
| Arbitrum | 42161 | ETH | ✅ Full support |
| Unichain | - | ETH | ✅ Full support |
| Monad | - | MON | ✅ Static fees only |
Post-Deployment Operations
Claim Vaulted Tokens
typescriptconst claimable = await clanker.getVaultClaimableAmount({ token: TOKEN_ADDRESS }); if (claimable > 0n) { const { txHash } = await clanker.claimVaultedTokens({ token: TOKEN_ADDRESS }); }
Collect Trading Rewards
typescript// Check available rewards const availableFees = await clanker.availableRewards({ token: TOKEN_ADDRESS, rewardRecipient: FEE_OWNER_ADDRESS, }); // Claim rewards const { txHash } = await clanker.claimRewards({ token: TOKEN_ADDRESS, rewardRecipient: FEE_OWNER_ADDRESS, });
Update Token Metadata
typescriptconst metadata = JSON.stringify({ description: 'Updated description', socialMediaUrls: [ { platform: 'twitter', url: 'https://twitter.com/mytoken' }, { platform: 'telegram', url: 'https://t.me/mytoken' }, ], }); const { txHash } = await clanker.updateMetadata({ token: TOKEN_ADDRESS, metadata, });
Update Token Image
typescriptconst { txHash } = await clanker.updateImage({ token: TOKEN_ADDRESS, image: 'ipfs://new_image_hash', });
Common Workflows
Simple Memecoin Launch
- Prepare token image (upload to IPFS)
- Deploy with basic config (name, symbol, image)
- Enable vanity address for memorable contract
- Share contract address
Community Token with Airdrop
- Compile airdrop recipient list
- Create Merkle tree with
createAirdrop() - Deploy token with airdrop extension
- Register airdrop with Clanker service
- Share claim instructions
Creator Token with Vesting
- Deploy with vault configuration
- Set lockup period (cliff)
- Set vesting duration
- Claim tokens as they vest
Full Deployment Config
typescript// Bankr interface fee recipient (20%) const BANKR_INTERFACE_ADDRESS = '0xF60633D02690e2A15A54AB919925F3d038Df163e'; const tokenConfig = { chainId: 8453, // Base name: 'My Token', symbol: 'TKN', image: 'ipfs://...', tokenAdmin: account.address, metadata: { description: 'Token description', socialMediaUrls: [ { platform: 'twitter', url: '...' }, { platform: 'telegram', url: '...' }, ], }, context: { interface: 'Bankr', platform: 'farcaster', messageId: '', id: '', }, vault: { percentage: 10, lockupDuration: 2592000, vestingDuration: 2592000, recipient: account.address, }, devBuy: { ethAmount: 0, recipient: account.address, }, // Default: 80% creator, 20% Bankr interface (all in paired token) rewards: { recipients: [ { recipient: account.address, admin: account.address, bps: 8000, // 80% to creator token: 'Paired', // Receive paired token (WETH) }, { recipient: BANKR_INTERFACE_ADDRESS, admin: BANKR_INTERFACE_ADDRESS, bps: 2000, // 20% to Bankr token: 'Paired', // Receive paired token (WETH) }, ], }, pool: { pairedToken: '0x4200000000000000000000000000000000000006', // WETH positions: 'Standard', }, fees: 'StaticBasic', vanity: true, sniperFees: { startingFee: 666_777, endingFee: 41_673, secondsToDecay: 15, }, };
Best Practices
Security
- Never expose private keys - Use environment variables
- Test on testnet first - Verify configs before mainnet
- Simulate transactions - Use
*Simulatemethods before execution - Verify addresses - Double-check all recipient addresses
Token Design
- Choose meaningful names - Clear, memorable token identity
- Use quality images - High-res, appropriate IPFS images
- Configure vesting wisely - Align with project timeline
Gas Optimization
- Use Base or Arbitrum - Lower gas fees
- Batch operations - Combine when possible
- Monitor gas prices - Deploy during low-traffic periods
Troubleshooting
Common Issues
- "Missing PRIVATE_KEY" - Set environment variable
- "Insufficient balance" - Fund wallet with native token
- "Transaction reverted" - Check parameters, simulate first
- "Invalid image" - Ensure IPFS hash is accessible
Debug Steps
- Check wallet balance
- Verify chain configuration
- Use simulation methods
- Check transaction on block explorer
- Review error message details
Resources
- GitHub: github.com/clanker-devco/clanker-sdk
- NPM: npmjs.com/package/clanker-sdk
- Examples: github.com/clanker-devco/clanker-sdk/tree/main/examples/v4
💡 Pro Tip: Always use the vanity: true option for memorable contract addresses.
⚠️ Security: Never commit private keys. Use .env files and add them to .gitignore.
🚀 Quick Win: Start with the simple deployment example, then add features like vesting and rewards as needed.

