/** * Deployed on polygon at 0x43E69adABC664617EB9C5E19413a335e9cd4A243 on Sep-27-2022 02:10:59 PM +UTC */ //SPDX-License-Identifier: MIT pragma solidity ^0.8.0; pragma experimental ABIEncoderV2; import "./AcceptEverythingPaymaster.sol"; ///a sample paymaster that has whitelists for senders and targets. /// - if at least one sender is whitelisted, then ONLY whitelisted senders are allowed. /// - if at least one target is whitelisted, then ONLY whitelisted targets are allowed. contract WhitelistPaymaster is AcceptEverythingPaymaster { bool public useSenderWhitelist; bool public useTargetWhitelist; mapping (address=>bool) public senderWhitelist; mapping (address=>bool) public targetWhitelist; function whitelistSender(address sender) public onlyOwner { senderWhitelist[sender]=true; useSenderWhitelist = true; } function whitelistTarget(address target) public onlyOwner { targetWhitelist[target]=true; useTargetWhitelist = true; } function preRelayedCall( GsnTypes.RelayRequest calldata relayRequest, bytes calldata signature, bytes calldata approvalData, uint256 maxPossibleGas ) external override virtual returns (bytes memory context, bool revertOnRecipientRevert) { (signature, maxPossibleGas); require(approvalData.length == 0, "approvalData: invalid length"); require(relayRequest.relayData.paymasterData.length == 0, "paymasterData: invalid length"); if ( useSenderWhitelist ) { require( senderWhitelist[relayRequest.request.from], "sender not whitelisted"); } if ( useTargetWhitelist ) { require( targetWhitelist[relayRequest.request.to], "target not whitelisted"); } return ("", false); } }