GULLY CHAINDocs

Quickstart

On this page

Three steps: add the network, get some test ETH, deploy. Test ETH is free and has no value.

#1. Add the network

The quickest way is the Add to wallet button on the testnet page. It adds the network to MetaMask, Rabby and other browser wallets in one click.

To add it by hand, use these values:

Field Value
Network name Gully Chain Testnet
RPC URL https://testnet-rpc.gullychain.xyz
Chain ID 485590
Currency symbol ETH
Block explorer https://testnet-explorer.gullychain.xyz

From a dapp, ask the wallet to add it with wallet_addEthereumChain:

JavaScript
await window.ethereum.request({
  method: "wallet_addEthereumChain",
  params: [{
    chainId: "0x768d6", // 485590
    chainName: "Gully Chain Testnet",
    nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 },
    rpcUrls: ["https://testnet-rpc.gullychain.xyz"],
    blockExplorerUrls: ["https://testnet-explorer.gullychain.xyz"],
  }],
});

#2. Get test ETH

Gully Chain uses ETH for gas. There are two ways to get it.

#Option A: the faucet

The Gully faucet sends 0.001 ETH per address per day straight to your address on Gully Chain. That is enough for a few contract deploys, and it is the fastest way to start.

#Option B: bridge from Arbitrum Sepolia

For more ETH, bring it over from Arbitrum Sepolia:

  1. Get Sepolia ETH from a public Sepolia faucet, for example the Google Cloud Web3 faucet or a proof-of-work faucet. Some faucets pay on Arbitrum Sepolia directly, so you can skip step 2.
  2. On bridge.arbitrum.io, bridge from Sepolia to Arbitrum Sepolia. This takes about 10 to 15 minutes.
  3. Open the Gully Bridge, connect your wallet and deposit. ETH arrives on Gully Chain in about a minute.

The Bridging page explains what happens under the hood and how to deposit from code.

#3. Deploy a contract

Point your tools at the RPC. Any EVM contract works.

#Foundry

Shell
# check the connection: prints 485590
cast chain-id --rpc-url https://testnet-rpc.gullychain.xyz

# deploy with a keystore account
# (create one first with: cast wallet import dev --interactive)
forge create src/Counter.sol:Counter \
  --rpc-url https://testnet-rpc.gullychain.xyz \
  --account dev --broadcast

You can name the endpoint in foundry.toml and pass --rpc-url gully_testnet instead:

TOML
[rpc_endpoints]
gully_testnet = "https://testnet-rpc.gullychain.xyz"

The explorer supports contract verification. You can upload the source in its UI after deploying.

#Hardhat

TypeScript
// hardhat.config.ts
import type { HardhatUserConfig } from "hardhat/config";

const config: HardhatUserConfig = {
  solidity: "0.8.24",
  networks: {
    gullyTestnet: {
      url: "https://testnet-rpc.gullychain.xyz",
      chainId: 485590,
      accounts: process.env.PRIVATE_KEY ? [process.env.PRIVATE_KEY] : [],
    },
  },
};

export default config;

Deploy with your usual script or Ignition module and add --network gullyTestnet. Keep keys in environment variables or a secrets manager, never in the repo.

#viem

TypeScript
import { defineChain, createPublicClient, createWalletClient, 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://testnet-rpc.gullychain.xyz"] } },
  blockExplorers: {
    default: { name: "Gully Explorer", url: "https://testnet-explorer.gullychain.xyz" },
  },
  testnet: true,
});

const publicClient = createPublicClient({ chain: gullyTestnet, transport: http() });
console.log(await publicClient.getBlockNumber());

// deploy: abi and bytecode come from your compiler output
const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`);
const wallet = createWalletClient({ account, chain: gullyTestnet, transport: http() });
const hash = await wallet.deployContract({ abi, bytecode, args: [] });
const receipt = await publicClient.waitForTransactionReceipt({ hash });
console.log("deployed at", receipt.contractAddress);

Heads up

Multicall3 is not deployed yet. viem's multicall action and wagmi's useReadContracts call Multicall3 at 0xcA11…CA11, which does not exist on Gully Chain today. Make reads one at a time until it is deployed. See Contract addresses.

#curl

Shell
curl -s https://testnet-rpc.gullychain.xyz \
  -H "content-type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}'

#Next steps