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
- approve and stake. approve
lodeStakingfor 100k lode, then callstake(poolId). emitsStaked(poolId, builder, 100000e18). - compute pool parameters. decide
premiumBps(≤ 30 in current tier),builderFeeBps(≤ 3000), andminAuctionInputSize(defaults to the chain-and-pair recommended value). - compute the splitter address (create2). the factory uses deterministic deployment — the splitter address is derivable from
(factory, poolId, salt). - call
factory.deployPool(...). emitsPoolDeployedwith the splitter address and all configured parameters. - verify on etherscan. the splitter and any helper contracts are auto-verified by the factory deploy script.
- register with the keeper. file a pull request to the public keeper config to add your
poolIdto 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
AuctionFilledevents on the hook for yourpoolId. - watch
AuctionSkippedevents — frequent skipping suggestsminAuctionInputSizeis mistuned for the pair. - monitor the splitter balance; trigger
distribute()if the keeper falls behind. - track your effective apr on the dashboard at
/app.