Added ERC2771 support & Increased pixTarget max size

This commit is contained in:
PedroCailleret
2023-05-21 02:05:43 -03:00
parent 2129566a27
commit 32469e2480
53 changed files with 1571 additions and 368 deletions

View File

@@ -11,11 +11,11 @@ pragma solidity 0.8.19;
import { OwnerSettings, ERC20, SafeTransferLib } from "./core/OwnerSettings.sol";
import { BaseUtils } from "./core/BaseUtils.sol";
import { ReentrancyGuard } from "./lib/utils/ReentrancyGuard.sol";
import { DataTypes as DT } from "./core/DataTypes.sol";
contract P2PIX is BaseUtils, ReentrancyGuard {
contract P2PIX is BaseUtils {
// solhint-disable use-forbidden-name
// solhint-disable no-inline-assembly
// solhint-disable no-empty-blocks
@@ -62,19 +62,20 @@ contract P2PIX is BaseUtils, ReentrancyGuard {
function deposit(
address _token,
uint96 _amount,
uint160 _pixTarget,
string memory _pixTarget,
bool _valid,
bytes32 allowlistRoot
) public {
ERC20 t = ERC20(_token);
uint256 k = _castAddrToKey(msg.sender);
if (_pixTarget == 0) revert EmptyPixTarget();
if (bytes(_pixTarget).length == 0) revert EmptyPixTarget();
if (!allowedERC20s(t)) revert TokenDenied();
uint256 _sellerBalance = sellerBalance(k,t);
uint256 _sellerBalance = __sellerBalance(k,t);
uint256 currBal = _sellerBalance & BITMASK_SB_ENTRY;
if ((currBal + _amount) > MAXBALANCE_UPPERBOUND)
uint256 _newBal = uint256(currBal + _amount);
if (_newBal > MAXBALANCE_UPPERBOUND)
revert MaxBalExceeded();
setReentrancyGuard();
@@ -83,21 +84,14 @@ contract P2PIX is BaseUtils, ReentrancyGuard {
setRoot(msg.sender, allowlistRoot);
}
uint256 amountCasted;
uint256 pixTargetCasted;
uint256 validCasted;
(
amountCasted,
pixTargetCasted,
validCasted
) = _castToUint(_amount, _pixTarget, _valid);
bytes32 pixTargetCasted = getStr(_pixTarget);
uint256 validCasted = _castBool(_valid);
_setSellerBalance(
k,
t,
((currBal + amountCasted) |
(pixTargetCasted << BITPOS_PIXTARGET) |
(validCasted << BITPOS_VALID))
(_newBal | (validCasted << BITPOS_VALID)),
pixTargetCasted
);
SafeTransferLib.safeTransferFrom(
@@ -118,19 +112,16 @@ contract P2PIX is BaseUtils, ReentrancyGuard {
/// @dev Function sighash: 0x72fada5c.
function setValidState(ERC20 token, bool state) public {
uint256 key = _castAddrToKey(msg.sender);
uint256 _sellerBalance = sellerBalance(key, token);
uint256 _sellerBalance = __sellerBalance(key, token);
if (_sellerBalance != 0) {
uint256 _valid;
assembly {
_valid := state
}
uint256 _valid = _castBool(state);
_sellerBalance =
(_sellerBalance & BITMASK_VALID) |
(_sellerBalance & BITMASK_SB_ENTRY) |
(_valid << BITPOS_VALID);
_setSellerBalance(key, token, _sellerBalance);
_setValidState(key, token, _sellerBalance);
emit ValidSet(msg.sender, address(token), state);
} else revert NotInitialized();
@@ -175,33 +166,43 @@ contract P2PIX is BaseUtils, ReentrancyGuard {
mapLocks[cCounter].expirationBlock >= block.number
) revert NotExpired();
address sender; uint256 forwarder;
(sender, forwarder) = _isTrustedForwarder();
DT.Lock memory l = DT.Lock(
_amount,
uint160(sellerBalance(k, t) >> BITPOS_PIXTARGET),
address(t),
msg.sender,
k,
cCounter,
(block.number + defaultLockBlocks)
(block.number + defaultLockBlocks),
getPixTarget(_seller, t),
_amount,
address(t),
sender
);
// transaction forwarding must leave `merkleProof` empty;
// otherwise, the trustedForwarder must be previously added
// to a seller whitelist.
if (merkleProof.length != 0) {
_merkleVerify(merkleProof, sellerAllowList(k), msg.sender);
_merkleVerify(merkleProof, sellerAllowList(k), sender);
lockID = _addLock(bal, _amount, cCounter, l, t, k);
} else {
if (l.amount <= REPUTATION_LOWERBOUND) {
lockID = _addLock(bal, _amount, cCounter, l, t, k);
} else {
if (forwarder != 0) {
lockID = _addLock(bal, _amount, cCounter, l, t, k);
} else {
uint256 userCredit = userRecord[_castAddrToKey(msg.sender)];
uint256 spendLimit; (spendLimit) = _limiter(userCredit / WAD);
if (
l.amount > (spendLimit * WAD) || l.amount > LOCKAMOUNT_UPPERBOUND
l.amount > (spendLimit * WAD) ||
l.amount > LOCKAMOUNT_UPPERBOUND
) revert AmountNotAllowed();
lockID = _addLock(bal, _amount, cCounter, l, t, k);
/* */}/* */}
/* */}/* */}/* */}
}
/// @notice Lock release method that liquidate lock
@@ -241,20 +242,23 @@ contract P2PIX is BaseUtils, ReentrancyGuard {
ERC20 t = ERC20(l.token);
// We cache values before zeroing them out.
// We cache lockAmount value before zeroing it out.
uint256 lockAmount = l.amount;
// uint256 totalAmount = (lockAmount - l.relayerPremium);
l.amount = 0;
l.expirationBlock = 0;
_setUsedTransactions(message);
address sender; uint256 forwarder;
(sender, forwarder) = _isTrustedForwarder();
if (forwarder == 0) {
if (msg.sender != l.buyerAddress) {
userRecord[_castAddrToKey(msg.sender)] += (lockAmount >> 1);
userRecord[_castAddrToKey(l.buyerAddress)] += (lockAmount >> 1);
} else {
userRecord[_castAddrToKey(msg.sender)] += lockAmount;
}
}}
SafeTransferLib.safeTransfer(
t,
@@ -283,7 +287,7 @@ contract P2PIX is BaseUtils, ReentrancyGuard {
_notExpired(l);
uint256 _sellerBalance =
sellerBalance(l.sellerKey, ERC20(l.token)) & BITMASK_SB_ENTRY;
__sellerBalance(l.sellerKey, ERC20(l.token)) & BITMASK_SB_ENTRY;
if ((_sellerBalance + l.amount) > MAXBALANCE_UPPERBOUND)
revert MaxBalExceeded();
@@ -335,7 +339,7 @@ contract P2PIX is BaseUtils, ReentrancyGuard {
uint256 key = _castAddrToKey(msg.sender);
_decBal(
(sellerBalance(key, token) & BITMASK_SB_ENTRY),
(__sellerBalance(key, token) & BITMASK_SB_ENTRY),
amount,
token,
key
@@ -407,7 +411,7 @@ contract P2PIX is BaseUtils, ReentrancyGuard {
mapLocks[_lockID] = _l;
_decBal(_bal, _amount, _t, _k);
lockCounter++;
++lockCounter;
counter = _lockID;
emit LockAdded(
@@ -448,9 +452,6 @@ contract P2PIX is BaseUtils, ReentrancyGuard {
view
returns (uint256 bal)
{
// bal =
// sellerBalance[_castAddrToKey(seller)][token] &
// BITMASK_SB_ENTRY;
assembly {
for {
/* */
@@ -462,7 +463,7 @@ contract P2PIX is BaseUtils, ReentrancyGuard {
mstore(0x00, seller)
bal := and(
BITMASK_SB_ENTRY,
sload(keccak256(0x0c, 0x34))
sload(add(keccak256(0x0c, 0x34), 0x01))
)
break
}
@@ -474,10 +475,6 @@ contract P2PIX is BaseUtils, ReentrancyGuard {
view
returns (bool valid)
{
// uint256 b = sellerBalance[
// _castAddrToKey(seller)
// ][token];
// ] >> BITPOS_VALID) & BITMASK_SB_ENTRY;
assembly {
for {
/* */
@@ -491,7 +488,7 @@ contract P2PIX is BaseUtils, ReentrancyGuard {
BITMASK_SB_ENTRY,
shr(
BITPOS_VALID,
sload(keccak256(0x0c, 0x34))
sload(add(keccak256(0x0c, 0x34), 0x01))
)
)
break
@@ -502,12 +499,8 @@ contract P2PIX is BaseUtils, ReentrancyGuard {
function getPixTarget(address seller, ERC20 token)
public
view
returns (uint160 pixTarget)
returns (bytes32 pixTarget)
{
// pixTarget = uint160(
// sellerBalance[_castAddrToKey(seller)][token] >>
// BITPOS_PIXTARGET
// );
assembly {
for {
/* */
@@ -517,15 +510,17 @@ contract P2PIX is BaseUtils, ReentrancyGuard {
mstore(0x20, token)
mstore(0x0c, _SELLER_BALANCE_SLOT_SEED)
mstore(0x00, seller)
pixTarget := shr(
BITPOS_PIXTARGET,
sload(keccak256(0x0c, 0x34))
)
pixTarget := sload(keccak256(0x0c, 0x34))
break
}
}
}
function getPixTargetString(address seller, ERC20 token) public view returns (string memory pixTarget) {
bytes32 _pixEnc = getPixTarget(seller, token);
pixTarget = string(abi.encodePacked(_pixEnc));
}
function getBalances(
address[] memory sellers,
ERC20 token
@@ -593,42 +588,53 @@ contract P2PIX is BaseUtils, ReentrancyGuard {
return (sortedIDs, status);
}
function _setSellerBalance(uint256 sellerKey, ERC20 erc20, uint256 packed) private {
function _setSellerBalance(uint256 _sellerKey, ERC20 _erc20, uint256 _packed, bytes32 _pixTarget) private {
assembly {
mstore(0x20, erc20)
mstore(0x20, _erc20)
mstore(0x0c, _SELLER_BALANCE_SLOT_SEED)
mstore(0x00, shr(12, sellerKey))
sstore(keccak256(0x0c, 0x34), packed)
mstore(0x00, shr(12, _sellerKey))
let _loc := keccak256(0x0c, 0x34)
sstore(add(_loc, 0x01), _packed)
sstore(_loc, _pixTarget)
}
}
function _addSellerBalance(uint256 sellerKey, ERC20 erc20, uint256 amount) private {
function _setValidState(uint256 _sellerKey, ERC20 _erc20, uint256 _packed) private {
assembly {
mstore(0x20, erc20)
mstore(0x20, _erc20)
mstore(0x0c, _SELLER_BALANCE_SLOT_SEED)
mstore(0x00, shr(12, sellerKey))
let slot := keccak256(0x0c, 0x34)
sstore(slot, add(sload(slot), amount))
mstore(0x00, shr(12, _sellerKey))
let _loc := keccak256(0x0c, 0x34)
sstore(add(_loc, 0x01), _packed)
}
}
function _decSellerBalance(uint256 sellerKey, ERC20 erc20, uint256 amount) private {
function _addSellerBalance(uint256 _sellerKey, ERC20 _erc20, uint256 _amount) private {
assembly {
mstore(0x20, erc20)
mstore(0x20, _erc20)
mstore(0x0c, _SELLER_BALANCE_SLOT_SEED)
mstore(0x00, shr(12, sellerKey))
let slot := keccak256(0x0c, 0x34)
sstore(slot, sub(sload(slot), amount))
mstore(0x00, shr(12, _sellerKey))
let _loc := add(keccak256(0x0c, 0x34), 0x01)
sstore(_loc, add(sload(_loc), _amount))
}
}
function sellerBalance(uint256 sellerKey, ERC20 erc20) public view returns(uint256 packed) {
function _decSellerBalance(uint256 _sellerKey, ERC20 _erc20, uint256 _amount) private {
assembly {
mstore(0x20, erc20)
mstore(0x20, _erc20)
mstore(0x0c, _SELLER_BALANCE_SLOT_SEED)
mstore(0x00, shr(12, sellerKey))
packed := sload(keccak256(0x0c, 0x34))
mstore(0x00, shr(12, _sellerKey))
let _loc := add(keccak256(0x0c, 0x34), 0x01)
sstore(_loc, sub(sload(_loc), _amount))
}
}
function __sellerBalance(uint256 _sellerKey, ERC20 _erc20) private view returns(uint256 _packed) {
assembly {
mstore(0x20, _erc20)
mstore(0x0c, _SELLER_BALANCE_SLOT_SEED)
mstore(0x00, shr(12, _sellerKey))
_packed := sload(add(keccak256(0x0c, 0x34), 0x01))
}
}