# 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 %}

```csharp
//get amoy config
var amoy = NetworkProvider.RlyAmoy;

//add your API Key (can also be chained)
amoy.WithApiKey(env.API_KEY);

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

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

//transfer RLY token
await amoy.TransferExact(
  destinationAddress,
  new BigInteger(1),
  MetaTxMethod.ExecuteMetaTransaction
);
```

## Getting started with your chosen ERC-20 token

### Contract requirements&#x20;

1. **Contract is compatible with the RallyMobile SDK**
   1. Contracts that are [ERC2771 compatible](https://docs.rallyprotocol.com/unity/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/unity/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/unity/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 token is already supported.
{% endhint %}

## Gasless transactions with your chosen ERC-20 token

Use the following code to transfer your chosen token gaslessly.

```csharp
//get amoy config
var amoy = NetworkProvider.RlyAmoy;

//add your API Key (can also be chained)
amoy.WithApiKey(env.API_KEY);

//destination address for testing
var destinationAddress = "0x...." 

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

//transfer tokens if the token contract supports executeMetaTransaction 
await amoy.TransferExact(
  destinationAddress,
  new BigInteger(1),
  MetaTxMethod.ExecuteMetaTransaction,
  {tokenAddress}
);

//transfer tokens if the token contract supports Permit 
await amoy.TransferExact(
  destinationAddress,
  new BigInteger(1),
  MetaTxMethod.Permit,
  {tokenAddress}
);
```
