How to use Defender Relayer Provider properly to pay for someone elses transaction?

My understanding of Defender was, that I could use them to let someone else pay for a transaction that was signed with another account.

Lets say:

0xAccountA sends ERC1155-tokens to 0xAccountB, but 0xAccountC is paying for that.

In order to achieve this, I did the following:

Given is apiKey and secretKey as response from

const key = await relayClient.createKey(relayerId);

Then I did:

    const credentials = { apiKey: apiKey, apiSecret: secretKey };

    const provider = new DefenderRelayProvider(credentials);
    const signer = new DefenderRelaySigner(credentials, provider, { speed: 'fast' });

    console.log("Signer", await signer.getAddress())
    const contract = new ethers.Contract(contractAddress, abi, signer);

    tx = await contract.functions.safeTransferFrom(from, to, tokenId, amount, nullBytes);

I think, the misconception of my thoughts is, that the Signer must be the From-address, because from owns the tokens. But sending the transaction must be done with the Relayer-Account, which shall pay for that.

How can I achieve that from is signing the transaction but the Relayer-Account is paying for it?

:computer: Environment

"defender-relay-client": "^1.30.0",
"ethers": "^5.6.0",


see above

:1234: Code to reproduce

see above

You can follow the steps in this guide to set up a gasless meta-transaction. There are a few additional components that are needed to make all this happen.

According to this guide, it looks like Relayer is only working with SmartContracts that support ERC2771 in conjunction with MinimalForwarder.
Does this mean for "normal" ERC1155-contracts which do not support ERC2771 this won't work?

If you're looking to replicate the meta-transaction functionality in the guide, those components are necessary.

Thank's a lot for explanation. Is there any other way to pay for a transaction of someone else on conventional contracts without ERC2771-support?