Multicurve

Create coins with Doppler Multicurve that migrate liquidity proceeds to Uniswap v2

/**
 * Example: Create a Multicurve Auction using the V4 Multicurve Initializer
 *
 * This example demonstrates:
 * - Seeding a Uniswap V4 pool with multiple curves in a single initializer
 * - Using WAD-based shares to weight curve distributions
 * - Choosing a standard migration path (V2 in this example)
 */

import { DopplerSDK, WAD } from '../src'
import { createPublicClient, createWalletClient, http, parseEther } from 'viem'
import { privateKeyToAccount } from 'viem/accounts'
import { base } from 'viem/chains'

const privateKey = process.env.PRIVATE_KEY as `0x${string}`
const rpcUrl = (process.env.RPC_URL || 'https://mainnet.base.org') as string

if (!privateKey) throw new Error('PRIVATE_KEY is not set')

async function main() {
  const account = privateKeyToAccount(privateKey)

  const publicClient = createPublicClient({ chain: base, transport: http(rpcUrl) })
  const walletClient = createWalletClient({ chain: base, transport: http(rpcUrl), account })

  const sdk = new DopplerSDK({ publicClient, walletClient, chainId: base.id })

  // Build multicurve initializer parameters
  const params = sdk
    .buildMulticurveAuction()
    .tokenConfig({ name: 'TEST MULTICURVE', symbol: 'TMC', tokenURI: 'ipfs://token.json' })
    .saleConfig({ initialSupply: 1_000_000n * WAD, numTokensToSell: 900_000n * WAD, numeraire: '0x4200000000000000000000000000000000000006' }) // WETH on Base
    .withMulticurveAuction({
      fee: 3000,
      tickSpacing: 60,
      curves: [
        { tickLower: -120000, tickUpper: -90000, numPositions: 8, shares: parseEther('0.4') },
        { tickLower: -90000, tickUpper: -70000, numPositions: 8, shares: parseEther('0.6') },
      ],
      // Optional: lock fee revenue to beneficiaries at init (shares in WAD)
      // lockableBeneficiaries: [ { beneficiary: account.address, shares: parseEther('0.05') } ],
    })
    .withGovernance({ type: 'default' })
    // Choose any supported migration (V2, V3, or V4). Using V2 for simplicity.
    .withMigration({ type: 'uniswapV2' })
    .withUserAddress(account.address)
    .build()

  // Simulate to preview addresses
  const { asset, pool } = await sdk.factory.simulateCreateMulticurve(params)
  console.log('Predicted token address:', asset)
  console.log('Predicted pool address:', pool)

  // Create the multicurve pool + token
  const result = await sdk.factory.createMulticurve(params)
  console.log('✅ Multicurve created')
  console.log('Token address:', result.tokenAddress)
  console.log('Pool address:', result.poolAddress)
  console.log('Transaction:', result.transactionHash)
}

main().catch((err) => {
  console.error('Error:', err)
  process.exit(1)
})

Last updated