The deposit address feature is not available on mainnet yet.
Please contact us with the details of your use case if you are interested in using it and we can set you up with testnet access.

Introduction

To bridge funds through Rhino you would normally need to generate a quote, commit it and then interact with the bridge contract on the origin chain to initiate the bridge. However, this is not always an option for all use cases where a smart contract interaction is not possible or very inconvenient.
To also cater to those use casas, Rhino supporting bridging through manual transfers.

How it works

1

Generate address

Call our API with deposit chain, destination chain and destination address.

2

Transfer funds

Make a standard ERC20 transfer to the generated address.

3

Receive funds

After the deposit has been confirmed on chain, the funds will be automatically bridged to the specified destination.

Deposit addresses are reusable and can be used for multiple bridges indefinetely (see cavehats below).

This makes bridging accessible to any wallet or app that supports standard ERC20 transfers.

Deposit address expiration

To conserve resources when monitoring deposit addresses, we will stop monitoring addresses that have not been used for a certain period of time. This is basically a timer that runs down from initial creation and is reset whenever a bridge is performed through an address.
An inactive deposit address can still be used for bridging by manually reactivating it through the API if it is needed. Funds that are sent to an inactive deposit address are not lost, they will only require one API call to activate the address and initate a bridge for the transfers made while inactive.

Supported chains

The general bridge config endpoint provides a boolean enabledDepositAddress flag that can be used to find chains that deposit addresses are enabled for. Example:

const response = await fetch('https://api.rhino.fi/bridge/configs')

The response will then specify which chains have deposit addresses enabled:

{
  "ETHEREUM": {
    "name": "Ethereum",
    ...,
    "enabledDepositAddress": true,
  },
  "SOLANA": {
    "name": "Solana",
    ...,
    "enabledDepositAddress": false,
  },
}

API interactions

The following examples showcase the use of our API to manage deposit addresses. All those calls require authentication, see details on this here.

Generating a deposit address

You can generate new deposit addresses with the following API call:

const response = await fetch('https://api.rhino.fi/bridge/deposit-addresses', {
  method: 'POST',
  body: JSON.stringify({
    depositChains: ['ETHEREUM'],
    destinationChain: 'BASE',
    destinationAddress: '0x123...',
  }),
  headers: {
    'Content-Type': 'application/json',
    'authorization': 'YOUR_JWT',
  },
})

The response will then look like this:

[{
  "depositChain": "ETHEREUM",
  "depositAddress": "0x456...",
  "destinationChain": "BASE",
  "destinationAddress": "0x123...",
  "supportedTokens": [
    {
      "symbol": "USDT",
      "address": "0x789...",
    }
  ],
  "isActive": true,
}]

The first highlighted line contains the generated deposit address. Funds can be sent there to be bridged.
However, only tokens from the supportedTokens list will be processed. Transfers of tokens that are not in this list will not be processed. If this happens, funds can be returned through our customer service.

Multiple deposit chains

You can provide multiple deposit chains in the request. The API will then generate one deposit address that can be used on all the provided chains. This is why the response is also a list - one element for each chain provided. The deposit addresses in the individial elements will be identical in this case.
Please note that providing multiple deposit chains only works for EVM chains currently. Only then can the same address be used for all of them.

Checking deposit address status

You can also check the current status of a deposit address with the following call:

const depositAddress = '0x123...'
const depositChain = 'ETHEREUM'
const response = await fetch(`https://api.rhino.fi/bridge/deposit-addresses/${depositAddress}/${depositChain}`, {
  headers: {
    'authorization': 'YOUR_JWT',
  },
})

The response format will be the same as the one returned when generating a new deposit address with the exception of the destinationAddress. That field will only be included if the request was made with a secret API key.

Reactivating a deposit address

If the isActive flag returned by the status check is false you can reactivate the dposit address manually with the following call:

const depositAddress = '0x123...'
const depositChain = 'ETHEREUM'
const response = await fetch(`https://api.rhino.fi/bridge/deposit-addresses/${depositAddress}/${depositChain}/activate`, {
  method: 'PATCH',
  headers: {
    'authorization': 'YOUR_JWT',
  },
})

This will cause the address to be monitored again. Additionally the address will be checked for transfers since the last activity to process transfers made while the address was inactive.