Fee Sponsorship - Relay

What is Fee Sponsorship?

Fee Sponsorship allows you to cover the destination chain fees for your users’ Relay transactions. By sponsoring these fees, you can reduce costs for your users and create a more seamless experience. This is particularly valuable for onboarding new users or providing a premium experience for your application.

Fee sponsorship covers all destination chain fees (including gas topup amounts), but not the origin chain gas fee. Users will still need to pay the gas required to submit their transaction on the origin chain.

Requirements

Before you can sponsor transactions, you need:

  1. An API key — Required to authenticate your sponsorship requests and associate them with your app balance. Create one in the Relay Dashboard; see API keys and Rate Limits for details.
  2. A Fee Sponsorship Wallet — A wallet linked to your API key that funds your app balance. Link one from the App Balance page in the Relay Dashboard by signing a message to prove ownership — no gas required.
  3. Sufficient App Balance — Your app balance must have enough funds to cover the fees you wish to sponsor.

Once you’re set up, you can begin depositing funds and sponsoring transactions.

Funding Your App Balance

There are two ways to deposit funds to your app balance:

Option 1: Use the Relay App UI

The simplest way to deposit funds is through the Relay App Balance UI. This provides a user-friendly interface for managing your balance.

Option 2: Direct On-Chain Deposit

You can programmatically deposit to your app balance by sending a transaction on Base to the Relay solver. This method involves appending specific calldata in place of the request ID to identify the deposit.

How It Works

When you transfer funds to the solver using specific calldata, Relay treats it as a deposit to your app balance. This method uses a fixed 12-character prefix and suffix (012345abcdef) with the middle portion specifying which address to credit:Calldata Format:

0x[prefix][address-to-credit][suffix]

Examples

Calldata Behavior
0x012345abcdef0000000000000000000000000000000000000000012345abcdef Credits msg.sender
0x012345abcdefd5c0d17ccb9071d27a4f7ed8255f59989b9aee0d012345abcdef Credits 0xd5c0d17ccb9071d27a4f7ed8255f59989b9aee0d

The ability to specify a different address is useful for building auto-topup systems or having more granular control over which accounts receive deposits.

Solver Address

Deposits should be sent to the Relay solver on Base:

Network Address
Base 0xf70da97812cb96acdf810712aa562db8dfa3dbef

TypeScript Example

import { erc20Abi, encodeFunctionData, createWalletClient } from 'viem'
import { base } from 'viem/chains'

const BASE_USDC_ADDRESS = '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913' as const
const RELAY_BASE_SOLVER_ADDRESS = '0xf70da97812cb96acdf810712aa562db8dfa3dbef' as const
const REQUEST_ID_PREFIX = '012345abcdef'

const walletClient = createWalletClient({
  chain: base,
  transport: custom(window.ethereum!),
})

const [userAddress] = await walletClient.getAddresses()

const amountInWei = '100000000' // 100 USDC

// Encode the transfer function call
const transferData = encodeFunctionData({
  abi: erc20Abi,
  functionName: 'transfer',
  args: [RELAY_BASE_SOLVER_ADDRESS, amountInWei]
})

// Add custom calldata to credit the wallet address
const customCalldata =
  `${REQUEST_ID_PREFIX}${userAddress.slice(2)}${REQUEST_ID_PREFIX}` as `0x${string}`

const hash = await walletClient.sendTransaction({
  to: BASE_USDC_ADDRESS,
  data: `${transferData}${customCalldata}`,
  account: userAddress,
  chain: base
})

Checking Your App Balance

Verify your available balance using the Get App Fee Balances API:

Request

curl --location 'https://api.relay.link/app-fees/{your-wallet-address}/balances'

Response

{
  "currency": {
    "chainId": 8453,
    "address": "0x0000000000000000000000000000000000000000",
    "symbol": "USDC",
    "name": "USDC",
    "decimals": 6
  },
  "amount": "75021651210714015",
  "amountFormatted": "0.075021651210714015",
  "amountUsd": "116.235557",
  "minimumAmount": "75021651210714015"
}

Sponsoring Transactions

Once your app balance is funded, you can sponsor transactions by including specific parameters in your quote requests.

Required Header

Header Type Description
x-api-key string Your API key, required to authenticate sponsorship requests and associate them with your app balance.

Sponsorship Parameters

Add these parameters to your Get Quote API request:

Parameter Type Description
subsidizeFees boolean Set to true to have the sponsor pay for all fees associated with the request, including gas topup amounts.
maxSubsidizationAmount string (Optional) The maximum amount to subsidize in USDC with 6 decimal places (e.g., "1000000" = $1.00). If the total fees exceed this threshold, the sponsor pays up to the cap and the user pays the remainder.
subsidizeRent boolean (Optional) Set to true to sponsor Solana ATA rent fees. Requires subsidizeFees to also be enabled. See Solana Fee Sponsorship.
depositFeePayer string (Optional) A Solana address to pay deposit transaction fees for Solana origin transactions. See Solana Fee Sponsorship.
sponsoredFeeComponents string[] (Optional) You can also choose to sponsor specific Relay fees for your users using the sponsoredFeeComponents parameter. This allows integrators to selectively cover different fee types (such as gas fees or relayer fees) while still collecting app fees.

Example Request

cURL

curl -X POST \
  'https://api.relay.link/quote' \
  -H 'Content-Type: application/json' \
  -H 'x-api-key: your-api-key' \
  -d '{
    "user": "0xF0AE622e463fa757Cf72243569E18Be7Df1996cd",
    "originChainId": 8453,
    "originCurrency": "0x0000000000000000000000000000000000000000",
    "destinationChainId": 10,
    "destinationCurrency": "0x0000000000000000000000000000000000000000",
    "tradeType": "EXACT_INPUT",
    "recipient": "0xF0AE622e463fa757Cf72243569E18Be7Df1996cd",
    "amount": "100000000000000000",
    "subsidizeFees": true,
    "maxSubsidizationAmount": "5000000"
  }'

In this example:

How maxSubsidizationAmount Works

The maxSubsidizationAmount parameter acts as a spending cap for fee sponsorship:

This protects you from unexpectedly high costs during network congestion or volatile market conditions, while still providing partial sponsorship benefit to your users.

Solana Fee Sponsorship

Solana transactions involve unique cost structures that differ from EVM chains. In addition to standard transaction fees, Solana requires rent payments for creating new accounts, such as Associated Token Accounts (ATAs). Relay provides specific parameters to handle these costs.

Understanding Solana Rent

When a user receives a token on Solana for the first time, an Associated Token Account must be created to hold that token. This account creation requires a rent payment (approximately 0.002 SOL). Without sponsorship, this cost falls on the user.

Sponsoring Destination Rent with subsidizeRent

The subsidizeRent parameter allows you to sponsor the rent fees for ATA creation on Solana destination transactions.

Parameter Type Description
subsidizeRent boolean Set to true to have the sponsor pay for Solana rent fees associated with ATA creation on the destination chain.

Example Request

cURL

curl -X POST \
  'https://api.relay.link/quote' \
  -H 'Content-Type: application/json' \
  -H 'x-api-key: your-api-key' \
  -d '{
    "user": "0xF0AE622e463fa757Cf72243569E18Be7Df1996cd",
    "originChainId": 8453,
    "originCurrency": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
    "destinationChainId": 792703809,
    "destinationCurrency": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
    "tradeType": "EXACT_INPUT",
    "recipient": "9aUn5swQzUTRanaaTwmszxiv89cvFwUCjEBv1vZCoT1u",
    "amount": "10000000",
    "subsidizeFees": true,
    "subsidizeRent": true,
    "maxSubsidizationAmount": "5000000"
  }'

Sponsoring Origin Deposits with depositFeePayer

For transactions originating from Solana, you can designate an alternative account to pay the transaction fees and rent for the deposit transaction using depositFeePayer.

Parameter Type Description
depositFeePayer string A Solana address that will pay the transaction fees and rent for deposit transactions on Solana. This account must have sufficient SOL to cover these costs. Must be different from the user address.

Example Request

cURL

curl -X POST \
  'https://api.relay.link/quote' \
  -H 'Content-Type: application/json' \
  -H 'x-api-key: your-api-key' \
  -d '{
    "user": "9aUn5swQzUTRanaaTwmszxiv89cvFwUCjEBv1vZCoT1u",
    "originChainId": 792703809,
    "originCurrency": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
    "destinationChainId": 8453,
    "destinationCurrency": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
    "tradeType": "EXACT_INPUT",
    "recipient": "0xF0AE622e463fa757Cf72243569E18Be7Df1996cd",
    "amount": "10000000",
    "depositFeePayer": "YourFeePayerSolanaAddressHere"
  }'

Solana Sponsorship Summary

Parameter Direction Funding Source Use Case
subsidizeFees + subsidizeRent To Solana (destination) App Balance Sponsor destination gas and ATA rent when users receive tokens on Solana
depositFeePayer From Solana (origin) Specified Solana wallet Sponsor origin transaction fees when users deposit from Solana

What Fee Sponsorship Does Not Cover

Fee sponsorship is designed to cover relay and execution costs, but certain fees remain outside its scope:

Fees Object

When you sponsor transactions, the quote response includes a fees object with a subsidized field showing the fees covered by your sponsorship:

{
  "fees": {
    "relayerService": "...",
    "relayerGas": "...",
    "relayer": "...",
    "app": "...",
    "subsidized": {
      "amount": "500000",
      "amountUsd": "0.50"
    }
  }
}

For more details on the fee structure, see Relay Fees.

Best Practices

  1. Monitor Your Balance — Set up alerts or automated checks to ensure your app balance doesn’t run dry during high-traffic periods.
  2. Use maxSubsidizationAmount — Always set a reasonable cap to protect against unexpected fee spikes.
  3. Consider Auto-Topup — For production applications, consider implementing an auto-topup system using the direct onchain deposit method.
  4. Track Sponsored Transactions — Use the Get Requests API to monitor your sponsored transaction history and costs.