Reference
Integrate Load on Robinhood Chain — network, contracts, create/buy/sell, fees, and graduation.
At a glance
Fair-launch factory on Robinhood Chain: create via LoadRouter (~$2.50), trade the bonding curve, graduate into locked Uniswap V3 LP at ~$35k FDV.
Quick tip
Build against Robinhood Chain Testnet (46630). Confirm contract addresses on the explorer before sending funds.
Load is a fair-launch token platform on Robinhood Chain. Launch an ERC-20 onto a Load bonding curve (~$2.50 creation fee), trade with live charts on load.fun, earn creator fees, and graduate into a locked Uniswap V3 LP at ~$35k FDV. Advanced launches can graduate into Uniswap V4 with a tax hook.
| Field | Value |
|---|---|
| Chain | Robinhood Chain Testnet |
| Chain ID | 46630 |
| RPC | https://rpc.testnet.chain.robinhood.com |
| Explorer | https://explorer.testnet.chain.robinhood.com |
| Gas token | ETH |
| Contract | Address | Role |
|---|---|---|
| LoadCurveFactory | 0x96855Ca3a0Ca29797FeD8BfE0c5a343Fa60510AD | Deploys token + curve; creation fee |
| LoadRouter | 0x983f7c6a14042456aF526Af25397238738F010AD | Create / buy / sell entrypoint |
| LoadV3Migrator | 0x39a72Bcdd0D59e67c1B563c3424E5c39f4a310AD | Graduation → Uniswap V3 LP |
| LoadLPFeeVault | 0x606942073e361f09b01f3c3f039fdcB9840410AD | Locks LP NFTs; splits fees |
| LoadV3SwapRouter | 0xf8d0df095155B4989Aa34c6C151FDe3Eef3410AD | Post-grad UI swaps (+ platform fee) |
| Contract | Address | Role |
|---|---|---|
| LoadV4Migrator | 0xc1854B23F88dba919e1C94e7b967b2eB571d10AD | Graduation → Uniswap V4 + tax |
| LoadV4TaxHook | 0x9A58999d32d670239E52DB2D31ff080dd66B88c8 | Buy/sell tax hook |
| LoadV4SwapRouter | 0xE157C40db77abBbE7705fc17743A4D9d7DfA10AD | Post-grad V4 swaps |
| LoadV4LPFeeVault | 0xDB79F039D7B46e9710A152F488864F8B431210AD | V4 LP + tax-liquidity |
| LoadV4DividendDistributor | 0xe03aaE9aeB49eCbE493d3F5fba582FBfb78210AD | Dividend claims |
| Contract | Address | Role |
|---|---|---|
| WETH | 0x7943e237c7F95DA44E0301572D358911207852Fa | Quote asset |
| Uniswap V3 Factory | 0xdf9e3D6ffaC4513dD7b053212bbECcbCD15ec932 | V3 pools |
| PositionManager | 0xFFe6CFc4f759b65f9B62c9D05A9E21a78cE93e12 | V3 LP NFTs |
| SwapRouter02 | 0xb79cB26e90EBBD9bC02c75267c9a86dBa1AFedB7 | External Uniswap router |
| Quoter V2 | 0xDDcBe4989C8171F721c5e683C9C6339B59718213 | Quotes |
| V4 PoolManager | 0x552815eF68E6eb418A3d65D0AA1043d93204F612 | V4 singleton |
| V4 PositionManager | 0x00EB6902D1e3be1A8C667041f9E75b77B7Ad3ba6 | V4 LP mint |
Each launch gets its own token and bonding curve. Look them up from TokenCreated events or factory.curveOf(token).
Examples use ethers v6 on Robinhood Chain Testnet (46630).
import { ethers } from "ethers";
const RPC = "https://rpc.testnet.chain.robinhood.com";
const CHAIN_ID = 46630;
const provider = new ethers.JsonRpcProvider(RPC, CHAIN_ID);
const wallet = new ethers.Wallet(process.env.PRIVATE_KEY!, provider);
const A = {
factory: "0x96855Ca3a0Ca29797FeD8BfE0c5a343Fa60510AD",
vault: "0x606942073e361f09b01f3c3f039fdcB9840410AD",
router: "0x983f7c6a14042456aF526Af25397238738F010AD",
weth: "0x7943e237c7F95DA44E0301572D358911207852Fa",
};Use LoadRouter.createToken (handles the creation fee and an optional initial buy). Load launches use the ~$35k graduation cap. Post-grad creator LP share is factory-locked — read it on-chain; a mismatched value reverts with InvalidLaunchConfig.
const ROUTER_ABI = [
"function createToken(string name,string symbol,bytes32 metadataHash,string metadataUri,(uint8 graduationCap,uint16 postGradCreatorShareBps,bool antiSnipe) launch,uint256 minTokensOut,uint256 deadline) payable returns (address token,address curve,uint256 tokensOut)",
];
const FACTORY_ABI = [
"function creationFee() view returns (uint256)",
"function POST_GRAD_CREATOR_SHARE_BPS() view returns (uint16)",
"event TokenCreated(address indexed token,address indexed curve,address indexed creator,string name,string symbol,bytes32 metadataHash,string metadataUri,address pool,uint8 graduationCap,uint16 postGradCreatorShareBps)",
];
const router = new ethers.Contract(A.router, ROUTER_ABI, wallet);
const factory = new ethers.Contract(A.factory, FACTORY_ABI, provider);
const fee = await factory.creationFee(); // ~$2.50 in ETH at spot
const postGradCreatorShareBps = await factory.POST_GRAD_CREATOR_SHARE_BPS();
const launch = {
graduationCap: 2, // ~$35k FDV design
postGradCreatorShareBps,
antiSnipe: true,
};
const metadataHash = ethers.id("ipfs://your-meta");
const deadline = Math.floor(Date.now() / 1000) + 600;
const tx = await router.createToken(
"My Token",
"MTK",
metadataHash,
"ipfs://your-meta",
launch,
0n, // minTokensOut for optional initial buy
deadline,
{ value: fee } // add ETH above fee for an initial buy
);
const rc = await tx.wait();
const ev = rc.logs
.map((l) => { try { return factory.interface.parseLog(l); } catch { return null; } })
.find((e) => e && e.name === "TokenCreated");
console.log("token:", ev.args.token, "curve:", ev.args.curve);Native ETH → tokens via the router while the token is still on the curve.
const ROUTER_ABI = [
"function buy(address token,address recipient,uint256 minTokensOut,uint256 deadline) payable returns (uint256)",
];
const router = new ethers.Contract(A.router, ROUTER_ABI, wallet);
const ethIn = ethers.parseEther("0.05");
const deadline = Math.floor(Date.now() / 1000) + 600;
const tx = await router.buy(token, wallet.address, 0n, deadline, { value: ethIn });
await tx.wait();Approve the router (or use sellWithPermit), then sell tokens back to the curve for ETH.
const ERC20_ABI = [
"function approve(address,uint256) returns (bool)",
"function allowance(address,address) view returns (uint256)",
];
const ROUTER_ABI = [
"function sell(address token,uint256 tokenAmount,address recipient,uint256 minEthOut,uint256 deadline) returns (uint256)",
];
const tokenC = new ethers.Contract(token, ERC20_ABI, wallet);
const router = new ethers.Contract(A.router, ROUTER_ABI, wallet);
const amountIn = ethers.parseEther("1000000");
if ((await tokenC.allowance(wallet.address, A.router)) < amountIn) {
await (await tokenC.approve(A.router, ethers.MaxUint256)).wait();
}
const deadline = Math.floor(Date.now() / 1000) + 600;
await (await router.sell(token, amountIn, wallet.address, 0n, deadline)).wait();After graduation, trade on Uniswap V3 (LoadV3SwapRouter or SwapRouter02) — the curve no longer accepts swaps.
// Creator curve fees
const CURVE_ABI = ["function claimCreatorFees() returns (uint256)"];
const curve = new ethers.Contract(curveAddress, CURVE_ABI, wallet);
await (await curve.claimCreatorFees()).wait();
// Collect V3 LP fees into the vault, then claim creator share
const VAULT_ABI = [
"function collectForToken(address launchToken) returns (uint256,uint256)",
"function claimCreatorLpFees(address launchToken) returns (uint256,uint256)",
];
const vault = new ethers.Contract(A.vault, VAULT_ABI, wallet);
await (await vault.collectForToken(token)).wait(); // permissionless
await (await vault.claimCreatorLpFees(token)).wait(); // creator onlyWhen reserves hit the design cap, anyone can call graduate() on the curve (router buys may also auto-trigger). Migrator seeds the V3 pool and locks the LP NFT in the vault.
const CURVE_ABI = ["function graduate()"];
const curve = new ethers.Contract(curveAddress, CURVE_ABI, wallet);
await (await curve.graduate()).wait();
// Listen for Graduated(token, pool, tokenId, ...) from the migrator / curve flowconst FACTORY_ABI = [
"function curveOf(address token) view returns (address)",
"function tokenOf(address curve) view returns (address)",
"function isCurve(address) view returns (bool)",
"function creationFee() view returns (uint256)",
];
const CURVE_ABI = [
"function token() view returns (address)",
"function creator() view returns (address)",
"function phase() view returns (uint8)", // 0 trading, 1 ready, 2 graduated
"function GRADUATION_ETH() view returns (uint256)",
];
const factory = new ethers.Contract(A.factory, FACTORY_ABI, provider);
const curveAddr = await factory.curveOf(token);
const curve = new ethers.Contract(curveAddr, CURVE_ABI, provider);
console.log("phase:", await curve.phase());
// Stream new launches
const TOPIC = ethers.id(
"TokenCreated(address,address,address,string,string,bytes32,string,address,uint8,uint16)"
);
// wsProvider.on({ address: A.factory, topics: [TOPIC] }, log => { ... })