Protocol
Documentation
Connect to Robinhood Chain, find the deployed contracts, and start calling them. For the thesis and economics, see the whitepaper.
Network
ArchLiquid runs on Robinhood Chain, an Arbitrum Orbit L2 with ETH as native gas. Add either network to any EVM wallet with the parameters below, or connect in-app to add it automatically.
Need test ETH to try the contracts? Request it from the Robinhood Chain testnet faucet, then use it to deploy or call anything below.
faucet.testnet.chain.robinhood.comArchitecture
The system is a set of small, single-purpose contracts. Factories deploy tokens and launches; the token distributes; lockers and vesting hold time-locked positions; the lending market runs independently; and a single treasury sinks every fee. No contract can move user funds outside the refunds, claims and documented flows.
- ·Fixed supply, no owner, immutable tax bounded 1-5%.
- ·Magnified-dividend accounting with SafeCast; pull claims plus claimFor.
- ·Keeper-only distribution; 90 / 10 split immutable; wiring frozen at deploy.
# immutable tax (bps) + claim your stock dividend
cast call $TOKEN "TAX_BPS()(uint16)" --rpc-url $RPC
cast send $TOKEN "claim()" --rpc-url $RPC --private-key $PK- ·One transaction: deploy the token, seed its Uniswap V3 pool, lock or burn the LP.
- ·CREATE2 deploy so a launch pool cannot be pre-computed and griefed.
- ·Every deploy is an RWA distributor; stock gated by the stock registry.
# createToken(TokenParams, LiquidityParams) is payable, msg.value >= FEE
cast call $FACTORY "FEE()(uint256)" --rpc-url $RPC- ·Creates fixed-price presales and pump-style bonding curves.
- ·Presale: every wei minus the fee becomes locked V3 liquidity at finalize.
- ·Curve: LP is burned permanently at graduation; no team allocation.
# createPresale(...) / createCurve(...) each charge FEE() as msg.value
cast call $LAUNCHPAD "FEE()(uint256)" --rpc-url $RPC- ·Locks Uniswap V3 position NFTs with an extend-only relock.
- ·Owner can collect trading fees while the position stays locked.
- ·No admin path to locked positions; no early exit.
# lock(manager, tokenId, unlockTime, lockOwner); relock extends only
cast send $LOCKER "collectFees(uint256,address)" $ID $YOU --private-key $PK- ·Ownerless cliff-plus-linear schedules with exact funding.
- ·Batch creation pays a single fee; claims follow checks-effects-interactions.
- ·No admin path to withdraw a beneficiary's tokens.
# releasable(id) is vested-but-unclaimed; claim(id) pulls it
cast call $VESTING "releasable(uint256)(uint256)" $ID --rpc-url $RPC
cast send $VESTING "claim(uint256)" $ID --private-key $PK- ·Deploys reward-per-token accumulator pools (Synthetix-style math).
- ·Protocol skims 5% of each funded reward to the treasury.
- ·Funded rewards are committed to stakers and cannot be pulled back.
# on a deployed pool: stake, then pull rewards
cast send $POOL "stake(uint256)" $AMOUNT --private-key $PK
cast send $POOL "getReward()" --private-key $PK- ·Multisig-governed allowlist of eligible Robinhood stock tokens.
- ·Gates which stock a distributor token can buy for holders.
- ·Each entry pairs a stock token with its Chainlink price feed.
# is a stock token approved as a distribution target?
cast call $REGISTRY "isApproved(address)(bool)" $STOCK --rpc-url $RPC- ·Terminal sink for every flat, percentage and reserve fee.
- ·Holds ETH and any ERC-20, including the stock tokens.
- ·Withdrawals are owner-only; ownership is intended for a multisig.
# withdrawals are owner-only; the ETH balance is public
cast balance $TREASURY --rpc-url $RPCContracts
Reference deployment on the Robinhood testnet (chain 46630). Every address links to the explorer; check the address page for its current source-publication status. An explorer link alone is not proof that source has been published.
Testnet has no native Uniswap V3, USDG or stock tokens, so the testnet deployment stands up its own mock DEX, wrapped ETH and stock infrastructure; those helper contracts are not listed here.
Quick start
Every service is a plain contract call. Read a fee, inspect a token, or send a transaction with cast (Foundry) or viem. All addresses are the testnet deployment above.
Read a protocol fee. Each factory exposes FEE(), the flat fee it charges.
# Robinhood testnet RPC + a deployed contract
export RPC=https://rpc.testnet.chain.robinhood.com
export LAUNCHPAD=0xcBdCec3A40BE75FFBefAf5A4926F34730C21B82B
# FEE() is the flat listing fee (wei) to create a presale or a curve
cast call $LAUNCHPAD "FEE()(uint256)" --rpc-url $RPCInspect a distributor token. Every launched token carries an immutable tax and accrues a tokenized-stock dividend you can read and claim.
# any token minted or launched through ArchLiquid is an RWA distributor
export TOKEN=0xYourArchToken
export YOU=0xYourWallet
# immutable trade tax, basis points (300 = 3%)
cast call $TOKEN "TAX_BPS()(uint16)" --rpc-url $RPC
# tokenized-stock dividend you can claim right now (raw units)
cast call $TOKEN "withdrawableDividendOf(address)(uint256)" $YOU --rpc-url $RPC
# pull your stock dividend
cast send $TOKEN "claim()" --rpc-url $RPC --private-key $PKRead from an app. The same view calls from TypeScript with viem or wagmi.
import { createPublicClient, http } from "viem";
const client = createPublicClient({
transport: http("https://rpc.testnet.chain.robinhood.com"),
});
// read the launchpad listing fee straight off the contract
const fee = await client.readContract({
address: "0xcBdCec3A40BE75FFBefAf5A4926F34730C21B82B", // ArchLaunchpad
abi: [{
type: "function", name: "FEE", stateMutability: "view",
inputs: [], outputs: [{ type: "uint256" }],
}],
functionName: "FEE",
});Send a transaction. Create calls charge FEE() as msg.value; read it, then deploy. Here, a staking pool:
export STAKING=0xE0A09184D0385A69c5F1E4a1ad841F5ee532E17C
# every create call charges FEE() as msg.value; read it, then send it
FEE=$(cast call $STAKING "FEE()(uint256)" --rpc-url $RPC)
# createPool(stakingToken, rewardsToken, rewardsDuration, lockDuration)
# 604800 = 7-day reward stream, 0 = no lock
cast send $STAKING \
"createPool(address,address,uint256,uint256)" \
$STAKE_TOKEN $REWARD_TOKEN 604800 0 \
--value $FEE --rpc-url $RPC --private-key $PKServices
Six services, one deploy, one fee treasury:
- Liquidity lockers · Time-lock V3 positions or ERC-20 LP with a flat fee; extend-only, no early exit.
- Token vesting · Cliff-plus-linear schedules enforced by contract; a batch pays one fee.
- Staking-as-a-service · Deploy a rewards pool; the protocol skims 5% of each funded reward.
- Token minter · Mint a fixed-supply RWA distributor, seed its pool, and lock or burn the LP in one call.
- Launchpad · Fixed-price presales and bonding-curve fair launches with enforced liquidity.
- Lending markets · Supply, borrow against tokenized-stock collateral, and flash-loan idle cash.
Distribution mechanics
Dividends use the magnified-dividend pattern. A per-share accumulator tracks stock owed per participating token; a holder’s claim is their balance times the accumulator, corrected on every transfer so past dividends stay with the seller and future ones accrue to the buyer.
Distribution is keeper-run but trust-minimized: the keeper only chooses timing and slippage bounds (minEthOut, minStockOut). It cannot change the split, the recipients, or divert funds. Rounding always favors the pool: payouts never exceed the stock actually acquired. The stock leg targets Uniswap V3; the sold tax is paid directly to the pool, so it is never re-taxed and never inflates the dividend base.
Lending
The lending market is an over-collateralized money market: suppliers earn interest, borrowers post tokenized-stock collateral, and a fixed share of interest accrues to protocol reserves. It is driven by a Chainlink-backed oracle that returns a zero “unavailable” price when a feed is missing or stale, so an off-hours or broken stock feed freezes that asset rather than mispricing it.
Markets add ERC-3156 flash loans over idle cash (a small fee to reserves), per-asset supply and borrow caps, and a 20% reserve factor as the protocol’s cut of interest. The full loan lifecycle (supply, collateralize, borrow, repay, redeem) plus the oracle freeze and the reserve accrual are all verified live on testnet.
Fee schedule
Every service charges a fee, and every fee ends in the treasury. The activity fees:
On top of the activity fees above, each service charges a small flat creation fee (mint, list, lock, vest, deploy-a-pool). Lending reserves and the 10% distribution share flow to the same treasury. There are no inflationary rewards funding the protocol; revenue is real, from real use.