# Transfer tokens gaslessly

{% hint style="info" %}
An API key is required to use the infrastructure to power gasless transactions. Visit  <https://app.rallyprotocol.com/> to generate both Amoy and Mainnet Polygon API keys.&#x20;
{% endhint %}

## Gasless transactions with RLY token&#x20;

{% hint style="success" %}
In this section, we leverage the RLY token ([polygonscan](https://polygonscan.com/token/0x76b8D57e5ac6afAc5D415a054453d1DD2c3C0094)) and our faucet to enable developers to complete a gasless token transfer in just seconds. Use the following code to claim test RLY tokens and transfer it to a destination wallet of your choosing.&#x20;
{% endhint %}

<pre class="language-dart"><code class="lang-dart">import 'package:rly_network_flutter_sdk/network.dart';

//get Amoy config
final amoy = rlyAmoyNetwork;

//add your API Key
amoy.setApiKey(env.API_KEY);

//claim 10 test RLY tokens gaslessly for testing
await amoy.claimRly();

//destination address for testing
final destinationAddress = "0x8D9F6c7Ab1316B613BDdcD1fDbac6025A1323569" 

<strong>//transfer RLY token using ExecuteMetaTransaction
</strong>await amoy.transferExact(
    destinationAddress, 
    BigInt.parse(1), 
    MetaTxMethod.ExecuteMetaTransaction
    );    
</code></pre>

## Getting started with your chosen ERC-20 token

### Prerequisites&#x20;

1. **Contract is compatible with the RallyMobile SDK**
   1. Contracts that are [ERC2771 compatible](/flutter/gasless-transactions/guides/add-erc2771recipient.md#if-you-are-able-to-update-the-contract) are natively supported by the RallyMobile SDK. Those that are not ERC2771 compatible must be whitelisted, [view the guide here.](/flutter/gasless-transactions/guides/add-erc2771recipient.md#if-you-are-able-to-update-the-contract)
2. **Contract natively supports gasless transactions**
   1. Contracts that have the `executeMetaTransaction` or `Permit` method for gasless transactions are natively supported by our SDK. To determine which method is supported by your contract, [view the guide here](/flutter/gasless-transactions/guides/determining-the-gasless-transaction-method.md).&#x20;

{% hint style="info" %}
View our [supported tokens list](https://docs.rallyprotocol.com/resources/supported-tokens) to see if your chosen token is already supported.
{% endhint %}

## Gasless transactions with your chosen ERC-20 token

Use the following code to transfer your chosen token gaslessly.

```dart
import 'package:rly_network_flutter_sdk/network.dart';

//get Amoy config for rally protocol sdk
final amoy = rlyAmoyNetwork;

//add your API Key
amoy.setApiKey(env.API_KEY);

//destination address 
final destinationAddress = "0x...." 

//hex address of token contract
final tokenAddress = "0x...." 

//transfer tokens if the token contract supports executeMetaTransaction 
await amoy.transferExact(
    destinationAddress, 
    BigInt.parse(1), 
    MetaTxMethod.ExecuteMetaTransaction,
    {tokenAddress}
);

//transfer tokens if the token contract supports Permit
await amoy.transferExact(
    destinationAddress, 
    BigInt.parse(1), 
    MetaTxMethod.Permit,
    {tokenAddress}
);
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.rallyprotocol.com/flutter/gasless-transactions/transfer-tokens-gaslessly.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
