Skip to main content
Transaction fees are one of the biggest UX barriers in crypto. With Rhinestone’s fee sponsorship, you deposit USDC once and the SDK covers gas, bridging, and swap fees for your users across any supported chain. No per-chain setup required. This tutorial builds on the Quickstart. You’ll need a working smart account setup before continuing.

Prerequisites

Steps

1

Top up your sponsorship balance

Open the Rhinestone dashboard and go to the Sponsorship tab.Press Deposit, enter an amount of USDC, and confirm the transaction in your wallet. Your balance updates automatically once the transaction is confirmed.
On testnets, sponsorship works out of the box with no deposit required. For production, reach out to get your deposit address set up.
2

Send a sponsored transaction

Add sponsored: true to your sendTransaction call:
const result = await account.sendTransaction({
  sourceChains: [arbitrum],
  targetChain: base,
  calls: [
    {
      to: recipientAddress,
      value: 0n,
      data: '0x',
    },
  ],
  sponsored: true,
})

const status = await account.waitForExecution(result)
console.log('Transaction settled:', status)
Your user signs once. The Rhinestone orchestrator deducts the fees from your sponsorship balance and the user pays nothing.
3

Sponsor selectively (optional)

You can choose which fee types to cover:
const result = await account.sendTransaction({
  sourceChains: [arbitrum],
  targetChain: base,
  calls: [...],
  sponsored: {
    gas: true,
    bridging: true,
    swaps: false,
  },
})
Or apply sponsorship conditionally on your backend. For example, only sponsor transactions that interact with your app’s contract:
function shouldSponsor(calls: { to: string }[]): boolean {
  const appContract = '0xYourContractAddress'
  return calls.some((call) => call.to.toLowerCase() === appContract.toLowerCase())
}

const calls = [{ to: '0xYourContractAddress', value: 0n, data: encodedCalldata }]

const result = await account.sendTransaction({
  sourceChains: [arbitrum],
  targetChain: base,
  calls,
  sponsored: shouldSponsor(calls),
})

Next steps