# 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](https://docs.rallyprotocol.com/flutter/guides/add-erc2771recipient#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.](https://docs.rallyprotocol.com/flutter/guides/add-erc2771recipient#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](https://docs.rallyprotocol.com/flutter/gasless-transactions/guides/determining-the-gasless-transaction-method).&#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}
);
```
