GULLY CHAINDocs

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_* and trace_* 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_chainId or eth_blockNumber instead.
  • waitForTransactionReceipt and 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.timestamp for time-based logic where you can.
  • To read Gully Chain's own block number from a contract, call arbBlockNumber() on the ArbSys precompile at 0x0000000000000000000000000000000000000064.
Solidity
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.