Skip to content

Deposits & Withdrawals

Fund your Parti account by sending USDG (6 decimals) to your personal on-chain deposit address on Robinhood Chain (an EVM L2). A watcher sweeps anything that lands there into the vault and credits your Oracle trading balance, usually in under a minute.

Your identity — and the address you fund — is a 0x EVM address. All deposit, balance and withdraw APIs key off that address, lowercase on the wire (the EIP-55 checksum is display-only).

Environments

Mainnet (parti.com) Testnet (staging)
Chain ID 4663 46630
Gas token ETH ETH
Gateway (REST) https://oracle-api.parti.com https://oracle-gateway.pbcapps.dev
Deposit host https://oracle-deposit.parti.com https://deposit-staging.parti-oracle.pbcapps.dev
PartiVault 0x9e92EB52229a6aE5361b6e75be4569461ee5BBB9 0x400441a9eF70843a356227cf1872dFbA25B8FA71
USDG token (6 dp) 0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168 0x29ECEE9eA19C638EB5b69f4e5f2C77B794982cd0
RPC https://rpc.mainnet.chain.robinhood.com https://rpc.testnet.chain.robinhood.com

Trading on mainnet is allowlist-gated during the venue's soft-launch. Validate the full deposit → trade → withdraw path on testnet first.


Get your deposit address

GET /v1/deposit/robinhood-address/{address}

{address} is your lowercase 0x EVM address. The route runs an EIP-55 checksum on the input, so a mixed-case address with a bad checksum returns derivation_failed; pass it lowercase.

# Mainnet
curl https://oracle-deposit.parti.com/v1/deposit/robinhood-address/<your-lowercase-0x-address>

# Testnet (staging)
curl https://deposit-staging.parti-oracle.pbcapps.dev/v1/deposit/robinhood-address/<your-lowercase-0x-address>

Response:

{
  "address": "0x…",
  "chain": "robinhood",
  "chain_id": 4663,
  "token": "USDG",
  "token_address": "0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168",
  "min_usdg_micro": 1000000
}

The returned address is a per-user CREATE2 DepositForwarder derived purely from your 0x address by the vault's DepositForwarderFactory. It is deterministic — the same wallet always resolves to the same forwarder address (chain_id is 46630 on testnet). Safe to cache.

The older GET /v1/deposit/bridge-address/{pubkey} route is the retired Solana/Fogo path — it returns invalid_pubkey for a 0x address. Use robinhood-address.


Deposit

Send USDG on Robinhood Chain (the matching network — mainnet for prod, testnet for staging) to the returned address.

Parameter Value
Token USDG (6 decimals) on Robinhood Chain
Minimum 1 USDG (min_usdg_micro = 1000000)
Cost Robinhood Chain gas only (ETH)
Time Usually under a minute

Only USDG on the matching Robinhood Chain credits. Other tokens, or USDG on any other network, are lost — there is no cross-chain bridge in this path.

What happens automatically

  1. The deposit watcher detects USDG landing in your forwarder address.
  2. It deploys-and-sweeps the DepositForwarder, moving the USDG into the vault.
  3. Your Oracle engine balance is credited — usually under a minute.

There are no deposit fees.


Check balance

Keyed to your lowercase 0x address:

GET /v1/balance/{address}
{
  "available": 10000000,
  "locked": 0,
  "total": 10000000
}

All values are in micro-USDG (6 decimals); 1000000 = $1.00. locked = funds held by open orders. The off-chain engine balance is separate from your on-chain USDG — orders consume the credited engine balance, not on-chain USDG directly.


Withdraw

Withdraw any time with POST /v1/withdraw-signed, passing chain: "robinhood" and an EIP-712 Withdraw signature from your EVM key. The operator executes the on-chain transfer for you — you pay no gas.

POST /v1/withdraw-signed
{
  "user": "<your lowercase 0x address>",
  "recipient": "<destination 0x address>",
  "amount": "10000000",
  "chain": "robinhood",
  "nonce": 0,
  "deadline": 1799000000,
  "signature": "<65-byte EIP-712 Withdraw signature>"
}

amount is USDG micro (6 decimals) as an integer string. USDG is transferred to recipient on Robinhood Chain.

Signed struct (EIP-712)

The signature is over the Withdraw typed struct under the PartiVault domain:

domain = { name: "PartiVault", version: "1", chainId, verifyingContract }  // verifyingContract = PartiVault address

Withdraw {
  address user;       // lowercase 0x
  address recipient;  // lowercase 0x
  uint256 amount;     // USDG micro (6 dp)
  uint256 nonce;      // SEQUENTIAL — vault.nonces(user), NOT a timestamp
  uint256 deadline;   // unix seconds; the vault reverts past it
}

⚠️ Withdraws use the SEQUENTIAL on-chain vault nonce — not the order timestamp nonce. Orders carry a monotonic timestamp nonce checked off-chain. A withdraw is verified on-chain by PartiVault, which requires nonce == vault.nonces(user) — a per-user counter that starts at 0 and increments by 1 per confirmed withdraw. Signing a timestamp nonce for a withdraw reverts on-chain with BadNonce ("future nonce") and the funds never move. Read vault.nonces(user) over RPC first (see the RPC column in the environments table), sign the Withdraw struct with that nonce (0 for a first withdraw), then submit.


The vault

Custody is the PartiVault Solidity contract on Robinhood Chain (addresses in the environments table). It holds USDG, exposes an operator withdraw gated by the EIP-712 Withdraw signature above, anchors the settlement root, and publishes solvency getters so anyone can verify backing on Blockscout. Pricing is handled off-chain (Pyth / OpticOdds) — there is no on-chain price feed in the vault.


FAQ

What token do I deposit? USDG (6 decimals) on Robinhood Chain. Nothing else credits on this path.

Is my deposit address custodial? It is a deterministic CREATE2 DepositForwarder tied to your 0x wallet. The watcher deploys-and-sweeps it into the vault; it never leaves Robinhood Chain.

What if the watcher is offline? The forwarder address is deterministic from your 0x wallet, so deposited USDG sits at a recoverable on-chain address. Nothing is lost — sweeping resumes when the watcher comes back.

Why does my balance still show 0 after sending? Confirm you sent USDG on the matching Robinhood Chain (mainnet 4663 / testnet 46630), to the exact address from robinhood-address, and that the amount is ≥ 1 USDG. Other tokens/networks do not credit.