Portal 8 contracts
Addresses, parameters as read on chain, and what changed for integrators.
On this page
Addresses
Arc mainnet, chain ID 5042. Deployed 2026-09-22 in blocks 22,251,758 to 22,251,798. All 12 contracts are verified; ABIs are on each contract page.
Portal
Creates launches.
Quote registry
Admitted quote assets and their starting and bond values.
Creator registry
Payout address, rotation, splits and takeovers.
Identity book
Creator fees directed to a GitHub or X account.
Converter
Quote to USDC conversion. Keeper only.
Burn executor
Buyback and burn lane.
Liquidity executor
Liquidity lane.
Lock executor
Buy-and-lock lane. Not used by this site.
Lock vault
Permanent locks. What arrives through lock() can never leave.
Time lock
Locks until a date, then withdrawable by the lock’s owner. The admin Safe can sweep what is sent to it without locking, never a lock.
Time lock (first)
Holds locks made before the current time lock. Still withdrawable by their owners. No sweep: dividends sent to it stay there.
Parts factory
Deploys each launch’s token, escrow and locker.
Hook factory
Deploys each launch’s hook.
Keeper forwarder
Created by the quote registry. Not used by Portal 8.
Roles
Admin Safe
Admits quote assets, starts takeovers, signs identity attestations, sets conversion routes.
Treasury Safe
Receives 30% of every fee and the whole opening surcharge.
Converter keeper
The only address that can run a conversion. The Argus keeper also runs the lanes and dividend pushes from it.
Parameters
| Parameter | Value on chain |
|---|---|
| treasuryBps | 3000 (30%) |
| MIN_TAX_BPS / MAX_TAX_BPS | 100 / 1000 per side, on each hook |
| BASE_FEE_BPS | 100, on each hook |
| minSeedPpm | 100 (0.01% of the bond) |
| MAX_BUNDLE | 1 |
| MAX_SNIPE_EXEMPT | 25 |
| MIN_TOTAL_SUPPLY | 1e18 (one token) |
| MAX_IMAGE_URI_BYTES | 512 |
| takeoverDelay | 604,800 seconds (7 days) |
| USDC starting / bond value | 2,500 / 45,000 USDC |
Launch on Portal 8
Every new launch goes to Portal 8 at 0xeed7559B8A6ABf64427dc41Cb5cc6400109C5D93. Portals 1 to 7 are legacy: do not launch on them. The published bundle carries everything below under portal8, and its launchPortal field names this Portal.
| Rule | Portal 8 |
|---|---|
| Call | launch(V5LaunchParams p, bytes32 hookSalt), selector 0x206641c0. Not payable. Returns the token. |
| Hook salt | Required. Mine it so the low 14 bits of the hook’s address equal 0x20CC, for the wallet that sends the launch. The steps are in the bundle’s portal8.hookSalt. |
| Opening buy | Required. At least 0.01% of the bond (minSeedPpm 100): 4.50 USDC on a USDC pair. One recipient. Approve the Portal for it first. |
| Buy and sell tax | Each side 100 to 1000 bps, checked separately (MIN_TAX_BPS 100, MAX_TAX_BPS 1000). A side outside that range reverts HookMismatch. |
| Starting and bond value | $2,500 and $45,000 fully diluted on a USDC pair, fixed per asset by the quote registry. The call names no FDV. |
| Allocation | Five lanes totaling 10,000 bps, in order: creator, burn, dividends, liquidity, lock. |
| Payout asset | The pair’s own asset, or USDC. |
| Gas | About 8,000,000. Set the limit yourself: a wallet’s fallback limit is too small. |
Pick an asset
The quote registry’s admissionFor(asset) must answer admissible and not revoked.
Mine the salt
For the wallet that will send the launch. Check it with predictEscrow and hookInitCodeHash on the Portal before spending gas.
Approve
The Portal, on the paired asset, for the opening buy.
Simulate, then send
eth_call launch from the sending wallet first. A launch that reverts there would revert on chain.
https://argus.world/argus-v4.json launchPortal and portal8
https://argus.world/argus-v5-launch-example.mjs mines the salt and simulates a launch, never sendsFor integrators
Portal 8 is in the published argus-v4.json bundle under portal8, with every ABI an integrator needs, and launchPortal names it. Scan from block 22,251,758.
event Launched(address indexed token, address indexed creator, address hook,
address escrow, address locker, uint256 positionId, int24 tickStart, int24 tickBond);
topic0 0xc32e25061af0b7f7d77b7fb015333ecb0004127b71abbda4d7ba4c18bcd497f3
event LaunchMetadata(address indexed token, string imageURI, string website,
string twitter, string telegram, string description);
topic0 0x81757bd4a3f7375c9021d3bd561d1a8075d765544734931f26896acacda7ccdc| What changed from Portal 7 | Portal 8 |
|---|---|
| Telling Portals apart | Select Portal 8 by address. It answers registry() as Portal 7 does, and LAUNCH_STRUCT_WORDS() reverts. |
| Launch record | launches(token) returns 7 fields: hook, escrow, locker, positionId, tickStart, tickBond, tokenIsToken0. No creator and no quote asset: read the quote from hook.quoteAsset(). |
| Enumeration | launchCount() only. No tokenCount() or getTokens(). |
| Pool key | fee 0x800000 (dynamic), overridden to zero on every swap; tickSpacing 200. |
| Fees | Always in the quote asset. hook.totalFeeBps() returns tax plus the 1% base per side. QuoteFeeTaken logs each fee. |
| Opening window | No currentSnipeTaxBps(). Read launchedAt(), launchBlock() and snipeExemptOf(address) on the hook. |
| Creator payout | creatorRegistry.payoutOf(token) and payoutSplit(token). |
| Claims | escrow.claimCreator(), claimDividends(), claimDividendsFor(holder). |
| Quote assets | registry.admissions(offset, limit), sizedQuoteCount(), sizedQuoteAt(i), economicsFor(quote). |