-
Notifications
You must be signed in to change notification settings - Fork 210
/
WhitelistPaymaster.sol
92 lines (78 loc) · 3.14 KB
/
WhitelistPaymaster.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
pragma experimental ABIEncoderV2;
import "@opengsn/contracts/src/BasePaymaster.sol";
/// A sample paymaster that has whitelists for senders, targets and methods.
/// - 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 BasePaymaster {
bool public useSenderWhitelist;
bool public useTargetWhitelist;
bool public useMethodWhitelist;
bool public useRejectOnRecipientRevert;
mapping(address => bool) public senderWhitelist;
mapping(address => bool) public targetWhitelist;
mapping(address => mapping(bytes4 => bool)) public methodWhitelist;
function versionPaymaster() external view override virtual returns (string memory){
return "3.0.0-beta.3+opengsn.whitelist.ipaymaster";
}
function whitelistSender(address sender, bool isAllowed) public onlyOwner {
senderWhitelist[sender] = isAllowed;
}
function whitelistTarget(address target, bool isAllowed) public onlyOwner {
targetWhitelist[target] = isAllowed;
}
function whitelistMethod(address target, bytes4 method, bool isAllowed) public onlyOwner {
methodWhitelist[target][method] = isAllowed;
}
function setConfiguration(
bool _useSenderWhitelist,
bool _useTargetWhitelist,
bool _useMethodWhitelist,
bool _useRejectOnRecipientRevert
) public onlyOwner {
useSenderWhitelist = _useSenderWhitelist;
useTargetWhitelist = _useTargetWhitelist;
useMethodWhitelist = _useMethodWhitelist;
useRejectOnRecipientRevert = _useRejectOnRecipientRevert;
}
function _preRelayedCall(
GsnTypes.RelayRequest calldata relayRequest,
bytes calldata signature,
bytes calldata approvalData,
uint256 maxPossibleGas
)
internal
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) {
address sender = relayRequest.request.from;
require(senderWhitelist[sender], "sender not whitelisted");
}
if (useTargetWhitelist) {
address target = relayRequest.request.to;
require(targetWhitelist[target], "target not whitelisted");
}
if (useMethodWhitelist) {
address target = relayRequest.request.to;
bytes4 method = GsnUtils.getMethodSig(relayRequest.request.data);
require(methodWhitelist[target][method], "method not whitelisted");
}
return ("", useRejectOnRecipientRevert);
}
function _postRelayedCall(
bytes calldata context,
bool success,
uint256 gasUseWithoutPost,
GsnTypes.RelayData calldata relayData
)
internal
override
virtual {
(context, success, gasUseWithoutPost, relayData);
}
}