---
title: SubmitGaslessOrder
description: Submitting a signed gasless deposit for the operator to relay on the source chain.
---
```
rpc SubmitGaslessOrder(SubmitGaslessOrderRequest) returns (GaslessSubmission)
```
A gasless order replaces the user's deposit transaction with a signature. The quote must have been requested with `gasless: true`; the user signs an authorization instead of sending a transaction, and an operator wallet submits the deposit and pays the gas. The gas cost is priced into the quote as the `sponsor_gas` fee component, or charged to the partner's [funding balance](/api-reference/partner#funding) when the quote was requested with `sponsor_fees`.
Gasless is available for cross-chain quotes whose source token is not the native asset, on chains where `GetChains` reports `gasless: true`. Same-chain swaps and native deposits are not gasless; `GetQuote` rejects them with `gasless is not supported for this order`.
## Request
Hash of a quote requested with `gasless: true`.
The `order` is a `oneof` matching the source chain's VM.
### EVM: `evm`
The deposit is authorized with a [permit2](https://github.com/Uniswap/permit2) `SignatureTransfer` witness signature. The witness binds the signature to the quote: `HularDeposit(bytes32 quoteHash)` for a plain deposit, `HularSwapDeposit(bytes32 quoteHash, address bridgeToken, uint256 minBridgeOut)` when the quote has a source swap. The spender is the quote's `gasless_router_address`.
Address that signed and whose tokens are pulled.
Unused permit2 nonce chosen by the signer, decimal string.
Unix timestamp the signature expires at. A past deadline is rejected with `signature deadline expired`.
The permit2 witness signature, `0x` hex.
Optional EIP-2612 permit signature approving permit2, for tokens where the owner has no standing permit2 allowance. 65 bytes, `0x` hex.
### Solana: `svm`
A fully user-signed deposit transaction with the quote's `sponsor_address` as fee payer. The API validates it byte for byte (program, treasury, quote hash, amount, compute budget), then the sponsor co-signs and submits it.
## Response
Echoed back.
`pending`, `submitting`, `submitted`, or `failed`.
The relayed deposit transaction, once submitted. Optional.
Failure reason when `status` is `failed`. Optional.
Submission is idempotent per quote hash: calling again returns the current state of the existing submission rather than creating a second one. Poll it until `tx_hash` appears or the status is `failed`; from there the order is tracked like any other deposit with [`GetOrder`](/api-reference/orders#getorder).
## With the SDK
`gaslessSteps` on a chain adapter builds the signature or transaction, submits it, and polls until the deposit is on chain:
```ts
const adapter = createChainAdapter(client, chainStatus, chainId);
const steps = await adapter.gaslessSteps(wallet, quote.quoteHash, quote.orderParams, {
sponsorAddress: quote.sponsorAddress,
});
for (const step of steps) {
const txHash = await step.run();
}
```
## Errors
| Code | Message | When |
| --- | --- | --- |
| `NOT_FOUND` | `quote not found or expired` | Unknown quote hash. |
| `FAILED_PRECONDITION` | `quote is not gasless` | The quote was not requested with `gasless: true`. |
| `FAILED_PRECONDITION` | `insufficient funding balance` | A `sponsor_fees` quote whose partner has no positive funding balance. |
| `INVALID_ARGUMENT` | `signature deadline expired` | The EVM deadline is in the past. |
| `INVALID_ARGUMENT` | `invalid transaction: ...` | The Solana transaction does not match the quote exactly. |
| `INVALID_ARGUMENT` | `expected an evm order` / `expected an svm order` | The order case does not match the source chain's VM. |