> For the complete documentation index, see [llms.txt](https://docs.reya.xyz/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.reya.xyz/developers/mainnet/smart-contract-withdrawals.md).

# Smart Contract Withdrawals

You can withdraw funds from Reya Network through the dApp or interact with the smart contracts directly. The deprecated standalone Reya Bridge website is separate from the Socket contracts used by the dApp's USDC withdrawal flow.

This guide covers **rUSD or USDC held directly in your wallet on Reya Network (chain ID `1729`)**. It unwraps wallet rUSD into USDC, then bridges the USDC to your wallet on a destination chain.

## Before you start

Identify where your funds are held:

| Location                                       | Starting point                                                                                                                                                                                  |
| ---------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| rUSD in your wallet on Reya Network            | Follow this guide from step 1.                                                                                                                                                                  |
| USDC in your wallet on Reya Network            | Prepare the route in step 1, then skip the unwrap in step 2.                                                                                                                                    |
| Margin account or Passive Pool / Earn position | Use the corresponding withdrawal flow in the dApp. If you need a direct contract withdrawal, contact support to prepare the account- or pool-specific call before continuing with wallet funds. |

Passive Pool shares are not a fixed amount of rUSD: their redemption value depends on the share price. Do not calculate a share withdrawal by multiplying a desired rUSD amount by `10^30`. Likewise, a minimum output amount is a lower bound, not the actual amount received. Always check the resulting wallet balance before unwrapping or bridging.

Direct contract transactions require **native ETH on Reya Network** for transaction gas and Socket's bridge fee. The dApp's gas sponsorship does not apply to these wallet transactions. If you do not have ETH on Reya Network, contact support for the current funding route before proceeding; do not rely on the deprecated bridge website.

## 1. Prepare the destination and bridge fee

The USDC Socket controller on Reya Network is [`0x1d43076909Ca139BFaC4EbB7194518bE3638fc76`](https://explorer.reya.network/address/0x1d43076909Ca139BFaC4EbB7194518bE3638fc76). The dApp's Periphery uses this same controller for USDC withdrawals.

Choose a destination chain and a receiving address you control on that chain. These **Reya-side connectors** were checked against the deployed Periphery configuration on **12 September 2026**:

| Destination      | Chain ID | Connector on Reya Network                    |
| ---------------- | -------- | -------------------------------------------- |
| Ethereum mainnet | `1`      | `0x807B2e8724cDf346c87EEFF4E309bbFCb8681eC1` |
| Arbitrum One     | `42161`  | `0x3F19417872BC9F5037Bc0D40cE7389D05Cf847Ad` |
| Optimism         | `10`     | `0x321C2Bd69819a43C340b55db40F7c8Eb3334cDe0` |
| Polygon          | `137`    | `0x2aF7a52C1fe0Ef66af0a65d32c6ab4112Db393ED` |

Configuration can change. To refresh it, read `getTokenController(token)` and `getTokenChainConnector(token, chainId)` on the [Periphery](https://explorer.reya.network/address/0xCd2869d1eb1BC8991Bc55de9E9B779e912faF736), using the Reya USDC token address `0x3B860c0b53f2e8bd5264AA7c3451d41263C933F2` and the destination chain ID above. These are read-only calls.

An enabled connector (`validConnectors(connector) = true`) does not by itself prove that relayers are delivering funds. Before unwrapping, confirm recent completed deliveries for the selected route, including the destination token transfer, or ask support to verify it. A successful source transaction alone is insufficient. Explorer history can lag behind the chain; a lack of recent entries is not proof that a route is inactive.

Read `getMinFees(connector, msgGasLimit, payloadSize)` on the Socket controller with:

| Parameter     | Value                                                              |
| ------------- | ------------------------------------------------------------------ |
| `connector`   | The current connector for your destination chain                   |
| `msgGasLimit` | `10000000`                                                         |
| `payloadSize` | `160` (the encoded bridge payload size when `execPayload` is `0x`) |

The returned `totalFees` is the bridge fee in **wei of native ETH on Reya Network**. Quote it again immediately before the bridge transaction. Do not use a fixed `0.01 ETH` or `0.001 ETH` amount: fees change, and excess payment should not be assumed to be refunded. Transaction gas is additional; `msgGasLimit` is the destination message gas limit, not your wallet transaction's gas limit.

## 2. Unwrap wallet rUSD into USDC

Skip this step if the funds are already USDC in your wallet on Reya Network.

Connect the wallet holding the rUSD to Reya Network and call `withdraw(uint256 amount)` on [RUSDProxy](https://usecannon.com/packages/reya-omnibus/latest/1729-main/interact/reya-omnibus/RUSDProxy/0xa9F32a851B1800742e47725DA54a09A7Ef2556A3#selector-0x2e1a7d4d), at `0xa9F32a851B1800742e47725DA54a09A7Ef2556A3`.

Both rUSD and its underlying USDC use **6 decimals**. For example, to unwrap `50 rUSD`, enter `50000000` as the raw `amount`. This burns the wallet's rUSD and returns the same raw amount of USDC to that wallet on Reya Network. It does not bridge funds to another chain.

Wait for confirmation and check your USDC balance at [`0x3B860c0b53f2e8bd5264AA7c3451d41263C933F2`](https://explorer.reya.network/address/0x3B860c0b53f2e8bd5264AA7c3451d41263C933F2). You can import this token into your wallet or read `balanceOf(yourWalletAddress)` on the token contract.

## 3. Bridge the USDC

Refresh the fee quote from step 1. From the wallet holding the USDC, on Reya Network, call `bridge(address,uint256,uint256,address,bytes,bytes)` on the [Socket controller](https://explorer.reya.network/address/0x1d43076909Ca139BFaC4EbB7194518bE3638fc76?tab=write_contract#405e720a):

| Field                          | Value                                                                         |
| ------------------------------ | ----------------------------------------------------------------------------- |
| `receiver`                     | Your receiving wallet address on the destination chain                        |
| `amount`                       | USDC to bridge, in 6-decimal raw units; for example, `50000000` for `50 USDC` |
| `msgGasLimit`                  | `10000000`, matching the fee quote                                            |
| `connector`                    | The current Reya-side connector for your destination chain                    |
| `execPayload`                  | `0x`                                                                          |
| `options`                      | `0x`                                                                          |
| Transaction value / native ETH | The freshly quoted `totalFees`                                                |

If the transaction-value field expects **wei**, enter `totalFees` directly. If it expects **ETH**, divide `totalFees` by `10^18`. Keep the USDC amount separate from this native ETH fee, and do not apply the token's 6-decimal scaling twice.

Review the destination, receiver, amount and fee in your wallet before signing. If the wallet reports a simulation failure or the contract interface does not expose the expected function, ask support to check the call before proceeding.

## 4. Verify delivery

Save the Reya transaction hash and check the bridge's destination execution and the token transfer to your receiving address. The withdrawal is complete when the funds have arrived on the destination chain, not merely when the Reya transaction succeeds.

If delivery is delayed or fails, contact support through Reya's official Discord with the source transaction hash, wallet address and destination chain. Ask support to trace the existing bridge message before submitting another bridge transaction.
