Are you an LLM? Read llms.txt for a summary of the docs, or llms-full.txt for the full context.
Skip to content

withdraw3

Sends USDC only from the perp account to an Arbitrum address via Bridge2. The frontend never calls the Bridge2 contract for this path — the node records the withdrawal and Bridge2 releases USDC after the protocol delay.

Direct EIP-712, signed by the account key. An agent cannot withdraw.

POST/exchangetype withdraw3

Withdraw USDC from the perp account to an Arbitrum address.Direct EIP-712, signed by the account key

Action fields
amountstringrequired

Decimal USDC amount. Minimum is `2`. A flat 1 USDC withdrawal fee is charged on top of the amount sent out.

apiVersioninteger · uint32required

TxFlow signing API version.

chainIdinteger · uint32required

TxFlow chain ID.

destinationstring · addressrequired

Arbitrum address that receives USDC. Must be non-zero.

nonceinteger · uint64required

Fresh millisecond timestamp. Direct EIP-712 actions carry the nonce inside the action as well as in the outer payload; the two must match.

signatureChainIdstringrequired

Hex string (no `0x`) of the EVM chain the wallet is connected to when signing. Testnet Bridge2 is Arbitrum Sepolia (`421614` → `66eee`); mainnet is Arbitrum One. Distinct from the action `chainId`, which is the TxFlow chain.

tokenAddressstring · addressrequired

TxFlow-side USDC contract. Withdrawals are USDC-only. The TypeScript SDK fills this from the network preset.

txflowNetworkstringrequired

TxFlow network name used by the EIP-712 action and domain.

typestringrequired

Must be `withdraw3`.

"withdraw3"
Request example
curl -X POST https://rpc.txflow-testnet.xyz/exchange \
  -H "Content-Type: application/json" \
  -H "x-api-version: 2026-08-16" \
  -d '{
  "action": {
    "type": "withdraw3",
    "txflowNetwork": "TxFlow-Testnet",
    "chainId": 2511,
    "apiVersion": 1,
    "destination": "0x0202020202020202020202020202020202020202",
    "signatureChainId": "66eee",
    "tokenAddress": "0xd04f0d19E8FbA49cfA541E272F9C60a2ad720464",
    "amount": "10",
    "nonce": 1757992743994
  },
  "signature": {
    "r": "0x<r>",
    "s": "0x<s>",
    "v": 27
  },
  "nonce": 1757992743994,
  "vaultAddress": null,
  "signatureChainId": null
}'
Try it
testnet · no account yet
Generates a throwaway key in your browser, claims testnet USDC and authorizes an agent key. The account is kept while you browse the docs and lost on reload.
Response · Withdraw3 200
codeinteger

`0` on success.

dataobject
dataobject
typestring

The action's internal name, which does not always match the request `type`.

"Withdraw3"
statusstring

A rejected request returns `err` with a non-zero `code` and the reason in `message` (or `response`).

"ok"
Response example
{
  "status": "ok",
  "code": 0,
  "data": {
    "type": "Withdraw3",
    "data": {
      "statuses": [
        "success"
      ]
    }
  }
}

The TypeScript SDK fills tokenAddress from the network preset (TXFLOW_USDC_TOKEN_ADDRESS). Callers only supply destination, amount, and optionally which Arbitrum network the wallet is on.

Preconditions

ConstraintDetail
Minimum amount2 USDC
FeeFlat 1 USDC, charged regardless of destination chain in the product UI; this action itself always pays out on Arbitrum
TokenTxFlow USDC contract only — other assets go through tokenSend + TxRelay
DestinationNon-zero Arbitrum address

signatureChainId on the action is a hex string of the wallet's connected EVM chain (Arbitrum Sepolia 421614 → 66eee on testnet). The action chainId remains the TxFlow chain (2511 / 869). The envelope may also set numeric signatureChainId for the EIP-712 domain.

Signing

Withdraw3(string txflowNetwork,address destination,string signatureChainId,address tokenAddress,string amount,uint64 nonce)

See Signing. Multi-sig accounts cannot single-sign this action.

Next steps

Track status with userNonFundingLedgerUpdates. For Ethereum, Base, Polygon, Solana, or other non-Arbitrum destinations, use TxRelay deposit-address plus tokenSend instead of withdraw3.