ERC2771 compatibility
This commit is contained in:
parent
a3e6aa5879
commit
e95828b7dd
|
@ -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))
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue