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. |
// 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:
[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:
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):
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):
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/ \
--watchUse 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
// 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!] },
},
};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
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
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
#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
| Contract | Address |
|---|---|
| ENS registry | 0xe0bE69254ce3916A38b2d266f6A7325e62e96576 |
| .gully registrar | 0x3eb64A442EB656C66376A0458162a0b00093492B |
| Public resolver | 0x9E8328918d40e45FBD40D422c854c554d6b45D37 |
| Reverse registrar | 0xF9D030660E04bdBBC3F0818f7a1F4523bD5bA12F |
#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)
| Contract | Address |
|---|---|
| Rollup | 0x85D80C06Fa5334E8Cd1C51F3F39D477E5dc35E0D (opens in a new tab) |
| Inbox (deposits, retryables) | 0x7B8499f1C058c9bdE2Bc9BdFEBE40364232C52B5 (opens in a new tab) |
| Sequencer inbox | 0x483f77f692635d4D8a8147D0f732A016614Ce685 (opens in a new tab) |
| Bridge | 0x2073106fd3fc844Bbde31f5Bf0BB91cf1e2d6C8A (opens in a new tab) |
| Outbox (withdrawals) | 0x976C651fe5E63E45C8C28449507F51548922f68c (opens in a new tab) |
| Challenge manager | 0x625aAFe602c82FA2E409BB3c6c073E6aD2cf999D (opens in a new tab) |
#Token bridge (Arbitrum Sepolia side)
| Contract | Address |
|---|---|
| Gateway router | 0xfbd7503009AB4ee5A1f980a2fCDEE4C7BEB6b2B9 (opens in a new tab) |
| Standard ERC-20 gateway | 0x8E35E523bFd709d577A77F749c831cB045bCabd0 (opens in a new tab) |
| Custom gateway | 0xA90752f7057dc1BFe2677f1791c5084535A4E42a (opens in a new tab) |
| WETH gateway | 0xEB602d8Fc5F5d87DA629201905bE51885165EC4f (opens in a new tab) |
| L1 USDC gateway (escrows USDC behind USDC.e) | 0xF904064BE100489a200EB754E591362C7Ced2D5b (opens in a new tab) |
#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). Setevm_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:
ArbSysat0x64,ArbGasInfoat0x6c,ArbWasmat0x71. - 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
- Email [email protected]: bugs, higher RPC limits, a bigger faucet allowance, a contract you need deployed.
- Discord GullyChain (opens in a new tab) and Telegram t.me/GullyChain (opens in a new tab) (news) and t.me/GullyChainDeploys (opens in a new tab) (new deploys).
- Is something down? Check status.gullylabs.xyz (opens in a new tab) first. What to include in a report: Support.