Live#…
Reading the chain…
Network now · GullyChain Testnet
Block
—
Txs · 30 blocks
—
Gas, gwei
—
Launches
—

Deploy on Gully Chain

On this page

One page with everything a team needs to ship on Gully Chain Testnet without asking us first. The same data is machine-readable: /chain.json (wallet and chain-list parameters) and /addresses.json (every contract below, with its status).

#Network

Setting Value
Chain ID 485590 (hex 0x768d6)
Network name Gully Chain Testnet
RPC (HTTPS), primary https://rpc.gullychain.xyz
RPC (HTTPS), alternatives https://rpc.gullyrpc.xyz/gullychain/evm/485590, https://rpc2.gullychain.xyz, https://testnet-rpc.gullychain.xyz
RPC with your own key https://rpc.gullyrpc.xyz/<project>/evm/485590 (Gully RPC (opens in a new tab), higher limits)
RPC (WebSocket) Not public yet. Poll over HTTPS for now (viem and ethers do this by default); see WebSocket
Explorer testnet-explorer.gullychain.xyz
Contract verification verify.gullychain.xyz (Sourcify, API v2 at https://verify.gullychain.xyz/v2/, no key)
Faucet faucet.gullychain.xyz (sign in with Gully ID, hCaptcha, small daily drip)
Bridge bridge.gullychain.xyz (Arbitrum Sepolia to Gully Chain in about a minute)
Gas token ETH, 18 decimals
Parent chain Arbitrum Sepolia (421614)
Stack Arbitrum Orbit L3, Nitro, ArbOS 51, Cancun EVM, Stylus
Status status.gullylabs.xyz (opens in a new tab) (RPCs, verifier, faucet and every standard contract, checked every minute)

Heads up

Use rpc.gullychain.xyz first. Some ISP security filters (Xfinity's, for one) block hostnames that start with testnet-, so a setup that only lists testnet-rpc.gullychain.xyz can fail on a home connection while it works everywhere else. testnet-rpc keeps working as an alternative.

#Machine-readable files

File What is in it
docs.gullychain.xyz/chain.json (also on dev.gullychain.xyz/chain.json) The ethereum-lists/chains (opens in a new tab) entry fields (name, chain, rpc, faucets, nativeCurrency, shortName, chainId, networkId, explorers, parent), plus eip3085: the exact object to pass to wallet_addEthereumChain, the service URLs and the chain quirks.
docs.gullychain.xyz/addresses.json (also on dev.) Every contract on this page: name, group, address, chainId (485590 or 421614), kind (standard, gully, parent), status (live, missing), checkedAt, and updatedAt for the file.
JavaScript
// add the network from a dapp, straight from chain.json
const chain = await (await fetch("https://docs.gullychain.xyz/chain.json")).json();
await window.ethereum.request({ method: "wallet_addEthereumChain", params: [chain.eip3085] });

Both files are CORS-open and regenerated from the deploy records every time the docs are built.

#Get test ETH

  • Faucet: faucet.gullychain.xyz. Sign in with Gully ID, pass the captcha, claim. Enough for several deploys.
  • More than the faucet gives: bridge Sepolia ETH in through bridge.gullychain.xyz (Arbitrum Sepolia faucets are listed on Bridging), or email [email protected] with your Gully ID and what you are building: verified developer accounts get a larger faucet allowance.

#Foundry

foundry.toml:

TOML
[profile.default]
solc = "0.8.28"
evm_version = "cancun"
optimizer = true
optimizer_runs = 200

[rpc_endpoints]
gully = "https://rpc.gullychain.xyz"
gully_alt = "https://testnet-rpc.gullychain.xyz"

Deploy and verify in one command:

Shell
forge create src/Counter.sol:Counter \
  --rpc-url gully \
  --private-key $PRIVATE_KEY \
  --broadcast \
  --verify --verifier sourcify --verifier-url https://verify.gullychain.xyz/

With a script (salted CREATE2 deploys go through the Arachnid factory, so they land at the same address as on other chains):

Shell
forge script script/Deploy.s.sol --rpc-url gully --broadcast \
  --verify --verifier sourcify --verifier-url https://verify.gullychain.xyz/

Verify a contract that is already deployed (no API key, no constructor arguments: Sourcify reads them from the creation transaction):

Shell
forge verify-contract <address> src/Counter.sol:Counter \
  --chain-id 485590 \
  --rpc-url https://rpc.gullychain.xyz \
  --verifier sourcify \
  --verifier-url https://verify.gullychain.xyz/ \
  --watch

Use a current Foundry (foundryup): the server speaks the Sourcify API v2 only. Check a result with curl https://verify.gullychain.xyz/v2/contract/485590/<address>. More, including Windows path issues and the web form: Verify your contract.

#Hardhat

TypeScript
// hardhat.config.ts (network part; the verify plugin settings are on /verify/#hardhat)
export default {
  solidity: { version: "0.8.28", settings: { evmVersion: "cancun", optimizer: { enabled: true, runs: 200 } } },
  networks: {
    gully: { url: "https://rpc.gullychain.xyz", chainId: 485590, accounts: [process.env.PRIVATE_KEY!] },
  },
};
Shell
npx hardhat run scripts/deploy.ts --network gully
npx hardhat verify --network gully <address>

Verification needs a Sourcify v2 capable plugin: see Verify your contract. Any Hardhat version can upload artifacts/build-info/*.json on verify.gullychain.xyz.

#viem

TypeScript
import { createPublicClient, createWalletClient, defineChain, fallback, http } from "viem";
import { privateKeyToAccount } from "viem/accounts";

export const gullyTestnet = defineChain({
  id: 485590,
  name: "Gully Chain Testnet",
  nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 },
  rpcUrls: { default: { http: ["https://rpc.gullychain.xyz", "https://testnet-rpc.gullychain.xyz"] } },
  blockExplorers: { default: { name: "Gully Explorer", url: "https://testnet-explorer.gullychain.xyz" } },
  contracts: { multicall3: { address: "0xcA11bde05977b3631167028862bE2a173976CA11" } },
});

const transport = fallback(gullyTestnet.rpcUrls.default.http.map((url) => http(url)), { rank: false });
export const publicClient = createPublicClient({ chain: gullyTestnet, transport });
export const walletClient = createWalletClient({ chain: gullyTestnet, transport, account: privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`) });

// deploy: const hash = await walletClient.deployContract({ abi, bytecode, args: [] });

The full four-endpoint fallback list is on Network reference.

#ethers v6

TypeScript
import { ContractFactory, JsonRpcProvider, Network, Wallet } from "ethers";

const network = Network.from(485590);
const provider = new JsonRpcProvider("https://rpc.gullychain.xyz", network, { staticNetwork: network });
const wallet = new Wallet(process.env.PRIVATE_KEY!, provider);

const contract = await new ContractFactory(abi, bytecode, wallet).deploy();
await contract.waitForDeployment();
console.log(await contract.getAddress());

A FallbackProvider over every endpoint: Network reference.

#Standard contracts

The contracts that tooling expects at the same address on every chain. Status is the result of an eth_getCode check at that address; the status page (opens in a new tab) re-checks every one of them each minute (group "Chain readiness").

#Deterministic deployers

Contract Canonical address Status
CREATE2 factory (Arachnid / Nick)
Used by forge script for salted CREATE2 deploys.
0x4e59b44847b379578588920cA78FbF26c0B4956C Live
ERC-2470 singleton factory 0xce0042B868300000d44A59004Da54A005ffdcf9f Live
Zoltu deterministic deployer 0x7A0D94F55792C434d74a40883C6ed8545E406D12 Live
CreateX (CREATE2 / CREATE3) 0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed Live
ImmutableCreate2Factory (0age) 0x0000000000FFe8B47B3e2130213B802212439497 Live
Safe singleton factory
Deployed per chain by the Safe team from their own key; requested. Use the Arachnid factory or CreateX meanwhile.
0x914d7Fec6aaC8cd542e72Bca78B30650d45643d7 Not deployed

#Utilities

Contract Canonical address Status
Multicall3
viem multicall and wagmi useReadContracts work unchanged.
0xcA11bde05977b3631167028862bE2a173976CA11 Live
Permit2 0x000000000022D473030F116dDEE9F6B43aC78BA3 Live
ERC-1820 registry 0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24 Live
ERC-6551 registry (token bound accounts) 0x000000006551c19487814612e58FE06813775758 Live
DelegateRegistry v2 (delegate.xyz) 0x00000000000000447e69651d841bD8D104Bed493 Live
EAS 1.3.0 (Ethereum Attestation Service)
EAS has no single canonical address; this is the Gully Chain deployment.
0x412a5d2f2a1f2f8e8e7e9023371d9ace11a23aaa Live
EAS SchemaRegistry 1.3.0 0x0fdec4B85Af441415763e06e82fB783c371FC8B1 Live

#ERC-4337

Contract Canonical address Status
EntryPoint v0.6
The public bundler serves v0.7.
0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789 Live
EntryPoint v0.7
Public bundler and paymaster: docs /account-abstraction/.
0x0000000071727De22E5E9d8BAf0edAc6f37da032 Live
EntryPoint v0.8 0x4337084D9E255Ff0702461CF8895CE9E3b5Ff108 Live
SimpleAccountFactory v0.6 0x9406Cc6185a346906296840746125a0E44976454 Live
SimpleAccountFactory v0.7 0x91E60e0613810449d098b0b5Ec8b51A0FE8c8985 Live
SimpleAccountFactory v0.8 0x13E9ed32155810FDbd067D4522C492D6f68E5944 Live
LightAccountFactory v2.0.0 (Alchemy) 0x0000000000400CdFef5E2714E63d8040b700BC24 Live
Kernel v3.3 (ZeroDev) 0xd6CEDDe84be40893d153Be9d467CD6aD37875b28 Live
KernelFactory v3.3 (ZeroDev) 0x2577507b78c2008Ff367261CB6285d44ba5eF2E9 Live
Safe4337Module 0.3.0 0x75cf11467937ce3F2f357CE24ffc3DBF8fD5c226 Live
SafeModuleSetup 0.3.0 0x2dd68b007B46fBe91B9A7c3EDa5A7a1063cB5b47 Live
P256 verifier (Daimo) 0xc2b78104907F722DABAc4C69f826a522B2754De4 Live

#Safe 1.4.1

Contract Canonical address Status
Safe 1.4.1 0x41675C099F32341bf84BFc5382aF534df5C7461a At Gully's address 0x639245e8476E03e789a244f279b5843b9633b2E7
SafeL2 1.4.1 0x29fcB43b46531BcA003ddC8FCB67FFE91900C762 At Gully's address 0x76667330c237Fb40f28d74563cdAAae4b06C23Ec
SafeProxyFactory 1.4.1 0x4e1DCf7AD4e460CfD30791CCC4F9c8a4f820ec67 At Gully's address 0xd9d2Ba03a7754250FDD71333F444636471CACBC4
CompatibilityFallbackHandler 1.4.1 0xfd0732Dc9E303f09fCEf3a7388Ad10A83459Ec99 At Gully's address 0xcB4a8d3609A7CCa2D9c063a742f75c899BF2f7b5
MultiSend 1.4.1 0x38869bf66a61cF6bDB996A6aE40D5853Fd43B526 At Gully's address 0x7B21BBDBdE8D01Df591fdc2dc0bE9956Dde1e16C
MultiSendCallOnly 1.4.1 0x9641d764fc13c8B624c04430C7356C1C7C8102e2 At Gully's address 0x32228dDEA8b9A2bd7f2d71A958fF241D79ca5eEC
SignMessageLib 1.4.1 0xd53cd0aB83D845Ac265BE939c57F53AD838012c9 At Gully's address 0x309C7b0A0D2f250Be322739753386911E1187C4E
CreateCall 1.4.1 0x9b35Af71d77eaf8d7e40252370304687390A1A52 At Gully's address 0x8BbCaE989A0Bdf15c8E783357a0E5848e36233d0
SimulateTxAccessor 1.4.1 0x3d4BA2E0884aa488718476ca2FB8Efc291A46199 At Gully's address 0xB59bD9861a97F9c309B7b73338503507580625D2
SafeWebAuthnSharedSigner 0.2.1 0x94a4F6affBd8975951142c3999aEAB7ecee555c2 At Gully's address 0xB3a6Aa3eDDD715dbD84aD465Ab0f98919eBB6d5C
SafeWebAuthnSignerFactory 0.2.1 0x1d31F259eE307358a26dFb23EB365939E8641195 At Gully's address 0xfF25690FC38De1572c2C8075966Bb813f60a095F

#NFT marketplaces

Contract Canonical address Status
Seaport 1.6 0x0000000000000068F116a894984e2DB1123eB395 Live
Seaport ConduitController 0x00000000F9490004C11Cef243f5400493c00Ad63 Live

The canonical Safe 1.4.1 addresses stay empty until the Safe team deploys their singleton factory on Gully Chain (it needs Safe's own key). The same audited creation code is live at Gully's addresses, shown in the Status column; pass them to Safe tooling explicitly (see Gully Safe).

#Gully contracts

Gully Chain's own deployments: tokens, Uniswap v3, the oracle, names, the testnet launchpad, accounts, the token bridge and the Hyperlane routes. Everything else (Quests, Pay, Sentry, RWA rails, Offerwall) is on Contract addresses.

#Tokens

Contract Address
WETH9 (canonical WETH9 code, Gully address) 0x26aCCCb2e98ca9e067E58668Aa3B101beF432754
USDC.e (Bridged USDC, Circle standard, 6 dp) 0x65Ba03c6FA90Ed549f465D4c8f2e784D6eEB7E76
USDC.e implementation (FiatTokenV2_2) 0xdCda1B0EfD3b83aC8fA766bCB262a6e8c677c8BE
USDC.e MasterMinter 0x0197877efae59Ac6723084fF1c8D0b73212F089c
L2 USDC gateway (sole USDC.e minter) 0xd9d07510cEEfeeaF538bDDbe4ee1B76E9F1A71B3
glUSD (Gully USD, 6 dp) 0xDBE84bE6496Fb3d07F601548555ec7Acc4CeBa8F
glUSD PSM (USDC.e <> glUSD 1:1) 0xe1Ae51036ede1b244c532A81FaC196f19fa5E28e

#Uniswap v3

Contract Address
UniswapV3Factory 0x1787a3bA8C8D7a2439cfA2EFaFc683ECAC623950
SwapRouter02 0xf49b65b9912fd017fDb91D21eE9bC9992F8cF05c
NonfungiblePositionManager 0x90aDCE86fce80E9fACD436efBb4C8A25D3d38f75
QuoterV2 0x808f5DE34f215712F780DB0eA91F7530f883A04e
TickLens 0x8746BFA894889A2aB87FF06F1e69B495F14ED38A
UniswapInterfaceMulticall 0x2CD6FA084e314C4Ce0D57d77231515D1f022b61d
V3Migrator 0x50AE8Ff4EB11dAD103fCE65a9F2e48dc1746cf64
UniswapV3Staker 0x1e4e1E496A3b35A1414C5F615eb4920C93a16143
NonfungibleTokenPositionDescriptor (proxy) 0x5ffaCCa457988b75E6B62E79C799Eea85Eb10Af3
GullyFeeController (factory owner) 0x47214e56806Daa1cdA5981E2F1AFE8FDfF19D93b
GullySwapRouter (0.25% interface fee) 0x1283a251E34296675CC5130A2B02871384c0436a

#Oracle (testnet only)

Contract Address
GullyPriceFeed (RedStone pull) 0x4c64c79ee59a83842a22c14712D66bfef48eb301
ETH / USD adapter (AggregatorV3) 0x732b8a31E19827B6c81db7a433fd120e302862c8
BTC / USD adapter (AggregatorV3) 0xE7Df3ec99314C0716510DAcd5B61a089Cf95130c
USDC / USD adapter (AggregatorV3) 0x7cEbF1d241165302b9a0bc2CFD24020ACB7AE44e

#.gully names

#Launchpad

Contract Address
GullyLaunchpad v2.1 (testnet launchpad; DeepCore is the built-in one) 0xCe2c3Ac523EfF3Bec8D3894f7e5C5F519638326b
GullyLPLocker v2 0x272a78b26B289c50632dCB29270aa2a07dAa5709
GullyLaunchpad v2.0 (existing tokens) 0x3378b659f6ddA7F13D87599B383b3995f82D0974
GullyLPLocker v1 0xBAb80bf7CA383461e573Dc503c70083c0415d58B

#Smart accounts

Contract Address
WebAuthnValidator (passkey root key) 0x7ab16Ff354AcB328452F1D445b3Ddee9a91e9e69
WebAuthnSigner (extra devices) 0x65DEeC8fEe717dc044D0CFD63cCf55F02cCaC2b3
ECDSASigner (session keys) 0x6A6F069E2a08c2468e7724Ab3250CdBFBA14D4FF
FactoryStaker (meta factory) 0x3fe1D99661BBD711a434045df5262e594Dd6cA9a
SudoPolicy 0x67b436caD8a6D025DF6C82C5BB43fbF11fC5B9B7
CallPolicy 0x85770b902D1e503D5f5141d9eaC16d0d08eEaDd2
RateLimitPolicy 0xf63d4139B25c836334edD76641356c6b74C86873
TimestampPolicy 0xB9f8f524bE6EcD8C945b1b87f9ae5C192FdCE20F

#Gully Safe

Contract Address
SafeToL2Setup 1.4.1 0x5DC954024c42433BF567eb072992A83b4d480A0a
SafeToL2Migration 1.4.1 0xf91b2B39B185395502Da5DD797bB659A169ba2E4
TokenCallbackHandler 1.4.1 0x63117fd9761850f4aC685457E484A01D752D5cC4

#Token bridge (Gully Chain side)

Contract Address
Gateway router 0x32C680cA4c27A3566fE5Dfd4643fE420eE1039B7
Standard ERC-20 gateway 0x5CbA5BFD52beA26Fb65c26Fa452f290cB8610fE2
Custom gateway 0x27530E706c67F210753081508302d69ba1693A41
WETH gateway 0xB8BAAd59F553707534F546983912486562FA0Eb3
Bridged WETH (Arbitrum Sepolia WETH) 0x3292dE74305DF64dbe082c6834fa841353eB2415
Upgrade executor 0x2d5E1C784b64715ED5F4191FEAe0F402A401Cd7D

#Apps

Contract Address
GullyArcade 0xe573789b235314661DEdDA08a18Ca261c069c872
GullyReferrals 0x42B46EA814024683B346cCEAc2124A054F4544b7
GullyRewardsDistributor 0x1F299b4EDecf58749f6f51Fab663a2509C6D11C6

#Hyperlane

Contract Address
Mailbox 0x5b875dac092FcA7cE0DfEe8B7C1dbBD2c2a0cfDe
MerkleTreeHook 0xB2cD98D3Fb515506e3A2c91222131Ec9cC8b4Dd3
ValidatorAnnounce 0x4E311b13cdE4ce8B4cA5830006B35E2CD220b2E0
InterchainAccountRouter 0xAE10F17aFf0ed91630202939b5ff65F4C6404909
Native ETH warp router (fast lane, HypNative) 0xB1943191df824138bd0784C60077c6610F380810
Native ETH warp router (Arbitrum Sepolia side) 0x9E40F1702977A0a48Fa275522Ba6877E209DE631 (opens in a new tab)

#On Arbitrum Sepolia

#Rollup core (Arbitrum Sepolia)

#Token bridge (Arbitrum Sepolia side)

#Quirks

Heads up

block.number is not Gully Chain's block number. Inside a contract it returns the L1 (Ethereum Sepolia) block number, as on every Arbitrum chain. Use block.timestamp for time, or ArbSys(0x64).arbBlockNumber() for the L3 block. Details: Network reference.

  • Blocks only when there are transactions. No fixed block time; a quiet chain can go minutes without a block. Do not use new blocks as a clock or a health check.
  • Gas includes the parent-chain data cost. Always estimate (eth_estimateGas; Foundry, Hardhat, viem and ethers do it by default). Never hard-code gas limits copied from Ethereum.
  • Cancun EVM (PUSH0, MCOPY, transient storage). Set evm_version = "cancun" or older. Max contract size 24,576 bytes, init code 49,152 bytes.
  • Stylus: contracts in Rust, C and C++ run next to Solidity. See Stylus.
  • Keyless pre-EIP-155 transactions are accepted, so published deterministic deployers (Arachnid, ERC-1820, Multicall3, CreateX) can be replayed. Your own transactions should still be EIP-155 signed (every tool does this by default).
  • Arbitrum precompiles are available: ArbSys at 0x64, ArbGasInfo at 0x6c, ArbWasm at 0x71.
  • No debug_* / trace_* on the public RPCs.

#Rate limits

Endpoint Limit per IP
rpc.gullychain.xyz, testnet-rpc.gullychain.xyz 100 requests/s
rpc2.gullychain.xyz 50 requests/s, burst 100
Gully RPC keyless (rpc.gullyrpc.xyz/gullychain/...) 25 requests/s
Gully RPC with your key Your plan's limit
  • Send single JSON-RPC requests. Batches work but count per call and are the first thing to hit a limit; keep them small.
  • Over the limit you get HTTP 429 or a JSON-RPC rate-limit error: back off and retry, or move to the next endpoint.
  • Never send the same signed transaction to two endpoints in parallel. Retrying it on the next endpoint after a failure is fine.

#WebSocket

There is no public WebSocket RPC yet: eth_subscribe is not available on the public endpoints. viem's watchBlocks, watchContractEvent and ethers' provider.on(...) fall back to HTTPS polling, which works on every endpoint above. A wss://rpc.gullychain.xyz/ws endpoint is prepared and will be listed here, in /chain.json and on the status page (opens in a new tab) when it is live.

#Get help