Overview
This quickstart guide will walk you through the complete lifecycle of a BondKit token in under 5 minutes. You’ll learn how to:
Deploy a new bond token
Trade during the bonding phase
Monitor progress toward the target
Migrate to Uniswap v4
Prerequisites : Make sure you’ve completed the installation and have a funded wallet on Base.
Complete Flow Diagram
Step 1: Deploy Your Token
Basic Deployment
import { BondkitTokenFactory } from "@b3dotfun/sdk/bondkit" ;
import { base } from "viem/chains" ;
import { parseEther } from "viem" ;
// Initialize the factory
const factory = new BondkitTokenFactory (
base . id ,
process . env . WALLET_PRIVATE_KEY
);
// Deploy your token
const tokenAddress = await factory . deployBondkitToken ({
// Token metadata
name: "My Awesome Token" ,
symbol: "MAT" ,
// Supply configuration (1 million tokens)
finalTokenSupply: parseEther ( "1000000" ),
// Bonding curve settings
aggressivenessFactor: 35 , // 0-100, higher = steeper curve
targetAmount: parseEther ( "10" ), // 10 units of trading token target for migration
// Fee configuration
feeRecipient: "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb1" , // Your address
lpSplitRatioFeeRecipientBps: 1000 n , // 10% to fee recipient
// Migration settings
migrationAdminAddress: "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb1" ,
// Uniswap V4 configuration
bondingPhaseSplitter: "0x2AB69e0d9D20D3700466153D84a6574128154Fd2" ,
v4PoolManager: "0x498581fF718922c3f8e6A244956aF099B2652b2b" ,
v4Hook: "0xB36f4A2FB18b745ef8eD31452781a463d2B3f0cC" ,
v4PoolFee: 3000 , // 0.3% fee tier
v4TickSpacing: 60 ,
// Trading token (B3 token address for Base mainnet)
tradingToken: "0xB3B32F9f8827D4634fE7d973Fa1034Ec9fdDB3B3"
});
console . log ( "✅ Token deployed at:" , tokenAddress );
Understanding Parameters
Total supply of tokens (with 18 decimals). Example: parseEther("1000000") for 1M tokens.
Controls bonding curve steepness (0-100):
0-30 : Linear pricing, fair for all buyers
30-60 : Moderate curve, balanced approach
60-100 : Aggressive, rewards early buyers
Amount of trading token needed to enable migration. Use parseEther("10") for 10 tokens (18 decimals).
Address that receives trading fees (5% of all trades).
lpSplitRatioFeeRecipientBps
Basis points (1/100th of 1%) for LP fee split. 1000 = 10%.
Step 2: Trading During Bonding Phase
Initialize Token Instance
import { BondkitToken } from "@b3dotfun/sdk/bondkit" ;
import { parseEther , formatEther } from "viem" ;
// Connect to your deployed token
const token = new BondkitToken (
tokenAddress ,
process . env . WALLET_PRIVATE_KEY
);
Understanding Trading Tokens
BondKit tokens use a configurable trading token system. Check what token is used for trading:
// Get the trading token details
const tradingTokenAddress = await token . getTradingTokenAddress ();
const tradingTokenSymbol = await token . getTradingTokenSymbol ();
console . log ( `Trading with: ${ tradingTokenSymbol } ( ${ tradingTokenAddress } )` );
// For Base mainnet, this is typically B3 token
// Check if it's ETH (zero address) or an ERC20 token
const isETH = tradingTokenAddress === "0x0000000000000000000000000000000000000000" ;
Buying Tokens
// Get a price quote first
const tradingTokenAmount = parseEther ( "100" ); // 100 units of trading token
const expectedTokens = await token . getAmountOfTokensToBuy ( tradingTokenAmount );
console . log ( ` ${ formatEther ( tradingTokenAmount ) } ${ tradingTokenSymbol } will buy: ${ formatEther ( expectedTokens ) } tokens` );
// Execute the purchase (parameters: minTokensOut, amount)
const buyTx = await token . buy (
tradingTokenAmount , // Amount of trading token to spend
0 n // minTokensOut (0 = accept any amount, use for slippage protection)
);
console . log ( "Purchase complete! Tx:" , buyTx );
Selling Tokens
// Check your token balance
const balance = await token . getBalance ( userAddress );
console . log ( `Your balance: ${ formatEther ( balance ) } tokens` );
// Get sell quote
const tokensToSell = parseEther ( "1000" );
const expectedTradingToken = await token . getAmountOfTradingTokensToSell ( tokensToSell );
console . log ( `Selling 1000 tokens will return: ${ formatEther ( expectedTradingToken ) } ${ tradingTokenSymbol } ` );
// Execute the sale
const sellTx = await token . sell (
tokensToSell , // Amount of tokens to sell
0 n // Min trading token out (for slippage protection)
);
console . log ( "Sale complete! Tx:" , sellTx );
Monitoring Progress
// Check bonding progress
const progress = await token . getBondingProgress ();
console . log ( `
Progress: ${ ( progress . progress * 100 ). toFixed ( 2 ) } %
Raised: ${ formatEther ( progress . raised ) } ${ tradingTokenSymbol }
Target: ${ formatEther ( progress . threshold ) } ${ tradingTokenSymbol }
Remaining: ${ formatEther ( progress . threshold - progress . raised ) } ${ tradingTokenSymbol }
` );
// Get current token price
const currentPrice = await token . getCurrentPrice ();
console . log ( `Current price: ${ formatEther ( currentPrice ) } ${ tradingTokenSymbol } per token` );
// Check if migration is available
const canMigrate = await token . canMigrate ();
console . log ( `Ready to migrate: ${ canMigrate } ` );
Event Monitoring
// Listen for buy events
token . onBuy (( event ) => {
console . log ( "New purchase:" , {
buyer: event . buyer ,
tradingTokenIn: formatEther ( event . ethIn ), // Note: field name is 'ethIn' but represents trading token
tokensOut: formatEther ( event . tokensOut )
});
});
// Listen for sell events
token . onSell (( event ) => {
console . log ( "New sale:" , {
seller: event . seller ,
tokensIn: formatEther ( event . tokensIn ),
tradingTokenOut: formatEther ( event . ethOut ) // Note: field name is 'ethOut' but represents trading token
});
});
Step 3: Migration to Uniswap v4
Check Migration Readiness
// Verify target is reached
const progress = await token . getBondingProgress ();
if ( progress . progress >= 1.0 ) {
console . log ( "✅ Target reached! Ready to migrate." );
// Get migration details
const migrationData = await token . getMigrationData ();
console . log ( "Migration will create pool with:" , {
tradingTokenLiquidity: formatEther ( migrationData . ethForLp ), // Note: 'ethForLp' field name
tokenLiquidity: formatEther ( migrationData . tokensForLp ),
initialPrice: formatEther ( migrationData . sqrtPriceX96 )
});
} else {
console . log ( `⏳ Need ${ formatEther ( progress . threshold - progress . raised ) } more ${ tradingTokenSymbol } ` );
}
Execute Migration
// Only the migration admin can call this
if ( await token . isMigrationAdmin ( userAddress )) {
console . log ( "🚀 Initiating migration to Uniswap v4..." );
const migrationTx = await token . migrateToDex ();
console . log ( "Migration transaction:" , migrationTx );
// Wait for confirmation
const receipt = await token . waitForTransaction ( migrationTx );
if ( receipt . status === "success" ) {
console . log ( "✅ Migration complete!" );
console . log ( "Uniswap v4 pool address:" , await token . getPoolAddress ());
}
} else {
console . log ( "❌ Only migration admin can execute migration" );
}
Important : After migration:
Contract ownership is automatically renounced
Bonding curve trading is permanently disabled
All trading moves to Uniswap v4
No further admin actions are possible
Complete Example
Here’s a full working example that demonstrates the entire lifecycle:
import {
BondkitTokenFactory ,
BondkitToken
} from "@b3dotfun/sdk/bondkit" ;
import { base } from "viem/chains" ;
import { parseEther , formatEther } from "viem" ;
async function launchToken () {
// 1. Deploy token
const factory = new BondkitTokenFactory (
base . id ,
process . env . WALLET_PRIVATE_KEY
);
const tokenAddress = await factory . deployBondkitToken ({
name: "Demo Token" ,
symbol: "DEMO" ,
finalTokenSupply: parseEther ( "1000000" ),
aggressivenessFactor: 50 ,
targetAmount: parseEther ( "5" ),
feeRecipient: process . env . WALLET_ADDRESS ,
lpSplitRatioFeeRecipientBps: 1000 n ,
migrationAdminAddress: process . env . WALLET_ADDRESS ,
// Uniswap V4 configuration
bondingPhaseSplitter: "0x2AB69e0d9D20D3700466153D84a6574128154Fd2" ,
v4PoolManager: "0x498581fF718922c3f8e6A244956aF099B2652b2b" ,
v4Hook: "0xB36f4A2FB18b745ef8eD31452781a463d2B3f0cC" ,
v4PoolFee: 3000 ,
v4TickSpacing: 60 ,
tradingToken: "0xB3B32F9f8827D4634fE7d973Fa1034Ec9fdDB3B3"
});
console . log ( "Token deployed:" , tokenAddress );
// 2. Trade during bonding
const token = new BondkitToken (
tokenAddress ,
process . env . WALLET_PRIVATE_KEY
);
// Buy some tokens
await token . buy ( parseEther ( "50" ), 0 n ); // 50 trading tokens, 0 min out
console . log ( "Bought tokens with 50 trading tokens" );
// Check progress
const progress = await token . getBondingProgress ();
console . log ( `Progress: ${ ( progress . progress * 100 ). toFixed ( 2 ) } %` );
// 3. Continue trading until target is reached...
// (In production, other users would be trading)
// 4. Migrate when ready
if ( progress . progress >= 1.0 ) {
await token . migrateToDex ();
console . log ( "Migration complete! Token is now on Uniswap v4" );
}
}
launchToken (). catch ( console . error );
Next Steps
Concepts Deep dive into bonding curves and pricing
SDK Reference Explore all available methods
Complete Lifecycle End-to-end token management guide
Demo App See a complete implementation