B is the gateway, e.g. B=http://<host>:3000. celestia-appd commands run on the host.
:3000 the UI, and the only public way to reach the chain
/rpc /rest Celestia RPC and REST
/api relayer API
/evm/<chain>/ EVM JSON-RPC for sepolia, arbitrum, base, eden
/tx/<hash> transaction view
:3001 relayer dashboard :3002 gas oracle dashboard
- Keplr: connect in the UI, import
CELESTIA_MNEMONICfromdevnet/.env. Account 0 is funded. - MetaMask: let the UI add the networks.
Faucet tab: 1000 TIA, once per address. CLI:
curl -s $B/api/faucet # {"enabled":true,"amountTia":1000}
curl -s -X POST $B/api/faucet -H 'content-type: application/json' \
-d '{"address":"celestia1..."}' # {"tx_hash":"...","amount_tia":1000}UI: pick origin, destination, asset, amount. No approve needed.
From Celestia:
celestia-appd tx warp transfer <celestia token id> <destination domain> \
0x000000000000000000000000<evm address without 0x> <amount> \
--from <key> --chain-id teeism-local --node tcp://localhost:26657 \
--gas auto --gas-adjustment 1.5 --gas-prices 0.002utia --max-hyperlane-fee 10000000utia -yDon't re-run if jq fails: it's already broadcast. Read the txhash line.
From an EVM chain:
cast send <router> "transferRemote(uint32,bytes32,uint256)(bytes32)" \
1297040299 0x000000000000000000000000<celestia address as 20 hex bytes> <amount> \
--value $(cast call <router> "quoteGasPayment(uint32)(uint256)" 1297040299 --rpc-url <rpc>) \
--rpc-url <rpc> --private-key $EVM_PRIVATE_KEYDomains: Celestia 1297040299, Sepolia 11155111, Arbitrum 421614, Base 84532, Eden
3735928814. Addresses: README.md.
Celestia -> Arbitrum, Base, Sepolia under 30 s
Celestia -> Eden ~30 s
Eden -> Celestia 1-4 min waiting for Eden to post its headers to mocha
Sepolia -> Celestia ~15 min Ethereum finality
Arbitrum -> Celestia under 1 min the next block its sequencer signs
Base -> Celestia under 1 min the next block its sequencer signs
Slower than this: MAINTAIN.
cast call <mailbox> "delivered(bytes32)(bool)" <message id> --rpc-url <rpc>
celestia-appd query hyperlane delivered <mailbox id> <message id> --node tcp://localhost:26657- Query the destination mailbox. On Celestia, only for messages into Celestia (outbound ids read
true). - Or check the balance: EVM
cast call <router> "balanceOf(address)(uint256)" <you> --rpc-url <rpc>; Celestia denomhyperlane/<token id>.
teeism status # every route's ISM height and state age
curl -s $B/api/v1/routes | jq '.[] | {name, status, ism: .ismReading.height, head: .originHead.height}'
journalctl -u teeism-relayer -f | grep -E 'attesting|delivering|delivered|route failed'Healthy:
route: attesting route=base-to-celestia from=46889663 to=46890863 leaves=2
destination: delivering id=...
route: batch delivered route=base-to-celestia height=46890863
cast call <TeeDcapIsm> "state()(bytes)" --rpc-url <rpc>
celestia-appd query teeism ism <ism id> --node tcp://localhost:26657 -o json[ 0: 32] state_root [ 32: 36] origin_domain [ 36: 44] height
[ 44: 52] timestamp [ 52: 84] lc_store_commit [ 84:116] identity_digest
At 1.1 gwei on Sepolia, 0.006 on Base, 0.25 on Arbitrum:
gas sepolia base arbitrum (ETH)
attestation 5,331,900 0.005900 0.000031 0.001330
delivery, per message 124,000 0.000140 0.000001 0.000030
Celestia: attestation 343,592 gas, delivery 117,337. Enclaves: $4.38/day. A quiet route also attests once a day with no messages (MAINTAIN): one attestation's gas per day. Current quotes: :3002, or one round:
~/tee-ism-nonzk/tee-hyperlane/target/release/gas-oracle --config ~/tee-ism-nonzk/devnet/.state/gas-oracle.toml --once.
cd bridge-app && npm install && npm run dev # http://localhost:5173Reads VITE_* from .env.local, which teeism ui writes (DEPLOY step 13).