Docs·Addresses
Addresses
ABIs and clone templates
Where each contract's ABI is served, and how to decode the per-launch and per-market contracts that have no fixed address.
Where the ABIs are#
Every contract named in the addresses file carries an abiPath, and that path is served from this origin. The ABIs are exported from the compiled contracts and copied beside the addresses file at build, so the two always describe the same generation.
# Fetch the ABI for a contract the addresses file names
curl -s <origin>/addresses/4663.json \
| jq -r '.contracts[] | select(.name == "LaunchFactory") | .abiPath'
# /abis/LaunchFactory.json
curl -s <origin>/abis/LaunchFactory.jsonDo not hardcode the ABI path from a contract name. It is a field for a reason: a contract published without an ABI carries abiPath: null and records a warning, and a consumer that constructed the path itself would fetch a 404 instead of noticing.
Contracts with no fixed address#
Several contract families exist once per launch, per market or per THD bucket. They are deployed at runtime by a factory or a deployer, so they have no fixed address and appear under cloneTemplates[] rather than contracts[] — named, with their ABI, and with deployedAtRuntime: true. An indexer decodes their logs by ABI without ever knowing an address in advance.
| Family | One per |
|---|---|
LaunchToken | Launch. The ERC-20 itself. |
BondingCurve | Launch. Holds the reserve and emits every curve trade. |
LaunchLiquidityLocker | Graduated launch. Holds the permanently locked V4 position. |
CrewSplitter | Launch that was created with a founding crew. |
THDImmediateClaim, THDVestedClaim, THDMerkleDistributor | THD bucket. Which of the three a bucket uses is chosen at deploy time; the addresses file publishes the candidate set rather than guessing. |
Finding a clone's address#
Every clone announces itself in a log at the moment it is created. These are the events to index; each is emitted once per instance.
| Instance | Event |
|---|---|
LaunchToken, BondingCurve | LaunchFactory.TokenLaunched(uint256 indexed launchId, address indexed token, address indexed curve, address creator, address creatorFeeRecipient, uint256 initialBuy, uint256 initialTokensBought, uint256 graduationTarget, Force force, bool dev, string logoURI, string bannerURI) |
LaunchLiquidityLocker | V4GraduationAdapter.GraduatedToV4(address indexed token, address indexed locker, uint256 positionId, uint256 ethAmount, uint256 tokenAmount, uint160 sqrtPriceX96) |
CrewSplitter | CrewSplitterDeployer.CrewSplitterDeployed(address indexed crewSplitter, address indexed creator, address indexed creatorRecipient, uint16 version, uint256 members) |
ParimutuelMarket | PredictionMarketFactory.MarketCreated(bytes32 indexed marketId, address indexed market, address indexed creator, address currency, CurrencyKind kind, uint64 deadline, string question) |
A market’s marketId is also its CREATE2 salt, so its address is derivable rather than only observable:
marketId = keccak256(abi.encode(block.chainid, address(factory), predicate, currency, salt))abi.encode, not abi.encodePacked. A separate MarketQuestion log carries the predicate the market settles on — family, metric, subject, comparator, threshold, deadline and settlement window. The metric, not the family, is what pins down the question, so an index that surfaces only the family cannot say what a market asked. See prediction markets.
Verification on the explorer#
Every contract this platform deploys is verified on the chain’s Blockscout instance, so its source is readable and its name and functions resolve in a wallet’s confirmation screen. Per-launch contracts are deployed at runtime and are verified individually once an instance exists.