Send meta transactions
This package supports ethers versions 5.7.2 and above, including version 6. It will automatically detect and use the appropriate interface creation syntax for your ethers version.
The API consists of one function at the moment, which is all you need to send meta transactions. You might also choose to import pre-loaded contract configurations or some types.
Sends a meta transaction using a relay server. It's provider agnostic, so it'll take the providers it needs as parameters. The Provider only has to conform to the required interface found on types. See the Configuration type for information on what values you can override.
The provider
argument refers to which network you are connected to and therefore where the meta transaction will be signed. The metaTransactionProvider
argument is where the meta transaction will be executed. E.g: If you want to send a meta transaction to a second layer like Matic by staying connected on Ethereum Mainnet, provider
could be Metamask connected to the Ethereum Mainnet and metaTransactionProvider
could be a provider instantiated with a Matic Mainnet RPC URL.
Definition
async function sendMetaTransaction(
provider: Provider,
metaTransactionProvider: Provider,
functionSignature: string,
contractData: ContractData,
partialConfiguration: Partial<Configuration> = {}
): Promise<string>
Usage
Using ethers for the providers
import {
sendMetaTransaction,
getContract,
ContractName,
ChainId
} from 'decentraland-transactions'
import { ethers } from 'ethers'
const manaConfig = getContract(ContractName.MANAToken, ChainId.MATIC_MUMBAI)
const manaContract = new ethers.Contract(
manaConfig.address,
manaConfig.abi,
provider
)
const txHash = await sendMetaTransaction(
new ethers.providers.Web3Provider(window.ethereum),
new ethers.providers.JsonRpcProvider('https://rpc-mumbai.matic.today'),
manaContract.pupulateTransaction.transfer(to, value),
manaConfig
// ,{ serverURL: 'override.url' }
)
Returns data for a collection of useful Decentraland contracts enum. for the different Ethereum chains. It contains all the information necessary to call sendMetaTransaction
.
Definition
function getContract(contractName: ContractName, chainId: ChainId): ContractData
Usage
getContract(ContractName.MANAToken, ChainId.ROPSTEN)
type Configuration = {
serverURL: string
}
Check configuration.ts to get an up to date snapshot of the current configuration values.
Defines the minimun required interface for a Provider. It tries to accomodate for different lib implementations
export interface EIPProvider {
request: (reqArgs: { method: string; params?: any[] }) => Promise<any>
send?: (method: string, params?: any[]) => Promise<any>
}
export interface LegacyProvider {
send: (method: string, params: any[]) => Promise<any>
}
export type Provider = EIPProvider | LegacyProvider
Supported contract names
enum ContractName {
MANAToken = 'MANAToken'
}
Represents all the information necessary to interact with a contract. If the contract is a proxy and doesn't need the address, you can leave it empty.
type ContractData = {
abi: object[]
address: string
name: string
version: string
chainId: ChainId
}
type DataToSign = {
types: {
EIP712Domain: DomainType[]
MetaTransaction: MetaTransactionType[]
}
domain: DomainData
primaryType: 'MetaTransaction'
message: {
nonce: number
from: string
functionSignature: FunctionSignature
}
}
type DomainData = {
name: string
version: string
verifyingContract: string
salt: string
}
Example using decentraland-connect and ethers to get the providers
import { ethers } from 'ethers'
import { connection, ProviderType } from 'decentraland-connect'
import {
sendMetaTransaction,
getContract,
ContractName,
ChainId
} from 'decentraland-transactions'
async function transferMana() {
try {
const { provider } = await connection.connect(ProviderType.INJECTED)
// For ethers v6:
const txHash = await sendMetaTransaction(
// Connected wallet provider
new ethers.BrowserProvider(window.ethereum),
// L2 matic provider
new ethers.JsonRpcProvider('https://rpc-mumbai.matic.today'),
// Function signature
'0xa9059cbb000000000000000000000000a8d82b0bf686eee78eb5ec882cac98fdd1335ef50000000000000000000000000000000000000000000000000000000000000001',
// Mana contract for MATIC_MUMBAI
getContract(ContractName.MANAToken, ChainId.MATIC_MUMBAI)
)
// For ethers v5:
const txHashV5 = await sendMetaTransaction(
// Connected wallet provider
new ethers.providers.Web3Provider(window.ethereum),
// L2 matic provider
new ethers.providers.JsonRpcProvider('https://rpc-mumbai.matic.today'),
// Function signature
'0xa9059cbb000000000000000000000000a8d82b0bf686eee78eb5ec882cac98fdd1335ef50000000000000000000000000000000000000000000000000000000000000001',
// Mana contract for MATIC_MUMBAI
getContract(ContractName.MANAToken, ChainId.MATIC_MUMBAI)
)
console.log('Result tx hash', txHash)
} catch (error) {
console.error('An error occurred sending the meta tx', error)
}
}
To run the project you need to
npm i
npm run test
npm run build
This repository is protected with a standard Apache 2 license. See the terms and conditions in the LICENSE file.