Network reference
On this page
#Testnet settings
| Setting | Value |
|---|---|
| Network name | Gully Chain Testnet |
| Chain ID | 485590 (hex 0x768d6) |
| RPC (HTTPS) | https://testnet-rpc.gullychain.xyz |
| Explorer | testnet-explorer.gullychain.xyz |
| Bridge | testnet-bridge.gullychain.xyz |
| Faucet | faucet.gullychain.xyz (0.001 ETH per address per day) |
| Live stats | gullychain.xyz/testnet |
| Gas token | ETH, 18 decimals |
| Parent chain | Arbitrum Sepolia, chain ID 421614 |
| Settlement path | Gully Chain, then Arbitrum Sepolia, then Ethereum Sepolia |
| Stack | Arbitrum Orbit, Nitro v3.12, ArbOS 51 at genesis |
| Data availability | Rollup mode: transaction data is posted to Arbitrum Sepolia (not AnyTrust) |
| Sequencer | Single sequencer, first come, first served ordering |
| Max contract size | 24,576 bytes (init code 49,152 bytes), the same as Ethereum |
A mainnet that settles to Arbitrum One is planned. It is not live, and it will have its own chain ID.
#The public RPC
https://testnet-rpc.gullychain.xyz serves the standard Ethereum JSON-RPC (eth_*, net_*, web3_*) over HTTPS, with CORS enabled, so browser dapps can call it directly.
- Rate limits apply. The public endpoint is shared, so bursts are throttled. Cache what you can, avoid tight polling loops, and back off on HTTP 429. If you need more for a project, email [email protected].
- No debug or trace methods.
debug_*andtrace_*are not exposed on the public endpoint. - Batch requests (a JSON array of calls) work. Keep batches small.
#Blocks are made only when there are transactions
Nitro chains produce a block only when there is a transaction to include. On a quiet testnet the chain can go minutes without a new block. That is normal and not downtime, and it means:
- Do not use "a new block arrived" as a clock or a health check. Check
eth_chainIdoreth_blockNumberinstead. waitForTransactionReceiptand similar helpers still return quickly, because your own transaction triggers a block.- Block timestamps can jump: there is no fixed block time.
#block.number is not the L3 block number
As on every Arbitrum chain, block.number inside a contract does not return Gully Chain's own block number. It returns a block number from the layers below, which advances on that layer's schedule. Code that measures time in blocks (vesting, auctions, cooldowns) will behave differently than on Ethereum.
- Use
block.timestampfor time-based logic where you can. - To read Gully Chain's own block number from a contract, call
arbBlockNumber()on the ArbSys precompile at0x0000000000000000000000000000000000000064.
interface ArbSys {
function arbBlockNumber() external view returns (uint256);
}
uint256 l3Block = ArbSys(address(0x64)).arbBlockNumber();The JSON-RPC eth_blockNumber and the explorer show Gully Chain's own block numbers.
#Gas and fees
Gas is paid in ETH. Gully Chain uses Arbitrum's fee model: a transaction pays for execution on Gully Chain plus its share of the cost of posting data to the parent chain. Because the data cost is folded into gas, the gas used by a transaction is higher than on Ethereum for the same call.
- Always estimate with
eth_estimateGas(Foundry, Hardhat, viem and ethers do this by default). Do not hard-code gas limits copied from Ethereum. - The gas price normally sits at the chain's minimum base fee. Read it with
eth_gasPrice; the testnet page shows it live. - EIP-1559 transactions (type 2) and legacy transactions both work. Sign with the chain ID (EIP-155); unprotected transactions may be rejected.
#EVM compatibility
Gully Chain runs the Arbitrum Nitro EVM, which supports the Cancun opcode set (including MCOPY and transient storage). Solidity, Vyper and the usual tools work as-is. The Arbitrum precompiles (ArbSys at 0x64, ArbGasInfo at 0x6c and others) are available. Contracts written in Rust run on Stylus.
#Parent-chain contracts
The rollup, inbox, outbox and token bridge contracts on Arbitrum Sepolia are listed on Contract addresses.
