Transactions

Build a seamless web3 UX by covering users' gas fees through meta-transactions

Background

In-protocol meta transactions allowing for third-party account to initiate and pay transaction fees on behalf of the account. https://github.com/near/NEPs/pull/366

Another hurdle for new users is that they need to pay gas fees to interact with apps. To simplify the experience the platform can cover all gas fees with Meta Transaction. Currently, all on-chain interactions in East are covered. All transactions are signed and will be sent by the users' account and the platform just merely paid for gas fees, don't worry!

How it works

  1. Create an on-chain function calls and wrap them with signedDelegate from @near-js/transactions

  2. Send the signed transaction to a meta tx's relayer

This is best explained by the code below. Do not use the code below for your project, it's only serves to explain NEAR's meta-transactions.

Code Sample

const { Account } = require('@near-js/accounts')
const { JsonRpcProvider } = require('@near-js/providers')
const { PublicKey } = require('@near-js/crypto')
const { InMemorySigner } = require('@near-js/signers')
const {
	actionCreators,
	SCHEMA,
	SignedDelegate,
	encodeSignedDelegate,
} = require('@near-js/transactions')
const { KeyPair, connect } = require('near-api-js')
const { InMemoryKeyStore } = require('near-api-js/lib/key_stores')

const main = async () => {
	const accountId = 'youraccount.near'
	const secretKey = 'redacted'

	const { networkId, nodeUrl } = getConfig('testnet')
	const provider = new JsonRpcProvider({ url: nodeUrl })
	const signer = await InMemorySigner.fromKeyPair(networkId, accountId, secretKey)

	const signerAccount = new Account({ networkId, provider, signer }, accountId)

	const actionDelegate = await signerAccount?.signedDelegate({
		actions: [
			actionCreators.functionCall(
				'ft_transfer',
				{
					receiver_id: 'u.arkana.near',
					amount: '1000000',
				},
				'10000000000000',
				0
			),
		],
		blockHeightTtl: 60,
		receiverId: 'usdt.tether-token.near',
	})

	const delegate = JSON.stringify(Array.from(encodeSignedDelegate(actionDelegate)))

	const res = await axios.post(
		`{arkanaBackendHost}/v2/transaction`,
		{
			delegate,
			account_id: accountId,
		},
		{
			headers: {
				Authorization: {jwtAuth},
			},
		}
	)
}
main()

Last updated