Skip to content

Instantly share code, notes, and snippets.

@mikroskeem
Created June 22, 2025 01:36
Show Gist options
  • Save mikroskeem/311ac268956338b4df76ae8e8510beec to your computer and use it in GitHub Desktop.
Save mikroskeem/311ac268956338b4df76ae8e8510beec to your computer and use it in GitHub Desktop.
ERC2771 abstract contract to support multiple trusted forwarders
pragma solidity ^0.8.30;
import {ERC2771ContextUpgradeable} from "@openzeppelin/contracts-upgradeable/metatx/ERC2771ContextUpgradeable.sol";
abstract contract MultiTrustedForwarder is ERC2771ContextUpgradeable {
mapping(address => bool) public trustedForwarders;
event TrustedForwardersAdded(address[] forwarders);
event TrustedForwardersRemoved(address[] forwarders);
// This contract supports multiple forwarders, so return null addy here
function trustedForwarder()
public
view
virtual
override(ERC2771ContextUpgradeable)
returns (address)
{
return address(0);
}
function isTrustedForwarder(
address forwarder
) public view virtual override(ERC2771ContextUpgradeable) returns (bool) {
return trustedForwarders[forwarder];
}
function _addTrustedForwarders(address[] memory forwarders) internal {
for (uint256 i = 0; i < forwarders.length; i++) {
trustedForwarders[forwarders[i]] = true;
}
emit TrustedForwardersAdded(forwarders);
}
function _removeTrustedForwarders(address[] memory forwarders) internal {
for (uint256 i = 0; i < forwarders.length; i++) {
delete trustedForwarders[forwarders[i]];
}
emit TrustedForwardersRemoved(forwarders);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment