https://github.com/humanbased-ai/erc20-gasless-adapter
Gasless payment adapter layer for XNY token
https://github.com/humanbased-ai/erc20-gasless-adapter
Last synced: 1 day ago
JSON representation
Gasless payment adapter layer for XNY token
- Host: GitHub
- URL: https://github.com/humanbased-ai/erc20-gasless-adapter
- Owner: humanbased-ai
- Created: 2026-01-15T12:56:09.000Z (5 months ago)
- Default Branch: main
- Last Pushed: 2026-02-27T09:46:06.000Z (4 months ago)
- Last Synced: 2026-06-01T04:29:34.437Z (26 days ago)
- Language: Solidity
- Size: 35.2 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
## Gasless Adapter for Any ERC20
This repository provides a **generic Gasless Adapter module** that adds
ERC2612 (`permit`) and ERC3009 (gasless transfers) support to any
standard ERC20 token.
- **Core base contract**: `GaslessAdapterBase`
- **Standard adapter implementation**: `StandardGaslessAdapter` (deployed via factory)
- **Factory contract**: `GaslessAdapterFactory` (deploys adapters)
- **Standalone extensions**: `ERC2612`, `ERC3009`
The design follows EIP-712 and exposes a full ERC20 interface plus:
- **ERC2612**: `permit`, `nonces`, `DOMAIN_SEPARATOR`
- **ERC3009**: `transferWithAuthorization`, `receiveWithAuthorization`,
`cancelAuthorization`, `authorizationState`
## Quick Start: Deploy via Factory
Deploy a gasless adapter for your ERC20 using the provided Foundry scripts.
### Supported Networks
Currently the repository ships with a pre-deployed factory on:
- **Base Sepolia**
- **Chain ID**: `84532`
- **Factory address**: `0x5e5E52fb594e5F98BD582b309d16FAE02D1e9032`
You can deploy additional factories on other networks if needed.
### 1. Deploy an Adapter via Factory (Foundry)
Use the `DeployAdapterViaFactory` script. Required environment variables:
- `PRIVATE_KEY`: Deployer private key
- `RPC_URL`: RPC endpoint for the target network
- `FACTORY_ADDRESS`: Factory contract address (see above)
- `UNDERLYING_TOKEN`: Underlying ERC20 token address
- `TOKEN_NAME`: EIP712 domain name
- `TOKEN_VERSION`: EIP712 domain version
- `OWNER`: Owner address for the adapter
Example (Base Sepolia):
```shell
export PRIVATE_KEY=your-private-key
export RPC_URL=https://sepolia.base.org
export FACTORY_ADDRESS=0x5e5E52fb594e5F98BD582b309d16FAE02D1e9032
export UNDERLYING_TOKEN=0x... # your ERC20 token
export TOKEN_NAME="MyToken Adapter"
export TOKEN_VERSION="1"
export OWNER=0x... # adapter owner
forge script script/DeployAdapterViaFactory.s.sol:DeployAdapterViaFactory \
--rpc-url $RPC_URL \
--broadcast
```
The script will print the deployed adapter address to the console.
If you prefer to deploy the factory yourself on another network, use:
```shell
export PRIVATE_KEY=your-private-key
export RPC_URL=
forge script script/GaslessAdapterFactory.s.sol:GaslessAdapterFactoryDeploy \
--rpc-url $RPC_URL \
--broadcast
```
Then pass the new factory address as `FACTORY_ADDRESS` when running `DeployAdapterViaFactory`.
## Integrating Your ERC20 with the Adapter
You can integrate in two ways:
1. **Use Factory + SDK** - Deploy via factory.
2. **Write your own adapter contract that inherits `GaslessAdapterBase`** - For custom logic.
### 1. Writing Your Own Adapter on `GaslessAdapterBase`
If you need custom logic, inherit `GaslessAdapterBase` directly:
- Implement `_getUnderlyingToken()` to return the underlying ERC20 address.
- Optionally:
- inherit `Pausable` and override `_requireNotPaused()` to enforce pause,
- inherit `Ownable` or `AccessControl` to restrict admin operations.
The signature verification and allowance handling for ERC2612/3009 are already
implemented in `GaslessAdapterBase`, `ERC2612`, and `ERC3009`.
## EIP-712 Configuration
The EIP-712 domain is configured through the `GaslessAdapterBase` constructor:
- `tokenName`: used as the domain `name`.
- `tokenVersion`: used as the domain `version`.
Frontends and wallets must use these values when constructing EIP-712 payloads
for:
- ERC2612 `Permit`:
- Type hash:
`Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)`
- ERC3009 transfers:
- `TransferWithAuthorization`
- `ReceiveWithAuthorization`
- `CancelAuthorization`
Use the adapter’s `DOMAIN_SEPARATOR()` and `nonces(owner)` view functions when
building client-side signing payloads.
## Foundry Commands
This repository uses Foundry for building and testing.
- **Build**
```shell
forge build
```
- **Test**
```shell
forge test
```
- **Format**
```shell
forge fmt
```
- **Gas Snapshots**
```shell
forge snapshot
```
- **Anvil**
```shell
anvil
```