Documentation Index Fetch the complete documentation index at: https://docs.ponzu.app/llms.txt
Use this file to discover all available pages before exploring further.
PonzuRecipe is the factory contract. One craftPonzu call deploys eight contracts.
Path Best For ponzu.app Founders who want a web UI MCP Server AI agents (Claude, Cursor, etc.) SDK Developers building integrations Raw viem Protocol engineers who want full control
Deploy via ponzu.app
No code required.
Prepare your assets
Token image (PNG or SVG) and a short description. The app handles IPFS upload.
Connect your wallet
MetaMask, WalletConnect, or any EVM wallet. Sepolia for dry runs (min 0.1 sETH).
Configure your token
Name, symbol, vesting duration (10 days or 10 weeks), target raise (min 3 ETH mainnet). Add socials.
Deploy
One transaction. 0.005 ETH creation fee + optional dev buy. Eight contracts deploy atomically. Presale is live.
MCP Server (AI Agent Integration)
Add to your MCP config (Claude Desktop: claude_desktop_config.json, Cursor: .cursor/mcp.json):
{
"mcpServers" : {
"ponzu" : {
"command" : "npx" ,
"args" : [ "-y" , "@ponzu_app/mcp" ],
"env" : {
"PONZU_PRIVATE_KEY" : "0x..." ,
"PONZU_NETWORK" : "mainnet"
}
}
}
}
17 tools available. Deploy tokens, buy presales, swap, farm, claim rewards from conversation.
PONZU_NETWORK: sepolia for testnet
Omit PONZU_PRIVATE_KEY for read-only access
NPM: @ponzu_app/mcp
Using the SDK
npm install @ponzu_app/sdk viem
import { deploy } from '@ponzu_app/sdk'
import { parseEther , createWalletClient , createPublicClient , http } from 'viem'
import { mainnet } from 'viem/chains'
import { privateKeyToAccount } from 'viem/accounts'
const account = privateKeyToAccount ( '0xYOUR_PRIVATE_KEY' )
const wallet = createWalletClient ({ account , chain: mainnet , transport: http () })
const client = createPublicClient ({ chain: mainnet , transport: http () })
const result = await deploy (
{
owner: account . address ,
tokenName: 'My Token' ,
tokenSymbol: 'MYTKN' ,
metadata: 'ipfs://Qm...' , // JSON: { image, description, socials }
imageURI: 'ipfs://Qm...' , // token logo
targetEthRaise: parseEther ( '5' ), // min 3 ETH mainnet, 0.1 ETH Sepolia
},
wallet ,
client ,
'mainnet' ,
)
// All eight deployed contract addresses:
const tokenAddress = result . addresses . token
const presaleAddress = result . addresses . presale
const farmAddress = result . addresses . farm
// + project, operator, launcher, distributor, ponzuBottle, liquidityCard
Using Raw viem (No SDK)
import { parseEther , parseAbi , keccak256 , toBytes , encodeAbiParameters } from 'viem'
const PONZU_RECIPE = '0x1155484c5fE614538d83c444f9a6dB662E6a7153'
const RECIPE_ABI = parseAbi ([
'function craftPonzu((address owner, address keyContract, uint256 initialBuyAmount, uint256 vestingDuration, bytes32 pricingStrategyTemplate, bytes pricingStrategyData, bytes feeStrategyData, string tokenName, string tokenSymbol, string metadata, string imageURI) params) payable' ,
])
Pricing Configuration
Total supply: 1,000,000. 690,000 (69%) sold in presale via linear pricing. 310,000 (31%) seeded into DEX liquidity at launch.
Price increases linearly from startPrice to endPrice as the presale fills.
Formula (LinearPricingStrategy):
totalCost = (startPrice + endPrice) x 690,000 / 2
Default: startPrice = endPrice / 10
So: totalCost = endPrice x 11 x 690,000 / 20
Solving for target raise:
endPrice = targetRaise x 20 / (11 x 690,000)
// Example: raise ~3 ETH on mainnet
const targetRaise = parseEther ( '3' )
const endPriceWei = ( targetRaise * 20 n ) / ( 11 n * 690_000 n )
const startPriceWei = endPriceWei / 10 n
const pricingStrategyTemplate = keccak256 ( toBytes ( 'LinearPricingStrategy' ))
const pricingStrategyData = encodeAbiParameters (
[{ type: 'uint256' }, { type: 'uint256' }],
[ startPriceWei , endPriceWei ],
)
Deploy Transaction
const devBuyEth = parseEther ( '0.1' ) // optional first purchase (0n to skip)
const params = {
owner: account . address ,
keyContract: '0x0000000000000000000000000000000000000000' ,
initialBuyAmount: devBuyEth ,
vestingDuration: 864000 n , // 10 days in seconds
pricingStrategyTemplate ,
pricingStrategyData ,
feeStrategyData: '0x' ,
tokenName: 'My Token' ,
tokenSymbol: 'MYTKN' ,
metadata: 'ipfs://Qm...' ,
imageURI: 'ipfs://Qm...' ,
}
// 0.005 ETH creation fee + your dev buy amount
const value = parseEther ( '0.005' ) + devBuyEth
const hash = await wallet . writeContract ({
address: PONZU_RECIPE ,
abi: RECIPE_ABI ,
functionName: 'craftPonzu' ,
args: [ params ],
value ,
})
Parse Deployed Addresses
const ponzuCraftedTopic = keccak256 ( toBytes (
'PonzuCrafted(address,string,(address,address,address,address,address,address,address,address,address))'
))
const receipt = await publicClient . waitForTransactionReceipt ({ hash })
const log = receipt . logs . find ( l => l . topics [ 0 ] === ponzuCraftedTopic ) !
const [, , addresses ] = decodeAbiParameters (
[
{ type: 'string' },
{
type: 'tuple' ,
components: [
{ name: 'project' , type: 'address' },
{ name: 'operator' , type: 'address' },
{ name: 'token' , type: 'address' },
{ name: 'presale' , type: 'address' },
{ name: 'launcher' , type: 'address' },
{ name: 'distributor' , type: 'address' },
{ name: 'farm' , type: 'address' },
{ name: 'ponzuBottle' , type: 'address' },
{ name: 'liquidityCard' , type: 'address' },
],
},
],
log . data ,
)
The contract accepts any URI string for metadata and imageURI. ponzu.app handles uploads automatically. For SDK or raw deploys, host these yourself.
IPFS via Pinata (recommended):
const imageURI = 'ipfs://Qm...' // uploaded via pinFileToIPFS
const metadata = 'ipfs://Qm...' // uploaded via pinJSONToIPFS
// Metadata JSON schema:
{
"image" : "ipfs://Qm..." ,
"description" : "A short description of your project" ,
"socials" : {
"twitter" : "https://x.com/yourproject" ,
"discord" : "https://discord.gg/yourserver" ,
"website" : "https://yourproject.com"
}
}
Arweave or HTTPS also work:
const imageURI = 'https://arweave.net/YOUR_TX_ID'
const metadata = 'https://your-server.com/token-metadata.json'
ABI Reference Contract ABIs for presale, swap, farming, and factory deployment.