builders

deploying a pool

the deployment flow is six on-chain transactions and one whitelist application. expected end-to-end time once whitelisted: under an hour.

prerequisites

  • 100,000 lode in the deployer eoa.
  • governance whitelist (apply via the marketing site form). skip during permissionless mode.
  • the asset pair must already exist as a uniswap v4 pool (or be initializable).
  • builder fee bps decided (0–3000) and beneficiary address chosen.

step-by-step

  1. approve and stake. approve lodeStaking for 100k lode, then call stake(poolId). emits Staked(poolId, builder, 100000e18).
  2. compute pool parameters. decide premiumBps (≤ 30 in current tier), builderFeeBps (≤ 3000), and minAuctionInputSize (defaults to the chain-and-pair recommended value).
  3. compute the splitter address (create2). the factory uses deterministic deployment — the splitter address is derivable from (factory, poolId, salt).
  4. call factory.deployPool(...). emits PoolDeployed with the splitter address and all configured parameters.
  5. verify on etherscan. the splitter and any helper contracts are auto-verified by the factory deploy script.
  6. register with the keeper. file a pull request to the public keeper config to add your poolId to the periodic distribute schedule. self-distribute is also possible.
typescript// pseudocode using viem
  import { writeContract } from 'viem/actions';

  await writeContract(client, {
    address: LODE_TOKEN,
    functionName: 'approve',
    args: [LODE_STAKING, parseEther('100000')],
  });

  await writeContract(client, {
    address: LODE_STAKING,
    functionName: 'stake',
    args: [poolId],
  });

  await writeContract(client, {
    address: LODE_FACTORY,
    functionName: 'deployPool',
    args: [{
      poolId,
      premiumBps:           30n,
      builderFeeBps:        2000n,
      minAuctionInputSize:  parseEther('0.01'),
      beneficiary:          LP_DISTRIBUTOR,
      builder:              account.address,
    }],
  });

post-deploy monitoring

  • watch AuctionFilled events on the hook for your poolId.
  • watch AuctionSkipped events — frequent skipping suggests minAuctionInputSize is mistuned for the pair.
  • monitor the splitter balance; trigger distribute() if the keeper falls behind.
  • track your effective apr on the dashboard at /app.