# Transact with a contract 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 %}

## Contract requirements &#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 by us, [view the guide here.](https://docs.rallyprotocol.com/flutter/guides/add-erc2771recipient#if-you-are-able-to-update-the-contract)

## Transact with contracts with the relay method

To gaslessly execute a transaction with a contract, create a [GSN transaction object](https://github.com/rally-dfs/rly-network-mobile-sdk/blob/736e1de0859bec5230abba80e978f76f43fe2123/src/gsnClient/utils.ts#L16) and use the `relay()` method to send the transaction to our relayer.

```dart
final gsnTx = GsnTransactionDetails(
    from: accountAddress,
    data: tx.data,
    value: "0",
    to: contractAddress,
    gas: gas.toString(),
    maxFeePerGas: maxFeePerGas.toString(),
    maxPriorityFeePerGas: maxPriorityFeePerGas.toString(),
    );

await amoy.relay(gsnTx)


// relay arbitrary tx through our gasless relayer. see complete example at
// https://github.com/rally-dfs/flutter-example-app/tree/main/app/lib/services/nft.dart
```
