ERC2771 compatibility

This commit is contained in:
hueso 2023-09-05 00:40:18 -03:00
parent a3e6aa5879
commit e95828b7dd
3 changed files with 11 additions and 23 deletions

View File

@ -67,7 +67,7 @@ abstract contract OwnerSettings is
sLoc := add(sLoc, 0x20)
} {
// cache hashmap entry in scratch space
mstore(0x20, isTrustedForwarder.slot)
mstore(0x20, trustedForwarders.slot)
mstore(0x00, mload(fLoc))
// let mapSlot := keccak256(0x00, 0x40)
sstore(keccak256(0x00, 0x40), mload(sLoc))

View File

@ -39,7 +39,7 @@ abstract contract Context {
/// @dev Context variant with ERC2771 support.
abstract contract ERC2771Context is Context {
// address private immutable _trustedForwarder;
mapping(address => bool) public isTrustedForwarder;
mapping(address => bool) public trustedForwarders;
/// @custom:oz-upgrades-unsafe-allow constructor
// constructor(address trustedForwarder) {
@ -53,7 +53,7 @@ abstract contract ERC2771Context is Context {
override
returns (address sender)
{
if (isTrustedForwarder[msg.sender]) {
if (trustedForwarders[msg.sender]) {
// The assembly code is more direct than the Solidity version using `abi.decode`.
/// @solidity memory-safe-assembly
assembly {
@ -67,15 +67,8 @@ abstract contract ERC2771Context is Context {
}
}
function _isTrustedForwarder()
internal
view
returns (address _sender, uint256 _forwarder)
{
_sender = _msgSender();
_forwarder = (_sender != msg.sender)
? uint256(1)
: uint256(0);
function isTrustedForwarder(address forwarder) public view virtual returns (bool) {
return trustedForwarders[forwarder];
}
function _msgData()
@ -85,7 +78,7 @@ abstract contract ERC2771Context is Context {
override
returns (bytes calldata)
{
if (isTrustedForwarder[msg.sender]) {
if (isTrustedForwarder(msg.sender)) {
return msg.data[:msg.data.length - 20];
} else {
return super._msgData();

View File

@ -158,20 +158,18 @@ contract P2PIX is BaseUtils {
mapLocks[lockID].expirationBlock >= block.number
) revert NotExpired();
address sender; uint256 forwarder;
(sender, forwarder) = _isTrustedForwarder();
bytes32 _pixTarget = getPixTarget(args.seller, args.token);
// transaction forwarding must leave `merkleProof` empty;
// otherwise, the trustedForwarder must be previously added
// to a seller whitelist.
if (args.merkleProof.length != 0) {
_merkleVerify( args.merkleProof, sellerAllowList(args.seller), sender);
_merkleVerify( args.merkleProof, sellerAllowList(args.seller), _msgSender());
} else if (args.amount > REPUTATION_LOWERBOUND && forwarder == 0) {
} else if ( args.amount > REPUTATION_LOWERBOUND && msg.sender == _msgSender() ) {
uint256 spendLimit; uint256 userCredit =
userRecord[_castAddrToKey(msg.sender)];
userRecord[_castAddrToKey(_msgSender())];
(spendLimit) = _limiter(userCredit / WAD);
if (
args.amount > (spendLimit * WAD) ||
@ -185,7 +183,7 @@ contract P2PIX is BaseUtils {
_pixTarget,
args.amount,
args.token,
sender,
_msgSender(),
args.seller
);
@ -231,11 +229,8 @@ contract P2PIX is BaseUtils {
l.amount = 0;
l.expirationBlock = 0;
_setUsedTransactions(message);
address sender; uint256 forwarder;
(sender, forwarder) = _isTrustedForwarder();
if (forwarder == 0) {
if (_msgSender() == msg.sender) {
if (msg.sender != l.buyerAddress) {
userRecord[_castAddrToKey(msg.sender)] += (lockAmount >> 1);
userRecord[_castAddrToKey(l.buyerAddress)] += (lockAmount >> 1);