fix_lint (#11)

Co-authored-by: Arthur Abeilice <afa7789@gmail.com>
Reviewed-on: https://git.p2pix.co/doiim/p2pix-smart-contracts/pulls/11
Co-authored-by: arthur <abeilice@kosmos.org>
Co-committed-by: arthur <abeilice@kosmos.org>
This commit is contained in:
arthur
2026-05-29 20:09:12 +00:00
committed by hueso
parent 1addaae1c7
commit 9cc62efb8a
21 changed files with 1086 additions and 858 deletions

View File

@@ -1,27 +0,0 @@
# directories
.yarn/
**/.coverage_artifacts
**/.coverage_cache
**/.coverage_contracts
**/artifacts
**/build
**/cache
**/coverage
**/dist
**/node_modules
**/types
# deploy artifacts
deploys/old/
# auto-generated docs
docs/
# files
*.env
*.log
.pnp.*
coverage.json
npm-debug.log*
yarn-debug.log*
yarn-error.log*

View File

@@ -1,21 +0,0 @@
extends:
- "eslint:recommended"
- "plugin:@typescript-eslint/eslint-recommended"
- "plugin:@typescript-eslint/recommended"
- "prettier"
parser: "@typescript-eslint/parser"
parserOptions:
project: "./tsconfig.json"
plugins:
- "@typescript-eslint"
root: true
rules:
"@typescript-eslint/no-floating-promises":
- error
- ignoreIIFE: true
ignoreVoid: true
"@typescript-eslint/no-inferrable-types": "off"
"@typescript-eslint/no-unused-vars":
- error
- argsIgnorePattern: "_"
varsIgnorePattern: "_"

View File

@@ -25,5 +25,3 @@ coverage.json
npm-debug.log* npm-debug.log*
yarn-debug.log* yarn-debug.log*
yarn-error.log* yarn-error.log*
contracts/p2pix.sol

View File

@@ -1,10 +1,8 @@
plugins:
- prettier-plugin-solidity
arrowParens: avoid arrowParens: avoid
bracketSpacing: true bracketSpacing: true
endOfLine: auto endOfLine: auto
importOrder: ["<THIRD_PARTY_MODULES>", "^[./]"]
importOrderParserPlugins: ["typescript"]
importOrderSeparation: true
importOrderSortSpecifiers: true
printWidth: 62 printWidth: 62
singleQuote: false singleQuote: false
tabWidth: 2 tabWidth: 2

View File

@@ -3,6 +3,7 @@
"plugins": ["prettier"], "plugins": ["prettier"],
"rules": { "rules": {
"code-complexity": ["error", 8], "code-complexity": ["error", 8],
"avoid-low-level-calls": "off",
"compiler-version": ["error", ">=0.8.4"], "compiler-version": ["error", ">=0.8.4"],
"const-name-snakecase": "off", "const-name-snakecase": "off",
"constructor-syntax": "error", "constructor-syntax": "error",
@@ -10,7 +11,14 @@
"error", "error",
{ "ignoreConstructors": true } { "ignoreConstructors": true }
], ],
"function-max-lines": "off",
"gas-calldata-parameters": "off",
"gas-indexed-events": "off",
"gas-strict-inequalities": "off",
"gas-struct-packing": "off",
"interface-starts-with-i": "off",
"max-line-length": ["error", 120], "max-line-length": ["error", 120],
"no-inline-assembly": "off",
"not-rely-on-time": "off", "not-rely-on-time": "off",
"prettier/prettier": [ "prettier/prettier": [
"error", "error",
@@ -18,6 +26,7 @@
"endOfLine": "auto" "endOfLine": "auto"
} }
], ],
"reason-string": ["warn", { "maxLength": 64 }] "reason-string": ["warn", { "maxLength": 64 }],
"use-natspec": "off"
} }
} }

View File

@@ -45,9 +45,8 @@ abstract contract BaseUtils is
!validBacenSigners( !validBacenSigners(
_castAddrToKey( _castAddrToKey(
ECDSA.recover( ECDSA.recover(
MessageHashUtils.toEthSignedMessageHash( MessageHashUtils
_message .toEthSignedMessageHash(_message),
),
_signature _signature
) )
) )

View File

@@ -4,19 +4,23 @@ pragma solidity ^0.8.19;
abstract contract Constants { abstract contract Constants {
/// ███ Constants ██████████████████████████████████████████████████████████ /// ███ Constants ██████████████████████████████████████████████████████████
uint256 constant _ROOT_UPDATED_EVENT_SIGNATURE = uint256 internal constant _ROOT_UPDATED_EVENT_SIGNATURE =
0x0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632; 0x0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632;
uint256 constant _ALLOWED_ERC20_UPDATED_EVENT_SIGNATURE = uint256
internal constant _ALLOWED_ERC20_UPDATED_EVENT_SIGNATURE =
0x5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a; 0x5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a;
uint256 constant _TRUSTED_FORWARDER_UPDATED_EVENT_SIGNATURE = uint256
internal constant _TRUSTED_FORWARDER_UPDATED_EVENT_SIGNATURE =
0xbee55516e29d3969d3cb8eb01351eb3c52d06f9e2435bd5a8bfe3647e185df92; 0xbee55516e29d3969d3cb8eb01351eb3c52d06f9e2435bd5a8bfe3647e185df92;
/// @dev Seller casted to key => Seller's allowlist merkleroot. /// @dev Seller casted to key => Seller's allowlist merkleroot.
/// mapping(uint256 => bytes32) public sellerAllowList; /// mapping(uint256 => bytes32) public sellerAllowList;
uint256 constant _SELLER_ALLOWLIST_SLOT_SEED = 0x74dfee70; uint256 internal constant _SELLER_ALLOWLIST_SLOT_SEED =
0x74dfee70;
/// @dev Tokens allowed to serve as the underlying amount of a deposit. /// @dev Tokens allowed to serve as the underlying amount of a deposit.
/// mapping(ERC20 => bool) public allowedERC20s; /// mapping(ERC20 => bool) public allowedERC20s;
uint256 constant _ALLOWED_ERC20_SLOT_SEED = 0xcbc9d1c4; uint256 internal constant _ALLOWED_ERC20_SLOT_SEED =
0xcbc9d1c4;
/// @dev `balance` max. value = 10**26. /// @dev `balance` max. value = 10**26.
/// @dev `pixTarget` keys are restricted to 160 bits. /// @dev `pixTarget` keys are restricted to 160 bits.
@@ -32,16 +36,21 @@ abstract contract Constants {
/// mstore(0x0c, _SELLER_BALANCE_SLOT_SEED) /// mstore(0x0c, _SELLER_BALANCE_SLOT_SEED)
/// mstore(0x00, seller) /// mstore(0x00, seller)
/// let value := sload(keccak256(0x0c, 0x34)). /// let value := sload(keccak256(0x0c, 0x34)).
uint256 constant _SELLER_BALANCE_SLOT_SEED = 0x739094b1; uint256 internal constant _SELLER_BALANCE_SLOT_SEED =
0x739094b1;
/// @dev The bitmask of `sellerBalance` entry. /// @dev The bitmask of `sellerBalance` entry.
uint256 constant BITMASK_SB_ENTRY = (1 << 94) - 1; uint256 internal constant BITMASK_SB_ENTRY =
(1 << 94) - 1;
/// @dev The bit position of `valid` in `sellerBalance`. /// @dev The bit position of `valid` in `sellerBalance`.
uint256 constant BITPOS_VALID = 95; uint256 internal constant BITPOS_VALID = 95;
/// @dev The scalar of BRZ token. /// @dev The scalar of BRZ token.
uint256 constant WAD = 1e18; uint256 internal constant WAD = 1e18;
uint256 constant MAXBALANCE_UPPERBOUND = 1e8 ether; uint256 internal constant MAXBALANCE_UPPERBOUND =
uint256 constant REPUTATION_LOWERBOUND = 1e2 ether; 1e8 ether;
uint256 constant LOCKAMOUNT_UPPERBOUND = 1e6 ether; uint256 internal constant REPUTATION_LOWERBOUND =
1e2 ether;
uint256 internal constant LOCKAMOUNT_UPPERBOUND =
1e6 ether;
} }

View File

@@ -4,7 +4,6 @@ pragma solidity ^0.8.19;
import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
library DataTypes { library DataTypes {
struct Lock { struct Lock {
uint256 counter; uint256 counter;
uint256 expirationBlock; uint256 expirationBlock;

View File

@@ -7,8 +7,9 @@ import { ERC2771Context } from "@openzeppelin/contracts/metatx/ERC2771Context.so
abstract contract ERC2771 is ERC2771Context(address(0)) { abstract contract ERC2771 is ERC2771Context(address(0)) {
mapping(address => bool) public trustedForwarders; mapping(address => bool) public trustedForwarders;
function isTrustedForwarder(address forwarder) public view override returns (bool) { function isTrustedForwarder(
address forwarder
) public view override returns (bool) {
return trustedForwarders[forwarder]; return trustedForwarders[forwarder];
} }
} }

View File

@@ -19,12 +19,12 @@ contract Multicall {
} }
//prettier-ignore //prettier-ignore
//solhint-disable-next-line no-empty-blocks
constructor(/* */) payable {/* */} constructor(/* */) payable {/* */}
function mtc1(Call[] calldata calls) function mtc1(
external Call[] calldata calls
returns (uint256, bytes[] memory) ) external returns (uint256, bytes[] memory) {
{
uint256 bn = block.number; uint256 bn = block.number;
uint256 len = calls.length; uint256 len = calls.length;
bytes[] memory res = new bytes[](len); bytes[] memory res = new bytes[](len);
@@ -49,21 +49,14 @@ contract Multicall {
return (bn, res); return (bn, res);
} }
function mtc2(Call[] calldata calls) function mtc2(
external Call[] calldata calls
returns ( ) external returns (uint256, bytes32, Result[] memory) {
uint256,
bytes32,
Result[] memory
)
{
uint256 bn = block.number; uint256 bn = block.number;
// µ 0 s [0] ≡ P(IHp , µs [0], 0) ∴ P is the hash of a block of a particular number, up to a maximum age. // µ 0 s [0] ≡ P(IHp , µs [0], 0) ∴ P is the hash of a block of a particular number, up to a maximum age.
// 0 is left on the stack if the looked for `block.number` is >= to the current `block.number` or more than 256 // 0 is left on the stack if the looked for `block.number` is >= to the current `block.number` or more than 256
// blocks behind the current block (Yellow Paper, p. 33, https://ethereum.github.io/yellowpaper/paper.pdf). // blocks behind the current block (Yellow Paper, p. 33, https://ethereum.github.io/yellowpaper/paper.pdf).
bytes32 bh = blockhash( bytes32 bh = blockhash(bn /* - 1 */);
bn /* - 1 */
);
uint256 len = calls.length; uint256 len = calls.length;
Result[] memory res = new Result[](len); Result[] memory res = new Result[](len);
uint256 i; uint256 i;

View File

@@ -12,7 +12,6 @@ import { OwnerSettings, ERC20, SafeTransferLib } from "contracts/core/OwnerSetti
import { BaseUtils } from "contracts/core/BaseUtils.sol"; import { BaseUtils } from "contracts/core/BaseUtils.sol";
import { DataTypes as DT } from "contracts/core/DataTypes.sol"; import { DataTypes as DT } from "contracts/core/DataTypes.sol";
contract P2PIX is BaseUtils { contract P2PIX is BaseUtils {
// solhint-disable use-forbidden-name // solhint-disable use-forbidden-name
// solhint-disable no-inline-assembly // solhint-disable no-inline-assembly
@@ -35,6 +34,7 @@ contract P2PIX is BaseUtils {
ERC20[] memory tokens, ERC20[] memory tokens,
bool[] memory tokenStates bool[] memory tokenStates
) )
payable
OwnerSettings( OwnerSettings(
defaultBlocks, defaultBlocks,
validSigners, validSigners,
@@ -42,7 +42,9 @@ contract P2PIX is BaseUtils {
tokens, tokens,
tokenStates tokenStates
) )
payable {/* */} {
/* */
}
/// @notice Creates a deposit order based on a seller's /// @notice Creates a deposit order based on a seller's
/// offer of an amount of ERC20 tokens. /// offer of an amount of ERC20 tokens.
@@ -58,10 +60,13 @@ contract P2PIX is BaseUtils {
uint96 amount, uint96 amount,
bool valid bool valid
) public nonReentrant { ) public nonReentrant {
if (bytes(pixTarget).length == 0)
if (bytes(pixTarget).length == 0) revert EmptyPixTarget(); revert EmptyPixTarget();
if (!allowedERC20s(token)) revert TokenDenied(); if (!allowedERC20s(token)) revert TokenDenied();
uint256 _sellerBalance = __sellerBalance(msg.sender, token); uint256 _sellerBalance = __sellerBalance(
msg.sender,
token
);
uint256 currBal = _sellerBalance & BITMASK_SB_ENTRY; uint256 currBal = _sellerBalance & BITMASK_SB_ENTRY;
uint256 _newBal = uint256(currBal + amount); uint256 _newBal = uint256(currBal + amount);
@@ -97,7 +102,10 @@ contract P2PIX is BaseUtils {
/// @notice This function does not affect any ongoing active locks. /// @notice This function does not affect any ongoing active locks.
/// @dev Function sighash: 0x6d82d9e0 /// @dev Function sighash: 0x6d82d9e0
function setValidState(ERC20 token, bool state) public { function setValidState(ERC20 token, bool state) public {
uint256 _sellerBalance = __sellerBalance(msg.sender, token); uint256 _sellerBalance = __sellerBalance(
msg.sender,
token
);
if (_sellerBalance != 0) { if (_sellerBalance != 0) {
uint256 _valid = _castBool(state); uint256 _valid = _castBool(state);
@@ -148,9 +156,8 @@ contract P2PIX is BaseUtils {
lockID = ++lockCounter; lockID = ++lockCounter;
} }
if ( if (mapLocks[lockID].expirationBlock >= block.number)
mapLocks[lockID].expirationBlock >= block.number revert NotExpired();
) revert NotExpired();
bytes32 _pixTarget = getPixTarget(seller, token); bytes32 _pixTarget = getPixTarget(seller, token);
@@ -158,12 +165,19 @@ contract P2PIX is BaseUtils {
// otherwise, the trustedForwarder must be previously added // otherwise, the trustedForwarder must be previously added
// to a seller whitelist. // to a seller whitelist.
if (merkleProof.length != 0) { if (merkleProof.length != 0) {
_merkleVerify( merkleProof, sellerAllowList(seller), _msgSender()); _merkleVerify(
merkleProof,
} else if ( amount > REPUTATION_LOWERBOUND && msg.sender == _msgSender() ) { sellerAllowList(seller),
_msgSender()
uint256 spendLimit; uint256 userCredit = );
userRecord[_castAddrToKey(_msgSender())]; } else if (
amount > REPUTATION_LOWERBOUND &&
msg.sender == _msgSender()
) {
uint256 spendLimit;
uint256 userCredit = userRecord[
_castAddrToKey(_msgSender())
];
(spendLimit) = _limiter(userCredit / WAD); (spendLimit) = _limiter(userCredit / WAD);
if ( if (
amount > (spendLimit * WAD) || amount > (spendLimit * WAD) ||
@@ -228,11 +242,18 @@ contract P2PIX is BaseUtils {
if (_msgSender() == msg.sender) { if (_msgSender() == msg.sender) {
if (msg.sender != l.buyerAddress) { if (msg.sender != l.buyerAddress) {
userRecord[_castAddrToKey(msg.sender)] += (lockAmount >> 1); userRecord[
userRecord[_castAddrToKey(l.buyerAddress)] += (lockAmount >> 1); _castAddrToKey(msg.sender)
] += (lockAmount >> 1);
userRecord[
_castAddrToKey(l.buyerAddress)
] += (lockAmount >> 1);
} else { } else {
userRecord[_castAddrToKey(msg.sender)] += lockAmount; userRecord[
}} _castAddrToKey(msg.sender)
] += lockAmount;
}
}
SafeTransferLib.safeTransfer( SafeTransferLib.safeTransfer(
t, t,
@@ -249,9 +270,9 @@ contract P2PIX is BaseUtils {
/// @notice For each successfull unexpired lock recovered, /// @notice For each successfull unexpired lock recovered,
/// `userRecord[_castAddrToKey(l.relayerAddress)]` is decreased by half of its value. /// `userRecord[_castAddrToKey(l.relayerAddress)]` is decreased by half of its value.
/// @dev Function sighash: 0xb0983d39 /// @dev Function sighash: 0xb0983d39
function unlockExpired(uint256[] calldata lockIDs) function unlockExpired(
public uint256[] calldata lockIDs
{ ) public {
uint256 i; uint256 i;
uint256 locksSize = lockIDs.length; uint256 locksSize = lockIDs.length;
@@ -260,19 +281,21 @@ contract P2PIX is BaseUtils {
_notExpired(l); _notExpired(l);
uint256 _sellerBalance = uint256 _sellerBalance = __sellerBalance(
__sellerBalance(l.seller, l.token) & BITMASK_SB_ENTRY; l.seller,
l.token
) & BITMASK_SB_ENTRY;
if ((_sellerBalance + l.amount) > MAXBALANCE_UPPERBOUND) if (
revert MaxBalExceeded(); (_sellerBalance + l.amount) >
MAXBALANCE_UPPERBOUND
) revert MaxBalExceeded();
_addSellerBalance(l.seller, l.token, l.amount); _addSellerBalance(l.seller, l.token, l.amount);
l.amount = 0; l.amount = 0;
uint256 userKey = _castAddrToKey( uint256 userKey = _castAddrToKey(l.buyerAddress);
l.buyerAddress
);
uint256 _newUserRecord = (userRecord[userKey] >> uint256 _newUserRecord = (userRecord[userKey] >>
1); 1);
@@ -312,7 +335,8 @@ contract P2PIX is BaseUtils {
setValidState(token, false); setValidState(token, false);
_decBal( _decBal(
(__sellerBalance(msg.sender, token) & BITMASK_SB_ENTRY), (__sellerBalance(msg.sender, token) &
BITMASK_SB_ENTRY),
amount, amount,
token, token,
msg.sender msg.sender
@@ -325,16 +349,13 @@ contract P2PIX is BaseUtils {
amount amount
); );
emit DepositWithdrawn( emit DepositWithdrawn(msg.sender, token, amount);
msg.sender,
token,
amount
);
} }
function setRoot(address addr, bytes32 merkleroot) function setRoot(
public address addr,
{ bytes32 merkleroot
) public {
assembly ("memory-safe") { assembly ("memory-safe") {
// if (addr != msg.sender) // if (addr != msg.sender)
if iszero(eq(addr, caller())) { if iszero(eq(addr, caller())) {
@@ -408,14 +429,13 @@ contract P2PIX is BaseUtils {
} }
// we can directly dec from packed uint entry value // we can directly dec from packed uint entry value
_decSellerBalance(_k,_t, _amount); _decSellerBalance(_k, _t, _amount);
} }
function getBalance(address seller, ERC20 token) function getBalance(
public address seller,
view ERC20 token
returns (uint256 bal) ) public view returns (uint256 bal) {
{
assembly ("memory-safe") { assembly ("memory-safe") {
for { for {
/* */ /* */
@@ -434,11 +454,10 @@ contract P2PIX is BaseUtils {
} }
} }
function getValid(address seller, ERC20 token) function getValid(
public address seller,
view ERC20 token
returns (bool valid) ) public view returns (bool valid) {
{
assembly ("memory-safe") { assembly ("memory-safe") {
for { for {
/* */ /* */
@@ -452,7 +471,9 @@ contract P2PIX is BaseUtils {
BITMASK_SB_ENTRY, BITMASK_SB_ENTRY,
shr( shr(
BITPOS_VALID, BITPOS_VALID,
sload(add(keccak256(0x0c, 0x34), 0x01)) sload(
add(keccak256(0x0c, 0x34), 0x01)
)
) )
) )
break break
@@ -460,11 +481,10 @@ contract P2PIX is BaseUtils {
} }
} }
function getPixTarget(address seller, ERC20 token) function getPixTarget(
public address seller,
view ERC20 token
returns (bytes32 pixTarget) ) public view returns (bytes32 pixTarget) {
{
assembly ("memory-safe") { assembly ("memory-safe") {
for { for {
/* */ /* */
@@ -480,7 +500,10 @@ contract P2PIX is BaseUtils {
} }
} }
function getPixTargetString(address seller, ERC20 token) public view returns (string memory pixTarget) { function getPixTargetString(
address seller,
ERC20 token
) public view returns (string memory pixTarget) {
bytes32 _pixEnc = getPixTarget(seller, token); bytes32 _pixEnc = getPixTarget(seller, token);
pixTarget = string(abi.encodePacked(_pixEnc)); pixTarget = string(abi.encodePacked(_pixEnc));
} }
@@ -506,7 +529,9 @@ contract P2PIX is BaseUtils {
/// @notice External getter that returns the status of a lockIDs array. /// @notice External getter that returns the status of a lockIDs array.
/// @notice Call will not revert if provided with an empty array as parameter. /// @notice Call will not revert if provided with an empty array as parameter.
/// @dev Function sighash: 0x49ef8448 /// @dev Function sighash: 0x49ef8448
function getLocksStatus(uint256[] memory ids) function getLocksStatus(
uint256[] memory ids
)
external external
view view
returns (uint256[] memory, DT.LockStatus[] memory) returns (uint256[] memory, DT.LockStatus[] memory)

55
eslint.config.js Normal file
View File

@@ -0,0 +1,55 @@
const tseslint = require("typescript-eslint");
const js = require("@eslint/js");
const eslintConfigPrettier = require("eslint-config-prettier");
module.exports = tseslint.config(
{
ignores: [
".yarn/",
"**/.coverage_artifacts",
"**/.coverage_cache",
"**/.coverage_contracts",
"**/artifacts",
"**/build",
"**/cache",
"**/coverage",
"**/dist",
"**/node_modules",
"**/types",
"deploys/old/",
"docs/",
"*.env",
"*.log",
".pnp.*",
"coverage.json",
"npm-debug.log*",
"yarn-debug.log*",
"yarn-error.log*",
".solcover.js",
"eslint.config.js",
],
},
js.configs.recommended,
...tseslint.configs.recommended,
eslintConfigPrettier,
{
languageOptions: {
parserOptions: {
projectService: true,
tsconfigRootDir: __dirname,
},
},
rules: {
"@typescript-eslint/no-floating-promises": [
"error",
{ ignoreIIFE: true, ignoreVoid: true },
],
"@typescript-eslint/no-inferrable-types": "off",
"@typescript-eslint/no-unused-vars": [
"error",
{ argsIgnorePattern: "_", varsIgnorePattern: "_" },
],
"@typescript-eslint/no-unused-expressions": "off",
},
},
);

View File

@@ -15,8 +15,10 @@ dotenvConfig({ path: resolve(__dirname, "./.env") });
const DEFAULT_MNEMONIC = const DEFAULT_MNEMONIC =
"test test test test test test test test test test test junk"; "test test test test test test test test test test test junk";
const mnemonic: string = process.env.MNEMONIC ?? DEFAULT_MNEMONIC; const mnemonic: string =
const alchemyApiKey: string | undefined = process.env.ALCHEMY_API_KEY; process.env.MNEMONIC ?? DEFAULT_MNEMONIC;
const alchemyApiKey: string | undefined =
process.env.ALCHEMY_API_KEY;
const chainIds = { const chainIds = {
// "{INSERT_NAME}": {INSERT_ID}, // "{INSERT_NAME}": {INSERT_ID},
@@ -33,7 +35,12 @@ const chainIds = {
function getChainConfig( function getChainConfig(
chain: keyof typeof chainIds, chain: keyof typeof chainIds,
): NetworkUserConfig { ): NetworkUserConfig {
let jsonRpcUrl = if (!alchemyApiKey) {
throw new Error(
`Please set ALCHEMY_API_KEY in a .env file before targeting ${chain}`,
);
}
const jsonRpcUrl =
"https://" + chain + ".g.alchemy.com/v2/" + alchemyApiKey; "https://" + chain + ".g.alchemy.com/v2/" + alchemyApiKey;
return { return {
accounts: { accounts: {
@@ -136,7 +143,7 @@ const config: HardhatUserConfig = {
}, },
docgen: { docgen: {
pages: "files", pages: "files",
} },
}; };
export default config; export default config;

View File

@@ -18,7 +18,7 @@
"coverage": "hardhat coverage --solcoverjs ./.solcover.js --temp artifacts --testfiles \"test/**/*.ts\" && yarn typechain", "coverage": "hardhat coverage --solcoverjs ./.solcover.js --temp artifacts --testfiles \"test/**/*.ts\" && yarn typechain",
"lint": "yarn lint:sol && yarn lint:ts && yarn prettier:check", "lint": "yarn lint:sol && yarn lint:ts && yarn prettier:check",
"lint:sol": "solhint --config ./.solhint.json --max-warnings 0 \"contracts/**/*.sol\"", "lint:sol": "solhint --config ./.solhint.json --max-warnings 0 \"contracts/**/*.sol\"",
"lint:ts": "eslint --config ./.eslintrc.yaml --ignore-path ./.eslintignore --ext .js,.ts .", "lint:ts": "eslint .",
"prettier": "prettier --config ./.prettierrc.yaml --write \"**/*.{js,json,md,sol,ts,yaml,yml}\"", "prettier": "prettier --config ./.prettierrc.yaml --write \"**/*.{js,json,md,sol,ts,yaml,yml}\"",
"prettier:check": "prettier --check --config ./.prettierrc.yaml \"**/*.{js,json,md,sol,ts,yaml,yml}\"" "prettier:check": "prettier --check --config ./.prettierrc.yaml \"**/*.{js,json,md,sol,ts,yaml,yml}\""
}, },
@@ -54,13 +54,14 @@
"mocha": "^10.8.2", "mocha": "^10.8.2",
"prettier": "^3.0.0", "prettier": "^3.0.0",
"prettier-plugin-solidity": "^1.0.0", "prettier-plugin-solidity": "^1.0.0",
"solhint": "^5.0.0", "solhint": "^6.2.1",
"solhint-plugin-prettier": "^0.1.0", "solhint-plugin-prettier": "^0.1.0",
"solidity-coverage": "^0.8.16", "solidity-coverage": "^0.8.16",
"solidity-docgen": "^0.6.0-beta.36", "solidity-docgen": "^0.6.0-beta.36",
"ts-node": "^10.9.2", "ts-node": "^10.9.2",
"typechain": "^8.3.2", "typechain": "^8.3.2",
"typescript": "^5.8.3", "typescript": "^5.8.3",
"typescript-eslint": "^8.60.0",
"viem": "^2.33.1" "viem": "^2.33.1"
}, },
"files": [ "files": [

View File

@@ -20,12 +20,22 @@ const main = async () => {
} }
const [deployer] = await ethers.getSigners(); const [deployer] = await ethers.getSigners();
console.log(`Signing transactions with ${deployer.address}`); console.log(
`Signing transactions with ${deployer.address}`,
);
const iface = new ethers.utils.Interface(P2PIX__factory.abi); const iface = new ethers.utils.Interface(
const calldata = iface.encodeFunctionData("setDefaultLockBlocks", ["10000"]); P2PIX__factory.abi,
);
const calldata = iface.encodeFunctionData(
"setDefaultLockBlocks",
["10000"],
);
const tx = await deployer.sendTransaction({to:deploysJson.p2pix, data: calldata}); const tx = await deployer.sendTransaction({
to: deploysJson.p2pix,
data: calldata,
});
const done = await tx.wait(); const done = await tx.wait();
console.log(done.transactionHash); console.log(done.transactionHash);
}; };

View File

@@ -1,6 +1,5 @@
import "@nomicfoundation/hardhat-chai-matchers"; import "@nomicfoundation/hardhat-chai-matchers";
import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; import { loadFixture } from "@nomicfoundation/hardhat-network-helpers";
import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers";
import { expect } from "chai"; import { expect } from "chai";
import { ethers, network } from "hardhat"; import { ethers, network } from "hardhat";
@@ -8,14 +7,11 @@ import { Reputation } from "../src/types";
import { curve, repFixture } from "./utils/fixtures"; import { curve, repFixture } from "./utils/fixtures";
describe("Reputation", () => { describe("Reputation", () => {
// contract deployer/admin
let owner: SignerWithAddress;
// Reputation Interface instance; // Reputation Interface instance;
let reputation: Reputation; let reputation: Reputation;
before("Set signers and reset network", async () => { before("Set signers and reset network", async () => {
// eslint-disable-next-line @typescript-eslint/no-explicit-any await ethers.getSigners();
[owner] = await ethers.getSigners();
await network.provider.send("hardhat_reset"); await network.provider.send("hardhat_reset");
}); });

View File

@@ -1,5 +1,3 @@
/* eslint-disable no-useless-escape */
describe("_", () => { describe("_", () => {
console.log( console.log(
"/// ______ __\r\n/// .-----.|__ |.-----.|__|.--.--.\r\n/// | _ || __|| _ || ||_ _|\r\n/// | __||______|| __||__||__.__|\r\n/// |__| |__|\r\n///", "/// ______ __\r\n/// .-----.|__ |.-----.|__|.--.--.\r\n/// | _ || __|| _ || ||_ _|\r\n/// | __||______|| __||__||__.__|\r\n/// |__| |__|\r\n///",

File diff suppressed because it is too large Load Diff

View File

@@ -4,15 +4,13 @@ import { ethers } from "hardhat";
import keccak256 from "keccak256"; import keccak256 from "keccak256";
import { MerkleTree } from "merkletreejs"; import { MerkleTree } from "merkletreejs";
import { import { MockToken, P2PIX__factory } from "../../src/types";
MockToken,
Multicall,
P2PIX,
P2PIX__factory,
Reputation,
} from "../../src/types";
import { Call, RepFixture, P2PixAndReputation, DepositArgs, LockArgs, ReleaseArgs } from "./interfaces"; import {
Call,
RepFixture,
P2PixAndReputation,
} from "./interfaces";
// exported constants // exported constants
export const getSignerAddrs = ( export const getSignerAddrs = (
@@ -22,18 +20,16 @@ export const getSignerAddrs = (
return addrs.slice(0, amount).map(({ address }) => address); return addrs.slice(0, amount).map(({ address }) => address);
}; };
export const getBnFrom = (nums: number[]): BigInt[] => { export const getBnFrom = (nums: number[]): bigint[] => {
const bns = nums.map(num => BigInt(num)); const bns = nums.map(num => BigInt(num));
return bns; return bns;
}; };
export const getLockData = ( export const getLockData = (
addr: string, addr: string,
locks: BigInt[][], locks: bigint[][],
): Call[] => { ): Call[] => {
const iface = new ethers.Interface( const iface = new ethers.Interface(P2PIX__factory.abi);
P2PIX__factory.abi,
);
return locks.map(lock => ({ return locks.map(lock => ({
target: addr, target: addr,
callData: iface.encodeFunctionData("getLocksStatus", [ callData: iface.encodeFunctionData("getLocksStatus", [
@@ -71,7 +67,8 @@ export const curve = (x: number): number => {
// exported async functions // exported async functions
export async function repFixture(): Promise<RepFixture> { export async function repFixture(): Promise<RepFixture> {
const reputation = await ethers.deployContract("Reputation"); const reputation =
await ethers.deployContract("Reputation");
return { reputation: await reputation.waitForDeployment() }; return { reputation: await reputation.waitForDeployment() };
} }
@@ -81,11 +78,12 @@ export async function p2pixFixture(): Promise<P2PixAndReputation> {
await ethers.getSigners(), await ethers.getSigners(),
); );
const reputation = await ethers.deployContract("Reputation"); const reputation =
await ethers.deployContract("Reputation");
const erc20 = await ethers.deployContract("MockToken", [ const erc20 = (await ethers.deployContract("MockToken", [
ethers.parseEther("20000000") // 20M ethers.parseEther("20000000"), // 20M
]) as MockToken; ])) as MockToken;
const p2pix = await ethers.deployContract("P2PIX", [ const p2pix = await ethers.deployContract("P2PIX", [
10, 10,

View File

@@ -5,7 +5,6 @@ import {
Reputation, Reputation,
} from "../../src/types"; } from "../../src/types";
// exported interfaces // exported interfaces
export interface Deploys { export interface Deploys {
signers: string[]; signers: string[];
@@ -17,29 +16,29 @@ export interface DepositArgs {
pixTarget: string; pixTarget: string;
allowlistRoot: string; allowlistRoot: string;
token: string; token: string;
amount: BigInt; amount: bigint;
valid: boolean; valid: boolean;
} }
export interface LockArgs { export interface LockArgs {
seller: string; seller: string;
token: string; token: string;
amount: BigInt; amount: bigint;
merkleProof: string[]; merkleProof: string[];
expiredLocks: BigInt[]; expiredLocks: bigint[];
} }
export interface ReleaseArgs { export interface ReleaseArgs {
lockID: BigInt; lockID: bigint;
pixTimestamp: string; pixTimestamp: string;
signature: string; signature: string;
} }
export interface Lock { export interface Lock {
counter: BigInt; counter: bigint;
expirationBlock: BigInt; expirationBlock: bigint;
pixTarget: string; pixTarget: string;
amount: BigInt; amount: bigint;
token: string; token: string;
buyerAddress: string; buyerAddress: string;
seller: string; seller: string;

376
yarn.lock
View File

@@ -64,6 +64,17 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@eslint-community/eslint-utils@npm:^4.9.1":
version: 4.9.1
resolution: "@eslint-community/eslint-utils@npm:4.9.1"
dependencies:
eslint-visitor-keys: "npm:^3.4.3"
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
checksum: 10/863b5467868551c9ae34d03eefe634633d08f623fc7b19d860f8f26eb6f303c1a5934253124163bee96181e45ed22bf27473dccc295937c3078493a4a8c9eddd
languageName: node
linkType: hard
"@eslint-community/regexpp@npm:^4.12.1": "@eslint-community/regexpp@npm:^4.12.1":
version: 4.12.1 version: 4.12.1
resolution: "@eslint-community/regexpp@npm:4.12.1" resolution: "@eslint-community/regexpp@npm:4.12.1"
@@ -71,6 +82,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@eslint-community/regexpp@npm:^4.12.2":
version: 4.12.2
resolution: "@eslint-community/regexpp@npm:4.12.2"
checksum: 10/049b280fddf71dd325514e0a520024969431dc3a8b02fa77476e6820e9122f28ab4c9168c11821f91a27982d2453bcd7a66193356ea84e84fb7c8d793be1ba0c
languageName: node
linkType: hard
"@eslint/config-array@npm:^0.21.0": "@eslint/config-array@npm:^0.21.0":
version: 0.21.0 version: 0.21.0
resolution: "@eslint/config-array@npm:0.21.0" resolution: "@eslint/config-array@npm:0.21.0"
@@ -1229,7 +1247,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@solidity-parser/parser@npm:^0.20.0, @solidity-parser/parser@npm:^0.20.1": "@solidity-parser/parser@npm:^0.20.1, @solidity-parser/parser@npm:^0.20.2":
version: 0.20.2 version: 0.20.2
resolution: "@solidity-parser/parser@npm:0.20.2" resolution: "@solidity-parser/parser@npm:0.20.2"
checksum: 10/405009cd712cc410df60e45510ddd2ca615d208b152903be71cef4b9440720287ffd3792f88a92eb0de375c2ea66b442e84c843cb810612d6b6e45fd51a2b49b checksum: 10/405009cd712cc410df60e45510ddd2ca615d208b152903be71cef4b9440720287ffd3792f88a92eb0de375c2ea66b442e84c843cb810612d6b6e45fd51a2b49b
@@ -1439,6 +1457,141 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@typescript-eslint/eslint-plugin@npm:8.60.0":
version: 8.60.0
resolution: "@typescript-eslint/eslint-plugin@npm:8.60.0"
dependencies:
"@eslint-community/regexpp": "npm:^4.12.2"
"@typescript-eslint/scope-manager": "npm:8.60.0"
"@typescript-eslint/type-utils": "npm:8.60.0"
"@typescript-eslint/utils": "npm:8.60.0"
"@typescript-eslint/visitor-keys": "npm:8.60.0"
ignore: "npm:^7.0.5"
natural-compare: "npm:^1.4.0"
ts-api-utils: "npm:^2.5.0"
peerDependencies:
"@typescript-eslint/parser": ^8.60.0
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: ">=4.8.4 <6.1.0"
checksum: 10/aec6f08be04ad0014c80e5cf3bd8ec83d59c44244c9ca357c4cf182b6f0debdd690e64daa88215e937183e97c4bdee6749dbf4162191c5851ae9c648439c8a96
languageName: node
linkType: hard
"@typescript-eslint/parser@npm:8.60.0":
version: 8.60.0
resolution: "@typescript-eslint/parser@npm:8.60.0"
dependencies:
"@typescript-eslint/scope-manager": "npm:8.60.0"
"@typescript-eslint/types": "npm:8.60.0"
"@typescript-eslint/typescript-estree": "npm:8.60.0"
"@typescript-eslint/visitor-keys": "npm:8.60.0"
debug: "npm:^4.4.3"
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: ">=4.8.4 <6.1.0"
checksum: 10/f55fa3547e3d0a0ec88bcb886b9bf6cef9b425c016dfa47e2ad7fbcbaa854640ba3f501cc0115824b58f33be4bf8bdf544505847988688906d11c154b600c54d
languageName: node
linkType: hard
"@typescript-eslint/project-service@npm:8.60.0":
version: 8.60.0
resolution: "@typescript-eslint/project-service@npm:8.60.0"
dependencies:
"@typescript-eslint/tsconfig-utils": "npm:^8.60.0"
"@typescript-eslint/types": "npm:^8.60.0"
debug: "npm:^4.4.3"
peerDependencies:
typescript: ">=4.8.4 <6.1.0"
checksum: 10/21e233d1292775753861aad32b30448f9fb5508f53d5a12c8ce7e75613df236757377fa877c738cc858ac863f2f8259a1f63bfb15a32ee9c5476fe9b2d12fbb0
languageName: node
linkType: hard
"@typescript-eslint/scope-manager@npm:8.60.0":
version: 8.60.0
resolution: "@typescript-eslint/scope-manager@npm:8.60.0"
dependencies:
"@typescript-eslint/types": "npm:8.60.0"
"@typescript-eslint/visitor-keys": "npm:8.60.0"
checksum: 10/c08274fdb38be51d2d655ee32bed271cfedf5f5775709da98b3d6cf5f7eb419e98228fb087b48f4a591f4dd71ebcb27a8bd716fa831442c7cad708288625e454
languageName: node
linkType: hard
"@typescript-eslint/tsconfig-utils@npm:8.60.0, @typescript-eslint/tsconfig-utils@npm:^8.60.0":
version: 8.60.0
resolution: "@typescript-eslint/tsconfig-utils@npm:8.60.0"
peerDependencies:
typescript: ">=4.8.4 <6.1.0"
checksum: 10/d82cac7dec0366c0e680d002b4d20bc2564a198a2d9a80099f4fa7ee2b2f394dd2d47df03f1c4b276c4de6c7b8684a50e7bad0ddd5b33907188e90cc203a9593
languageName: node
linkType: hard
"@typescript-eslint/type-utils@npm:8.60.0":
version: 8.60.0
resolution: "@typescript-eslint/type-utils@npm:8.60.0"
dependencies:
"@typescript-eslint/types": "npm:8.60.0"
"@typescript-eslint/typescript-estree": "npm:8.60.0"
"@typescript-eslint/utils": "npm:8.60.0"
debug: "npm:^4.4.3"
ts-api-utils: "npm:^2.5.0"
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: ">=4.8.4 <6.1.0"
checksum: 10/4b29dcc1ee7a006b2df8a50700b43701bedd4f8380e94311a8988102d98fdd89244c233a8063a800cbdee86278bdc98874bfa6a8a3c71f1b278be1be6698961b
languageName: node
linkType: hard
"@typescript-eslint/types@npm:8.60.0, @typescript-eslint/types@npm:^8.60.0":
version: 8.60.0
resolution: "@typescript-eslint/types@npm:8.60.0"
checksum: 10/8c6967503b3a370af10fea7bfec9adc7a4152e0e8aaa72ee790f105f08721683f6e8829acf610de82bfcdeb56bdf07f6795ccec394edbdac222fd3a1d76fe9cd
languageName: node
linkType: hard
"@typescript-eslint/typescript-estree@npm:8.60.0":
version: 8.60.0
resolution: "@typescript-eslint/typescript-estree@npm:8.60.0"
dependencies:
"@typescript-eslint/project-service": "npm:8.60.0"
"@typescript-eslint/tsconfig-utils": "npm:8.60.0"
"@typescript-eslint/types": "npm:8.60.0"
"@typescript-eslint/visitor-keys": "npm:8.60.0"
debug: "npm:^4.4.3"
minimatch: "npm:^10.2.2"
semver: "npm:^7.7.3"
tinyglobby: "npm:^0.2.15"
ts-api-utils: "npm:^2.5.0"
peerDependencies:
typescript: ">=4.8.4 <6.1.0"
checksum: 10/ad02384fd48152a7d9bb5db1aa5d6cbda1cfa9e549a2d529d801ec1401d1d7d011c5e071f5b4d99c5ed656c95e5e97c46a783b45dcc7c016df7fee37ab5bdc0a
languageName: node
linkType: hard
"@typescript-eslint/utils@npm:8.60.0":
version: 8.60.0
resolution: "@typescript-eslint/utils@npm:8.60.0"
dependencies:
"@eslint-community/eslint-utils": "npm:^4.9.1"
"@typescript-eslint/scope-manager": "npm:8.60.0"
"@typescript-eslint/types": "npm:8.60.0"
"@typescript-eslint/typescript-estree": "npm:8.60.0"
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: ">=4.8.4 <6.1.0"
checksum: 10/9fc8bc7a62deacd3823d957de8e8ca2012ffa90715734cd89d0e3a62c2c9e2775d3ba9da80e419339893a44af8674d690488cb195c981e8de9fd9dfa4948956d
languageName: node
linkType: hard
"@typescript-eslint/visitor-keys@npm:8.60.0":
version: 8.60.0
resolution: "@typescript-eslint/visitor-keys@npm:8.60.0"
dependencies:
"@typescript-eslint/types": "npm:8.60.0"
eslint-visitor-keys: "npm:^5.0.0"
checksum: 10/4854d08416e2c97837cc1ecf8dacb50b3337ebb34bd6d703ad40b6585fdf78243074e56994ddc90650586146cebd6ad7390b6fa3ddda4e3532be4b872dd8f541
languageName: node
linkType: hard
"abbrev@npm:1, abbrev@npm:1.0.x": "abbrev@npm:1, abbrev@npm:1.0.x":
version: 1.0.9 version: 1.0.9
resolution: "abbrev@npm:1.0.9" resolution: "abbrev@npm:1.0.9"
@@ -1550,12 +1703,12 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"ajv-errors@npm:^1.0.1": "ajv-errors@npm:^3.0.0":
version: 1.0.1 version: 3.0.0
resolution: "ajv-errors@npm:1.0.1" resolution: "ajv-errors@npm:3.0.0"
peerDependencies: peerDependencies:
ajv: ">=5.0.0" ajv: ^8.0.1
checksum: 10/7d8907f7ff3df7cb5b224ddd95c43ebd3d8bac3fd74fe942d644adc68ed3f67d5bb971b897ab8d21607a1ecf6071a987024b96439e040c9fd45625a9b87da1bb checksum: 10/bd3403f8547dc12f7417c40b6a003f6d891c0123e365b4b3cd9fffb0edd29100ae682b92ef47dcb3a3b4642a702a246873d3758c3fb92e24dfa3443f97476421
languageName: node languageName: node
linkType: hard linkType: hard
@@ -1571,18 +1724,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"ajv@npm:^6.12.6":
version: 6.15.0
resolution: "ajv@npm:6.15.0"
dependencies:
fast-deep-equal: "npm:^3.1.1"
fast-json-stable-stringify: "npm:^2.0.0"
json-schema-traverse: "npm:^0.4.1"
uri-js: "npm:^4.2.2"
checksum: 10/0916dda09c152fb5857bc1cc7ce61718e9cec5b7faeff44a74f5e324eed8a556e1a84856724ea322a067b436ecad9f74ac8295fd395449788cca52f0c25bd5fb
languageName: node
linkType: hard
"ajv@npm:^8.0.1": "ajv@npm:^8.0.1":
version: 8.17.1 version: 8.17.1
resolution: "ajv@npm:8.17.1" resolution: "ajv@npm:8.17.1"
@@ -1595,6 +1736,18 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"ajv@npm:^8.18.0":
version: 8.20.0
resolution: "ajv@npm:8.20.0"
dependencies:
fast-deep-equal: "npm:^3.1.3"
fast-uri: "npm:^3.0.1"
json-schema-traverse: "npm:^1.0.0"
require-from-string: "npm:^2.0.2"
checksum: 10/5ce59c0537f4c2aca9a758b412659ec70acb4d5dde971c10ecf21d2e3d799f99acdb4a08e1f5fb2e067c8542930398aae793bb996bb07d3feb81dae22fe2ada9
languageName: node
linkType: hard
"amdefine@npm:>=0.0.4": "amdefine@npm:>=0.0.4":
version: 1.0.1 version: 1.0.1
resolution: "amdefine@npm:1.0.1" resolution: "amdefine@npm:1.0.1"
@@ -1666,13 +1819,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"antlr4@npm:^4.13.1-patch-1":
version: 4.13.2
resolution: "antlr4@npm:4.13.2"
checksum: 10/23ab4742ec937adaaf20d13228c8cca58638e1aafeb28919bdeb4860776a403d0c7eb85a3f07fadc27fc03f773eed6bcc82bd8369b9d0e258e6502ba514cf87e
languageName: node
linkType: hard
"anymatch@npm:~3.1.2": "anymatch@npm:~3.1.2":
version: 3.1.3 version: 3.1.3
resolution: "anymatch@npm:3.1.3" resolution: "anymatch@npm:3.1.3"
@@ -1787,6 +1933,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"balanced-match@npm:^4.0.2":
version: 4.0.4
resolution: "balanced-match@npm:4.0.4"
checksum: 10/fb07bb66a0959c2843fc055838047e2a95ccebb837c519614afb067ebfdf2fa967ca8d712c35ced07f2cd26fc6f07964230b094891315ad74f11eba3d53178a0
languageName: node
linkType: hard
"base-x@npm:^3.0.2": "base-x@npm:^3.0.2":
version: 3.0.11 version: 3.0.11
resolution: "base-x@npm:3.0.11" resolution: "base-x@npm:3.0.11"
@@ -1895,6 +2048,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"brace-expansion@npm:^5.0.5":
version: 5.0.6
resolution: "brace-expansion@npm:5.0.6"
dependencies:
balanced-match: "npm:^4.0.2"
checksum: 10/a7acf120fefa79e9d7c9c92898114f57c07596a3920197f3c5917e6a628b04220a5f7f9618c30bdd973a6576a32113b99f9c3f1c8245ccc399dd2a9a718d81d8
languageName: node
linkType: hard
"braces@npm:^3.0.3, braces@npm:~3.0.2": "braces@npm:^3.0.3, braces@npm:~3.0.2":
version: 3.0.3 version: 3.0.3
resolution: "braces@npm:3.0.3" resolution: "braces@npm:3.0.3"
@@ -2439,6 +2601,18 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"debug@npm:^4.4.3":
version: 4.4.3
resolution: "debug@npm:4.4.3"
dependencies:
ms: "npm:^2.1.3"
peerDependenciesMeta:
supports-color:
optional: true
checksum: 10/9ada3434ea2993800bd9a1e320bd4aa7af69659fb51cca685d390949434bc0a8873c21ed7c9b852af6f2455a55c6d050aa3937d52b3c69f796dab666f762acad
languageName: node
linkType: hard
"decamelize@npm:^4.0.0": "decamelize@npm:^4.0.0":
version: 4.0.0 version: 4.0.0
resolution: "decamelize@npm:4.0.0" resolution: "decamelize@npm:4.0.0"
@@ -2737,6 +2911,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"eslint-visitor-keys@npm:^5.0.0":
version: 5.0.1
resolution: "eslint-visitor-keys@npm:5.0.1"
checksum: 10/f9cc1a57b75e0ef949545cac33d01e8367e302de4c1483266ed4d8646ee5c306376660196bbb38b004e767b7043d1e661cb4336b49eff634a1bbe75c1db709ec
languageName: node
linkType: hard
"eslint@npm:^9.32.0": "eslint@npm:^9.32.0":
version: 9.32.0 version: 9.32.0
resolution: "eslint@npm:9.32.0" resolution: "eslint@npm:9.32.0"
@@ -3045,6 +3226,18 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"fdir@npm:^6.5.0":
version: 6.5.0
resolution: "fdir@npm:6.5.0"
peerDependencies:
picomatch: ^3 || ^4
peerDependenciesMeta:
picomatch:
optional: true
checksum: 10/14ca1c9f0a0e8f4f2e9bf4e8551065a164a09545dae548c12a18d238b72e51e5a7b39bd8e5494b56463a0877672d0a6c1ef62c6fa0677db1b0c847773be939b1
languageName: node
linkType: hard
"file-entry-cache@npm:^8.0.0": "file-entry-cache@npm:^8.0.0":
version: 8.0.0 version: 8.0.0
resolution: "file-entry-cache@npm:8.0.0" resolution: "file-entry-cache@npm:8.0.0"
@@ -3166,17 +3359,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"fs-extra@npm:^11.1.0":
version: 11.3.5
resolution: "fs-extra@npm:11.3.5"
dependencies:
graceful-fs: "npm:^4.2.0"
jsonfile: "npm:^6.0.1"
universalify: "npm:^2.0.0"
checksum: 10/dc8408818eec8b03efad8742d079ecab749a2f7bc9f208e429b447fcac7632fae52e09312d6d42218efe7e2efa97f03ff232d639ade4aa7fcd8c00ebe9ad0c0c
languageName: node
linkType: hard
"fs-extra@npm:^7.0.0, fs-extra@npm:^7.0.1": "fs-extra@npm:^7.0.0, fs-extra@npm:^7.0.1":
version: 7.0.1 version: 7.0.1
resolution: "fs-extra@npm:7.0.1" resolution: "fs-extra@npm:7.0.1"
@@ -3362,6 +3544,17 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"glob@npm:^13.0.6":
version: 13.0.6
resolution: "glob@npm:13.0.6"
dependencies:
minimatch: "npm:^10.2.2"
minipass: "npm:^7.1.3"
path-scurry: "npm:^2.0.2"
checksum: 10/201ad69e5f0aa74e1d8c00a481581f8b8c804b6a4fbfabeeb8541f5d756932800331daeba99b58fb9e4cd67e12ba5a7eba5b82fb476691588418060b84353214
languageName: node
linkType: hard
"glob@npm:^5.0.15": "glob@npm:^5.0.15":
version: 5.0.15 version: 5.0.15
resolution: "glob@npm:5.0.15" resolution: "glob@npm:5.0.15"
@@ -3389,7 +3582,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"glob@npm:^8.0.3, glob@npm:^8.1.0": "glob@npm:^8.1.0":
version: 8.1.0 version: 8.1.0
resolution: "glob@npm:8.1.0" resolution: "glob@npm:8.1.0"
dependencies: dependencies:
@@ -3784,6 +3977,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"ignore@npm:^7.0.5":
version: 7.0.5
resolution: "ignore@npm:7.0.5"
checksum: 10/f134b96a4de0af419196f52c529d5c6120c4456ff8a6b5a14ceaaa399f883e15d58d2ce651c9b69b9388491d4669dda47285d307e827de9304a53a1824801bc6
languageName: node
linkType: hard
"immer@npm:10.0.2": "immer@npm:10.0.2":
version: 10.0.2 version: 10.0.2
resolution: "immer@npm:10.0.2" resolution: "immer@npm:10.0.2"
@@ -4296,6 +4496,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"lru-cache@npm:^11.0.0":
version: 11.5.1
resolution: "lru-cache@npm:11.5.1"
checksum: 10/02c4f73967d91fb101f4accf8ebac9e0541e08e16d987bdb9e9737f13e5f2c4bc33c593b98ec30e4486bf899bc97edb36fbd133684b36087336559e41edafdea
languageName: node
linkType: hard
"lru-cache@npm:^6.0.0": "lru-cache@npm:^6.0.0":
version: 6.0.0 version: 6.0.0
resolution: "lru-cache@npm:6.0.0" resolution: "lru-cache@npm:6.0.0"
@@ -4480,6 +4687,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"minimatch@npm:^10.2.2":
version: 10.2.5
resolution: "minimatch@npm:10.2.5"
dependencies:
brace-expansion: "npm:^5.0.5"
checksum: 10/19e87a931aff60ee7b9d80f39f817b8bfc54f61f8356ee3549fbf636dbccacacfec8d803eac73293955c4527cd085247dfc064bce4a5e349f8f3b85e2bf5da0f
languageName: node
linkType: hard
"minimatch@npm:^5.0.1, minimatch@npm:^5.1.6": "minimatch@npm:^5.0.1, minimatch@npm:^5.1.6":
version: 5.1.6 version: 5.1.6
resolution: "minimatch@npm:5.1.6" resolution: "minimatch@npm:5.1.6"
@@ -4572,6 +4788,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"minipass@npm:^7.1.3":
version: 7.1.3
resolution: "minipass@npm:7.1.3"
checksum: 10/175e4d5e20980c3cd316ae82d2c031c42f6c746467d8b1905b51060a0ba4461441a0c25bb67c025fd9617f9a3873e152c7b543c6b5ac83a1846be8ade80dffd6
languageName: node
linkType: hard
"minizlib@npm:^3.0.1": "minizlib@npm:^3.0.1":
version: 3.0.2 version: 3.0.2
resolution: "minizlib@npm:3.0.2" resolution: "minizlib@npm:3.0.2"
@@ -4959,13 +5182,14 @@ __metadata:
mocha: "npm:^10.8.2" mocha: "npm:^10.8.2"
prettier: "npm:^3.0.0" prettier: "npm:^3.0.0"
prettier-plugin-solidity: "npm:^1.0.0" prettier-plugin-solidity: "npm:^1.0.0"
solhint: "npm:^5.0.0" solhint: "npm:^6.2.1"
solhint-plugin-prettier: "npm:^0.1.0" solhint-plugin-prettier: "npm:^0.1.0"
solidity-coverage: "npm:^0.8.16" solidity-coverage: "npm:^0.8.16"
solidity-docgen: "npm:^0.6.0-beta.36" solidity-docgen: "npm:^0.6.0-beta.36"
ts-node: "npm:^10.9.2" ts-node: "npm:^10.9.2"
typechain: "npm:^8.3.2" typechain: "npm:^8.3.2"
typescript: "npm:^5.8.3" typescript: "npm:^5.8.3"
typescript-eslint: "npm:^8.60.0"
viem: "npm:^2.33.1" viem: "npm:^2.33.1"
languageName: unknown languageName: unknown
linkType: soft linkType: soft
@@ -5048,6 +5272,16 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"path-scurry@npm:^2.0.2":
version: 2.0.2
resolution: "path-scurry@npm:2.0.2"
dependencies:
lru-cache: "npm:^11.0.0"
minipass: "npm:^7.1.2"
checksum: 10/2b4257422bcb870a4c2d205b3acdbb213a72f5e2250f61c80f79c9d014d010f82bdf8584441612c8e1fa4eb098678f5704a66fa8377d72646bad4be38e57a2c3
languageName: node
linkType: hard
"path-type@npm:^4.0.0": "path-type@npm:^4.0.0":
version: 4.0.0 version: 4.0.0
resolution: "path-type@npm:4.0.0" resolution: "path-type@npm:4.0.0"
@@ -5096,6 +5330,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"picomatch@npm:^4.0.4":
version: 4.0.4
resolution: "picomatch@npm:4.0.4"
checksum: 10/f6ef80a3590827ce20378ae110ac78209cc4f74d39236370f1780f957b7ee41c12acde0e4651b90f39983506fd2f5e449994716f516db2e9752924aff8de93ce
languageName: node
linkType: hard
"pify@npm:^4.0.1": "pify@npm:^4.0.1":
version: 4.0.1 version: 4.0.1
resolution: "pify@npm:4.0.1" resolution: "pify@npm:4.0.1"
@@ -5145,7 +5386,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"prettier@npm:^2.3.1, prettier@npm:^2.8.3": "prettier@npm:^2.3.1":
version: 2.8.8 version: 2.8.8
resolution: "prettier@npm:2.8.8" resolution: "prettier@npm:2.8.8"
bin: bin:
@@ -5545,7 +5786,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"semver@npm:^7.3.7, semver@npm:^7.5.2, semver@npm:^7.7.1": "semver@npm:^7.3.7, semver@npm:^7.5.2, semver@npm:^7.7.1, semver@npm:^7.7.3":
version: 7.8.1 version: 7.8.1
resolution: "semver@npm:7.8.1" resolution: "semver@npm:7.8.1"
bin: bin:
@@ -5718,30 +5959,27 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"solhint@npm:^5.0.0": "solhint@npm:^6.2.1":
version: 5.2.0 version: 6.2.1
resolution: "solhint@npm:5.2.0" resolution: "solhint@npm:6.2.1"
dependencies: dependencies:
"@solidity-parser/parser": "npm:^0.20.0" "@solidity-parser/parser": "npm:^0.20.2"
ajv: "npm:^6.12.6" ajv: "npm:^8.18.0"
ajv-errors: "npm:^1.0.1" ajv-errors: "npm:^3.0.0"
antlr4: "npm:^4.13.1-patch-1"
ast-parents: "npm:^0.0.1" ast-parents: "npm:^0.0.1"
better-ajv-errors: "npm:^2.0.2" better-ajv-errors: "npm:^2.0.2"
chalk: "npm:^4.1.2" chalk: "npm:^4.1.2"
commander: "npm:^10.0.0" commander: "npm:^10.0.0"
cosmiconfig: "npm:^8.0.0" cosmiconfig: "npm:^8.0.0"
fast-diff: "npm:^1.2.0" fast-diff: "npm:^1.2.0"
fs-extra: "npm:^11.1.0" glob: "npm:^13.0.6"
glob: "npm:^8.0.3"
ignore: "npm:^5.2.4" ignore: "npm:^5.2.4"
js-yaml: "npm:^4.1.0" js-yaml: "npm:^4.1.0"
latest-version: "npm:^7.0.0" latest-version: "npm:^7.0.0"
lodash: "npm:^4.17.21" lodash: "npm:^4.17.21"
pluralize: "npm:^8.0.0" pluralize: "npm:^8.0.0"
prettier: "npm:^2.8.3" prettier: "npm:^3.0.0"
semver: "npm:^7.5.2" semver: "npm:^7.5.2"
strip-ansi: "npm:^6.0.1"
table: "npm:^6.8.1" table: "npm:^6.8.1"
text-table: "npm:^0.2.0" text-table: "npm:^0.2.0"
dependenciesMeta: dependenciesMeta:
@@ -5749,7 +5987,7 @@ __metadata:
optional: true optional: true
bin: bin:
solhint: solhint.js solhint: solhint.js
checksum: 10/ccccfe72390989fe4e4827e9635ef41605f966a1efb835bb9c231b5e4b9edcd0ccd60602668aba3365c385e89f8ca383e32570cf1148f7a81e8bb44d69b5ddf7 checksum: 10/b8edac2ee072034cbb2200a4146ce50bdb20839ed4772a72718f341766006753780c48a5292b6911b4f8398e046a905ae4ab0dd21101041449b8ada1f7c93b2f
languageName: node languageName: node
linkType: hard linkType: hard
@@ -6057,6 +6295,16 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"tinyglobby@npm:^0.2.15":
version: 0.2.16
resolution: "tinyglobby@npm:0.2.16"
dependencies:
fdir: "npm:^6.5.0"
picomatch: "npm:^4.0.4"
checksum: 10/5c2c41b572ada38449e7c86a5fe034f204a1dbba577225a761a14f29f48dc3f2fc0d81a6c56fcc67c5a742cc3aa9fb5e2ca18dbf22b610b0bc0e549b34d5a0f8
languageName: node
linkType: hard
"tmp@npm:0.0.33": "tmp@npm:0.0.33":
version: 0.0.33 version: 0.0.33
resolution: "tmp@npm:0.0.33" resolution: "tmp@npm:0.0.33"
@@ -6089,6 +6337,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"ts-api-utils@npm:^2.5.0":
version: 2.5.0
resolution: "ts-api-utils@npm:2.5.0"
peerDependencies:
typescript: ">=4.8.4"
checksum: 10/d5f1936f5618c6ab6942a97b78802217540ced00e7501862ae1f578d9a3aa189fc06050e64cb8951d21f7088e5fd35f53d2bf0d0370a883861c7b05e993ebc44
languageName: node
linkType: hard
"ts-command-line-args@npm:^2.2.0": "ts-command-line-args@npm:^2.2.0":
version: 2.5.1 version: 2.5.1
resolution: "ts-command-line-args@npm:2.5.1" resolution: "ts-command-line-args@npm:2.5.1"
@@ -6239,6 +6496,21 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"typescript-eslint@npm:^8.60.0":
version: 8.60.0
resolution: "typescript-eslint@npm:8.60.0"
dependencies:
"@typescript-eslint/eslint-plugin": "npm:8.60.0"
"@typescript-eslint/parser": "npm:8.60.0"
"@typescript-eslint/typescript-estree": "npm:8.60.0"
"@typescript-eslint/utils": "npm:8.60.0"
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: ">=4.8.4 <6.1.0"
checksum: 10/625e49e6d06e32adcfe903087d1fb2adc3be925adafe1f4e57f690bb196b35e2aac01760a3d5e17a53ea2feb6fef3a13da4b8faa214f628ec56e64f99f20e4ad
languageName: node
linkType: hard
"typescript@npm:^5.8.3": "typescript@npm:^5.8.3":
version: 5.8.3 version: 5.8.3
resolution: "typescript@npm:5.8.3" resolution: "typescript@npm:5.8.3"