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

@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
"buildInfo": "../../build-info/e227c161b97af39988677e65180082ec.json"
"buildInfo": "../../build-info/291bd612212fb4c1e87cae2657c915eb.json"
}

View File

@ -5,7 +5,7 @@
"abi": [
{
"inputs": [],
"stateMutability": "nonpayable",
"stateMutability": "payable",
"type": "constructor"
},
{
@ -54,8 +54,8 @@
"type": "function"
}
],
"bytecode": "0x60808060405234610016576102c9908161001c8239f35b600080fdfe6080806040526004908136101561001557600080fd5b600091823560e01c9182631a861d2614610254575081634d2b179114610085575063a4b345571461004557600080fd5b3461008257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610082576020604051643a352944008152f35b80fd5b82346100825760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261008257813591620f42408381029081048403610228578380029380850481149015171561022857643a352944009384018094116102285760b58471010000000000000000000000000000000000811015610211575b80690100000000000000000062010000921015610204575b650100000000008110156101f7575b63010000008110156101ea575b010260121c9360019480820401851c80820401851c80820401851c80820401851c80820401851c80820401851c80820401851c8080920410908181146101be57039004830180931161019257602083604051908152f35b9060116024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b6024856012867f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b60101c9160081b9161013b565b60201c9160101b9161012e565b60401c9160201b9161011f565b5068b500000000000000009050608085901c610107565b6024836011847f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b83903461028f57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261028f5780620f424060209252f35b5080fdfea26469706673582212201f57ae0c5884bdde41f85c3510ca33502ea7408e92d2669d2cb4da374119f5e064736f6c63430008130033",
"deployedBytecode": "0x6080806040526004908136101561001557600080fd5b600091823560e01c9182631a861d2614610254575081634d2b179114610085575063a4b345571461004557600080fd5b3461008257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610082576020604051643a352944008152f35b80fd5b82346100825760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261008257813591620f42408381029081048403610228578380029380850481149015171561022857643a352944009384018094116102285760b58471010000000000000000000000000000000000811015610211575b80690100000000000000000062010000921015610204575b650100000000008110156101f7575b63010000008110156101ea575b010260121c9360019480820401851c80820401851c80820401851c80820401851c80820401851c80820401851c80820401851c8080920410908181146101be57039004830180931161019257602083604051908152f35b9060116024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b6024856012867f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b60101c9160081b9161013b565b60201c9160101b9161012e565b60401c9160201b9161011f565b5068b500000000000000009050608085901c610107565b6024836011847f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b83903461028f57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261028f5780620f424060209252f35b5080fdfea26469706673582212201f57ae0c5884bdde41f85c3510ca33502ea7408e92d2669d2cb4da374119f5e064736f6c63430008130033",
"bytecode": "0x6080806040526102c990816100128239f3fe6080806040526004908136101561001557600080fd5b600091823560e01c9182631a861d2614610254575081634d2b179114610085575063a4b345571461004557600080fd5b3461008257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610082576020604051643a352944008152f35b80fd5b82346100825760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261008257813591620f42408381029081048403610228578380029380850481149015171561022857643a352944009384018094116102285760b58471010000000000000000000000000000000000811015610211575b80690100000000000000000062010000921015610204575b650100000000008110156101f7575b63010000008110156101ea575b010260121c9360019480820401851c80820401851c80820401851c80820401851c80820401851c80820401851c80820401851c8080920410908181146101be57039004830180931161019257602083604051908152f35b9060116024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b6024856012867f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b60101c9160081b9161013b565b60201c9160101b9161012e565b60401c9160201b9161011f565b5068b500000000000000009050608085901c610107565b6024836011847f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b83903461028f57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261028f5780620f424060209252f35b5080fdfea26469706673582212202029db6a087d223f768aabc1fe8120c7f9d7e525e947a354114a42f80a3955db64736f6c63430008130033",
"deployedBytecode": "0x6080806040526004908136101561001557600080fd5b600091823560e01c9182631a861d2614610254575081634d2b179114610085575063a4b345571461004557600080fd5b3461008257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610082576020604051643a352944008152f35b80fd5b82346100825760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261008257813591620f42408381029081048403610228578380029380850481149015171561022857643a352944009384018094116102285760b58471010000000000000000000000000000000000811015610211575b80690100000000000000000062010000921015610204575b650100000000008110156101f7575b63010000008110156101ea575b010260121c9360019480820401851c80820401851c80820401851c80820401851c80820401851c80820401851c80820401851c8080920410908181146101be57039004830180931161019257602083604051908152f35b9060116024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b6024856012867f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b60101c9160081b9161013b565b60201c9160101b9161012e565b60401c9160201b9161011f565b5068b500000000000000009050608085901c610107565b6024836011847f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b83903461028f57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261028f5780620f424060209252f35b5080fdfea26469706673582212202029db6a087d223f768aabc1fe8120c7f9d7e525e947a354114a42f80a3955db64736f6c63430008130033",
"linkReferences": {},
"deployedLinkReferences": {}
}

View File

@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
"buildInfo": "../../../build-info/e227c161b97af39988677e65180082ec.json"
"buildInfo": "../../../build-info/291bd612212fb4c1e87cae2657c915eb.json"
}

View File

@ -83,6 +83,11 @@
"name": "OnlySeller",
"type": "error"
},
{
"inputs": [],
"name": "Reentrancy",
"type": "error"
},
{
"inputs": [],
"name": "StaticCallFailed",
@ -330,6 +335,25 @@
"name": "RootUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "forwarder",
"type": "address"
},
{
"indexed": true,
"internalType": "bool",
"name": "state",
"type": "bool"
}
],
"name": "TrustedForwarderUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
@ -438,6 +462,44 @@
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "str",
"type": "string"
}
],
"name": "getStr",
"outputs": [
{
"internalType": "bytes32",
"name": "strEnc",
"type": "bytes32"
}
],
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "isTrustedForwarder",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "owner",
@ -522,6 +584,24 @@
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address[]",
"name": "forwarders",
"type": "address[]"
},
{
"internalType": "bool[]",
"name": "states",
"type": "bool[]"
}
],
"name": "setTrustedFowarders",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{

View File

@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
"buildInfo": "../../../build-info/e227c161b97af39988677e65180082ec.json"
"buildInfo": "../../../build-info/291bd612212fb4c1e87cae2657c915eb.json"
}

View File

@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
"buildInfo": "../../../build-info/c96aab92784d63ce08c6b112913f46c8.json"
"buildInfo": "../../../build-info/291bd612212fb4c1e87cae2657c915eb.json"
}

View File

@ -3,8 +3,8 @@
"contractName": "DataTypes",
"sourceName": "contracts/core/DataTypes.sol",
"abi": [],
"bytecode": "0x60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea2646970667358221220ed19291aba408239fe7ce17eba420cb350ea83c88994bb2b37733371feac745f64736f6c63430008130033",
"deployedBytecode": "0x600080fdfea2646970667358221220ed19291aba408239fe7ce17eba420cb350ea83c88994bb2b37733371feac745f64736f6c63430008130033",
"bytecode": "0x60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea2646970667358221220a40e6f94f4c0b9a9cdd9ac64f98613aece8f5a3f084ee1eca35eba466df9810964736f6c63430008130033",
"deployedBytecode": "0x600080fdfea2646970667358221220a40e6f94f4c0b9a9cdd9ac64f98613aece8f5a3f084ee1eca35eba466df9810964736f6c63430008130033",
"linkReferences": {},
"deployedLinkReferences": {}
}

View File

@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
"buildInfo": "../../../build-info/e227c161b97af39988677e65180082ec.json"
"buildInfo": "../../../build-info/291bd612212fb4c1e87cae2657c915eb.json"
}

View File

@ -306,6 +306,25 @@
"name": "RootUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "forwarder",
"type": "address"
},
{
"indexed": true,
"internalType": "bool",
"name": "state",
"type": "bool"
}
],
"name": "TrustedForwarderUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [

View File

@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
"buildInfo": "../../../build-info/e227c161b97af39988677e65180082ec.json"
"buildInfo": "../../../build-info/291bd612212fb4c1e87cae2657c915eb.json"
}

View File

@ -330,6 +330,25 @@
"name": "RootUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "forwarder",
"type": "address"
},
{
"indexed": true,
"internalType": "bool",
"name": "state",
"type": "bool"
}
],
"name": "TrustedForwarderUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
@ -400,6 +419,25 @@
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "isTrustedForwarder",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "owner",
@ -484,6 +522,24 @@
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address[]",
"name": "forwarders",
"type": "address[]"
},
{
"internalType": "bool[]",
"name": "states",
"type": "bool[]"
}
],
"name": "setTrustedFowarders",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{

View File

@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
"buildInfo": "../../../../build-info/e227c161b97af39988677e65180082ec.json"
"buildInfo": "../../../../build-info/291bd612212fb4c1e87cae2657c915eb.json"
}

View File

@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
"buildInfo": "../../../../build-info/e227c161b97af39988677e65180082ec.json"
"buildInfo": "../../../../build-info/291bd612212fb4c1e87cae2657c915eb.json"
}

View File

@ -0,0 +1,4 @@
{
"_format": "hh-sol-dbg-1",
"buildInfo": "../../../../build-info/291bd612212fb4c1e87cae2657c915eb.json"
}

View File

@ -0,0 +1,10 @@
{
"_format": "hh-sol-artifact-1",
"contractName": "Context",
"sourceName": "contracts/lib/metatx/ERC2771Context.sol",
"abi": [],
"bytecode": "0x",
"deployedBytecode": "0x",
"linkReferences": {},
"deployedLinkReferences": {}
}

View File

@ -0,0 +1,4 @@
{
"_format": "hh-sol-dbg-1",
"buildInfo": "../../../../build-info/291bd612212fb4c1e87cae2657c915eb.json"
}

View File

@ -0,0 +1,30 @@
{
"_format": "hh-sol-artifact-1",
"contractName": "ERC2771Context",
"sourceName": "contracts/lib/metatx/ERC2771Context.sol",
"abi": [
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "isTrustedForwarder",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
}
],
"bytecode": "0x",
"deployedBytecode": "0x",
"linkReferences": {},
"deployedLinkReferences": {}
}

View File

@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
"buildInfo": "../../../../build-info/e227c161b97af39988677e65180082ec.json"
"buildInfo": "../../../../build-info/291bd612212fb4c1e87cae2657c915eb.json"
}

View File

@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
"buildInfo": "../../../../build-info/e227c161b97af39988677e65180082ec.json"
"buildInfo": "../../../../build-info/291bd612212fb4c1e87cae2657c915eb.json"
}

View File

@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
"buildInfo": "../../../../build-info/e227c161b97af39988677e65180082ec.json"
"buildInfo": "../../../../build-info/291bd612212fb4c1e87cae2657c915eb.json"
}

View File

@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
"buildInfo": "../../../../build-info/e227c161b97af39988677e65180082ec.json"
"buildInfo": "../../../../build-info/291bd612212fb4c1e87cae2657c915eb.json"
}

View File

@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
"buildInfo": "../../../../build-info/e227c161b97af39988677e65180082ec.json"
"buildInfo": "../../../../build-info/291bd612212fb4c1e87cae2657c915eb.json"
}

View File

@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
"buildInfo": "../../../../build-info/e227c161b97af39988677e65180082ec.json"
"buildInfo": "../../../../build-info/291bd612212fb4c1e87cae2657c915eb.json"
}

View File

@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
"buildInfo": "../../../../build-info/e227c161b97af39988677e65180082ec.json"
"buildInfo": "../../../../build-info/291bd612212fb4c1e87cae2657c915eb.json"
}

View File

@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
"buildInfo": "../../build-info/2fbad03752b21beeabf4fed16acdbf91.json"
"buildInfo": "../../build-info/291bd612212fb4c1e87cae2657c915eb.json"
}

File diff suppressed because one or more lines are too long

View File

@ -12,7 +12,7 @@ contract Reputation is IReputation {
// prettier-ignore
// solhint-disable no-inline-assembly
// solhint-disable-next-line no-empty-blocks
constructor(/* */) {/* */}
constructor(/* */) payable {/* */}
function limiter(
uint256 _userCredit

View File

@ -2,10 +2,15 @@
pragma solidity 0.8.19;
import { OwnerSettings } from "./OwnerSettings.sol";
import { ECDSA } from "../lib/utils/ECDSA.sol";
import { MerkleProofLib as Merkle } from "../lib/utils/MerkleProofLib.sol";
import { ReentrancyGuard } from "../lib/utils/ReentrancyGuard.sol";
abstract contract BaseUtils is OwnerSettings {
abstract contract BaseUtils is
OwnerSettings,
ReentrancyGuard
{
/// Storage
/// @dev List of Pix transactions already signed.
@ -67,26 +72,26 @@ abstract contract BaseUtils is OwnerSettings {
) revert AddressDenied();
}
function _castToUint(
uint96 _amount,
uint160 _pixTarget,
function _castBool(
bool _valid
)
internal
pure
returns (
uint256 _amountCasted,
uint256 _pixTargetCasted,
uint256 _validCasted
)
{
) internal pure returns (uint256 _validCasted) {
assembly {
_amountCasted := _amount
_pixTargetCasted := _pixTarget
_validCasted := _valid
}
}
function getStr(
string memory str
) public pure returns (bytes32 strEnc) {
bytes memory enc = bytes(abi.encodePacked(str));
assembly {
if lt(0x20, mload(enc)) {
invalid()
}
strEnc := mload(add(enc, 0x20))
}
}
/// @notice Public method that handles `address`
/// to `uint256` safe type casting.
/// @dev Function sighash: 0x4b2ae980.

View File

@ -8,6 +8,8 @@ abstract contract Constants {
0x0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632;
uint256 constant _ALLOWED_ERC20_UPDATED_EVENT_SIGNATURE =
0x5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a;
uint256 constant _TRUSTED_FORWARDER_UPDATED_EVENT_SIGNATURE =
0xbee55516e29d3969d3cb8eb01351eb3c52d06f9e2435bd5a8bfe3647e185df92;
/// @dev Seller casted to key => Seller's allowlist merkleroot.
/// mapping(uint256 => bytes32) public sellerAllowList;
@ -18,12 +20,12 @@ abstract contract Constants {
/// @dev `balance` max. value = 10**26.
/// @dev `pixTarget` keys are restricted to 160 bits.
/// mapping(uint256 => mapping(ERC20 => uint256)) public sellerBalance;
/// mapping(uint256 => mapping(ERC20 => { `uint256`, `uint96` } )) public sellerBalance;
/// @dev Bits layout:
/// `bytes32` [0...255] := pixTarget
/// `uint96` [0...94] := balance
/// `uint160` [95...254] := pixTarget
/// `bool` [255] := valid
/// `bool` [95] := valid
/// @dev Value in custom storage slot given by:
/// mstore(0x20, token)
@ -34,12 +36,10 @@ abstract contract Constants {
/// @dev The bitmask of `sellerBalance` entry.
uint256 constant BITMASK_SB_ENTRY = (1 << 94) - 1;
/// @dev The bit position of `pixTarget` in `sellerBalance`.
uint256 constant BITPOS_PIXTARGET = 95;
/// @dev The bit position of `valid` in `sellerBalance`.
uint256 constant BITPOS_VALID = 255;
uint256 constant BITPOS_VALID = 95;
/// @dev The bitmask of all 256 bits of `sellerBalance` except for the last one.
uint256 constant BITMASK_VALID = (1 << 255) - 1;
// uint256 constant BITMASK_VALID = (1 << 255) - 1;
/// @dev The scalar of BRZ token.
uint256 constant WAD = 1e18;

View File

@ -3,15 +3,13 @@ pragma solidity 0.8.19;
library DataTypes {
struct Lock {
uint80 amount;
uint160 pixTarget;
address token;
/// @dev Amount to be tranfered via PIX.
address buyerAddress;
uint256 sellerKey;
uint256 counter;
/// @dev If not paid at this block will be expired.
uint256 expirationBlock;
bytes32 pixTarget;
uint80 amount;
address token;
address buyerAddress;
}
// prettier-ignore

View File

@ -57,6 +57,11 @@ interface EventAndErrors {
address indexed token,
bool indexed state
);
/// @dev 0xbee55516e29d3969d3cb8eb01351eb3c52d06f9e2435bd5a8bfe3647e185df92
event TrustedForwarderUpdated(
address indexed forwarder,
bool indexed state
);
/// @dev 0xe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f
event ReputationUpdated(address reputation);
/// @dev 0x70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b8511
@ -64,6 +69,7 @@ interface EventAndErrors {
/// @dev 0x14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d7
event ValidSignersUpdated(address[] signers);
/// Errors
/// @dev Only seller could call this function.

View File

@ -1,6 +1,7 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;
import { ERC2771Context as ERC2771 } from "../lib/metatx/ERC2771Context.sol";
import { ERC20, SafeTransferLib } from "../lib/utils/SafeTransferLib.sol";
import { IReputation } from "../lib/interfaces/IReputation.sol";
import { EventAndErrors } from "./EventAndErrors.sol";
@ -10,7 +11,8 @@ import { Owned } from "../lib/auth/Owned.sol";
abstract contract OwnerSettings is
Constants,
EventAndErrors,
Owned(msg.sender)
Owned(msg.sender),
ERC2771
{
/// Storage
@ -40,6 +42,48 @@ abstract contract OwnerSettings is
/// Owner Only
function setTrustedFowarders(
address[] memory forwarders,
bool[] memory states
) external onlyOwner {
assembly {
// first 32 bytes eq to array's length
let fLen := mload(forwarders)
// halts execution if forwarders.length eq 0
if iszero(fLen) {
invalid()
}
// revert with `LengthMismatch()`
if iszero(eq(fLen, mload(states))) {
mstore(0x00, 0xff633a38)
revert(0x1c, 0x04)
}
let fLoc := add(forwarders, 0x20)
let sLoc := add(states, 0x20)
for {
let end := add(fLoc, shl(5, fLen))
} iszero(eq(fLoc, end)) {
fLoc := add(fLoc, 0x20)
sLoc := add(sLoc, 0x20)
} {
// cache hashmap entry in scratch space
mstore(0x20, isTrustedForwarder.slot)
mstore(0x00, mload(fLoc))
// let mapSlot := keccak256(0x00, 0x40)
sstore(keccak256(0x00, 0x40), mload(sLoc))
// emit TrustedForwarderUpdated(address, bool)
log3(
0,
0,
_TRUSTED_FORWARDER_UPDATED_EVENT_SIGNATURE,
mload(fLoc),
mload(sLoc)
)
}
}
}
/// @dev Contract's underlying balance withdraw method.
/// @dev Function sighash: 0x5fd8c710.
function withdrawBalance() external onlyOwner {

View File

@ -0,0 +1,94 @@
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.4;
/// @author OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
/// (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Context.sol)
/// @dev Provides information about the current execution context, including the
/// sender of the transaction and its data. While these are generally available
/// via msg.sender and msg.data, they should not be accessed in such a direct
/// manner, since when dealing with meta-transactions the account sending and
/// paying for execution may not be the actual sender (as far as an application
/// is concerned).
///
/// This contract is only required for intermediate, library-like contracts.
abstract contract Context {
function _msgSender()
internal
view
virtual
returns (address)
{
return msg.sender;
}
function _msgData()
internal
view
virtual
returns (bytes calldata)
{
return msg.data;
}
}
/// @author Modified from OpenZeppelin Contracts (last updated v4.7.0) (metatx/ERC2771Context.sol)
/// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/metatx/ERC2771Context.sol
/// @dev Context variant with ERC2771 support.
abstract contract ERC2771Context is Context {
// address private immutable _trustedForwarder;
mapping(address => bool) public isTrustedForwarder;
/// @custom:oz-upgrades-unsafe-allow constructor
// constructor(address trustedForwarder) {
// _trustedForwarder = trustedForwarder;
// }
function _msgSender()
internal
view
virtual
override
returns (address sender)
{
if (isTrustedForwarder[msg.sender]) {
// The assembly code is more direct than the Solidity version using `abi.decode`.
/// @solidity memory-safe-assembly
assembly {
sender := shr(
96,
calldataload(sub(calldatasize(), 20))
)
}
} else {
return super._msgSender();
}
}
function _isTrustedForwarder()
internal
view
returns (address _sender, uint256 _forwarder)
{
_sender = _msgSender();
_forwarder = (_sender != msg.sender)
? uint256(1)
: uint256(0);
}
function _msgData()
internal
view
virtual
override
returns (bytes calldata)
{
if (isTrustedForwarder[msg.sender]) {
return msg.data[:msg.data.length - 20];
} else {
return super._msgData();
}
}
}

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))
}
}

View File

@ -33,12 +33,15 @@ export interface BaseUtilsInterface extends utils.Interface {
"_castKeyToAddr(uint256)": FunctionFragment;
"allowedERC20s(address)": FunctionFragment;
"defaultLockBlocks()": FunctionFragment;
"getStr(string)": FunctionFragment;
"isTrustedForwarder(address)": FunctionFragment;
"owner()": FunctionFragment;
"reputation()": FunctionFragment;
"sellerAllowList(uint256)": FunctionFragment;
"setDefaultLockBlocks(uint256)": FunctionFragment;
"setOwner(address)": FunctionFragment;
"setReputation(address)": FunctionFragment;
"setTrustedFowarders(address[],bool[])": FunctionFragment;
"setValidSigners(address[])": FunctionFragment;
"tokenSettings(address[],bool[])": FunctionFragment;
"usedTransactions(bytes32)": FunctionFragment;
@ -52,12 +55,15 @@ export interface BaseUtilsInterface extends utils.Interface {
| "_castKeyToAddr"
| "allowedERC20s"
| "defaultLockBlocks"
| "getStr"
| "isTrustedForwarder"
| "owner"
| "reputation"
| "sellerAllowList"
| "setDefaultLockBlocks"
| "setOwner"
| "setReputation"
| "setTrustedFowarders"
| "setValidSigners"
| "tokenSettings"
| "usedTransactions"
@ -81,6 +87,14 @@ export interface BaseUtilsInterface extends utils.Interface {
functionFragment: "defaultLockBlocks",
values?: undefined
): string;
encodeFunctionData(
functionFragment: "getStr",
values: [PromiseOrValue<string>]
): string;
encodeFunctionData(
functionFragment: "isTrustedForwarder",
values: [PromiseOrValue<string>]
): string;
encodeFunctionData(functionFragment: "owner", values?: undefined): string;
encodeFunctionData(
functionFragment: "reputation",
@ -102,6 +116,10 @@ export interface BaseUtilsInterface extends utils.Interface {
functionFragment: "setReputation",
values: [PromiseOrValue<string>]
): string;
encodeFunctionData(
functionFragment: "setTrustedFowarders",
values: [PromiseOrValue<string>[], PromiseOrValue<boolean>[]]
): string;
encodeFunctionData(
functionFragment: "setValidSigners",
values: [PromiseOrValue<string>[]]
@ -139,6 +157,11 @@ export interface BaseUtilsInterface extends utils.Interface {
functionFragment: "defaultLockBlocks",
data: BytesLike
): Result;
decodeFunctionResult(functionFragment: "getStr", data: BytesLike): Result;
decodeFunctionResult(
functionFragment: "isTrustedForwarder",
data: BytesLike
): Result;
decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result;
decodeFunctionResult(functionFragment: "reputation", data: BytesLike): Result;
decodeFunctionResult(
@ -154,6 +177,10 @@ export interface BaseUtilsInterface extends utils.Interface {
functionFragment: "setReputation",
data: BytesLike
): Result;
decodeFunctionResult(
functionFragment: "setTrustedFowarders",
data: BytesLike
): Result;
decodeFunctionResult(
functionFragment: "setValidSigners",
data: BytesLike
@ -187,6 +214,7 @@ export interface BaseUtilsInterface extends utils.Interface {
"OwnerUpdated(address,address)": EventFragment;
"ReputationUpdated(address)": EventFragment;
"RootUpdated(address,bytes32)": EventFragment;
"TrustedForwarderUpdated(address,bool)": EventFragment;
"ValidSet(address,address,bool)": EventFragment;
"ValidSignersUpdated(address[])": EventFragment;
};
@ -202,6 +230,7 @@ export interface BaseUtilsInterface extends utils.Interface {
getEvent(nameOrSignatureOrTopic: "OwnerUpdated"): EventFragment;
getEvent(nameOrSignatureOrTopic: "ReputationUpdated"): EventFragment;
getEvent(nameOrSignatureOrTopic: "RootUpdated"): EventFragment;
getEvent(nameOrSignatureOrTopic: "TrustedForwarderUpdated"): EventFragment;
getEvent(nameOrSignatureOrTopic: "ValidSet"): EventFragment;
getEvent(nameOrSignatureOrTopic: "ValidSignersUpdated"): EventFragment;
}
@ -334,6 +363,18 @@ export type RootUpdatedEvent = TypedEvent<
export type RootUpdatedEventFilter = TypedEventFilter<RootUpdatedEvent>;
export interface TrustedForwarderUpdatedEventObject {
forwarder: string;
state: boolean;
}
export type TrustedForwarderUpdatedEvent = TypedEvent<
[string, boolean],
TrustedForwarderUpdatedEventObject
>;
export type TrustedForwarderUpdatedEventFilter =
TypedEventFilter<TrustedForwarderUpdatedEvent>;
export interface ValidSetEventObject {
seller: string;
token: string;
@ -401,6 +442,16 @@ export interface BaseUtils extends BaseContract {
defaultLockBlocks(overrides?: CallOverrides): Promise<[BigNumber]>;
getStr(
str: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<[string] & { strEnc: string }>;
isTrustedForwarder(
arg0: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<[boolean]>;
owner(overrides?: CallOverrides): Promise<[string]>;
reputation(overrides?: CallOverrides): Promise<[string]>;
@ -425,6 +476,12 @@ export interface BaseUtils extends BaseContract {
overrides?: Overrides & { from?: PromiseOrValue<string> }
): Promise<ContractTransaction>;
setTrustedFowarders(
forwarders: PromiseOrValue<string>[],
states: PromiseOrValue<boolean>[],
overrides?: Overrides & { from?: PromiseOrValue<string> }
): Promise<ContractTransaction>;
setValidSigners(
_validSigners: PromiseOrValue<string>[],
overrides?: Overrides & { from?: PromiseOrValue<string> }
@ -468,6 +525,16 @@ export interface BaseUtils extends BaseContract {
defaultLockBlocks(overrides?: CallOverrides): Promise<BigNumber>;
getStr(
str: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<string>;
isTrustedForwarder(
arg0: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<boolean>;
owner(overrides?: CallOverrides): Promise<string>;
reputation(overrides?: CallOverrides): Promise<string>;
@ -492,6 +559,12 @@ export interface BaseUtils extends BaseContract {
overrides?: Overrides & { from?: PromiseOrValue<string> }
): Promise<ContractTransaction>;
setTrustedFowarders(
forwarders: PromiseOrValue<string>[],
states: PromiseOrValue<boolean>[],
overrides?: Overrides & { from?: PromiseOrValue<string> }
): Promise<ContractTransaction>;
setValidSigners(
_validSigners: PromiseOrValue<string>[],
overrides?: Overrides & { from?: PromiseOrValue<string> }
@ -535,6 +608,16 @@ export interface BaseUtils extends BaseContract {
defaultLockBlocks(overrides?: CallOverrides): Promise<BigNumber>;
getStr(
str: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<string>;
isTrustedForwarder(
arg0: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<boolean>;
owner(overrides?: CallOverrides): Promise<string>;
reputation(overrides?: CallOverrides): Promise<string>;
@ -559,6 +642,12 @@ export interface BaseUtils extends BaseContract {
overrides?: CallOverrides
): Promise<void>;
setTrustedFowarders(
forwarders: PromiseOrValue<string>[],
states: PromiseOrValue<boolean>[],
overrides?: CallOverrides
): Promise<void>;
setValidSigners(
_validSigners: PromiseOrValue<string>[],
overrides?: CallOverrides
@ -680,6 +769,15 @@ export interface BaseUtils extends BaseContract {
merkleRoot?: PromiseOrValue<BytesLike> | null
): RootUpdatedEventFilter;
"TrustedForwarderUpdated(address,bool)"(
forwarder?: PromiseOrValue<string> | null,
state?: PromiseOrValue<boolean> | null
): TrustedForwarderUpdatedEventFilter;
TrustedForwarderUpdated(
forwarder?: PromiseOrValue<string> | null,
state?: PromiseOrValue<boolean> | null
): TrustedForwarderUpdatedEventFilter;
"ValidSet(address,address,bool)"(
seller?: PromiseOrValue<string> | null,
token?: null,
@ -715,6 +813,16 @@ export interface BaseUtils extends BaseContract {
defaultLockBlocks(overrides?: CallOverrides): Promise<BigNumber>;
getStr(
str: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<BigNumber>;
isTrustedForwarder(
arg0: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<BigNumber>;
owner(overrides?: CallOverrides): Promise<BigNumber>;
reputation(overrides?: CallOverrides): Promise<BigNumber>;
@ -739,6 +847,12 @@ export interface BaseUtils extends BaseContract {
overrides?: Overrides & { from?: PromiseOrValue<string> }
): Promise<BigNumber>;
setTrustedFowarders(
forwarders: PromiseOrValue<string>[],
states: PromiseOrValue<boolean>[],
overrides?: Overrides & { from?: PromiseOrValue<string> }
): Promise<BigNumber>;
setValidSigners(
_validSigners: PromiseOrValue<string>[],
overrides?: Overrides & { from?: PromiseOrValue<string> }
@ -783,6 +897,16 @@ export interface BaseUtils extends BaseContract {
defaultLockBlocks(overrides?: CallOverrides): Promise<PopulatedTransaction>;
getStr(
str: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<PopulatedTransaction>;
isTrustedForwarder(
arg0: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<PopulatedTransaction>;
owner(overrides?: CallOverrides): Promise<PopulatedTransaction>;
reputation(overrides?: CallOverrides): Promise<PopulatedTransaction>;
@ -807,6 +931,12 @@ export interface BaseUtils extends BaseContract {
overrides?: Overrides & { from?: PromiseOrValue<string> }
): Promise<PopulatedTransaction>;
setTrustedFowarders(
forwarders: PromiseOrValue<string>[],
states: PromiseOrValue<boolean>[],
overrides?: Overrides & { from?: PromiseOrValue<string> }
): Promise<PopulatedTransaction>;
setValidSigners(
_validSigners: PromiseOrValue<string>[],
overrides?: Overrides & { from?: PromiseOrValue<string> }

View File

@ -33,6 +33,7 @@ export interface EventAndErrorsInterface extends utils.Interface {
"LockReturned(address,uint256)": EventFragment;
"ReputationUpdated(address)": EventFragment;
"RootUpdated(address,bytes32)": EventFragment;
"TrustedForwarderUpdated(address,bool)": EventFragment;
"ValidSet(address,address,bool)": EventFragment;
"ValidSignersUpdated(address[])": EventFragment;
};
@ -47,6 +48,7 @@ export interface EventAndErrorsInterface extends utils.Interface {
getEvent(nameOrSignatureOrTopic: "LockReturned"): EventFragment;
getEvent(nameOrSignatureOrTopic: "ReputationUpdated"): EventFragment;
getEvent(nameOrSignatureOrTopic: "RootUpdated"): EventFragment;
getEvent(nameOrSignatureOrTopic: "TrustedForwarderUpdated"): EventFragment;
getEvent(nameOrSignatureOrTopic: "ValidSet"): EventFragment;
getEvent(nameOrSignatureOrTopic: "ValidSignersUpdated"): EventFragment;
}
@ -168,6 +170,18 @@ export type RootUpdatedEvent = TypedEvent<
export type RootUpdatedEventFilter = TypedEventFilter<RootUpdatedEvent>;
export interface TrustedForwarderUpdatedEventObject {
forwarder: string;
state: boolean;
}
export type TrustedForwarderUpdatedEvent = TypedEvent<
[string, boolean],
TrustedForwarderUpdatedEventObject
>;
export type TrustedForwarderUpdatedEventFilter =
TypedEventFilter<TrustedForwarderUpdatedEvent>;
export interface ValidSetEventObject {
seller: string;
token: string;
@ -309,6 +323,15 @@ export interface EventAndErrors extends BaseContract {
merkleRoot?: PromiseOrValue<BytesLike> | null
): RootUpdatedEventFilter;
"TrustedForwarderUpdated(address,bool)"(
forwarder?: PromiseOrValue<string> | null,
state?: PromiseOrValue<boolean> | null
): TrustedForwarderUpdatedEventFilter;
TrustedForwarderUpdated(
forwarder?: PromiseOrValue<string> | null,
state?: PromiseOrValue<boolean> | null
): TrustedForwarderUpdatedEventFilter;
"ValidSet(address,address,bool)"(
seller?: PromiseOrValue<string> | null,
token?: null,

View File

@ -31,12 +31,14 @@ export interface OwnerSettingsInterface extends utils.Interface {
functions: {
"allowedERC20s(address)": FunctionFragment;
"defaultLockBlocks()": FunctionFragment;
"isTrustedForwarder(address)": FunctionFragment;
"owner()": FunctionFragment;
"reputation()": FunctionFragment;
"sellerAllowList(uint256)": FunctionFragment;
"setDefaultLockBlocks(uint256)": FunctionFragment;
"setOwner(address)": FunctionFragment;
"setReputation(address)": FunctionFragment;
"setTrustedFowarders(address[],bool[])": FunctionFragment;
"setValidSigners(address[])": FunctionFragment;
"tokenSettings(address[],bool[])": FunctionFragment;
"validBacenSigners(uint256)": FunctionFragment;
@ -47,12 +49,14 @@ export interface OwnerSettingsInterface extends utils.Interface {
nameOrSignatureOrTopic:
| "allowedERC20s"
| "defaultLockBlocks"
| "isTrustedForwarder"
| "owner"
| "reputation"
| "sellerAllowList"
| "setDefaultLockBlocks"
| "setOwner"
| "setReputation"
| "setTrustedFowarders"
| "setValidSigners"
| "tokenSettings"
| "validBacenSigners"
@ -67,6 +71,10 @@ export interface OwnerSettingsInterface extends utils.Interface {
functionFragment: "defaultLockBlocks",
values?: undefined
): string;
encodeFunctionData(
functionFragment: "isTrustedForwarder",
values: [PromiseOrValue<string>]
): string;
encodeFunctionData(functionFragment: "owner", values?: undefined): string;
encodeFunctionData(
functionFragment: "reputation",
@ -88,6 +96,10 @@ export interface OwnerSettingsInterface extends utils.Interface {
functionFragment: "setReputation",
values: [PromiseOrValue<string>]
): string;
encodeFunctionData(
functionFragment: "setTrustedFowarders",
values: [PromiseOrValue<string>[], PromiseOrValue<boolean>[]]
): string;
encodeFunctionData(
functionFragment: "setValidSigners",
values: [PromiseOrValue<string>[]]
@ -113,6 +125,10 @@ export interface OwnerSettingsInterface extends utils.Interface {
functionFragment: "defaultLockBlocks",
data: BytesLike
): Result;
decodeFunctionResult(
functionFragment: "isTrustedForwarder",
data: BytesLike
): Result;
decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result;
decodeFunctionResult(functionFragment: "reputation", data: BytesLike): Result;
decodeFunctionResult(
@ -128,6 +144,10 @@ export interface OwnerSettingsInterface extends utils.Interface {
functionFragment: "setReputation",
data: BytesLike
): Result;
decodeFunctionResult(
functionFragment: "setTrustedFowarders",
data: BytesLike
): Result;
decodeFunctionResult(
functionFragment: "setValidSigners",
data: BytesLike
@ -157,6 +177,7 @@ export interface OwnerSettingsInterface extends utils.Interface {
"OwnerUpdated(address,address)": EventFragment;
"ReputationUpdated(address)": EventFragment;
"RootUpdated(address,bytes32)": EventFragment;
"TrustedForwarderUpdated(address,bool)": EventFragment;
"ValidSet(address,address,bool)": EventFragment;
"ValidSignersUpdated(address[])": EventFragment;
};
@ -172,6 +193,7 @@ export interface OwnerSettingsInterface extends utils.Interface {
getEvent(nameOrSignatureOrTopic: "OwnerUpdated"): EventFragment;
getEvent(nameOrSignatureOrTopic: "ReputationUpdated"): EventFragment;
getEvent(nameOrSignatureOrTopic: "RootUpdated"): EventFragment;
getEvent(nameOrSignatureOrTopic: "TrustedForwarderUpdated"): EventFragment;
getEvent(nameOrSignatureOrTopic: "ValidSet"): EventFragment;
getEvent(nameOrSignatureOrTopic: "ValidSignersUpdated"): EventFragment;
}
@ -304,6 +326,18 @@ export type RootUpdatedEvent = TypedEvent<
export type RootUpdatedEventFilter = TypedEventFilter<RootUpdatedEvent>;
export interface TrustedForwarderUpdatedEventObject {
forwarder: string;
state: boolean;
}
export type TrustedForwarderUpdatedEvent = TypedEvent<
[string, boolean],
TrustedForwarderUpdatedEventObject
>;
export type TrustedForwarderUpdatedEventFilter =
TypedEventFilter<TrustedForwarderUpdatedEvent>;
export interface ValidSetEventObject {
seller: string;
token: string;
@ -361,6 +395,11 @@ export interface OwnerSettings extends BaseContract {
defaultLockBlocks(overrides?: CallOverrides): Promise<[BigNumber]>;
isTrustedForwarder(
arg0: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<[boolean]>;
owner(overrides?: CallOverrides): Promise<[string]>;
reputation(overrides?: CallOverrides): Promise<[string]>;
@ -385,6 +424,12 @@ export interface OwnerSettings extends BaseContract {
overrides?: Overrides & { from?: PromiseOrValue<string> }
): Promise<ContractTransaction>;
setTrustedFowarders(
forwarders: PromiseOrValue<string>[],
states: PromiseOrValue<boolean>[],
overrides?: Overrides & { from?: PromiseOrValue<string> }
): Promise<ContractTransaction>;
setValidSigners(
_validSigners: PromiseOrValue<string>[],
overrides?: Overrides & { from?: PromiseOrValue<string> }
@ -413,6 +458,11 @@ export interface OwnerSettings extends BaseContract {
defaultLockBlocks(overrides?: CallOverrides): Promise<BigNumber>;
isTrustedForwarder(
arg0: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<boolean>;
owner(overrides?: CallOverrides): Promise<string>;
reputation(overrides?: CallOverrides): Promise<string>;
@ -437,6 +487,12 @@ export interface OwnerSettings extends BaseContract {
overrides?: Overrides & { from?: PromiseOrValue<string> }
): Promise<ContractTransaction>;
setTrustedFowarders(
forwarders: PromiseOrValue<string>[],
states: PromiseOrValue<boolean>[],
overrides?: Overrides & { from?: PromiseOrValue<string> }
): Promise<ContractTransaction>;
setValidSigners(
_validSigners: PromiseOrValue<string>[],
overrides?: Overrides & { from?: PromiseOrValue<string> }
@ -465,6 +521,11 @@ export interface OwnerSettings extends BaseContract {
defaultLockBlocks(overrides?: CallOverrides): Promise<BigNumber>;
isTrustedForwarder(
arg0: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<boolean>;
owner(overrides?: CallOverrides): Promise<string>;
reputation(overrides?: CallOverrides): Promise<string>;
@ -489,6 +550,12 @@ export interface OwnerSettings extends BaseContract {
overrides?: CallOverrides
): Promise<void>;
setTrustedFowarders(
forwarders: PromiseOrValue<string>[],
states: PromiseOrValue<boolean>[],
overrides?: CallOverrides
): Promise<void>;
setValidSigners(
_validSigners: PromiseOrValue<string>[],
overrides?: CallOverrides
@ -605,6 +672,15 @@ export interface OwnerSettings extends BaseContract {
merkleRoot?: PromiseOrValue<BytesLike> | null
): RootUpdatedEventFilter;
"TrustedForwarderUpdated(address,bool)"(
forwarder?: PromiseOrValue<string> | null,
state?: PromiseOrValue<boolean> | null
): TrustedForwarderUpdatedEventFilter;
TrustedForwarderUpdated(
forwarder?: PromiseOrValue<string> | null,
state?: PromiseOrValue<boolean> | null
): TrustedForwarderUpdatedEventFilter;
"ValidSet(address,address,bool)"(
seller?: PromiseOrValue<string> | null,
token?: null,
@ -630,6 +706,11 @@ export interface OwnerSettings extends BaseContract {
defaultLockBlocks(overrides?: CallOverrides): Promise<BigNumber>;
isTrustedForwarder(
arg0: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<BigNumber>;
owner(overrides?: CallOverrides): Promise<BigNumber>;
reputation(overrides?: CallOverrides): Promise<BigNumber>;
@ -654,6 +735,12 @@ export interface OwnerSettings extends BaseContract {
overrides?: Overrides & { from?: PromiseOrValue<string> }
): Promise<BigNumber>;
setTrustedFowarders(
forwarders: PromiseOrValue<string>[],
states: PromiseOrValue<boolean>[],
overrides?: Overrides & { from?: PromiseOrValue<string> }
): Promise<BigNumber>;
setValidSigners(
_validSigners: PromiseOrValue<string>[],
overrides?: Overrides & { from?: PromiseOrValue<string> }
@ -683,6 +770,11 @@ export interface OwnerSettings extends BaseContract {
defaultLockBlocks(overrides?: CallOverrides): Promise<PopulatedTransaction>;
isTrustedForwarder(
arg0: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<PopulatedTransaction>;
owner(overrides?: CallOverrides): Promise<PopulatedTransaction>;
reputation(overrides?: CallOverrides): Promise<PopulatedTransaction>;
@ -707,6 +799,12 @@ export interface OwnerSettings extends BaseContract {
overrides?: Overrides & { from?: PromiseOrValue<string> }
): Promise<PopulatedTransaction>;
setTrustedFowarders(
forwarders: PromiseOrValue<string>[],
states: PromiseOrValue<boolean>[],
overrides?: Overrides & { from?: PromiseOrValue<string> }
): Promise<PopulatedTransaction>;
setValidSigners(
_validSigners: PromiseOrValue<string>[],
overrides?: Overrides & { from?: PromiseOrValue<string> }

View File

@ -1,7 +1,13 @@
/* Autogenerated file. Do not edit manually. */
/* tslint:disable */
/* eslint-disable */
import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers";
import {
Signer,
utils,
Contract,
ContractFactory,
PayableOverrides,
} from "ethers";
import type { Provider, TransactionRequest } from "@ethersproject/providers";
import type { PromiseOrValue } from "../common";
import type { Reputation, ReputationInterface } from "../Reputation";
@ -9,7 +15,7 @@ import type { Reputation, ReputationInterface } from "../Reputation";
const _abi = [
{
inputs: [],
stateMutability: "nonpayable",
stateMutability: "payable",
type: "constructor",
},
{
@ -60,7 +66,7 @@ const _abi = [
];
const _bytecode =
"0x60808060405234610016576102c9908161001c8239f35b600080fdfe6080806040526004908136101561001557600080fd5b600091823560e01c9182631a861d2614610254575081634d2b179114610085575063a4b345571461004557600080fd5b3461008257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610082576020604051643a352944008152f35b80fd5b82346100825760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261008257813591620f42408381029081048403610228578380029380850481149015171561022857643a352944009384018094116102285760b58471010000000000000000000000000000000000811015610211575b80690100000000000000000062010000921015610204575b650100000000008110156101f7575b63010000008110156101ea575b010260121c9360019480820401851c80820401851c80820401851c80820401851c80820401851c80820401851c80820401851c8080920410908181146101be57039004830180931161019257602083604051908152f35b9060116024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b6024856012867f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b60101c9160081b9161013b565b60201c9160101b9161012e565b60401c9160201b9161011f565b5068b500000000000000009050608085901c610107565b6024836011847f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b83903461028f57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261028f5780620f424060209252f35b5080fdfea26469706673582212201f57ae0c5884bdde41f85c3510ca33502ea7408e92d2669d2cb4da374119f5e064736f6c63430008130033";
"0x6080806040526102c990816100128239f3fe6080806040526004908136101561001557600080fd5b600091823560e01c9182631a861d2614610254575081634d2b179114610085575063a4b345571461004557600080fd5b3461008257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610082576020604051643a352944008152f35b80fd5b82346100825760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261008257813591620f42408381029081048403610228578380029380850481149015171561022857643a352944009384018094116102285760b58471010000000000000000000000000000000000811015610211575b80690100000000000000000062010000921015610204575b650100000000008110156101f7575b63010000008110156101ea575b010260121c9360019480820401851c80820401851c80820401851c80820401851c80820401851c80820401851c80820401851c8080920410908181146101be57039004830180931161019257602083604051908152f35b9060116024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b6024856012867f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b60101c9160081b9161013b565b60201c9160101b9161012e565b60401c9160201b9161011f565b5068b500000000000000009050608085901c610107565b6024836011847f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b83903461028f57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261028f5780620f424060209252f35b5080fdfea26469706673582212202029db6a087d223f768aabc1fe8120c7f9d7e525e947a354114a42f80a3955db64736f6c63430008130033";
type ReputationConstructorParams =
| [signer?: Signer]
@ -80,12 +86,12 @@ export class Reputation__factory extends ContractFactory {
}
override deploy(
overrides?: Overrides & { from?: PromiseOrValue<string> }
overrides?: PayableOverrides & { from?: PromiseOrValue<string> }
): Promise<Reputation> {
return super.deploy(overrides || {}) as Promise<Reputation>;
}
override getDeployTransaction(
overrides?: Overrides & { from?: PromiseOrValue<string> }
overrides?: PayableOverrides & { from?: PromiseOrValue<string> }
): TransactionRequest {
return super.getDeployTransaction(overrides || {});
}

View File

@ -87,6 +87,11 @@ const _abi = [
name: "OnlySeller",
type: "error",
},
{
inputs: [],
name: "Reentrancy",
type: "error",
},
{
inputs: [],
name: "StaticCallFailed",
@ -334,6 +339,25 @@ const _abi = [
name: "RootUpdated",
type: "event",
},
{
anonymous: false,
inputs: [
{
indexed: true,
internalType: "address",
name: "forwarder",
type: "address",
},
{
indexed: true,
internalType: "bool",
name: "state",
type: "bool",
},
],
name: "TrustedForwarderUpdated",
type: "event",
},
{
anonymous: false,
inputs: [
@ -442,6 +466,44 @@ const _abi = [
stateMutability: "view",
type: "function",
},
{
inputs: [
{
internalType: "string",
name: "str",
type: "string",
},
],
name: "getStr",
outputs: [
{
internalType: "bytes32",
name: "strEnc",
type: "bytes32",
},
],
stateMutability: "pure",
type: "function",
},
{
inputs: [
{
internalType: "address",
name: "",
type: "address",
},
],
name: "isTrustedForwarder",
outputs: [
{
internalType: "bool",
name: "",
type: "bool",
},
],
stateMutability: "view",
type: "function",
},
{
inputs: [],
name: "owner",
@ -526,6 +588,24 @@ const _abi = [
stateMutability: "nonpayable",
type: "function",
},
{
inputs: [
{
internalType: "address[]",
name: "forwarders",
type: "address[]",
},
{
internalType: "bool[]",
name: "states",
type: "bool[]",
},
],
name: "setTrustedFowarders",
outputs: [],
stateMutability: "nonpayable",
type: "function",
},
{
inputs: [
{

View File

@ -313,6 +313,25 @@ const _abi = [
name: "RootUpdated",
type: "event",
},
{
anonymous: false,
inputs: [
{
indexed: true,
internalType: "address",
name: "forwarder",
type: "address",
},
{
indexed: true,
internalType: "bool",
name: "state",
type: "bool",
},
],
name: "TrustedForwarderUpdated",
type: "event",
},
{
anonymous: false,
inputs: [

View File

@ -337,6 +337,25 @@ const _abi = [
name: "RootUpdated",
type: "event",
},
{
anonymous: false,
inputs: [
{
indexed: true,
internalType: "address",
name: "forwarder",
type: "address",
},
{
indexed: true,
internalType: "bool",
name: "state",
type: "bool",
},
],
name: "TrustedForwarderUpdated",
type: "event",
},
{
anonymous: false,
inputs: [
@ -407,6 +426,25 @@ const _abi = [
stateMutability: "view",
type: "function",
},
{
inputs: [
{
internalType: "address",
name: "",
type: "address",
},
],
name: "isTrustedForwarder",
outputs: [
{
internalType: "bool",
name: "",
type: "bool",
},
],
stateMutability: "view",
type: "function",
},
{
inputs: [],
name: "owner",
@ -491,6 +529,24 @@ const _abi = [
stateMutability: "nonpayable",
type: "function",
},
{
inputs: [
{
internalType: "address[]",
name: "forwarders",
type: "address[]",
},
{
internalType: "bool[]",
name: "states",
type: "bool[]",
},
],
name: "setTrustedFowarders",
outputs: [],
stateMutability: "nonpayable",
type: "function",
},
{
inputs: [
{

View File

@ -3,6 +3,7 @@
/* eslint-disable */
export * as auth from "./auth";
export * as interfaces from "./interfaces";
export * as metatx from "./metatx";
export * as mock from "./mock";
export * as tokens from "./tokens";
export * as utils from "./utils";

View File

@ -0,0 +1,45 @@
/* Autogenerated file. Do not edit manually. */
/* tslint:disable */
/* eslint-disable */
import { Contract, Signer, utils } from "ethers";
import type { Provider } from "@ethersproject/providers";
import type {
ERC2771Context,
ERC2771ContextInterface,
} from "../../../lib/metatx/ERC2771Context";
const _abi = [
{
inputs: [
{
internalType: "address",
name: "",
type: "address",
},
],
name: "isTrustedForwarder",
outputs: [
{
internalType: "bool",
name: "",
type: "bool",
},
],
stateMutability: "view",
type: "function",
},
];
export class ERC2771Context__factory {
static readonly abi = _abi;
static createInterface(): ERC2771ContextInterface {
return new utils.Interface(_abi) as ERC2771ContextInterface;
}
static connect(
address: string,
signerOrProvider: Signer | Provider
): ERC2771Context {
return new Contract(address, _abi, signerOrProvider) as ERC2771Context;
}
}

View File

@ -0,0 +1,4 @@
/* Autogenerated file. Do not edit manually. */
/* tslint:disable */
/* eslint-disable */
export { ERC2771Context__factory } from "./ERC2771Context__factory";

File diff suppressed because one or more lines are too long

View File

@ -32,6 +32,10 @@ declare module "hardhat/types/runtime" {
name: "IReputation",
signerOrOptions?: ethers.Signer | FactoryOptions
): Promise<Contracts.IReputation__factory>;
getContractFactory(
name: "ERC2771Context",
signerOrOptions?: ethers.Signer | FactoryOptions
): Promise<Contracts.ERC2771Context__factory>;
getContractFactory(
name: "MockToken",
signerOrOptions?: ethers.Signer | FactoryOptions
@ -90,6 +94,11 @@ declare module "hardhat/types/runtime" {
address: string,
signer?: ethers.Signer
): Promise<Contracts.IReputation>;
getContractAt(
name: "ERC2771Context",
address: string,
signer?: ethers.Signer
): Promise<Contracts.ERC2771Context>;
getContractAt(
name: "MockToken",
address: string,

View File

@ -19,6 +19,8 @@ export type { Owned } from "./lib/auth/Owned";
export { Owned__factory } from "./factories/lib/auth/Owned__factory";
export type { IReputation } from "./lib/interfaces/IReputation";
export { IReputation__factory } from "./factories/lib/interfaces/IReputation__factory";
export type { ERC2771Context } from "./lib/metatx/ERC2771Context";
export { ERC2771Context__factory } from "./factories/lib/metatx/ERC2771Context__factory";
export type { MockToken } from "./lib/mock/mockToken.sol/MockToken";
export { MockToken__factory } from "./factories/lib/mock/mockToken.sol/MockToken__factory";
export type { ERC20 } from "./lib/tokens/ERC20";

View File

@ -5,6 +5,8 @@ import type * as auth from "./auth";
export type { auth };
import type * as interfaces from "./interfaces";
export type { interfaces };
import type * as metatx from "./metatx";
export type { metatx };
import type * as mock from "./mock";
export type { mock };
import type * as tokens from "./tokens";

View File

@ -0,0 +1,103 @@
/* Autogenerated file. Do not edit manually. */
/* tslint:disable */
/* eslint-disable */
import type {
BaseContract,
BigNumber,
BytesLike,
CallOverrides,
PopulatedTransaction,
Signer,
utils,
} from "ethers";
import type { FunctionFragment, Result } from "@ethersproject/abi";
import type { Listener, Provider } from "@ethersproject/providers";
import type {
TypedEventFilter,
TypedEvent,
TypedListener,
OnEvent,
PromiseOrValue,
} from "../../common";
export interface ERC2771ContextInterface extends utils.Interface {
functions: {
"isTrustedForwarder(address)": FunctionFragment;
};
getFunction(nameOrSignatureOrTopic: "isTrustedForwarder"): FunctionFragment;
encodeFunctionData(
functionFragment: "isTrustedForwarder",
values: [PromiseOrValue<string>]
): string;
decodeFunctionResult(
functionFragment: "isTrustedForwarder",
data: BytesLike
): Result;
events: {};
}
export interface ERC2771Context extends BaseContract {
connect(signerOrProvider: Signer | Provider | string): this;
attach(addressOrName: string): this;
deployed(): Promise<this>;
interface: ERC2771ContextInterface;
queryFilter<TEvent extends TypedEvent>(
event: TypedEventFilter<TEvent>,
fromBlockOrBlockhash?: string | number | undefined,
toBlock?: string | number | undefined
): Promise<Array<TEvent>>;
listeners<TEvent extends TypedEvent>(
eventFilter?: TypedEventFilter<TEvent>
): Array<TypedListener<TEvent>>;
listeners(eventName?: string): Array<Listener>;
removeAllListeners<TEvent extends TypedEvent>(
eventFilter: TypedEventFilter<TEvent>
): this;
removeAllListeners(eventName?: string): this;
off: OnEvent<this>;
on: OnEvent<this>;
once: OnEvent<this>;
removeListener: OnEvent<this>;
functions: {
isTrustedForwarder(
arg0: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<[boolean]>;
};
isTrustedForwarder(
arg0: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<boolean>;
callStatic: {
isTrustedForwarder(
arg0: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<boolean>;
};
filters: {};
estimateGas: {
isTrustedForwarder(
arg0: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<BigNumber>;
};
populateTransaction: {
isTrustedForwarder(
arg0: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<PopulatedTransaction>;
};
}

View File

@ -0,0 +1,4 @@
/* Autogenerated file. Do not edit manually. */
/* tslint:disable */
/* eslint-disable */
export type { ERC2771Context } from "./ERC2771Context";

View File

@ -33,12 +33,15 @@ export interface P2PIXInterface extends utils.Interface {
"_castKeyToAddr(uint256)": FunctionFragment;
"allowedERC20s(address)": FunctionFragment;
"defaultLockBlocks()": FunctionFragment;
"deposit(address,uint96,uint160,bool,bytes32)": FunctionFragment;
"deposit(address,uint96,string,bool,bytes32)": FunctionFragment;
"getBalance(address,address)": FunctionFragment;
"getBalances(address[],address)": FunctionFragment;
"getLocksStatus(uint256[])": FunctionFragment;
"getPixTarget(address,address)": FunctionFragment;
"getPixTargetString(address,address)": FunctionFragment;
"getStr(string)": FunctionFragment;
"getValid(address,address)": FunctionFragment;
"isTrustedForwarder(address)": FunctionFragment;
"lock(address,address,uint80,bytes32[],uint256[])": FunctionFragment;
"lockCounter()": FunctionFragment;
"mapLocks(uint256)": FunctionFragment;
@ -46,11 +49,11 @@ export interface P2PIXInterface extends utils.Interface {
"release(uint256,bytes32,bytes32,bytes32,uint8)": FunctionFragment;
"reputation()": FunctionFragment;
"sellerAllowList(uint256)": FunctionFragment;
"sellerBalance(uint256,address)": FunctionFragment;
"setDefaultLockBlocks(uint256)": FunctionFragment;
"setOwner(address)": FunctionFragment;
"setReputation(address)": FunctionFragment;
"setRoot(address,bytes32)": FunctionFragment;
"setTrustedFowarders(address[],bool[])": FunctionFragment;
"setValidSigners(address[])": FunctionFragment;
"setValidState(address,bool)": FunctionFragment;
"tokenSettings(address[],bool[])": FunctionFragment;
@ -73,7 +76,10 @@ export interface P2PIXInterface extends utils.Interface {
| "getBalances"
| "getLocksStatus"
| "getPixTarget"
| "getPixTargetString"
| "getStr"
| "getValid"
| "isTrustedForwarder"
| "lock"
| "lockCounter"
| "mapLocks"
@ -81,11 +87,11 @@ export interface P2PIXInterface extends utils.Interface {
| "release"
| "reputation"
| "sellerAllowList"
| "sellerBalance"
| "setDefaultLockBlocks"
| "setOwner"
| "setReputation"
| "setRoot"
| "setTrustedFowarders"
| "setValidSigners"
| "setValidState"
| "tokenSettings"
@ -118,7 +124,7 @@ export interface P2PIXInterface extends utils.Interface {
values: [
PromiseOrValue<string>,
PromiseOrValue<BigNumberish>,
PromiseOrValue<BigNumberish>,
PromiseOrValue<string>,
PromiseOrValue<boolean>,
PromiseOrValue<BytesLike>
]
@ -139,10 +145,22 @@ export interface P2PIXInterface extends utils.Interface {
functionFragment: "getPixTarget",
values: [PromiseOrValue<string>, PromiseOrValue<string>]
): string;
encodeFunctionData(
functionFragment: "getPixTargetString",
values: [PromiseOrValue<string>, PromiseOrValue<string>]
): string;
encodeFunctionData(
functionFragment: "getStr",
values: [PromiseOrValue<string>]
): string;
encodeFunctionData(
functionFragment: "getValid",
values: [PromiseOrValue<string>, PromiseOrValue<string>]
): string;
encodeFunctionData(
functionFragment: "isTrustedForwarder",
values: [PromiseOrValue<string>]
): string;
encodeFunctionData(
functionFragment: "lock",
values: [
@ -180,10 +198,6 @@ export interface P2PIXInterface extends utils.Interface {
functionFragment: "sellerAllowList",
values: [PromiseOrValue<BigNumberish>]
): string;
encodeFunctionData(
functionFragment: "sellerBalance",
values: [PromiseOrValue<BigNumberish>, PromiseOrValue<string>]
): string;
encodeFunctionData(
functionFragment: "setDefaultLockBlocks",
values: [PromiseOrValue<BigNumberish>]
@ -200,6 +214,10 @@ export interface P2PIXInterface extends utils.Interface {
functionFragment: "setRoot",
values: [PromiseOrValue<string>, PromiseOrValue<BytesLike>]
): string;
encodeFunctionData(
functionFragment: "setTrustedFowarders",
values: [PromiseOrValue<string>[], PromiseOrValue<boolean>[]]
): string;
encodeFunctionData(
functionFragment: "setValidSigners",
values: [PromiseOrValue<string>[]]
@ -271,7 +289,16 @@ export interface P2PIXInterface extends utils.Interface {
functionFragment: "getPixTarget",
data: BytesLike
): Result;
decodeFunctionResult(
functionFragment: "getPixTargetString",
data: BytesLike
): Result;
decodeFunctionResult(functionFragment: "getStr", data: BytesLike): Result;
decodeFunctionResult(functionFragment: "getValid", data: BytesLike): Result;
decodeFunctionResult(
functionFragment: "isTrustedForwarder",
data: BytesLike
): Result;
decodeFunctionResult(functionFragment: "lock", data: BytesLike): Result;
decodeFunctionResult(
functionFragment: "lockCounter",
@ -285,10 +312,6 @@ export interface P2PIXInterface extends utils.Interface {
functionFragment: "sellerAllowList",
data: BytesLike
): Result;
decodeFunctionResult(
functionFragment: "sellerBalance",
data: BytesLike
): Result;
decodeFunctionResult(
functionFragment: "setDefaultLockBlocks",
data: BytesLike
@ -299,6 +322,10 @@ export interface P2PIXInterface extends utils.Interface {
data: BytesLike
): Result;
decodeFunctionResult(functionFragment: "setRoot", data: BytesLike): Result;
decodeFunctionResult(
functionFragment: "setTrustedFowarders",
data: BytesLike
): Result;
decodeFunctionResult(
functionFragment: "setValidSigners",
data: BytesLike
@ -342,6 +369,7 @@ export interface P2PIXInterface extends utils.Interface {
"OwnerUpdated(address,address)": EventFragment;
"ReputationUpdated(address)": EventFragment;
"RootUpdated(address,bytes32)": EventFragment;
"TrustedForwarderUpdated(address,bool)": EventFragment;
"ValidSet(address,address,bool)": EventFragment;
"ValidSignersUpdated(address[])": EventFragment;
};
@ -357,6 +385,7 @@ export interface P2PIXInterface extends utils.Interface {
getEvent(nameOrSignatureOrTopic: "OwnerUpdated"): EventFragment;
getEvent(nameOrSignatureOrTopic: "ReputationUpdated"): EventFragment;
getEvent(nameOrSignatureOrTopic: "RootUpdated"): EventFragment;
getEvent(nameOrSignatureOrTopic: "TrustedForwarderUpdated"): EventFragment;
getEvent(nameOrSignatureOrTopic: "ValidSet"): EventFragment;
getEvent(nameOrSignatureOrTopic: "ValidSignersUpdated"): EventFragment;
}
@ -489,6 +518,18 @@ export type RootUpdatedEvent = TypedEvent<
export type RootUpdatedEventFilter = TypedEventFilter<RootUpdatedEvent>;
export interface TrustedForwarderUpdatedEventObject {
forwarder: string;
state: boolean;
}
export type TrustedForwarderUpdatedEvent = TypedEvent<
[string, boolean],
TrustedForwarderUpdatedEventObject
>;
export type TrustedForwarderUpdatedEventFilter =
TypedEventFilter<TrustedForwarderUpdatedEvent>;
export interface ValidSetEventObject {
seller: string;
token: string;
@ -559,7 +600,7 @@ export interface P2PIX extends BaseContract {
deposit(
_token: PromiseOrValue<string>,
_amount: PromiseOrValue<BigNumberish>,
_pixTarget: PromiseOrValue<BigNumberish>,
_pixTarget: PromiseOrValue<string>,
_valid: PromiseOrValue<boolean>,
allowlistRoot: PromiseOrValue<BytesLike>,
overrides?: Overrides & { from?: PromiseOrValue<string> }
@ -586,7 +627,18 @@ export interface P2PIX extends BaseContract {
seller: PromiseOrValue<string>,
token: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<[BigNumber] & { pixTarget: BigNumber }>;
): Promise<[string] & { pixTarget: string }>;
getPixTargetString(
seller: PromiseOrValue<string>,
token: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<[string] & { pixTarget: string }>;
getStr(
str: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<[string] & { strEnc: string }>;
getValid(
seller: PromiseOrValue<string>,
@ -594,6 +646,11 @@ export interface P2PIX extends BaseContract {
overrides?: CallOverrides
): Promise<[boolean] & { valid: boolean }>;
isTrustedForwarder(
arg0: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<[boolean]>;
lock(
_seller: PromiseOrValue<string>,
_token: PromiseOrValue<string>,
@ -609,22 +666,14 @@ export interface P2PIX extends BaseContract {
arg0: PromiseOrValue<BigNumberish>,
overrides?: CallOverrides
): Promise<
[
BigNumber,
BigNumber,
string,
string,
BigNumber,
BigNumber,
BigNumber
] & {
amount: BigNumber;
pixTarget: BigNumber;
token: string;
buyerAddress: string;
[BigNumber, BigNumber, BigNumber, string, BigNumber, string, string] & {
sellerKey: BigNumber;
counter: BigNumber;
expirationBlock: BigNumber;
pixTarget: string;
amount: BigNumber;
token: string;
buyerAddress: string;
}
>;
@ -646,12 +695,6 @@ export interface P2PIX extends BaseContract {
overrides?: CallOverrides
): Promise<[string] & { root: string }>;
sellerBalance(
sellerKey: PromiseOrValue<BigNumberish>,
erc20: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<[BigNumber] & { packed: BigNumber }>;
setDefaultLockBlocks(
_blocks: PromiseOrValue<BigNumberish>,
overrides?: Overrides & { from?: PromiseOrValue<string> }
@ -673,6 +716,12 @@ export interface P2PIX extends BaseContract {
overrides?: Overrides & { from?: PromiseOrValue<string> }
): Promise<ContractTransaction>;
setTrustedFowarders(
forwarders: PromiseOrValue<string>[],
states: PromiseOrValue<boolean>[],
overrides?: Overrides & { from?: PromiseOrValue<string> }
): Promise<ContractTransaction>;
setValidSigners(
_validSigners: PromiseOrValue<string>[],
overrides?: Overrides & { from?: PromiseOrValue<string> }
@ -742,7 +791,7 @@ export interface P2PIX extends BaseContract {
deposit(
_token: PromiseOrValue<string>,
_amount: PromiseOrValue<BigNumberish>,
_pixTarget: PromiseOrValue<BigNumberish>,
_pixTarget: PromiseOrValue<string>,
_valid: PromiseOrValue<boolean>,
allowlistRoot: PromiseOrValue<BytesLike>,
overrides?: Overrides & { from?: PromiseOrValue<string> }
@ -769,7 +818,18 @@ export interface P2PIX extends BaseContract {
seller: PromiseOrValue<string>,
token: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<BigNumber>;
): Promise<string>;
getPixTargetString(
seller: PromiseOrValue<string>,
token: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<string>;
getStr(
str: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<string>;
getValid(
seller: PromiseOrValue<string>,
@ -777,6 +837,11 @@ export interface P2PIX extends BaseContract {
overrides?: CallOverrides
): Promise<boolean>;
isTrustedForwarder(
arg0: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<boolean>;
lock(
_seller: PromiseOrValue<string>,
_token: PromiseOrValue<string>,
@ -792,14 +857,14 @@ export interface P2PIX extends BaseContract {
arg0: PromiseOrValue<BigNumberish>,
overrides?: CallOverrides
): Promise<
[BigNumber, BigNumber, string, string, BigNumber, BigNumber, BigNumber] & {
amount: BigNumber;
pixTarget: BigNumber;
token: string;
buyerAddress: string;
[BigNumber, BigNumber, BigNumber, string, BigNumber, string, string] & {
sellerKey: BigNumber;
counter: BigNumber;
expirationBlock: BigNumber;
pixTarget: string;
amount: BigNumber;
token: string;
buyerAddress: string;
}
>;
@ -821,12 +886,6 @@ export interface P2PIX extends BaseContract {
overrides?: CallOverrides
): Promise<string>;
sellerBalance(
sellerKey: PromiseOrValue<BigNumberish>,
erc20: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<BigNumber>;
setDefaultLockBlocks(
_blocks: PromiseOrValue<BigNumberish>,
overrides?: Overrides & { from?: PromiseOrValue<string> }
@ -848,6 +907,12 @@ export interface P2PIX extends BaseContract {
overrides?: Overrides & { from?: PromiseOrValue<string> }
): Promise<ContractTransaction>;
setTrustedFowarders(
forwarders: PromiseOrValue<string>[],
states: PromiseOrValue<boolean>[],
overrides?: Overrides & { from?: PromiseOrValue<string> }
): Promise<ContractTransaction>;
setValidSigners(
_validSigners: PromiseOrValue<string>[],
overrides?: Overrides & { from?: PromiseOrValue<string> }
@ -917,7 +982,7 @@ export interface P2PIX extends BaseContract {
deposit(
_token: PromiseOrValue<string>,
_amount: PromiseOrValue<BigNumberish>,
_pixTarget: PromiseOrValue<BigNumberish>,
_pixTarget: PromiseOrValue<string>,
_valid: PromiseOrValue<boolean>,
allowlistRoot: PromiseOrValue<BytesLike>,
overrides?: CallOverrides
@ -944,7 +1009,18 @@ export interface P2PIX extends BaseContract {
seller: PromiseOrValue<string>,
token: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<BigNumber>;
): Promise<string>;
getPixTargetString(
seller: PromiseOrValue<string>,
token: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<string>;
getStr(
str: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<string>;
getValid(
seller: PromiseOrValue<string>,
@ -952,6 +1028,11 @@ export interface P2PIX extends BaseContract {
overrides?: CallOverrides
): Promise<boolean>;
isTrustedForwarder(
arg0: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<boolean>;
lock(
_seller: PromiseOrValue<string>,
_token: PromiseOrValue<string>,
@ -967,22 +1048,14 @@ export interface P2PIX extends BaseContract {
arg0: PromiseOrValue<BigNumberish>,
overrides?: CallOverrides
): Promise<
[
BigNumber,
BigNumber,
string,
string,
BigNumber,
BigNumber,
BigNumber
] & {
amount: BigNumber;
pixTarget: BigNumber;
token: string;
buyerAddress: string;
[BigNumber, BigNumber, BigNumber, string, BigNumber, string, string] & {
sellerKey: BigNumber;
counter: BigNumber;
expirationBlock: BigNumber;
pixTarget: string;
amount: BigNumber;
token: string;
buyerAddress: string;
}
>;
@ -1004,12 +1077,6 @@ export interface P2PIX extends BaseContract {
overrides?: CallOverrides
): Promise<string>;
sellerBalance(
sellerKey: PromiseOrValue<BigNumberish>,
erc20: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<BigNumber>;
setDefaultLockBlocks(
_blocks: PromiseOrValue<BigNumberish>,
overrides?: CallOverrides
@ -1031,6 +1098,12 @@ export interface P2PIX extends BaseContract {
overrides?: CallOverrides
): Promise<void>;
setTrustedFowarders(
forwarders: PromiseOrValue<string>[],
states: PromiseOrValue<boolean>[],
overrides?: CallOverrides
): Promise<void>;
setValidSigners(
_validSigners: PromiseOrValue<string>[],
overrides?: CallOverrides
@ -1175,6 +1248,15 @@ export interface P2PIX extends BaseContract {
merkleRoot?: PromiseOrValue<BytesLike> | null
): RootUpdatedEventFilter;
"TrustedForwarderUpdated(address,bool)"(
forwarder?: PromiseOrValue<string> | null,
state?: PromiseOrValue<boolean> | null
): TrustedForwarderUpdatedEventFilter;
TrustedForwarderUpdated(
forwarder?: PromiseOrValue<string> | null,
state?: PromiseOrValue<boolean> | null
): TrustedForwarderUpdatedEventFilter;
"ValidSet(address,address,bool)"(
seller?: PromiseOrValue<string> | null,
token?: null,
@ -1213,7 +1295,7 @@ export interface P2PIX extends BaseContract {
deposit(
_token: PromiseOrValue<string>,
_amount: PromiseOrValue<BigNumberish>,
_pixTarget: PromiseOrValue<BigNumberish>,
_pixTarget: PromiseOrValue<string>,
_valid: PromiseOrValue<boolean>,
allowlistRoot: PromiseOrValue<BytesLike>,
overrides?: Overrides & { from?: PromiseOrValue<string> }
@ -1242,12 +1324,28 @@ export interface P2PIX extends BaseContract {
overrides?: CallOverrides
): Promise<BigNumber>;
getPixTargetString(
seller: PromiseOrValue<string>,
token: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<BigNumber>;
getStr(
str: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<BigNumber>;
getValid(
seller: PromiseOrValue<string>,
token: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<BigNumber>;
isTrustedForwarder(
arg0: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<BigNumber>;
lock(
_seller: PromiseOrValue<string>,
_token: PromiseOrValue<string>,
@ -1282,12 +1380,6 @@ export interface P2PIX extends BaseContract {
overrides?: CallOverrides
): Promise<BigNumber>;
sellerBalance(
sellerKey: PromiseOrValue<BigNumberish>,
erc20: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<BigNumber>;
setDefaultLockBlocks(
_blocks: PromiseOrValue<BigNumberish>,
overrides?: Overrides & { from?: PromiseOrValue<string> }
@ -1309,6 +1401,12 @@ export interface P2PIX extends BaseContract {
overrides?: Overrides & { from?: PromiseOrValue<string> }
): Promise<BigNumber>;
setTrustedFowarders(
forwarders: PromiseOrValue<string>[],
states: PromiseOrValue<boolean>[],
overrides?: Overrides & { from?: PromiseOrValue<string> }
): Promise<BigNumber>;
setValidSigners(
_validSigners: PromiseOrValue<string>[],
overrides?: Overrides & { from?: PromiseOrValue<string> }
@ -1379,7 +1477,7 @@ export interface P2PIX extends BaseContract {
deposit(
_token: PromiseOrValue<string>,
_amount: PromiseOrValue<BigNumberish>,
_pixTarget: PromiseOrValue<BigNumberish>,
_pixTarget: PromiseOrValue<string>,
_valid: PromiseOrValue<boolean>,
allowlistRoot: PromiseOrValue<BytesLike>,
overrides?: Overrides & { from?: PromiseOrValue<string> }
@ -1408,12 +1506,28 @@ export interface P2PIX extends BaseContract {
overrides?: CallOverrides
): Promise<PopulatedTransaction>;
getPixTargetString(
seller: PromiseOrValue<string>,
token: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<PopulatedTransaction>;
getStr(
str: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<PopulatedTransaction>;
getValid(
seller: PromiseOrValue<string>,
token: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<PopulatedTransaction>;
isTrustedForwarder(
arg0: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<PopulatedTransaction>;
lock(
_seller: PromiseOrValue<string>,
_token: PromiseOrValue<string>,
@ -1448,12 +1562,6 @@ export interface P2PIX extends BaseContract {
overrides?: CallOverrides
): Promise<PopulatedTransaction>;
sellerBalance(
sellerKey: PromiseOrValue<BigNumberish>,
erc20: PromiseOrValue<string>,
overrides?: CallOverrides
): Promise<PopulatedTransaction>;
setDefaultLockBlocks(
_blocks: PromiseOrValue<BigNumberish>,
overrides?: Overrides & { from?: PromiseOrValue<string> }
@ -1475,6 +1583,12 @@ export interface P2PIX extends BaseContract {
overrides?: Overrides & { from?: PromiseOrValue<string> }
): Promise<PopulatedTransaction>;
setTrustedFowarders(
forwarders: PromiseOrValue<string>[],
states: PromiseOrValue<boolean>[],
overrides?: Overrides & { from?: PromiseOrValue<string> }
): Promise<PopulatedTransaction>;
setValidSigners(
_validSigners: PromiseOrValue<string>[],
overrides?: Overrides & { from?: PromiseOrValue<string> }

View File

@ -302,7 +302,7 @@ describe("P2PIX", () => {
});
describe("Deposit", async () => {
it("should revert if ERC20 is not allowed", async () => {
const pTarget = ethers.BigNumber.from(7331);
const pTarget = "7ce3339x4133301u8f63pn71a5333118";
const root = ethers.utils.keccak256(
ethers.utils.toUtf8Bytes("root"),
);
@ -326,7 +326,7 @@ describe("P2PIX", () => {
const tx = p2pix.deposit(
erc20.address,
1,
0,
"",
true,
root,
);
@ -337,7 +337,7 @@ describe("P2PIX", () => {
);
});
it("should revert if amount exceeds the balance limit", async () => {
const pTarget = ethers.BigNumber.from(7331);
const pTarget = "7ce3339x4133301u8f63pn71a5333118";
const root = ethers.utils.keccak256(
ethers.utils.toUtf8Bytes("root"),
);
@ -355,7 +355,7 @@ describe("P2PIX", () => {
);
});
it("should create deposit, update storage and emit event", async () => {
const pTarget = ethers.BigNumber.from(7331);
const pTarget = "7ce3339x4133301u8f63pn71a5333118";
// we use `hashZero` to avoid updating seller's allowlist settings
const root = ethers.constants.HashZero;
await erc20.approve(p2pix.address, price);
@ -387,6 +387,7 @@ describe("P2PIX", () => {
erc20.address,
);
expect(tx).to.be.ok;
await expect(tx)
.to.emit(p2pix, "DepositAdded")
@ -397,7 +398,7 @@ describe("P2PIX", () => {
["-100000000000000000000", price],
);
expect(storage).to.eq(price);
expect(pixTarget).to.eq(pTarget);
expect(pixTarget).to.eq(await p2pix.callStatic.getStr(pTarget));
expect(valid).to.eq(true);
expect(allowList).to.eq(root);
expect(balances[0]).to.eq(price);
@ -418,9 +419,9 @@ describe("P2PIX", () => {
acc03.address,
);
const pTarget = ethers.BigNumber.from(7331);
const pTarget2 = ethers.BigNumber.from(1337);
const pTarget3 = ethers.BigNumber.from(3731);
const pTarget = "7ce3339x4133301u8f63pn71a5333118";
const pTarget2 = "12312333321";
const pTarget3 = "43999999999";
// we mock the allowlist root here only to test storage update. In depth
// allowlist test coverage in both "Lock" and "Allowlist Settings" unit tests.
const root = ethers.utils.keccak256(
@ -588,29 +589,29 @@ describe("P2PIX", () => {
expect(prices[3]).to.eq(balances[3]);
expect(storage1).to.eq(price);
expect(pixTarget1).to.eq(pTarget);
expect(pixTarget1).to.eq(await p2pix.callStatic.getStr(pTarget));
expect(valid1).to.eq(true);
expect(allowList1).to.eq(root);
expect(storage2).to.eq(price2);
expect(pixTarget2).to.eq(pTarget2);
expect(pixTarget2).to.eq(await p2pix.callStatic.getStr(pTarget2));
expect(valid2).to.eq(false);
expect(allowList2).to.eq(nullRoot);
expect(storage3).to.eq(price3);
expect(pixTarget3).to.eq(pTarget3);
expect(pixTarget3).to.eq(await p2pix.callStatic.getStr(pTarget3));
expect(valid3).to.eq(true);
expect(allowList3).to.eq(root);
expect(storage4).to.eq(price4);
expect(pixTarget4).to.eq(pTarget);
expect(pixTarget4).to.eq(await p2pix.callStatic.getStr(pTarget));
expect(valid4).to.eq(false);
expect(allowList4).to.eq(nullRoot);
});
});
describe("Lock", async () => {
it("should revert if deposit is invalid", async () => {
const pTarget = ethers.BigNumber.from(7331);
const pTarget = "7ce3339x4133301u8f63pn71a5333118";
await erc20.approve(p2pix.address, price);
await p2pix.deposit(
erc20.address,
@ -652,7 +653,7 @@ describe("P2PIX", () => {
});
it("should revert if wished amount is greater than balance's remaining amount", async () => {
await erc20.approve(p2pix.address, price);
const pTarget = ethers.BigNumber.from(1337);
const pTarget = "7ce3339x4133301u8f63pn71a5333118";
await p2pix.deposit(
erc20.address,
price,
@ -683,7 +684,7 @@ describe("P2PIX", () => {
await p2pix.deposit(
erc20.address,
price,
ethers.BigNumber.from("1337"),
"7ce3339x4133301u8f63pn71a5333118",
true,
merkleRoot,
);
@ -716,7 +717,7 @@ describe("P2PIX", () => {
await p2pix.deposit(
erc20.address,
price.mul(BigNumber.from("3")),
ethers.BigNumber.from("1"),
"1",
true,
merkleRoot,
);
@ -738,7 +739,7 @@ describe("P2PIX", () => {
);
});
it("should create a lock, update storage and emit events via the allowlist path", async () => {
const target = ethers.BigNumber.from(101);
const target = "333";
await erc20.approve(p2pix.address, price);
await p2pix.deposit(
erc20.address,
@ -784,14 +785,14 @@ describe("P2PIX", () => {
// );
expect(storage.amount).to.eq(price);
expect(storage.expirationBlock).to.eq(expiration);
expect(storage.pixTarget).to.eq(target);
expect(storage.pixTarget).to.eq(await p2pix.callStatic.getStr(target));
expect(storage.buyerAddress).to.eq(acc01.address);
// expect(storage.relayerAddress).to.eq(acc01.address);
expect(storage.token).to.eq(erc20.address);
});
it("should create a lock, update storage and emit events via the reputation path 1", async () => {
const root = ethers.constants.HashZero;
const target = ethers.BigNumber.from(101);
const target = "101";
await erc20.approve(p2pix.address, price);
await p2pix.deposit(
erc20.address,
@ -833,7 +834,7 @@ describe("P2PIX", () => {
// );
expect(storage.amount).to.eq(price);
expect(storage.expirationBlock).to.eq(expiration);
expect(storage.pixTarget).to.eq(target);
expect(storage.pixTarget).to.eq(await p2pix.callStatic.getStr(target));
expect(storage.buyerAddress).to.eq(acc01.address);
// expect(storage.relayerAddress).to.eq(acc01.address);
expect(storage.token).to.eq(erc20.address);
@ -848,10 +849,10 @@ describe("P2PIX", () => {
.mul(ethers.constants.Two)
.add(ethers.constants.One);
const endtoendID = ethers.constants.HashZero;
const target = ethers.BigNumber.from(101);
const target = "101";
const messageToSign = ethers.utils.solidityKeccak256(
["uint160", "uint80", "bytes32"],
[target, price, endtoendID],
["bytes32", "uint80", "bytes32"],
[await p2pix.callStatic.getStr(target), price, endtoendID],
);
const messageHashBytes =
ethers.utils.arrayify(messageToSign);
@ -922,7 +923,7 @@ describe("P2PIX", () => {
price.add(ethers.constants.One),
);
expect(storage.expirationBlock).to.eq(expiration);
expect(storage.pixTarget).to.eq(target);
expect(storage.pixTarget).to.eq(await p2pix.callStatic.getStr(target));
expect(storage.buyerAddress).to.eq(acc01.address);
// expect(storage.relayerAddress).to.eq(acc01.address);
expect(storage.token).to.eq(erc20.address);
@ -934,7 +935,7 @@ describe("P2PIX", () => {
// edge case test
it("should create multiple locks", async () => {
const newPrice = price.div(ethers.BigNumber.from(2));
const target = ethers.BigNumber.from(101);
const target = ethers.BigNumber.from(101).toString();
await erc20.approve(p2pix.address, price);
await p2pix.deposit(
erc20.address,
@ -1088,7 +1089,7 @@ describe("P2PIX", () => {
expect(storage2.expirationBlock).to.eq(expiration2);
expect(storage3.expirationBlock).to.eq(expiration3);
expect(target)
expect(await p2pix.callStatic.getStr(target))
.to.eq(storage1.pixTarget)
.and.to.eq(storage2.pixTarget)
.and.to.eq(storage3.pixTarget);
@ -1138,7 +1139,7 @@ describe("P2PIX", () => {
await p2pix.deposit(
erc20.address,
price,
ethers.BigNumber.from(10101),
ethers.BigNumber.from(10101).toString(),
true,
merkleRoot,
);
@ -1165,7 +1166,7 @@ describe("P2PIX", () => {
it("should cancel multiple balances", async () => {
const hashZero = ethers.constants.HashZero;
await erc20.mint([acc01.address, acc02.address], price);
const target = ethers.BigNumber.from("1");
const target = ethers.BigNumber.from("1").toString();
await erc20.approve(p2pix.address, price);
await p2pix.deposit(
erc20.address,
@ -1255,7 +1256,7 @@ describe("P2PIX", () => {
});
describe("Release", async () => {
it("should revert if lock has expired", async () => {
const target = ethers.BigNumber.from(101);
const target = ethers.BigNumber.from(101).toString();
const messageToSign = ethers.utils.solidityKeccak256(
["uint160", "uint80", "bytes32"],
[target, 100, ethers.constants.HashZero],
@ -1299,11 +1300,11 @@ describe("P2PIX", () => {
);
});
it("should revert if lock has already been released", async () => {
const target = ethers.BigNumber.from("1");
const target = ethers.BigNumber.from("1").toString();
const hashZero = ethers.constants.HashZero;
const messageToSign = ethers.utils.solidityKeccak256(
["uint160", "uint80", "bytes32"],
[target, 100, hashZero],
["bytes32", "uint80", "bytes32"],
[await p2pix.callStatic.getStr(target), 100, hashZero],
);
const flatSig = await acc01.signMessage(
ethers.utils.arrayify(messageToSign),
@ -1350,10 +1351,10 @@ describe("P2PIX", () => {
);
});
it("should revert if signed message has already been used", async () => {
const target = ethers.BigNumber.from(101);
const target = ethers.BigNumber.from(101).toString();
const messageToSign = ethers.utils.solidityKeccak256(
["uint160", "uint80", "bytes32"],
[target, 100, ethers.constants.HashZero],
["bytes32", "uint80", "bytes32"],
[await p2pix.callStatic.getStr(target), 100, ethers.constants.HashZero],
);
const flatSig = await owner.signMessage(
ethers.utils.arrayify(messageToSign),
@ -1415,10 +1416,10 @@ describe("P2PIX", () => {
);
});
it("should revert if ecrecovered signer is invalid", async () => {
const target = ethers.BigNumber.from(101);
const target = ethers.BigNumber.from(101).toString();
const messageToSign = ethers.utils.solidityKeccak256(
["uint160", "uint80", "bytes32"],
[target, 100, ethers.constants.HashZero],
["bytes32", "uint80", "bytes32"],
[await p2pix.callStatic.getStr(target), 100, ethers.constants.HashZero],
);
const flatSig = await acc03.signMessage(
ethers.utils.arrayify(messageToSign),
@ -1462,10 +1463,10 @@ describe("P2PIX", () => {
it("should release lock, update storage and emit events", async () => {
const zero = ethers.constants.Zero;
const endtoendID = ethers.constants.HashZero;
const pixTarget = ethers.BigNumber.from(101);
const pixTarget = ethers.BigNumber.from(101).toString();
const messageToSign = ethers.utils.solidityKeccak256(
["uint160", "uint80", "bytes32"],
[pixTarget, 100, endtoendID],
["bytes32", "uint80", "bytes32"],
[await p2pix.callStatic.getStr(pixTarget), 100, endtoendID],
);
// Note: messageToSign is a string, that is 66-bytes long, to sign the
// binary value, we must convert it to the 32 byte Array that
@ -1615,7 +1616,7 @@ describe("P2PIX", () => {
// edge case test
it("should release multiple locks", async () => {
const endtoendID = ethers.constants.HashZero;
const pixTarget = ethers.BigNumber.from(101);
const pixTarget = ethers.BigNumber.from(101).toString();
const root = ethers.constants.HashZero;
const acc01Key = await p2pix.callStatic._castAddrToKey(
acc01.address,
@ -1630,24 +1631,24 @@ describe("P2PIX", () => {
acc03Key,
);
const messageToSign1 = ethers.utils.solidityKeccak256(
["uint160", "uint80", "bytes32"],
[pixTarget, 100, endtoendID],
["bytes32", "uint80", "bytes32"],
[await p2pix.callStatic.getStr(pixTarget), 100, endtoendID],
);
const flatSig1 = await owner.signMessage(
ethers.utils.arrayify(messageToSign1),
);
const sig1 = ethers.utils.splitSignature(flatSig1);
const messageToSign2 = ethers.utils.solidityKeccak256(
["uint160", "uint80", "bytes32"],
[pixTarget, 50, endtoendID],
["bytes32", "uint80", "bytes32"],
[await p2pix.callStatic.getStr(pixTarget), 50, endtoendID],
);
const flatSig2 = await owner.signMessage(
ethers.utils.arrayify(messageToSign2),
);
const sig2 = ethers.utils.splitSignature(flatSig2);
const messageToSign3 = ethers.utils.solidityKeccak256(
["uint160", "uint80", "bytes32"],
[pixTarget, 25, endtoendID],
["bytes32", "uint80", "bytes32"],
[await p2pix.callStatic.getStr(pixTarget), 25, endtoendID],
);
const flatSig3 = await owner.signMessage(
ethers.utils.arrayify(messageToSign3),
@ -1851,7 +1852,7 @@ describe("P2PIX", () => {
});
describe("Unexpire Locks", async () => {
it("should revert if lock isn't expired", async () => {
const target = ethers.BigNumber.from(101);
const target = ethers.BigNumber.from(101).toString();
await erc20.approve(p2pix.address, price);
await p2pix.deposit(
erc20.address,
@ -1881,10 +1882,10 @@ describe("P2PIX", () => {
});
it("should revert if lock has already been released", async () => {
const endtoendID = ethers.constants.HashZero;
const pixTarget = ethers.BigNumber.from(101);
const pixTarget = ethers.BigNumber.from(101).toString();
const messageToSign = ethers.utils.solidityKeccak256(
["uint160", "uint80", "bytes32"],
[pixTarget, 1, endtoendID],
["bytes32", "uint80", "bytes32"],
[await p2pix.callStatic.getStr(pixTarget), 1, endtoendID],
);
const messageHashBytes =
ethers.utils.arrayify(messageToSign);
@ -1928,7 +1929,7 @@ describe("P2PIX", () => {
);
});
it("should unlock expired locks, update storage and emit events", async () => {
const target = ethers.BigNumber.from(101);
const target = ethers.BigNumber.from(101).toString();
await erc20.approve(p2pix.address, price);
await p2pix.deposit(
erc20.address,
@ -1992,7 +1993,7 @@ describe("P2PIX", () => {
);
});
it("should unlock expired through lock function", async () => {
const target = ethers.BigNumber.from(101);
const target = ethers.BigNumber.from(101).toString();
// test method through lock fx
await erc20.approve(p2pix.address, price);
await p2pix.deposit(
@ -2068,7 +2069,7 @@ describe("P2PIX", () => {
);
});
it("should unlock expired through withdraw function", async () => {
const target = ethers.constants.One;
const target = ethers.constants.One.toString();
// test method through withdraw fx
await erc20.approve(p2pix.address, price);
await p2pix.deposit(
@ -2110,7 +2111,7 @@ describe("P2PIX", () => {
describe("Seller Withdraw", async () => {
it("should revert if the wished amount is invalid", async () => {
const target = ethers.BigNumber.from(101);
const target = ethers.BigNumber.from(101).toString();
await erc20.approve(p2pix.address, price);
await p2pix.deposit(
erc20.address,
@ -2138,7 +2139,7 @@ describe("P2PIX", () => {
const dep = await p2pix.deposit(
erc20.address,
price,
ethers.BigNumber.from(101),
ethers.BigNumber.from(101).toString(),
true,
merkleRoot,
);

View File

@ -23,7 +23,7 @@ export interface Lock {
sellerKey: BigNumber;
counter: BigNumber;
expirationBlock: BigNumber;
pixTarget: BigNumber;
pixTarget: string;
token: string;
buyerAddress: string;
amount: BigNumber;