Build on the same reads.
Everything the Masque terminal shows comes from public contracts on Robinhood Chain. These are the addresses, events and calls it uses, so you can check them or build your own.
Network
- Chain
- Robinhood Chain, id
4663 - RPC
https://rpc.mainnet.chain.robinhood.com- Explorer
- robinhoodchain.blockscout.com
- Native gas
- ETH
The official RPC answers log queries. Public mirrors may refuse eth_getLogs without a key, so read events from the official endpoint.
Contracts
Uniswap v3 on Robinhood Chain. Router and quoter were checked on chain: both return the same factory() and WETH9() as the live pools.
| Contract | Address | Used for |
|---|---|---|
| UniswapV3Factory | 0x1f7d7550b1b028f7571e69a784071f0205fd2efa | getPool for a pair and fee |
| SwapRouter02 | 0xcaf681a66d020601342297493863e78c959e5cb2 | exactInputSingle via multicall |
| QuoterV2 | 0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7 | quotes, called with eth_call |
| WETH | 0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73 | ETH side of pools |
| USDG | 0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168 | dollar side, 6 decimals |
| Pons factory | 0x7eD598BcEf8bd9Edd8C97A195C6d13f40801EC7e | launch and curve events |
Stock tokens
Each token pairs with a Chainlink feed for the same stock. The terminal compares the two to show the gap.
| Ticker | Token | Chainlink feed |
|---|
Read a price
Quote one share against USDG on every fee tier that has a pool, and keep the best. Run with viem in Node or the browser.
import { createPublicClient, http, parseAbi, parseUnits, formatUnits } from "viem";
const client = createPublicClient({ transport: http("https://rpc.mainnet.chain.robinhood.com") });
const FACTORY = "0x1f7d7550b1b028f7571e69a784071f0205fd2efa", QUOTER = "0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7";
const USDG = "0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168", NVDA = "0xd0601CE157Db5bdC3162BbaC2a2C8aF5320D9EEC";
const F = parseAbi(["function getPool(address,address,uint24) view returns (address)"]);
const Q = parseAbi(["function quoteExactInputSingle((address tokenIn,address tokenOut,uint256 amountIn,uint24 fee,uint160 sqrtPriceLimitX96)) returns (uint256,uint160,uint32,uint256)"]);
let best = 0n;
for (const fee of [100, 500, 3000, 10000]) {
const pool = await client.readContract({ address: FACTORY, abi: F, functionName: "getPool", args: [NVDA, USDG, fee] });
if (/^0x0+$/.test(pool)) continue; // no pool at this fee
const { result } = await client.simulateContract({ address: QUOTER, abi: Q, functionName: "quoteExactInputSingle",
args: [{ tokenIn: NVDA, tokenOut: USDG, amountIn: parseUnits("1", 18), fee, sqrtPriceLimitX96: 0n }] });
if (result[0] > best) best = result[0];
}
console.log("1 NVDA =", formatUnits(best, 6), "USDG");
Read the token's decimals() instead of assuming 18 when you adapt this.
Build a swap
The terminal wraps one exactInputSingle in multicall(deadline, data), sets the minimum out from a fresh quote and the user's slippage, and simulates before asking the wallet to sign. When paying with ETH, send the amount as value; the router wraps it.
const R = parseAbi([
"function exactInputSingle((address tokenIn,address tokenOut,uint24 fee,address recipient,uint256 amountIn,uint256 amountOutMinimum,uint160 sqrtPriceLimitX96)) payable returns (uint256)",
"function multicall(uint256 deadline,bytes[] data) payable returns (bytes[])",
]);
const min = quoteOut * (10000n - 50n) / 10000n; // 0.5% slippage
const swap = encodeFunctionData({ abi: R, functionName: "exactInputSingle",
args: [{ tokenIn: WETH, tokenOut: NVDA, fee, recipient: account, amountIn, amountOutMinimum: min, sqrtPriceLimitX96: 0n }] });
const req = { address: ROUTER, abi: R, functionName: "multicall",
args: [BigInt(Math.floor(Date.now() / 1000) + 600), [swap]], account, value: amountIn };
await publicClient.simulateContract(req); // fails here, not in the wallet
const hash = await walletClient.writeContract(req);
Pons events
The Launches tab filters the Pons factory by the launch topic. Topic 1 is the new token, topic 2 the creator.
| Event | Topic 0 |
|---|---|
| TokenLaunched | 0x8d4aad4953d0ca700d468f3753aa14432d1b35b43ec6409f051fb6aa43a89607 |
| CurveBuy | 0xec36bf571f136799e8dc0b0b8bea4b04d8bd3d43de838aab0d5fc21d4cbfc455 |
| CurveSell | 0x8113d738abdcb6b38357e9d53a54a7157861a09031b453651f0fe7fe151f59df |
Addresses above were read from Robinhood Chain on 8 November 2026. Check them on the explorer before you send value. Not affiliated with Robinhood, Uniswap or Pons.