Networks
Networks
UMBR runs one shielded pool design on two chains: Robinhood Chain and Tempo. Testnets first; a mainnet appears only once it is configured.
- Chains
- Robinhood Chain, Tempo
- Testnet ids
- 46630, 42431
- Mainnet
- Not configured
Two chains, one design#
UMBR deploys the same shielded pool, the same circuits and the same verifier logic on each chain it supports. A note on one chain lives in that chain's pool and cannot be spent on the other. There is no bridge between pools: to move value across, unshield on one chain, move it publicly, and shield again on the other.
Each chain keeps its own Merkle tree, so each has its own set of depositors to blend into. Proofs name the chain they were made on, and a verifier checks the root against that chain's pool.
| Network | Chain id | RPC | Explorer | Assets |
|---|---|---|---|---|
| Robinhood Chain testnet | 46630 | https://rpc.testnet.chain.robinhood.com | explorer.testnet.chain.robinhood.com | USDG; stock tokens TSLA, AMZN, PLTR, NFLX, AMD |
| Tempo Moderato (testnet) | 42431 | https://rpc.moderato.tempo.xyz | explore.testnet.tempo.xyz | pathUSD, AlphaUSD, BetaUSD, OUSD |
Robinhood Chain#
An EVM chain whose gas is paid in ETH. On testnet you need a small amount of test ETH for every transaction you send yourself; if you use the relayer for private sends, it pays gas and takes a fee in the asset being moved.
- Stablecoin: USDG, 6 decimals. This is the asset UMBR shields on Robinhood Chain.
- Stock tokens: the testnet carries tokens for TSLA, AMZN, PLTR, NFLX and AMD. The app can show them under Markets, but trading from a private balance is part of sealed trade, which is switched off.
- SDK:
networks.robinhoodTestnet.
Tempo#
A payments chain with no native gas coin. Fees are paid in USD stablecoins, so a wallet holding only pathUSD can shield, send and unshield without buying anything else.
- Stablecoins: pathUSD, AlphaUSD, BetaUSD and OUSD on the Moderato testnet. They follow Tempo's TIP-20 token standard and use 6 decimals.
- SDK:
networks.tempoModerato.
Mainnet#
No mainnet is configured
A mainnet appears only when a deployment sets both its pool address and its deploy block. Before that happens, the network has to pass the production gate. When the time comes, the expected assets are USDG on Robinhood Chain and USDC.e, pathUSD, USDT0 and OUSD on Tempo, and the SDK will expose networks.robinhood and networks.tempo. The current state is always on /mainnet.
Configuration#
No pool address is built into the app. Each deployment supplies them as public environment variables, keyed by chain id. Without them the app still runs on both testnets, read-only, and demo mode works on localhost.
# Testnets: a network stays "planned" (read-only) until both values are set.
NEXT_PUBLIC_UMBR_POOL_46630=0x... # Robinhood Chain testnet pool
NEXT_PUBLIC_UMBR_POOL_BLOCK_46630=... # block the pool was deployed in
NEXT_PUBLIC_UMBR_POOL_42431=0x... # Tempo Moderato pool
NEXT_PUBLIC_UMBR_POOL_BLOCK_42431=...
# Optional RPC overrides (defaults are the public endpoints).
NEXT_PUBLIC_RPC_46630=
NEXT_PUBLIC_RPC_42431=
# Mainnets: hidden everywhere unless BOTH pool values are set.
NEXT_PUBLIC_UMBR_POOL_4663=
NEXT_PUBLIC_UMBR_POOL_BLOCK_4663=
NEXT_PUBLIC_UMBR_POOL_4217=
NEXT_PUBLIC_UMBR_POOL_BLOCK_4217=
NEXT_PUBLIC_RPC_4663=
NEXT_PUBLIC_RPC_4217=NEXT_PUBLIC_UMBR_POOL_<chainId>is the pool contract address on that chain.NEXT_PUBLIC_UMBR_POOL_BLOCK_<chainId>is the block it was deployed in. The app starts scanning for notes there, so a wrong value means missing history or a slow first sync.NEXT_PUBLIC_RPC_<chainId>overrides the public RPC, for example with a provider that has higher rate limits.NEXT_PUBLIC_UMBR_DEMOcontrols demo mode: unset allows?demo=1on localhost,1allows it on any host,alwaysshows every visitor the demo account.
These values are public by nature. No secret belongs in a NEXT_PUBLIC_ variable.
Switching networks#
In the app, pick the network from the switcher; your wallet is asked to follow. Your private balance is shown per network, because each pool is separate and notes on one chain are invisible to the other.
In the SDK, a client is bound to one network. Create one client per chain, and expect a NETWORK_MISMATCH error if the wallet is on another chain.
import { createUmbrClient, networks, UmbrError } from "@umbr/sdk";
const rh = createUmbrClient({ network: networks.robinhoodTestnet, wallet });
const tempo = createUmbrClient({ network: networks.tempoModerato, wallet });
// A wallet on the wrong chain fails fast instead of signing.
try {
await rh.shield({ asset: "USDG", amount: "25.00" });
} catch (err) {
if (err instanceof UmbrError && err.code === "NETWORK_MISMATCH") {
// ask the user to switch their wallet to chain 46630
}
}