GULLY CHAINDocs

Stablecoins

On this page

Gully Chain Testnet has two dollar tokens, both with 6 decimals:

Token Address What it is
USDC.e ("Bridged USDC (Gully Labs)") 0x65Ba03c6FA90Ed549f465D4c8f2e784D6eEB7E76 Circle's USDC from Arbitrum Sepolia, bridged to Gully Chain through a dedicated USDC gateway pair.
glUSD ("Gully USD") 0xDBE84bE6496Fb3d07F601548555ec7Acc4CeBa8F Minted 1:1 against USDC.e by the glUSD PSM, and always redeemable 1:1 for USDC.e.
glUSD PSM 0xe1Ae51036ede1b244c532A81FaC196f19fa5E28e The only contract that can mint or burn glUSD.

Both are in the token list with the stablecoin tag.

Heads up

Testnet only. These are test tokens with no value. USDC.e is bridged by Gully Labs and is not issued by Circle; its backing is the USDC held in the bridge's escrow on Arbitrum Sepolia. glUSD on this testnet is a technical preview: it is not offered to the public as a redeemable dollar, and the glUSD PSM will not be deployed on mainnet without legal sign-off. The mainnet glUSD plan is to work with a regulated issuer.

#USDC.e: Circle Bridged USDC Standard

USDC.e follows Circle's Bridged USDC Standard, using the same USDC gateways Offchain Labs ships for Arbitrum Orbit chains:

  • The token on Gully Chain is Circle's own FiatToken code (FiatTokenV2_2 behind a FiatTokenProxy), so it behaves exactly like USDC: permit (EIP-2612), transferWithAuthorization (EIP-3009) and 6 decimals.
  • The L2 USDC gateway 0xd9d07510cEEfeeaF538bDDbe4ee1B76E9F1A71B3 is its only minter. It mints on deposit and burns on withdrawal.
  • The L1 USDC gateway on Arbitrum Sepolia 0xF904064BE100489a200EB754E591362C7Ced2D5b escrows the USDC, so every USDC.e is backed 1:1 by USDC locked there.
  • Because it follows the standard, Circle could later take the token over and turn it into native USDC at the same address, with the same holders. That is an option for Circle, not a promise.

The standard ERC-20 gateway is not used for USDC: deposits of USDC through the router go to the USDC gateway automatically.

#Bridge USDC from Arbitrum Sepolia

  1. Get test USDC on Arbitrum Sepolia from Circle's faucet, faucet.circle.com (choose USDC and Arbitrum Sepolia). The Arbitrum Sepolia USDC address is 0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d.
  2. Keep a little Arbitrum Sepolia ETH for gas and the retryable ticket fee (about 0.0001 ETH).
  3. Deposit through the gateway router. The Arbitrum SDK's Erc20Bridger approves the right gateway and sizes the retryable for you. Use the network object from Bridging:
TypeScript
const USDC_ARB_SEPOLIA = "0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d";
const erc20Bridger = new Erc20Bridger(gully);   // registered as on the Bridging page

// approves the L1 USDC gateway (the router picks it for USDC)
await (await erc20Bridger.approveToken({ erc20ParentAddress: USDC_ARB_SEPOLIA, parentSigner })).wait();

const tx = await erc20Bridger.deposit({
  amount: 5_000_000n,                     // 5 USDC (6 decimals)
  erc20ParentAddress: USDC_ARB_SEPOLIA,
  parentSigner,                           // signer on Arbitrum Sepolia
  childProvider,                          // provider for https://testnet-rpc.gullychain.xyz
});
await (await tx.wait()).waitForChildTransactionReceipt(childProvider);

USDC.e arrives on Gully Chain after the deposit message is read from Arbitrum Sepolia, usually within minutes.

Withdrawing works the other way: approve the L2 USDC gateway for the amount (it pulls and burns the USDC.e), then call outboundTransfer(<Arbitrum Sepolia USDC>, <to>, <amount>, 0x) on the Gully Chain gateway router 0x32C680cA4c27A3566fE5Dfd4643fE420eE1039B7. The USDC is released on Arbitrum Sepolia through the Outbox after the confirmation period; see Withdrawals, which are still rolling out.

#glUSD: 1:1 mint and redeem

The glUSD PSM (peg stability module) swaps USDC.e and glUSD in both directions, always 1:1:

Call What happens
deposit(amount, to) Takes amount USDC.e (approve the PSM first) and mints amount - mintFee glUSD to to.
redeem(amount, to) Burns amount glUSD from the caller and pays amount - redeemFee USDC.e to to.
TypeScript
const PSM = "0xe1Ae51036ede1b244c532A81FaC196f19fa5E28e";
const USDCe = "0x65Ba03c6FA90Ed549f465D4c8f2e784D6eEB7E76";
const amount = 5_000_000n; // 5 USDC.e

await wallet.writeContract({ address: USDCe, abi: erc20Abi, functionName: "approve", args: [PSM, amount] });
await wallet.writeContract({
  address: PSM,
  abi: [{ type: "function", name: "deposit", stateMutability: "nonpayable",
          inputs: [{ name: "amount", type: "uint256" }, { name: "to", type: "address" }], outputs: [] }],
  functionName: "deposit",
  args: [amount, account],
});

What the contract guarantees:

  • Fully backed. The PSM always holds at least as much USDC.e as there is glUSD (plus any collected fees). Both sides move by the same amount on every mint and redeem.
  • Redemptions can never be paused. The owner can pause new deposits only. redeem has no pause switch.
  • Nobody can take the reserve. There is no withdraw, sweep, rescue or upgrade path. USDC.e leaves the PSM only through redeem, and through claimFees(), which sends exactly the fees collected.
  • Only the PSM can mint or burn glUSD. glUSD has no owner, no minter role and no upgrade path. It supports EIP-2612 permit.

One edge comes from USDC.e itself: as Circle's FiatToken, USDC.e can be paused, and an address can be blacklisted by its pauser and blacklister roles. If that ever hit the PSM, redemptions would revert until it was lifted; the reserve stays in place and nothing is lost.

#Fees

Fee Today Cap in the contract
Mint fee 0 0.5% (50 bps)
Redeem fee 0 0.5% (50 bps)

At a 0 fee, one glUSD is exactly one USDC.e unit, with no rounding. If fees are ever turned on they round up, are kept in USDC.e and are counted separately from the reserve, and they can never exceed 0.5%.

  • Testnet only. Both tokens are test tokens on a testnet and have no value.
  • USDC.e is not Circle-issued. It is a bridged form of USDC; Circle does not issue it or stand behind it.
  • glUSD. Issuing a dollar-redeemable token to the public is regulated (for example under the US GENIUS Act and the EU's MiCA). The glUSD PSM on this testnet exists for development and testing. It is not an offer of a payment stablecoin, and it will not go to mainnet before legal sign-off.
  • Admin roles. On the testnet, the token roles (USDC.e owner, pauser, blacklister, gateway owners) are held by a Gully Labs testnet key. They move to multisigs before any mainnet.