Skip to main content
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.
That sequence — mint → approve → initiateDeposit → wait — is stable. The contract addresses below are not.

Testnet parameters

These addresses are testnet deployment details that change on every redeploy or network reset — confirm them before relying on them in automation. A stale address fails in one of two ways: an obvious WrongToken / transfer revert, or a transaction that succeeds on-chain but never credits your account (you minted/approved/deposited against a retired deployment that the live exchange no longer watches). The flow is stable; the values are not.
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:
The 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.

Troubleshooting

Next steps

With a funded account, place your first order — Trade over REST or Trade over WebSocket.