Skip to main content
Gasless Swaps: the token they’re swapping is all they need. Users swap with what they hold. Fees come out of the swap, or you cover them. Every swap has a hidden prerequisite: gas. Holding the right native token, on the right network, at the right time is friction your users shouldn’t have to think about. For users who arrive holding only the token they want to swap, it’s a dead end. Gasless Swaps remove the prerequisite. The user signs, the swap executes, and the input token covers everything: fees come out of the swap itself, so someone holding only USDC can swap it without holding anything else. If you’d rather your users pay nothing at all, cover the fees from your app balance instead. It keeps the intake side of your product open: users bring whatever token they hold, and you settle in the asset you run on.

One integration, three paths

Gasless Swaps work with the wallets you already have:
  • External wallets: The user signs a message offchain and the swap executes from there. No approval transaction, no gas. USDC is fully gasless out of the box; other tokens need a one-time approval.
  • ERC-4337 smart accounts: Already on smart accounts? Submit the operation through Relay instead of a bundler, and Relay covers the gas.
  • Embedded and custodial wallets: EIP-7702 delegation makes the approval and the swap one atomic, gasless action with any token.
The decision tree below picks the right path for your setup.

How it works

  1. Quote: Request a swap quote as normal.
  2. Sign: The user signs offchain. No transaction to send, no gas to pay.
  3. Execute: Relay submits the swap and handles the gas.
  4. Receive: The user gets the output token, with fees deducted from the swap or covered by you.

Why it matters

For integrators

  • Serve users who hold one token. That’s most users, most of the time.
  • Remove the approval-and-gas dance. One signature replaces the multi-step setup that loses users.
  • Choose the cost model. Deduct fees from the swap itself, or sponsor them for a free experience.
  • Skip paymaster and bundler infrastructure. The paths above all use one API.

For your users

  • Swap what they hold. No native gas token required.
  • Sign once. No approval transaction, setup, or dead end.

Who it’s for

  • Wallets and wallet infrastructure: Make the swap button work for users who hold a single token.
  • Onchain apps: Keep users swapping with the balance they already have instead of stalling when they run out of gas.
  • DEXes and aggregators: Offer routes users can complete, whatever token they hold.

What to watch

Same-chain Gasless Swaps require you to sponsor the fees. Same-chain swaps route directly through DEXes, so Relay cannot deduct gas fees before the user receives the destination token. On the external-wallet path, tokens without permit support need a one-time approval transaction. For stablecoin conversions at exactly 1:1, pair Gasless Swaps with Price Stabilization and Fee Sponsorship.

What solution is right for me?

There are many different solutions when it comes to implementing a gasless swap experience. We’ve put together a decision tree below to help you arrive at the solution that best fits your application.
Same-chain gasless swaps are only supported if you sponsor the fees. Same-chain swaps route directly through DEXes, due to this the solver never has an opportunity to deduct the gas fees before the user gets the destination token.

Permit-based Gasless

Use this approach when your app does not control the user’s wallet (e.g. MetaMask, Rainbow, or any external EOA). The user signs an off-chain EIP-3009 or Permit2 message, and Relay’s solver handles everything else — no approval transaction, no gas.
USDC is fully gasless. Other ERC20 tokens require a one-time approval transaction.

How it works

1

Get a quote

Call /quote/v2 with usePermit: true
2

Sign the permit

Prompt the user to sign an EIP-712 typed-data permit message (off-chain, no gas)
3

Submit to Relay

Submit the signed permit to Relay
4

Fulfillment

Relay’s solver withdraws tokens from the user’s EOA and fulfills the destination transaction

Fees

You can choose to subsidize all destination fees by passing subsidizeFees: true to the quote api (this effectively subsidizes the first time approval). The user still needs to pay for the origin gas fee. For subsidizing fees you’ll need to make sure you have fee sponsorship set up. See the full working example: byo-eoa-permit

ERC-4337 Gasless

Use this approach if your app already uses ERC-4337 smart accounts. ERC-4337 UserOperations normally require gas fees, either paid by the sender or a paymaster. With Relay, you set all gas fee fields to 0 and submit the handleOps call via Relay’s /execute endpoint instead of directly to the EntryPoint. Relay’s relayer submits the transaction and covers the gas.

originGasOverhead

Pass originGasOverhead: 300000 in the /quote/v2 request. This tells Relay how much additional gas the UserOperation adds over a normal EOA transaction, used during simulation to accurately price the fee.

How it works

1

Get a quote

Call /quote/v2 with originGasOverhead: 300000 to get deposit transaction details
2

Build the UserOperation

Build a UserOperation that batches approve + deposit calls via executeBatch
3

Zero out gas fields

Set maxFeePerGas and maxPriorityFeePerGas to 0
4

Sign the UserOperation

Sign the UserOperation with the account owner key
5

Submit via Relay

Encode an EntryPoint.handleOps() call and submit it via POST /execute with subsidizeFees: true
6

Monitor

Poll /intents/status/v3 until the bridge completes

Fees

You can choose to subsidize origin fees: pass subsidizeFees: true to the execute api executionOptions. You can choose to subsidize destination fees: pass subsidizeFees: true to the quote api. You can choose to subsidize both or none of these. If not subsidized the user pays from the output token. For subsidizing fees you’ll need to make sure you have fee sponsorship set up. See the full working example: 4337-gasless

7702 BatchExecutor

Use this approach when your app controls an embedded or custodial wallet and you want gasless execution with any ERC-20 token — not just permit-compatible ones. This leverages EIP-7702 to delegate the user’s EOA to a BatchExecutor contract (Calibur or similar), enabling atomic approve + deposit in a single call.

originGasOverhead

Pass originGasOverhead: 80000 in the /quote/v2 request. This tells Relay how much additional gas the Calibur execute() wrapper adds over the raw inner calls (EIP-712 signature verification, batch dispatch, nonce check). This is lower than ERC-4337’s 300000 because there’s no EntryPoint or UserOp validation overhead.
The 80000 value is specific to Calibur. Different BatchExecutor contracts may have different gas overheads — adjust this value based on the implementation you use.

How it works

1

Check delegation

Check if the user’s EOA is already delegated to the BatchExecutor via EIP-7702
2

Get a quote

Call /quote/v2 with originGasOverhead: 80000 to get deposit transaction details
3

Build the batch

Build a BatchedCall that atomically combines approve() and deposit()
4

Sign the authorization

Sign an EIP-7702 authorization (off-chain, no gas) delegating the EOA to the BatchExecutor
5

Submit via Relay

Submit via POST /execute targeting the user’s EOA

Fees

You can choose to subsidize origin fees: pass subsidizeFees: true to the execute api executionOptions. You can choose to subsidize destination fees: pass subsidizeFees: true to the quote api. You can choose to subsidize both or none of these. If not subsidized the user pays from the output token. For subsidizing fees you’ll need to make sure you have fee sponsorship set up. See the full working example: 7702-batch-executor