The GasTank Module eliminates the need for a user to hold gas tokens in their EOAs, which is required for executing a transaction. To achieve this goal, the Module offers the following two key functionalities:
-
Transaction Execution: The GasTank Module facilitates the execution of transactions within a specific Safe. These transactions are initiated using the Gelato Network relayer, allowing them to be executed without the user being burdened with gas requirements.
-
Gelato Fee Payment: To cover the Gelato Network relaying services fees, the GasTank Module retrieves the necessary tokens from a Safe designated as the "GasTank". Depending on the organization's setup, it could either be the Safe where the transaction originated or an external Safe (Use case: one GasTank to pay for many Safe's fees).
There are two options to pay for the Relaying fee, depending on where the GasTank is located:
-
Option 1: same Safe from which the transaction is executed In this case, the transaction executor must be an owner. It is required to sign a series of parameters authorizing the payment of fees from the GasTank.
-
Option 2: a different Safe The user must be added as a delegate or owner of the GasTank and authorize fee payment.
To put it simply, the GasTank Module addresses the gas expenses incurred during the execution of transactions within a Safe by utilizing tokens to cover Gelato's relayer service fees. It provides users with the option to use the same Safe for execution or a different one, as long as they meet the authorization requirements, thus offering flexibility.
The Smart Contract is designed as a singleton, which means that it can be shared between different Safes, eliminating the need for each Safe to deploy its own module.
To authenticate the sender and validate the authorization to pay the fees, two signatures are required.
-
required by Gelato to authenticate the sender of the relayed transaction, which then is appended to the calldata passed to the module.
-
Validate that the sender is whether an Owner or a delegate of the GasTank, and is authorized to pay the fees using a given token up to a maximum amount. To achieve this, the module relies on the ERC-721 signature and uses the following schema:
- EIP721Domain
{
EIP712Domain: [
{ name: 'name', type: 'string' },
{ name: 'version', type: 'string' },
{ name: 'chainId', type: 'uint256' },
{ name: 'verifyingContract', type: 'address' }
]
}
- AllowedFee
{
AllowedFee: [
{ name: 'gasTank', type: 'address' },
{ name: 'token', type: 'address' },
{ name: 'maxFee', type: 'uint256' },
{ name: 'nonce', type: 'uint16' }
]
}
To authorize a non-owner to use a GasTank (a Safe) to pay for the transaction of a different Safe, the non-owner account
must be set as a delegate
of the GasTank and indicate which token this new delegate is allowed to use.
For this, the following steps should be followed:
- Enable the GasTankModule on the GasTank.
- Call the
GasTankModule.addDelegate(address _delegate)
from GasTank. - Call the
GasTankModule.addTokenAllowance(address _delegate, address _token)
from the GasTank for each token the given delegate is allowed to use
The module would be available on the same address for all the networks where Gelato is and also the Safe.
GasTankModule address: 0x150EfE6b6E093D625313cAe5E7083a4C57fb9BA0
Having issues? See the troubleshooting section.
First, run the command below to get foundryup
, the Foundry toolchain installer:
curl -L https://foundry.paradigm.xyz | bash
If you do not want to use the redirect, feel free to manually download the foundryup installation script from here.
Then, run foundryup
in a new terminal session or after reloading your PATH
.
Other ways to use foundryup
can be found in the
documentation. Happy forging!
yarn install
forge install
Create an .env
file using .env.example
as a template, then run.
yarn test
This project is licensed under Business Source License 1.1.