Most users don’t need this. In the Arcus testnet web app, connect your wallet and click Testnet Deposit to instantly credit ~$1,000 in USDG of paper-trading collateral — that’s enough for nearly everything. This guide is for API traders who need a larger balance, or who want to fund programmatically as part of a test harness.
The flow
Funding is an on-chain deposit on Robinhood Chain testnet. The exchange credits your trading account automatically once it observes the deposit on-chain (typically under a minute). The steps never change:1
Mint the collateral token
The testnet collateral token (
USDG) has an open mint — anyone can mint themselves test tokens. Mint the amount you want to deposit.2
Approve the deposit proxy
Approve the deposit proxy contract to pull your
USDG. The spender is the deposit proxy, not the bridge.3
Call `initiateDeposit`
Call
initiateDeposit on the deposit proxy. It pulls your USDG, wraps it into the margin token, and forwards it to the bridge. owner must equal the wallet that signs the transaction.4
Wait for the credit
Poll
GET /v1/account until your balance reflects the deposit. It also shows up as an APPLIED DEPOSIT on GET /v1/accountTransferUpdates.initiateDeposit → wait — is stable. The contract addresses below are not.
Testnet parameters
You only ever interact with two contracts: the collateral token (USDG) and the deposit proxy. The proxy forwards to the bridge internally, so you never call the BridgeVault directly.
Amounts use the token’s 6 decimals — e.g.
$1,000 = 1000000000, $100,000 = 100000000000.
Your wallet also needs a small amount of RH-testnet ETH (≈0.001) to pay gas for the transactions below. There is currently no public faucet for RH-testnet ETH — seed a fresh wallet by transferring from a wallet you already gas-funded, or ask the Arcus team. (When seeding wallet-to-wallet, note the chain rejects a bare 21,000-gas transfer with intrinsic gas too low — let your tooling estimate gas rather than hard-coding the classic minimum.)
Deposit with cast
Using Foundry’s cast. $KEY / $ADDR are the depositing wallet’s private key / address:
initiateDeposit arguments are (owner, accountIndex, token, amount). Use accountIndex 0 unless you trade a non-default subaccount, and token must be the USDG address (the proxy rejects anything else with WrongToken).
Deposit programmatically (web3.py)
The same three transactions from a test harness, using web3.py and the wallet’s private key:Verify
An address with no activity at all returns 404 (
"this account has no activity yet") from GET /v1/account — that’s the expected empty state, not an error. Registering an API key already counts as activity: an onboarded-but-unfunded account returns 200 with equity: "0". Once the deposit applies, the response reflects the credited balance.