TypeScript SDK for interacting with the Ponder DEX protocol on Bitkub Chain.
npm install @ponderfinance/sdk
# or
yarn add @ponderfinance/sdk
import { PonderSDK } from '@ponderfinance/sdk'
import { createPublicClient, createWalletClient, http, custom } from 'viem'
// Initialize SDK
const sdk = new PonderSDK({
chainId: 96, // Bitkub Chain
// Optional: provide your own clients
publicClient,
walletClient
})
// Get pair address
const pairAddress = await sdk.factory.getPair(tokenA, tokenB)
// Create new pair
const result = await sdk.factory.createPair({
tokenA: '0x...',
tokenB: '0x...'
})
const { pairAddress, token0, token1 } = await result.wait()
// Add liquidity
await sdk.router.addLiquidity({
tokenA: '0x...',
tokenB: '0x...',
amountADesired: parseEther('1'),
amountBDesired: parseEther('1'),
amountAMin: parseEther('0.95'),
amountBMin: parseEther('0.95'),
to: userAddress,
deadline: BigInt(Math.floor(Date.now() / 1000) + 1200) // 20 minutes
})
// Get swap amounts
const amountsOut = await sdk.router.getAmountsOut(
parseEther('1'),
[tokenA, tokenB]
)
// Swap tokens
await sdk.router.swapExactTokensForTokens({
amountIn: parseEther('1'),
amountOutMin: parseEther('0.95'),
path: [tokenA, tokenB],
to: userAddress,
deadline: BigInt(Math.floor(Date.now() / 1000) + 1200)
})
const pair = sdk.getPair(pairAddress)
// Get reserves
const { reserve0, reserve1, blockTimestampLast } = await pair.getReserves()
// Add liquidity
await pair.mint(userAddress)
// Remove liquidity
await pair.burn(userAddress)
// Get pool info
const poolInfo = await sdk.masterChef.poolInfo(0n)
const userInfo = await sdk.masterChef.userInfo(0n, userAddress)
// Get pending rewards
const pending = await sdk.masterChef.pendingPonder(0n, userAddress)
// Stake LP tokens
await sdk.masterChef.deposit(0n, parseEther('1'))
// Unstake LP tokens
await sdk.masterChef.withdraw(0n, parseEther('1'))
// Boost rewards with PONDER tokens
await sdk.masterChef.boostStake(0n, parseEther('100'))
import { usePublicClient, useWalletClient } from 'wagmi'
import { PonderSDK } from '@ponderfinance/sdk'
import { useMemo } from 'react'
function usePonderSDK() {
const publicClient = usePublicClient()
const { data: walletClient } = useWalletClient()
const sdk = useMemo(() => {
if (!publicClient) return null
return new PonderSDK({
chainId: 96,
publicClient,
walletClient: walletClient ?? undefined
})
}, [publicClient, walletClient])
return sdk
}
// Usage in component
function SwapComponent() {
const sdk = usePonderSDK()
const handleSwap = async () => {
if (!sdk) return
const amountsOut = await sdk.router.getAmountsOut(
parseEther('1'),
[tokenA, tokenB]
)
// Execute swap...
}
return <button onClick={handleSwap}>Swap</button>
}
try {
await sdk.router.swapExactTokensForTokens({
// ... params
})
} catch (error) {
if (error.message.includes('Wallet client required')) {
console.error('Please connect your wallet')
} else if (error.message.includes('INSUFFICIENT_OUTPUT_AMOUNT')) {
console.error('Slippage too high')
} else {
console.error('Swap failed:', error)
}
}
- Bitkub Chain (ChainID: 96)
- Bitkub Testnet (ChainID: 25925)
See API Documentation for detailed information about all available methods and types.
The SDK is written in TypeScript and provides full type definitions for all exports.
Contributions are welcome! Please read our Contributing Guide for details on our code of conduct and the process for submitting pull requests.
MIT Licensed. See LICENSE for more details.