# Migrating from GSNv2 to GSNv3
This document outlines the changes to the code for applications to move from GSNv2 to GSNv3
# Needed Modifications to existing apps
# Modifications to GSN-enabled target contracts.
When developing a GSN-enabled contract, the contract to inherit from was renamed from
Note that our
ERC2771Recipient and OpenZeppelin's
ERC2771ContextUpgradeable are essentially the same. You can use whichever you wish.
If you have deployed contracts, you can continue and use the same contract.
Just note that you need to switch to the new
Forwarder. If your contract is Ownable, and has a
setTrustedForwarder() method then use it to update the forwarder.
You should remove the
versionRecipient() method, as we no longer require it.
# Paymaster development
The Paymaster's APIs didn't change, but they do require re-compilation.
# Frontend application
The RelayProvider API was left almost unchanged - you might need to remove network-specific configuration parameters, as we made the configuration simpler, and also read network-specific defaults from the server.
# New ethers-based API
You can experiment with the new APIs that let you work directly with ethers, instead of wrapping
Assuming that you have in your code an ethers contract connected to the network:
myContract = new ethers.Contract(...)
In order to use it with GSN all you need to do is:
gsnContract = await wrapContract(myContract, gsnConfig)
gsnContract now exposes the same API as the original
myContract. Events and view calls are unchanged,
but it will use GSN to make transaction.