From e95828b7ddf79a7bf03256fde77e8cc93118e549 Mon Sep 17 00:00:00 2001 From: hueso Date: Tue, 5 Sep 2023 00:40:18 -0300 Subject: [PATCH] ERC2771 compatibility --- contracts/core/OwnerSettings.sol | 2 +- contracts/lib/metatx/ERC2771Context.sol | 17 +++++------------ contracts/p2pix.sol | 15 +++++---------- 3 files changed, 11 insertions(+), 23 deletions(-) diff --git a/contracts/core/OwnerSettings.sol b/contracts/core/OwnerSettings.sol index 6bd9f82..4691811 100644 --- a/contracts/core/OwnerSettings.sol +++ b/contracts/core/OwnerSettings.sol @@ -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)) diff --git a/contracts/lib/metatx/ERC2771Context.sol b/contracts/lib/metatx/ERC2771Context.sol index 04c75c7..82d8734 100644 --- a/contracts/lib/metatx/ERC2771Context.sol +++ b/contracts/lib/metatx/ERC2771Context.sol @@ -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(); diff --git a/contracts/p2pix.sol b/contracts/p2pix.sol index 28fe041..8890f67 100644 --- a/contracts/p2pix.sol +++ b/contracts/p2pix.sol @@ -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);