Skip to main content
PonzuRecipe is the factory contract. One craftPonzu call deploys eight contracts.
PathBest For
ponzu.appFounders who want a web UI
MCP ServerAI agents (Claude, Cursor, etc.)
SDKDevelopers building integrations
Raw viemProtocol engineers who want full control

Deploy via ponzu.app

No code required.
1

Prepare your assets

Token image (PNG or SVG) and a short description. The app handles IPFS upload.
2

Connect your wallet

MetaMask, WalletConnect, or any EVM wallet. Sepolia for dry runs (min 0.1 sETH).
3

Configure your token

Name, symbol, vesting duration (10 days or 10 weeks), target raise (min 3 ETH mainnet). Add socials.
4

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 * 20n) / (11n * 690_000n)
const startPriceWei = endPriceWei / 10n

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:         864000n,               // 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,
)

Metadata

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.