From 8d62740b4a59ef3d1371e4a1bea6a00a5d0f6b1e Mon Sep 17 00:00:00 2001 From: Alain Nicolas Date: Thu, 19 Dec 2024 00:15:20 +0100 Subject: [PATCH] chore: Add Prettier and ESLint to the CCIP Gateway package --- packages/linea-ccip-gateway/.eslintrc.cjs | 7 + packages/linea-ccip-gateway/.mocharc.json | 12 +- packages/linea-ccip-gateway/.prettierignore | 5 + packages/linea-ccip-gateway/.prettierrc | 8 + packages/linea-ccip-gateway/README.md | 45 +++--- packages/linea-ccip-gateway/hardhat.config.ts | 8 +- packages/linea-ccip-gateway/package.json | 53 +++--- .../linea-ccip-gateway/src/L2ProofService.ts | 98 ++++++----- .../src/evm-gateway/EVMGateway.ts | 70 ++++---- .../src/evm-gateway/EVMProofHelper.ts | 30 ++-- .../src/evm-gateway/IProofService.ts | 2 +- .../src/evm-gateway/index.ts | 2 +- packages/linea-ccip-gateway/src/index.ts | 10 +- packages/linea-ccip-gateway/src/server.ts | 42 ++--- packages/linea-ccip-gateway/src/utils.ts | 10 +- .../test/testVerifier.spec.ts | 125 +++++++------- .../linea-ccip-gateway/tsconfig.build.json | 11 ++ packages/linea-ccip-gateway/tsconfig.json | 36 ++--- pnpm-lock.yaml | 153 ++++++++++-------- 19 files changed, 404 insertions(+), 323 deletions(-) create mode 100644 packages/linea-ccip-gateway/.eslintrc.cjs create mode 100644 packages/linea-ccip-gateway/.prettierignore create mode 100644 packages/linea-ccip-gateway/.prettierrc create mode 100644 packages/linea-ccip-gateway/tsconfig.build.json diff --git a/packages/linea-ccip-gateway/.eslintrc.cjs b/packages/linea-ccip-gateway/.eslintrc.cjs new file mode 100644 index 000000000..cb27d003b --- /dev/null +++ b/packages/linea-ccip-gateway/.eslintrc.cjs @@ -0,0 +1,7 @@ +module.exports = { + root: true, + env: { browser: false }, + extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended'], + ignorePatterns: ['dist', '.eslintrc.cjs', 'artifacts', 'cache', 'typechain-types'], + parser: '@typescript-eslint/parser', +}; diff --git a/packages/linea-ccip-gateway/.mocharc.json b/packages/linea-ccip-gateway/.mocharc.json index 48586d7d7..7c7e241b6 100644 --- a/packages/linea-ccip-gateway/.mocharc.json +++ b/packages/linea-ccip-gateway/.mocharc.json @@ -1,7 +1,13 @@ { "require": "ts-node/register", "loader": "ts-node/esm", - "extensions": ["ts", "tsx"], - "spec": ["test/**/*.spec.*"], - "watch-files": ["src"] + "extensions": [ + "ts" + ], + "spec": [ + "test/**/*.spec.*" + ], + "watch-files": [ + "src" + ] } diff --git a/packages/linea-ccip-gateway/.prettierignore b/packages/linea-ccip-gateway/.prettierignore new file mode 100644 index 000000000..c4b74602b --- /dev/null +++ b/packages/linea-ccip-gateway/.prettierignore @@ -0,0 +1,5 @@ +dist +node_modules +typechain-types +cache +artifacts diff --git a/packages/linea-ccip-gateway/.prettierrc b/packages/linea-ccip-gateway/.prettierrc new file mode 100644 index 000000000..c9bcca6ab --- /dev/null +++ b/packages/linea-ccip-gateway/.prettierrc @@ -0,0 +1,8 @@ +{ + "semi": true, + "singleQuote": true, + "trailingComma": "all", + "printWidth": 80, + "tabWidth": 2, + "parser": "typescript" +} diff --git a/packages/linea-ccip-gateway/README.md b/packages/linea-ccip-gateway/README.md index a0905bff9..1d4c19cc3 100644 --- a/packages/linea-ccip-gateway/README.md +++ b/packages/linea-ccip-gateway/README.md @@ -1,6 +1,7 @@ # linea-ccip-gateway -Adapted from [EVM gateway](https://github.com/ensdomains/evmgateway) for fetching data on Linea along with Sparse Merkle Proofs and return it to the L1 callback function. +Adapted from [EVM gateway](https://github.com/ensdomains/evmgateway) for fetching data on Linea along with Sparse Merkle +Proofs and return it to the L1 callback function. ## Start dev env @@ -44,23 +45,23 @@ Before running the script, ensure that you have the necessary environment variab Create a new script file in your project directory at `scripts/testL1.ts` and add the following code: ```js -import { ethers } from "ethers"; -import "dotenv/config"; +import { ethers } from 'ethers'; +import 'dotenv/config'; // Define the ABI for the getLatest function const getLatestABI = [ { inputs: [], - name: "getLatest", + name: 'getLatest', outputs: [ { - internalType: "uint256", - name: "", - type: "uint256", + internalType: 'uint256', + name: '', + type: 'uint256', }, ], - stateMutability: "view", - type: "function", + stateMutability: 'view', + type: 'function', }, ]; @@ -71,7 +72,7 @@ async function main() { https://sepolia.etherscan.io/address/0xb12038acce44e39dd5b2f59f0f68bbfaac35dd16 */ - const testL1Address = "0xB12038acCE44e39dd5B2f59F0f68bbfAaC35dd16"; + const testL1Address = '0xB12038acCE44e39dd5B2f59F0f68bbfAaC35dd16'; const provider = new ethers.JsonRpcProvider( `https://sepolia.infura.io/v3/${process.env.INFURA_API_KEY}` @@ -93,32 +94,38 @@ async function main() { } main().catch((error) => { - console.error("Error in main execution:", error); + console.error('Error in main execution:', error); process.exitCode = 1; }); ``` -This script connects to the Sepolia testnet and calls the `getLatest` function of the `TestL1` contract, demonstrating how to enable and use the CCIP-Read functionality. +This script connects to the Sepolia testnet and calls the `getLatest` function of the `TestL1` contract, demonstrating +how to enable and use the CCIP-Read functionality. #### Running the Script To execute the script, follow these steps: -1. **Open a terminal** and navigate to the root directory of your project. +1. **Open a terminal** and navigate to the root directory of your project. -2. **Run the script using Hardhat** with the following command: +2. **Run the script using Hardhat** with the following command: ```shell npx hardhat run scripts/testL1.ts --network sepolia ``` -- This command will launch the `testL1.ts` script, which interacts with the `TestL1` contract deployed on the Sepolia network. -- The script demonstrates the usage of Chainlink's CCIP-Read protocol to fetch and verify off-chain data using a Sparse Merkle Proof. +- This command will launch the `testL1.ts` script, which interacts with the `TestL1` contract deployed on the Sepolia + network. +- The script demonstrates the usage of Chainlink's CCIP-Read protocol to fetch and verify off-chain data using a Sparse + Merkle Proof. #### What the Script Does - **Connects to the Sepolia Network**: Utilizes Infura as the provider to connect to the Ethereum Sepolia testnet. -- **Interacts with the Contract**: Calls the `getLatest` function on the `TestL1` contract, showcasing how to enable and leverage CCIP-Read capabilities. -- **Handles Off-Chain Data**: Demonstrates the retrieval and verification of off-chain data, integrating it back into the on-chain environment using CCIP. +- **Interacts with the Contract**: Calls the `getLatest` function on the `TestL1` contract, showcasing how to enable and + leverage CCIP-Read capabilities. +- **Handles Off-Chain Data**: Demonstrates the retrieval and verification of off-chain data, integrating it back into + the on-chain environment using CCIP. -This example provides a practical demonstration of how to set up and utilize the CCIP-Read protocol within a dApp, highlighting the benefits of off-chain data fetching and proof verification. +This example provides a practical demonstration of how to set up and utilize the CCIP-Read protocol within a dApp, +highlighting the benefits of off-chain data fetching and proof verification. diff --git a/packages/linea-ccip-gateway/hardhat.config.ts b/packages/linea-ccip-gateway/hardhat.config.ts index 300f0e206..ae48895e4 100644 --- a/packages/linea-ccip-gateway/hardhat.config.ts +++ b/packages/linea-ccip-gateway/hardhat.config.ts @@ -1,6 +1,6 @@ -import "@nomicfoundation/hardhat-toolbox"; -import { HardhatUserConfig } from "hardhat/config"; -import * as dotenv from "dotenv"; +import '@nomicfoundation/hardhat-toolbox'; +import { HardhatUserConfig } from 'hardhat/config'; +import * as dotenv from 'dotenv'; dotenv.config(); @@ -8,7 +8,7 @@ const config: HardhatUserConfig = { solidity: { compilers: [ { - version: "0.8.25", + version: '0.8.25', settings: { optimizer: { enabled: true, diff --git a/packages/linea-ccip-gateway/package.json b/packages/linea-ccip-gateway/package.json index 75a582305..ad87dd137 100644 --- a/packages/linea-ccip-gateway/package.json +++ b/packages/linea-ccip-gateway/package.json @@ -1,56 +1,59 @@ { "name": "@consensys/linea-ccip-gateway", "version": "1.1.0", - "main": "dist/index.js", - "author": "Consensys", "license": "Apache-2.0", + "author": "Consensys", + "main": "dist/index.js", "scripts": { - "start": "node dist/server.js", - "build": "tsc --project tsconfig.json --module commonjs --skipLibCheck true --outDir ./dist", + "build": "tsc --project tsconfig.build.json", "clean": "rm -fr node_modules dist", - "test": "hardhat compile && mocha test/testVerifier.spec.ts --timeout 20000 --exit", - "compile": "hardhat compile" + "compile": "hardhat compile", + "lint": "eslint . --ext ts --report-unused-disable-directives --max-warnings 0", + "prettier": "prettier --check '**/*.ts'", + "prettier:fix": "prettier --write '**/*.ts'", + "start": "node dist/server.js", + "test": "hardhat compile && mocha test/testVerifier.spec.ts --timeout 20000 --exit" }, "dependencies": { + "@chainlink/ccip-read-server": "^0.2.1", + "@consensys/linea-state-verifier": "^1.0.1", "@ethersproject/abi": "^5.4.7", "@ethersproject/bytes": "^5.7.0", - "@chainlink/ccip-read-server": "^0.2.1", "commander": "^11.0.0", "cors": "^2.8.5", "dotenv": "^16.0.3", "ethers": "^6.11.1", "express": "^4.19.2", - "@consensys/linea-state-verifier": "^1.0.1", "tsdx": "^0.14.1", "tslib": "^2.6.2", - "winston": "^3.9.0", - "typescript": "^5.4.5" + "typescript": "^5.4.5", + "winston": "^3.9.0" }, "devDependencies": { - "typechain": "^8.2.0", - "@typechain/ethers-v6": "^0.4.0", - "ts-node": "^10.9.2", - "supertest": "^6.3.3", - "eslint": "^8.56.0", - "mocha": "^10.3.0", - "@openzeppelin/contracts": "^4.9.3", - "hardhat-gas-reporter": "^1.0.8", - "solidity-coverage": "^0.8.1", - "hardhat": "^2.21.0", - "@typescript-eslint/eslint-plugin": "^7.1.0", - "@typescript-eslint/parser": "^7.1.0", - "chai": "^4.2.0", - "@typechain/hardhat": "^8.0.0", "@nomicfoundation/hardhat-chai-matchers": "^2.0.0", "@nomicfoundation/hardhat-ethers": "^3.0.0", "@nomicfoundation/hardhat-network-helpers": "^1.0.0", "@nomicfoundation/hardhat-toolbox": "^3.0.0", "@nomicfoundation/hardhat-verify": "^1.0.0", + "@openzeppelin/contracts": "^4.9.3", + "@typechain/ethers-v6": "^0.4.0", + "@typechain/hardhat": "^8.0.0", "@types/chai": "^4.2.0", "@types/express": "^4.17.18", "@types/mocha": ">=9.1.0", "@types/node": "12.0.0", "@types/supertest": "^2.0.14", - "nyc": "^15.1.0" + "@typescript-eslint/eslint-plugin": "^7.6.0", + "@typescript-eslint/parser": "^7.6.0", + "chai": "^4.2.0", + "eslint": "^8.57.0", + "hardhat": "^2.21.0", + "hardhat-gas-reporter": "^1.0.8", + "mocha": "^10.3.0", + "nyc": "^15.1.0", + "solidity-coverage": "^0.8.1", + "supertest": "^6.3.3", + "ts-node": "^10.9.2", + "typechain": "^8.2.0" } } diff --git a/packages/linea-ccip-gateway/src/L2ProofService.ts b/packages/linea-ccip-gateway/src/L2ProofService.ts index c248f11eb..5537386bc 100644 --- a/packages/linea-ccip-gateway/src/L2ProofService.ts +++ b/packages/linea-ccip-gateway/src/L2ProofService.ts @@ -1,17 +1,17 @@ import { AbiCoder, AddressLike, - JsonRpcProvider, Contract, ethers, -} from "ethers"; -import { EVMProofHelper, IProofService, StateProof } from "./evm-gateway"; -import { logDebug, logError } from "./utils"; + JsonRpcProvider, +} from 'ethers'; +import { EVMProofHelper, IProofService, StateProof } from './evm-gateway'; +import { logDebug, logError } from './utils'; export type L2ProvableBlock = number; const currentL2BlockNumberSig = - "function currentL2BlockNumber() view returns (uint256)"; + 'function currentL2BlockNumber() view returns (uint256)'; /** * The proofService class can be used to calculate proofs for a given target and slot on the Optimism Bedrock network. @@ -26,7 +26,7 @@ export class L2ProofService implements IProofService { providerL1: JsonRpcProvider, providerL2: JsonRpcProvider, rollupAddress: string, - shomeiNode?: JsonRpcProvider + shomeiNode?: JsonRpcProvider, ) { this.helper = new EVMProofHelper(providerL2, shomeiNode); const currentL2BlockNumberIface = new ethers.Interface([ @@ -35,7 +35,7 @@ export class L2ProofService implements IProofService { this.rollup = new Contract( rollupAddress, currentL2BlockNumberIface, - providerL1 + providerL1, ); } @@ -43,21 +43,22 @@ export class L2ProofService implements IProofService { * @dev Returns an object representing a block whose state can be proven on L1. */ async getProvableBlock(): Promise { - try { - logDebug( - "Calling currentL2BlockNumber() on Rollup Contract", - await this.rollup.getAddress() - ); - const lastBlockFinalized = await this.rollup.currentL2BlockNumber({ - blockTag: "finalized", - }); - if (!lastBlockFinalized) throw new Error("No block found"); - logDebug("Provable block found", lastBlockFinalized); - return lastBlockFinalized; - } catch (e) { - logError(e); - throw e; + logDebug( + 'Calling currentL2BlockNumber() on Rollup Contract', + await this.rollup.getAddress(), + ); + + const lastBlockFinalized = await this.rollup.currentL2BlockNumber({ + blockTag: 'finalized', + }); + + if (!lastBlockFinalized) { + logError('No block found'); + return Promise.reject(new Error('No block found')); } + + logDebug('Provable block found', lastBlockFinalized); + return lastBlockFinalized; } /** @@ -70,7 +71,7 @@ export class L2ProofService implements IProofService { getStorageAt( block: L2ProvableBlock, address: AddressLike, - slot: bigint + slot: bigint, ): Promise { try { return this.helper.getStorageAt(block, address, slot); @@ -82,7 +83,7 @@ export class L2ProofService implements IProofService { /** * @dev Fetches a set of proofs for the requested state slots. - * @param block A `ProvableBlock` returned by `getProvableBlock`. + * @param blockNo A `ProvableBlock`'s number returned by `getProvableBlock`. * @param address The address of the contract to fetch data from. * @param slots An array of slots to fetch data for. * @returns A proof of the given slots, encoded in a manner that this service's @@ -91,28 +92,36 @@ export class L2ProofService implements IProofService { async getProofs( blockNo: L2ProvableBlock, address: AddressLike, - slots: bigint[] + slots: bigint[], ): Promise { try { - let proof = await this.helper.getProofs(blockNo, address, slots); + const proof = await this.helper.getProofs(blockNo, address, slots); + if (!proof.accountProof) { - throw `No account proof on contract ${address} for block number ${blockNo}`; + const error = `No account proof on contract ${address} for block number ${blockNo}`; + logError(error, { blockNo, address, slots }); + return Promise.reject(new Error(error)); } + if (proof.storageProofs.length === 0) { - throw `No storage proofs on contract ${address} for block number ${blockNo}`; + const error = `No storage proofs on contract ${address} for block number ${blockNo}`; + logError(error, { blockNo, address, slots }); + return Promise.reject(new Error(error)); } - proof = this.checkStorageInitialized(proof); + + const verifiedProof = this.checkStorageInitialized(proof); + return AbiCoder.defaultAbiCoder().encode( [ - "uint256", - "tuple(bytes key, uint256 leafIndex, tuple(bytes value, bytes[] proofRelatedNodes) proof)", - "tuple(bytes32 key, uint256 leafIndex, tuple(bytes32 value, bytes[] proofRelatedNodes) proof, bool initialized)[]", + 'uint256', + 'tuple(bytes key, uint256 leafIndex, tuple(bytes value, bytes[] proofRelatedNodes) proof)', + 'tuple(bytes32 key, uint256 leafIndex, tuple(bytes32 value, bytes[] proofRelatedNodes) proof, bool initialized)[]', ], - [blockNo, proof.accountProof, proof.storageProofs] + [blockNo, verifiedProof.accountProof, verifiedProof.storageProofs], ); } catch (e) { logError(e, { blockNo, address, slots }); - throw e; + return Promise.reject(e); } } @@ -123,15 +132,22 @@ export class L2ProofService implements IProofService { * @returns modifier proof with the */ checkStorageInitialized(proof: StateProof): StateProof { - for (let storageProof of proof.storageProofs) { + for (const storageProof of proof.storageProofs) { if (storageProof.leftProof || storageProof.rightProof) { - storageProof.proof = storageProof.leftProof; - storageProof.leafIndex = storageProof.leftLeafIndex; - storageProof.initialized = false; - delete storageProof.leftProof; - delete storageProof.rightProof; - delete storageProof.leftLeafIndex; - delete storageProof.rightLeafIndex; + if ( + storageProof.leftProof && + storageProof.leftLeafIndex !== undefined + ) { + storageProof.proof = storageProof.leftProof; + storageProof.leafIndex = storageProof.leftLeafIndex; + storageProof.initialized = false; + delete storageProof.leftProof; + delete storageProof.rightProof; + delete storageProof.leftLeafIndex; + delete storageProof.rightLeafIndex; + } else { + throw new Error('Left proof or left leaf index is undefined'); + } } else { storageProof.initialized = true; } diff --git a/packages/linea-ccip-gateway/src/evm-gateway/EVMGateway.ts b/packages/linea-ccip-gateway/src/evm-gateway/EVMGateway.ts index ca19890e9..3ea930ef2 100644 --- a/packages/linea-ccip-gateway/src/evm-gateway/EVMGateway.ts +++ b/packages/linea-ccip-gateway/src/evm-gateway/EVMGateway.ts @@ -1,5 +1,5 @@ -import { HandlerDescription } from "@chainlink/ccip-read-server"; -import { Fragment, Interface, JsonFragment } from "@ethersproject/abi"; +import { HandlerDescription } from '@chainlink/ccip-read-server'; +import { Fragment, Interface, JsonFragment } from '@ethersproject/abi'; import { concat, dataSlice, @@ -7,9 +7,9 @@ import { solidityPackedKeccak256, toBigInt, zeroPadValue, -} from "ethers"; -import { IProofService, ProvableBlock } from "./IProofService"; -import { logDebug, logError, logInfo } from "../utils"; +} from 'ethers'; +import { IProofService, ProvableBlock } from './IProofService'; +import { logDebug, logError, logInfo } from '../utils'; const OP_CONSTANT = 0x00; const OP_BACKREF = 0x20; @@ -34,7 +34,7 @@ interface StorageElement { interface Server { add: ( abi: string | readonly (string | Fragment | JsonFragment)[] | Interface, - handlers: HandlerDescription[] + handlers: HandlerDescription[], ) => void; } @@ -91,30 +91,30 @@ export class EVMGateway { * The final result of this hashing operation is used as the base slot number for the storage * lookup. This mirrors Solidity's recursive hashing operation for determining storage slot locations. */ - "function getStorageSlots(address addr, bytes32[] memory commands, bytes[] memory constants) external view returns(bytes memory witness)", + 'function getStorageSlots(address addr, bytes32[] memory commands, bytes[] memory constants) external view returns(bytes memory witness)', ]; server.add(abi, [ { - type: "getStorageSlots", - func: async (args) => { + type: 'getStorageSlots', + func: async args => { const [addr, commands, constants] = args; logInfo(`CCIP request started for L2 target contract`, { address: addr, }); - logDebug("CCIP request started with args", addr, commands, constants); + logDebug('CCIP request started with args', addr, commands, constants); try { const proofs = await this.createProofs(addr, commands, constants); logInfo( `CCIP request successfully executed for L2 target contract`, { address: addr, - } + }, ); - logDebug("CCIP request finished with encoded proofs", proofs); + logDebug('CCIP request finished with encoded proofs', proofs); return [proofs]; } catch (e) { logError(e, { addr, commands, constants }); - throw "ccip-gateway error calling getStorageSlots"; + throw 'ccip-gateway error calling getStorageSlots'; } }, }, @@ -125,13 +125,13 @@ export class EVMGateway { /** * * @param address The address to fetch storage slot proofs for - * @param paths Each element of this array specifies a Solidity-style path derivation for a storage slot ID. - * See README.md for details of the encoding. + * @param commands The commands to execute to compute the storage slots + * @param constants The constants to use in the commands */ async createProofs( address: string, commands: string[], - constants: string[] + constants: string[], ): Promise { const block = await this.proofService.getProvableBlock(); const requests: Promise[] = []; @@ -143,14 +143,14 @@ export class EVMGateway { address, commands[i], constants, - requests.slice() - ) + requests.slice(), + ), ); } // Resolve all the outstanding requests const results = await Promise.all(requests); const slots = Array.prototype.concat( - ...results.map((result) => result.slots) + ...results.map(result => result.slots), ); return this.proofService.getProofs(block, address, slots); } @@ -158,7 +158,7 @@ export class EVMGateway { private async executeOperation( operation: number, constants: string[], - requests: Promise[] + requests: Promise[], ): Promise { const opcode = operation & 0xe0; const operand = operation & 0x1f; @@ -169,21 +169,21 @@ export class EVMGateway { case OP_BACKREF: return await (await requests[operand]).value(); default: - throw new Error("Unrecognized opcode"); + throw new Error('Unrecognized opcode'); } } private async computeFirstSlot( command: string, constants: string[], - requests: Promise[] + requests: Promise[], ): Promise<{ slot: bigint; isDynamic: boolean }> { const commandWord = getBytes(command); const flags = commandWord[0]; const isDynamic = (flags & 0x01) != 0; let slot = toBigInt( - await this.executeOperation(commandWord[1], constants, requests) + await this.executeOperation(commandWord[1], constants, requests), ); // If there are multiple path elements, recursively hash them solidity-style to get the final slot. @@ -191,10 +191,10 @@ export class EVMGateway { const index = await this.executeOperation( commandWord[j], constants, - requests + requests, ); slot = toBigInt( - solidityPackedKeccak256(["bytes", "uint256"], [index, slot]) + solidityPackedKeccak256(['bytes', 'uint256'], [index, slot]), ); } @@ -204,16 +204,16 @@ export class EVMGateway { private async getDynamicValue( block: T, address: string, - slot: bigint + slot: bigint, ): Promise { const firstValue = getBytes( - await this.proofService.getStorageAt(block, address, slot) + await this.proofService.getStorageAt(block, address, slot), ); // Decode Solidity dynamic value encoding if (firstValue[31] & 0x01) { // Long value: first slot is `length * 2 + 1`, following slots are data. const len = (Number(toBigInt(firstValue)) - 1) / 2; - const hashedSlot = toBigInt(solidityPackedKeccak256(["uint256"], [slot])); + const hashedSlot = toBigInt(solidityPackedKeccak256(['uint256'], [slot])); const slotNumbers = Array(Math.ceil(len / 32)) .fill(BigInt(hashedSlot)) .map((i, idx) => i + BigInt(idx)); @@ -222,9 +222,9 @@ export class EVMGateway { isDynamic: true, value: memoize(async () => { const values = await Promise.all( - slotNumbers.map((slot) => - this.proofService.getStorageAt(block, address, slot) - ) + slotNumbers.map(slot => + this.proofService.getStorageAt(block, address, slot), + ), ); return dataSlice(concat(values), 0, len); }), @@ -245,12 +245,12 @@ export class EVMGateway { address: string, command: string, constants: string[], - requests: Promise[] + requests: Promise[], ): Promise { const { slot, isDynamic } = await this.computeFirstSlot( command, constants, - requests + requests, ); if (!isDynamic) { @@ -260,8 +260,8 @@ export class EVMGateway { value: memoize(async () => zeroPadValue( await this.proofService.getStorageAt(block, address, slot), - 32 - ) + 32, + ), ), }; } else { diff --git a/packages/linea-ccip-gateway/src/evm-gateway/EVMProofHelper.ts b/packages/linea-ccip-gateway/src/evm-gateway/EVMProofHelper.ts index d48cc2234..4500c6da3 100644 --- a/packages/linea-ccip-gateway/src/evm-gateway/EVMProofHelper.ts +++ b/packages/linea-ccip-gateway/src/evm-gateway/EVMProofHelper.ts @@ -1,5 +1,5 @@ -import { toBeHex, AddressLike, JsonRpcProvider, ethers } from "ethers"; -import { logDebug, logInfo } from "../utils"; +import { AddressLike, ethers, JsonRpcProvider, toBeHex } from 'ethers'; +import { logDebug, logInfo } from '../utils'; interface ProofStruct { key: string; @@ -37,7 +37,7 @@ export class EVMProofHelper { /** * @dev Returns the value of a contract state slot at the specified block - * @param block A `ProvableBlock` returned by `getProvableBlock`. + * @param blockNo A `ProvableBlock`'s number returned by `getProvableBlock`. * @param address The address of the contract to fetch data from. * @param slot The slot to fetch. * @returns The value in `slot` of `address` at block `block` @@ -45,14 +45,14 @@ export class EVMProofHelper { getStorageAt( blockNo: number, address: AddressLike, - slot: bigint + slot: bigint, ): Promise { return this.providerL2.getStorage(address, slot, blockNo); } /** * @dev Fetches a set of proofs for the requested state slots. - * @param block A `ProvableBlock` returned by `getProvableBlock`. + * @param blockNo A `ProvableBlock`'s number returned by `getProvableBlock`. * @param address The address of the contract to fetch data from. * @param slots An array of slots to fetch data for. * @returns A proof of the given slots, encoded in a manner that this service's @@ -61,31 +61,31 @@ export class EVMProofHelper { async getProofs( blockNo: number, address: AddressLike, - slots: bigint[] + slots: bigint[], ): Promise { const args = [ address, - slots.map((slot) => toBeHex(slot, 32)), - "0x" + blockNo.toString(16), + slots.map(slot => toBeHex(slot, 32)), + '0x' + blockNo.toString(16), ]; - logInfo("Calling linea_getProof with args", args); + logInfo('Calling linea_getProof with args', args); // We have to reinitilize the provider L2 because of an issue when multiple // requests are sent at the same time, the provider becomes not aware of // the linea_getProof method - const providerUrl = await this.shomeiNode._getConnection().url; - const providerChainId = await this.shomeiNode._network.chainId; + const providerUrl = this.shomeiNode._getConnection().url; + const providerChainId = this.shomeiNode._network.chainId; const providerL2 = new ethers.JsonRpcProvider( providerUrl, providerChainId, { staticNetwork: true, - } + }, ); - logDebug("Calling linea_getProof with L2 provider", providerUrl); - const proofs: StateProof = await providerL2.send("linea_getProof", args); - logDebug("Proof result", proofs); + logDebug('Calling linea_getProof with L2 provider', providerUrl); + const proofs: StateProof = await providerL2.send('linea_getProof', args); + logDebug('Proof result', proofs); return proofs; } } diff --git a/packages/linea-ccip-gateway/src/evm-gateway/IProofService.ts b/packages/linea-ccip-gateway/src/evm-gateway/IProofService.ts index 8344eaf4c..fea25ebff 100644 --- a/packages/linea-ccip-gateway/src/evm-gateway/IProofService.ts +++ b/packages/linea-ccip-gateway/src/evm-gateway/IProofService.ts @@ -1,4 +1,4 @@ -import type { AddressLike } from 'ethers'; +import { AddressLike } from 'ethers'; export interface ProvableBlock {} diff --git a/packages/linea-ccip-gateway/src/evm-gateway/index.ts b/packages/linea-ccip-gateway/src/evm-gateway/index.ts index 9af503240..367eb22f5 100644 --- a/packages/linea-ccip-gateway/src/evm-gateway/index.ts +++ b/packages/linea-ccip-gateway/src/evm-gateway/index.ts @@ -1,3 +1,3 @@ export { EVMGateway, StorageLayout } from './EVMGateway'; export { EVMProofHelper, StateProof } from './EVMProofHelper'; -export type { IProofService, ProvableBlock } from './IProofService'; \ No newline at end of file +export { IProofService, ProvableBlock } from './IProofService'; diff --git a/packages/linea-ccip-gateway/src/index.ts b/packages/linea-ccip-gateway/src/index.ts index 5c8227449..af90e4c17 100644 --- a/packages/linea-ccip-gateway/src/index.ts +++ b/packages/linea-ccip-gateway/src/index.ts @@ -1,6 +1,6 @@ -import { EVMGateway } from "./evm-gateway"; -import { JsonRpcProvider } from "ethers"; -import { L2ProofService, L2ProvableBlock } from "./L2ProofService"; +import { EVMGateway } from './evm-gateway'; +import { JsonRpcProvider } from 'ethers'; +import { L2ProofService, L2ProvableBlock } from './L2ProofService'; export type L1Gateway = EVMGateway; @@ -8,10 +8,10 @@ export function makeL2Gateway( providerL1: JsonRpcProvider, providerL2: JsonRpcProvider, rollupAddress: string, - shomeiNode?: JsonRpcProvider + shomeiNode?: JsonRpcProvider, ): L1Gateway { return new EVMGateway( - new L2ProofService(providerL1, providerL2, rollupAddress, shomeiNode) + new L2ProofService(providerL1, providerL2, rollupAddress, shomeiNode), ); } diff --git a/packages/linea-ccip-gateway/src/server.ts b/packages/linea-ccip-gateway/src/server.ts index 526d9c483..ba8bc5420 100644 --- a/packages/linea-ccip-gateway/src/server.ts +++ b/packages/linea-ccip-gateway/src/server.ts @@ -1,16 +1,17 @@ -import { EVMGateway } from "./evm-gateway"; -import { ethers } from "ethers"; -import { L2ProofService } from "./L2ProofService"; -import "dotenv/config"; -import { Server } from "@chainlink/ccip-read-server"; -import { logError } from "./utils"; +import { EVMGateway } from './evm-gateway'; +import { ethers } from 'ethers'; +import { L2ProofService } from './L2ProofService'; +import 'dotenv/config'; +import { Server } from '@chainlink/ccip-read-server'; +import { logError } from './utils'; const l1ProviderUrl = process.env.L1_PROVIDER_URL; const l2ProviderUrl = process.env.L2_PROVIDER_URL; -const l2ChainId = parseInt(process.env.L2_CHAIN_ID); -const rollupAddress = process.env.L1_ROLLUP_ADDRESS; +const l2ChainId = parseInt(process.env.L2_CHAIN_ID ?? '59144'); +const rollupAddress = + process.env.L1_ROLLUP_ADDRESS ?? '0xB218f8A4Bc926cF1cA7b3423c154a0D627Bdb7E5'; const port = process.env.PORT || 3000; -const nodeEnv = process.env.NODE_ENV || "test"; +const nodeEnv = process.env.NODE_ENV || 'test'; try { const providerL1 = new ethers.JsonRpcProvider(l1ProviderUrl); @@ -19,36 +20,36 @@ try { }); const gateway = new EVMGateway( - new L2ProofService(providerL1, providerL2, rollupAddress) + new L2ProofService(providerL1, providerL2, rollupAddress), ); const server = new Server(); gateway.add(server); - const app = server.makeApp("/"); + const app = server.makeApp('/'); - console.log("Server setup complete."); + console.log('Server setup complete.'); // Liveness probe - app.get("/live", async (_req, res, _next) => { + app.get('/live', async (_req, res) => { res.send({ uptime: process.uptime(), - message: "OK", + message: 'OK', timestamp: Date.now(), }); }); // Readiness probe - app.get("/ready", async (_req, res, _next) => { + app.get('/ready', async (_req, res) => { const readiness = { - message: "OK", + message: 'OK', timestamp: Date.now(), }; try { - const host = _req.protocol + "://" + _req.get("host"); + const host = _req.protocol + '://' + _req.get('host'); // Call the actual method to get the results for a specific slot location to check that it resolves correctly // Query to retrieve the address of "test.linea.eth" using the mainnet linea ccip gateway let urlToCheck = `${host}/0xde16ee87b0c019499cebdde29c9f7686560f679a/0xea9cd3bf00000000000000000000000086c5aed9f27837074612288610fb98ccc1733126000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000002000001ff000000000000000000000000000000000000000000000000000000000102200304ff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a6b048e995adeec31455b4128a77bb8c173bd1314c7c99ab5e09622ee28be2f0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000020a6b048e995adeec31455b4128a77bb8c173bd1314c7c99ab5e09622ee28be2f00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003c.json`; - if (nodeEnv === "test") { + if (nodeEnv === 'test') { // If on sepolia the values are slightly different // Query to retrieve the address of "test.linea-sepolia.eth" using the linea sepolia ccip gateway urlToCheck = `${host}/0x64884ed06241c059497aedb2c7a44ccae6bc7937/0xea9cd3bf000000000000000000000000a2008916ed2d7ed0ecd747a8a5309267e42cf1f1000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000002000001ff000000000000000000000000000000000000000000000000000000000102200304ff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020dde5d7fdc926e668bfdf1fa738b96e0ad0267b06f38e6709478a00dbc5243c17000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000020dde5d7fdc926e668bfdf1fa738b96e0ad0267b06f38e6709478a00dbc5243c170000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003c.json`; @@ -62,14 +63,15 @@ try { res.send(readiness); } } catch (error) { - readiness.message = error; + readiness.message = + error instanceof Error ? error.message : JSON.stringify(error); logError(error, readiness); res.status(500).send(); } }); (async () => { - app.listen(port, function () { + app.listen(port, function() { console.log(`Listening on ${port}`); }); })(); diff --git a/packages/linea-ccip-gateway/src/utils.ts b/packages/linea-ccip-gateway/src/utils.ts index 3dc1124c3..c219a58e7 100644 --- a/packages/linea-ccip-gateway/src/utils.ts +++ b/packages/linea-ccip-gateway/src/utils.ts @@ -1,13 +1,13 @@ -export function logError(error: any, ...objects: any[]) { +export function logError(error: unknown, ...objects: unknown[]) { const logObject = { - error: error.message || error, + error: error instanceof Error ? error.message : error, details: objects, }; console.error(logObject); } -export function logDebug(message: string, ...objects: any[]) { - if (process.env.NODE_ENV === "development") { +export function logDebug(message: string, ...objects: unknown[]) { + if (process.env.NODE_ENV === 'development') { const logObject = { message, details: objects, @@ -16,7 +16,7 @@ export function logDebug(message: string, ...objects: any[]) { } } -export function logInfo(message: string, ...objects: any[]) { +export function logInfo(message: string, ...objects: unknown[]) { const logObject = { message, details: objects, diff --git a/packages/linea-ccip-gateway/test/testVerifier.spec.ts b/packages/linea-ccip-gateway/test/testVerifier.spec.ts index e0fae776d..eb9aa8fe6 100644 --- a/packages/linea-ccip-gateway/test/testVerifier.spec.ts +++ b/packages/linea-ccip-gateway/test/testVerifier.spec.ts @@ -1,36 +1,36 @@ -import { Server } from "@chainlink/ccip-read-server"; -import { makeL2Gateway } from "../src"; -import { HardhatEthersProvider } from "@nomicfoundation/hardhat-ethers/internal/hardhat-ethers-provider"; -import { HardhatEthersHelpers } from "@nomicfoundation/hardhat-ethers/types"; -import { expect } from "chai"; +import { Server } from '@chainlink/ccip-read-server'; +import { makeL2Gateway } from '../src'; +import { HardhatEthersProvider } from '@nomicfoundation/hardhat-ethers/internal/hardhat-ethers-provider'; +import { HardhatEthersHelpers } from '@nomicfoundation/hardhat-ethers/types'; +import { expect } from 'chai'; import { BrowserProvider, Contract, + ethers as ethersT, FetchRequest, JsonRpcProvider, Signer, - ethers as ethersT, -} from "ethers"; -import { ethers } from "hardhat"; -import { EthereumProvider } from "hardhat/types"; -import request from "supertest"; +} from 'ethers'; +import { ethers } from 'hardhat'; +import { EthereumProvider } from 'hardhat/types'; +import request from 'supertest'; type ethersObj = typeof ethersT & - Omit & { - provider: Omit & { + Omit & { + provider: Omit & { _hardhatProvider: EthereumProvider; }; }; -declare module "hardhat/types/runtime" { +declare module 'hardhat/types/runtime' { const ethers: ethersObj; + interface HardhatRuntimeEnvironment { - // @ts-ignore ethers: ethersObj; } } -describe("L1Verifier", () => { +describe('L1Verifier', () => { let l1Provider: BrowserProvider; let l2Provider: JsonRpcProvider; let l1SepoliaProvider: JsonRpcProvider; @@ -41,156 +41,155 @@ describe("L1Verifier", () => { before(async () => { // Hack to get a 'real' ethers provider from hardhat. The default `HardhatProvider` // doesn't support CCIP-read. - // @ts-ignore l1Provider = new ethers.BrowserProvider(ethers.provider._hardhatProvider); l2Provider = new ethers.JsonRpcProvider( - "https://rpc.sepolia.linea.build/", + 'https://rpc.sepolia.linea.build/', 59141, { staticNetwork: true, - } + }, ); // We need this provider to get the latest L2BlockNumber along with the the linea state root hash l1SepoliaProvider = new ethers.JsonRpcProvider( - "https://gateway.tenderly.co/public/sepolia", + 'https://gateway.tenderly.co/public/sepolia', 11155111, { staticNetwork: true, - } + }, ); // This test only works with the specific test contract deployed on linea sepolia network - l2TestContract = "0x09a434561f4b40067F71444d7042fd110013F879"; + l2TestContract = '0x09a434561f4b40067F71444d7042fd110013F879'; signer = await l1Provider.getSigner(0); - const Rollup = await ethers.getContractFactory("RollupMock", signer); + const Rollup = await ethers.getContractFactory('RollupMock', signer); // We query the latest block number and state root hash on the actual L1 sepolia chain // because otherwise if we hard code a block number and state root hash the test is no longer // working after a while as linea_getProof stops working for older blocks const rollupSepolia = new ethers.Contract( - "0xB218f8A4Bc926cF1cA7b3423c154a0D627Bdb7E5", + '0xB218f8A4Bc926cF1cA7b3423c154a0D627Bdb7E5', Rollup.interface, - l1SepoliaProvider + l1SepoliaProvider, ); const currentL2BlockNumber = await rollupSepolia.currentL2BlockNumber(); const stateRootHash = await rollupSepolia.stateRootHashes( - currentL2BlockNumber + currentL2BlockNumber, ); const rollup = await Rollup.deploy(currentL2BlockNumber, stateRootHash); const gateway = makeL2Gateway( - l1Provider as unknown as JsonRpcProvider, + (l1Provider as unknown) as JsonRpcProvider, l2Provider, - await rollup.getAddress() + await rollup.getAddress(), ); const server = new Server(); gateway.add(server); - const app = server.makeApp("/"); + const app = server.makeApp('/'); const getUrl = FetchRequest.createGetUrlFunc(); ethers.FetchRequest.registerGetUrl(async (req: FetchRequest) => { - if (req.url != "test:") return getUrl(req); + if (req.url != 'test:') return getUrl(req); - const r = request(app).post("/"); + const r = request(app).post('/'); if (req.hasBody()) { - r.set("Content-Type", "application/json").send( - ethers.toUtf8String(req.body) + r.set('Content-Type', 'application/json').send( + ethers.toUtf8String(req.body), ); } const response = await r; return { statusCode: response.statusCode, - statusMessage: response.ok ? "OK" : response.statusCode.toString(), + statusMessage: response.ok ? 'OK' : response.statusCode.toString(), body: ethers.toUtf8Bytes(JSON.stringify(response.body)), headers: { - "Content-Type": "application/json", + 'Content-Type': 'application/json', }, }; }); - const Mimc = await ethers.getContractFactory("Mimc", signer); + const Mimc = await ethers.getContractFactory('Mimc', signer); const mimc = await Mimc.deploy(); const SparseMerkleProof = await ethers.getContractFactory( - "SparseMerkleProof", - { libraries: { Mimc: await mimc.getAddress() }, signer } + 'SparseMerkleProof', + { libraries: { Mimc: await mimc.getAddress() }, signer }, ); const sparseMerkleProof = await SparseMerkleProof.deploy(); const LineaSparseProofVerifier = await ethers.getContractFactory( - "LineaSparseProofVerifier", + 'LineaSparseProofVerifier', { libraries: { SparseMerkleProof: await sparseMerkleProof.getAddress(), }, signer, - } + }, ); const lineaSparseProofVerifier = await LineaSparseProofVerifier.deploy( - ["test:"], - await rollup.getAddress() + ['test:'], + await rollup.getAddress(), ); - const TestL1 = await ethers.getContractFactory("TestL1", signer); + const TestL1 = await ethers.getContractFactory('TestL1', signer); target = await TestL1.deploy( await lineaSparseProofVerifier.getAddress(), - l2TestContract + l2TestContract, ); // Mine an empty block so we have something to prove against - await l1Provider.send("evm_mine", []); + await l1Provider.send('evm_mine', []); }); - it("simple proofs for fixed values", async () => { + it('simple proofs for fixed values', async () => { const result = await target.getLatest({ enableCcipRead: true }); expect(Number(result)).to.equal(42); }); - it("simple proofs for dynamic values", async () => { + it('simple proofs for dynamic values', async () => { const result = await target.getName({ enableCcipRead: true }); - expect(result).to.equal("Satoshi"); + expect(result).to.equal('Satoshi'); }); - it("nested proofs for dynamic values", async () => { + it('nested proofs for dynamic values', async () => { const result = await target.getHighscorer(42, { enableCcipRead: true }); - expect(result).to.equal("Hal Finney"); + expect(result).to.equal('Hal Finney'); }); - it("nested proofs for long dynamic values", async () => { + it('nested proofs for long dynamic values', async () => { const result = await target.getHighscorer(1, { enableCcipRead: true }); expect(result).to.equal( - "Hubert Blaine Wolfeschlegelsteinhausenbergerdorff Sr." + 'Hubert Blaine Wolfeschlegelsteinhausenbergerdorff Sr.', ); }); - it("nested proofs with lookbehind", async () => { + it('nested proofs with lookbehind', async () => { const result = await target.getLatestHighscore({ enableCcipRead: true }); expect(Number(result)).to.equal(12345); }); - it("nested proofs with lookbehind for dynamic values", async () => { + it('nested proofs with lookbehind for dynamic values', async () => { const result = await target.getLatestHighscorer({ enableCcipRead: true }); - expect(result).to.equal("Hal Finney"); + expect(result).to.equal('Hal Finney'); }); - it("mappings with variable-length keys", async () => { - const result = await target.getNickname("Money Skeleton", { + it('mappings with variable-length keys', async () => { + const result = await target.getNickname('Money Skeleton', { enableCcipRead: true, }); - expect(result).to.equal("Vitalik Buterin"); + expect(result).to.equal('Vitalik Buterin'); }); - it("nested proofs of mappings with variable-length keys", async () => { + it('nested proofs of mappings with variable-length keys', async () => { const result = await target.getPrimaryNickname({ enableCcipRead: true }); - expect(result).to.equal("Hal Finney"); + expect(result).to.equal('Hal Finney'); }); - it("treats uninitialized storage elements as zeroes", async () => { + it('treats uninitialized storage elements as zeroes', async () => { const result = await target.getZero({ enableCcipRead: true }); expect(Number(result)).to.equal(0); }); - it("treats uninitialized dynamic values as empty strings", async () => { - const result = await target.getNickname("Santa", { enableCcipRead: true }); - expect(result).to.equal(""); + it('treats uninitialized dynamic values as empty strings', async () => { + const result = await target.getNickname('Santa', { enableCcipRead: true }); + expect(result).to.equal(''); }); }); diff --git a/packages/linea-ccip-gateway/tsconfig.build.json b/packages/linea-ccip-gateway/tsconfig.build.json new file mode 100644 index 000000000..2ae42f5b6 --- /dev/null +++ b/packages/linea-ccip-gateway/tsconfig.build.json @@ -0,0 +1,11 @@ +{ + "extends": "./tsconfig.json", + "include": [ + "src" + ], + "exclude": [ + "node_modules", + "dist", + "test" + ] +} diff --git a/packages/linea-ccip-gateway/tsconfig.json b/packages/linea-ccip-gateway/tsconfig.json index 33322a0b8..54416c359 100644 --- a/packages/linea-ccip-gateway/tsconfig.json +++ b/packages/linea-ccip-gateway/tsconfig.json @@ -1,24 +1,24 @@ { - "include": ["src"], "compilerOptions": { - "module": "esnext", - "lib": ["dom", "esnext"], - "importHelpers": true, - "declaration": true, - "sourceMap": true, - "rootDir": "./src", - "noUnusedLocals": true, - "noUnusedParameters": true, - "moduleResolution": "Node", - "jsx": "react", + "target": "ESNext", + "module": "commonjs", + "strict": true, "esModuleInterop": true, - "skipLibCheck": false, - "resolveJsonModule": true - }, - "ts-node": { - "compilerOptions": { - "module": "commonjs" + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "moduleResolution": "node", + "allowSyntheticDefaultImports": true, + "baseUrl": ".", + "outDir": "./dist", + "paths": { + "*": [ + "node_modules/*" + ] } }, - "outDir": "./dist" + "include": [ + "src", + "test" + ] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5830a0a21..1f8056591 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -88,16 +88,16 @@ importers: specifier: ^2.0.14 version: 2.0.16 '@typescript-eslint/eslint-plugin': - specifier: ^7.1.0 + specifier: ^7.6.0 version: 7.6.0(@typescript-eslint/parser@7.6.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) '@typescript-eslint/parser': - specifier: ^7.1.0 + specifier: ^7.6.0 version: 7.6.0(eslint@8.57.0)(typescript@5.4.5) chai: specifier: ^4.2.0 version: 4.4.1 eslint: - specifier: ^8.56.0 + specifier: ^8.57.0 version: 8.57.0 hardhat: specifier: ^2.21.0 @@ -158,7 +158,7 @@ importers: version: 2.0.1(@types/react@18.2.21)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(viem@2.9.17(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4))(wagmi@2.5.7(@react-native-async-storage/async-storage@1.23.1(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.7)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@6.0.3)))(@tanstack/query-core@5.22.2)(@tanstack/react-query@5.22.2(react@18.2.0))(@types/react@18.2.21)(bufferutil@4.0.7)(encoding@0.1.13)(immer@9.0.21)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4(@babel/core@7.24.4))(bufferutil@4.0.7)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@6.0.3))(react@18.2.0)(rollup@2.78.0)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.9.17(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.22.4))(zod@3.22.4)) '@sentry/nextjs': specifier: ^7.43.0 - version: 7.110.0(encoding@0.1.13)(next@14.2.10(@babel/core@7.24.4)(@playwright/test@1.43.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)(webpack@5.96.1(esbuild@0.17.19)) + version: 7.110.0(encoding@0.1.13)(next@14.2.10(@babel/core@7.24.4)(@playwright/test@1.43.1)(babel-plugin-macros@3.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)(webpack@5.96.1(esbuild@0.17.19)) '@svgr/webpack': specifier: ^8.1.0 version: 8.1.0(typescript@5.4.5) @@ -221,7 +221,7 @@ importers: version: 7.4.7(react@18.2.0) next: specifier: 14.2.10 - version: 14.2.10(@babel/core@7.24.4)(@playwright/test@1.43.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 14.2.10(@babel/core@7.24.4)(@playwright/test@1.43.1)(babel-plugin-macros@3.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) p-memoize: specifier: ^7.1.1 version: 7.1.1 @@ -312,7 +312,7 @@ importers: version: 1.43.1 '@testing-library/jest-dom': specifier: ^6.4.2 - version: 6.4.2(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@18.19.31)(ts-node@10.9.2(@types/node@18.19.31)(typescript@5.4.5)))(vitest@1.5.0(@types/node@18.19.31)(jsdom@24.0.0(bufferutil@4.0.7)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.3))(terser@5.30.3)) + version: 6.4.2(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@18.19.31)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.31)(typescript@5.4.5)))(vitest@1.5.0(@types/node@18.19.31)(jsdom@24.0.0(bufferutil@4.0.7)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.3))(terser@5.30.3)) '@testing-library/react': specifier: ^14.0.0 version: 14.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -390,13 +390,13 @@ importers: version: 8.50.0 eslint-config-airbnb: specifier: ^19.0.4 - version: 19.0.4(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.50.0)(typescript@5.4.5))(eslint@8.50.0))(eslint-plugin-jsx-a11y@6.8.0(eslint@8.50.0))(eslint-plugin-react-hooks@4.6.0(eslint@8.50.0))(eslint-plugin-react@7.34.1(eslint@8.50.0))(eslint@8.50.0) + version: 19.0.4(eslint-plugin-import@2.29.1)(eslint-plugin-jsx-a11y@6.8.0(eslint@8.50.0))(eslint-plugin-react-hooks@4.6.0(eslint@8.50.0))(eslint-plugin-react@7.34.1(eslint@8.50.0))(eslint@8.50.0) eslint-config-airbnb-base: specifier: ^15.0.0 - version: 15.0.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.50.0)(typescript@5.4.5))(eslint@8.50.0))(eslint@8.50.0) + version: 15.0.0(eslint-plugin-import@2.29.1)(eslint@8.50.0) eslint-config-airbnb-typescript: specifier: ^17.1.0 - version: 17.1.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.50.0)(typescript@5.4.5))(eslint@8.50.0)(typescript@5.4.5))(@typescript-eslint/parser@6.21.0(eslint@8.50.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.50.0)(typescript@5.4.5))(eslint@8.50.0))(eslint@8.50.0) + version: 17.1.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.50.0)(typescript@5.4.5))(eslint@8.50.0)(typescript@5.4.5))(@typescript-eslint/parser@6.21.0(eslint@8.50.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@8.50.0) eslint-config-next: specifier: ^13.4.19 version: 13.5.6(eslint@8.50.0)(typescript@5.4.5) @@ -468,10 +468,10 @@ importers: version: 2.2.1 next-dev-https: specifier: ^0.1.2 - version: 0.1.2(next@14.2.10(@babel/core@7.24.4)(@playwright/test@1.43.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0) + version: 0.1.2(next@14.2.10(@babel/core@7.24.4)(@playwright/test@1.43.1)(babel-plugin-macros@3.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0) next-router-mock: specifier: ^0.9.10 - version: 0.9.13(next@14.2.10(@babel/core@7.24.4)(@playwright/test@1.43.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0) + version: 0.9.13(next@14.2.10(@babel/core@7.24.4)(@playwright/test@1.43.1)(babel-plugin-macros@3.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0) next-transpile-modules: specifier: ^9.1.0 version: 9.1.0 @@ -516,7 +516,7 @@ importers: version: 3.3.0(stylelint@14.11.0)(webpack@5.96.1(esbuild@0.17.19)) svgo: specifier: latest - version: 3.2.0 + version: 3.3.2 ts-node: specifier: ^10.9.1 version: 10.9.2(@types/node@18.19.31)(typescript@5.4.5) @@ -561,7 +561,7 @@ importers: version: 0.1.1 '@ensdomains/ens-contracts': specifier: ensdomains/ens-contracts#feature/crosschain-resolver-with-reverse-registrar - version: https://codeload.github.com/ensdomains/ens-contracts/tar.gz/9d6d5b727db18247d74937aa3c6ed162f9121c52(hardhat@2.22.2(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10)) + version: https://codeload.github.com/ensdomains/ens-contracts/tar.gz/d93dfee5908040eb3f7ee98bad7e0fed43d4c9a4(hardhat@2.22.2(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-chai-matchers': specifier: ^2.0.0 version: 2.0.6(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.11.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.2(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10)))(chai@4.4.1)(ethers@6.11.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.2(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10)) @@ -767,10 +767,10 @@ importers: version: 10.4.8(@nestjs/common@10.3.7(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.8) '@nestjs/swagger': specifier: ^7.4.2 - version: 7.4.2(@nestjs/common@10.3.7(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.8(@nestjs/common@10.3.7(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/platform-express@10.4.8)(encoding@0.1.13)(reflect-metadata@0.1.14)(rxjs@7.8.1))(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14) + version: 7.4.2(@nestjs/common@10.3.7(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.8)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14) '@nestjs/terminus': specifier: ^10.2.3 - version: 10.2.3(@nestjs/axios@3.0.2(@nestjs/common@10.3.7(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(axios@1.7.7)(rxjs@7.8.1))(@nestjs/common@10.3.7(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.8(@nestjs/common@10.3.7(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/platform-express@10.4.8)(encoding@0.1.13)(reflect-metadata@0.1.14)(rxjs@7.8.1))(reflect-metadata@0.1.14)(rxjs@7.8.1) + version: 10.2.3(@nestjs/axios@3.0.2(@nestjs/common@10.3.7(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(axios@1.7.7)(rxjs@7.8.1))(@nestjs/common@10.3.7(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.8)(reflect-metadata@0.1.14)(rxjs@7.8.1) class-transformer: specifier: ^0.5.1 version: 0.5.1 @@ -807,7 +807,7 @@ importers: version: 10.1.1(chokidar@3.6.0)(typescript@5.4.5) '@nestjs/testing': specifier: ^10.3.3 - version: 10.3.7(@nestjs/common@10.3.7(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.8(@nestjs/common@10.3.7(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/platform-express@10.4.8)(encoding@0.1.13)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/platform-express@10.4.8(@nestjs/common@10.3.7(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.8)) + version: 10.3.7(@nestjs/common@10.3.7(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.8)(@nestjs/platform-express@10.4.8) '@types/express': specifier: ^4.17.13 version: 4.17.21 @@ -1837,9 +1837,9 @@ packages: '@ensdomains/ens-contracts@file:packages/linea-ens-contracts': resolution: {directory: packages/linea-ens-contracts, type: directory} - '@ensdomains/ens-contracts@https://codeload.github.com/ensdomains/ens-contracts/tar.gz/9d6d5b727db18247d74937aa3c6ed162f9121c52': - resolution: {tarball: https://codeload.github.com/ensdomains/ens-contracts/tar.gz/9d6d5b727db18247d74937aa3c6ed162f9121c52} - version: 0.0.21 + '@ensdomains/ens-contracts@https://codeload.github.com/ensdomains/ens-contracts/tar.gz/d93dfee5908040eb3f7ee98bad7e0fed43d4c9a4': + resolution: {tarball: https://codeload.github.com/ensdomains/ens-contracts/tar.gz/d93dfee5908040eb3f7ee98bad7e0fed43d4c9a4} + version: 1.0.1 '@ensdomains/ens-test-env@0.4.0-beta.0': resolution: {integrity: sha512-B/Kv0EhPQnwHbgHV1yH178es3EIejYf5LbRtTN1N69jbyoxjT+0cUE74YfaH9EZFQ6sLmpJP/Yk7vE3wTpBglQ==} @@ -2328,6 +2328,7 @@ packages: '@humanwhocodes/config-array@0.11.14': resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} @@ -2335,6 +2336,7 @@ packages: '@humanwhocodes/object-schema@2.0.3': resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead '@ianvs/prettier-plugin-sort-imports@4.2.1': resolution: {integrity: sha512-NKN1LVFWUDGDGr3vt+6Ey3qPeN/163uR1pOPAlkWpgvAqgxQ6kSdUf1F0it8aHUtKRUzEGcK38Wxd07O61d7+Q==} @@ -3210,6 +3212,7 @@ packages: '@openzeppelin/test-helpers@0.5.16': resolution: {integrity: sha512-T1EvspSfH1qQO/sgGlskLfYVBbqzJR23SZzYl/6B2JnT4EhThcI85UpvDk0BkLWKaDScQTabGHt4GzHW+3SfZg==} + deprecated: Package no longer maintained. Consider using @nomicfoundation/hardhat-chai-matchers and @nomicfoundation/hardhat-network-helpers instead. '@parcel/watcher-android-arm64@2.4.1': resolution: {integrity: sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==} @@ -4744,6 +4747,7 @@ packages: '@walletconnect/sign-client@2.11.1': resolution: {integrity: sha512-s3oKSx6/F5X2WmkV1jfJImBFACf9Km5HpTb+n5q+mobJVpUQw/clvoVyIrNNppLhm1V1S/ylHXh0qCrDppDpCA==} + deprecated: Reliability and performance greatly improved - please see https://github.com/WalletConnect/walletconnect-monorepo/releases '@walletconnect/sign-client@2.12.2': resolution: {integrity: sha512-cM0ualXj6nVvLqS4BDNRk+ZWR+lubcsz/IHreH+3wYrQ2sV+C0fN6ctrd7MMGZss0C0qacWCx0pm62ZBuoKvqA==} @@ -4921,6 +4925,7 @@ packages: abstract-leveldown@7.2.0: resolution: {integrity: sha512-DnhQwcFEaYsvYDnACLZhMmCWd3rkOeEvglpa4q5i/5Jlm3UIsWaxVzuXvDLFCSCWRO3yy2/+V/G7FusFgejnfQ==} engines: {node: '>=10'} + deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} @@ -6734,6 +6739,7 @@ packages: eciesjs@0.3.18: resolution: {integrity: sha512-RQhegEtLSyIiGJmFTZfvCTHER/fymipXFVx6OwSRYD6hOuy+6Kjpk0dGvIfP9kxn/smBpxQy71uxpGO406ITCw==} + deprecated: Please upgrade to v0.4+ ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} @@ -7166,16 +7172,19 @@ packages: eslint@6.8.0: resolution: {integrity: sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true eslint@8.50.0: resolution: {integrity: sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true eslint@8.57.0: resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true esniff@2.0.1: @@ -7273,6 +7282,7 @@ packages: ethereum-bloom-filters@1.1.0: resolution: {integrity: sha512-J1gDRkLpuGNvWYzWslBQR9cDV4nd4kfvVTE/Wy4Kkm4yb3EYRSlyi0eB/inTsSTTVyA0+HyzHgbr95Fn/Z1fSw==} + deprecated: do not use this package use package versions above as this can miss some topics ethereum-cryptography@0.1.3: resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} @@ -7285,6 +7295,7 @@ packages: ethereumjs-abi@0.6.8: resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} + deprecated: This library has been deprecated and usage is discouraged. ethereumjs-util@6.2.1: resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==} @@ -7908,6 +7919,7 @@ packages: glob@7.1.7: resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + deprecated: Glob versions prior to v9 are no longer supported glob@7.2.0: resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} @@ -11095,6 +11107,7 @@ packages: puppeteer@22.6.5: resolution: {integrity: sha512-YuoRKGj3MxHhUwrey7vmNvU4odGdUdNsj1ee8pfcqQlLWIXfMOXZCAXh8xdzpZESHH3tCGWp2xmPZE8E6iUEWg==} engines: {node: '>=18'} + deprecated: < 22.8.2 is no longer supported hasBin: true pure-rand@5.0.5: @@ -11611,6 +11624,7 @@ packages: rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true ripemd160-min@0.0.6: @@ -12441,10 +12455,12 @@ packages: sudo-prompt@9.2.1: resolution: {integrity: sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. superagent@8.1.2: resolution: {integrity: sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==} engines: {node: '>=6.4.0 <13 || >=14'} + deprecated: Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.net superstruct@1.0.4: resolution: {integrity: sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==} @@ -12488,8 +12504,8 @@ packages: svg-tags@1.0.0: resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} - svgo@3.2.0: - resolution: {integrity: sha512-4PP6CMW/V7l/GmKRKzsLR8xxjdHTV4IMvhTnpuHwwBazSIlw5W/5SmPjN8Dwyt7lKbSJrRDgp4t9ph0HgChFBQ==} + svgo@3.3.2: + resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==} engines: {node: '>=14.0.0'} hasBin: true @@ -15337,7 +15353,7 @@ snapshots: transitivePeerDependencies: - debug - '@ensdomains/ens-contracts@https://codeload.github.com/ensdomains/ens-contracts/tar.gz/9d6d5b727db18247d74937aa3c6ed162f9121c52(hardhat@2.22.2(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10))': + '@ensdomains/ens-contracts@https://codeload.github.com/ensdomains/ens-contracts/tar.gz/d93dfee5908040eb3f7ee98bad7e0fed43d4c9a4(hardhat@2.22.2(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10))': dependencies: '@ensdomains/buffer': 0.1.1 '@ensdomains/solsha1': 0.0.3 @@ -16118,7 +16134,7 @@ snapshots: - supports-color - utf-8-validate - '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.11.20)(typescript@5.4.5))': + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.31)(typescript@5.4.5))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -16132,7 +16148,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@18.19.31)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.11.20)(typescript@5.4.5)) + jest-config: 29.7.0(@types/node@18.19.31)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.31)(typescript@5.4.5)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -16152,8 +16168,9 @@ snapshots: - babel-plugin-macros - supports-color - ts-node + optional: true - '@jest/core@29.7.0(ts-node@10.9.2(@types/node@18.19.31)(typescript@5.4.5))': + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.11.20)(typescript@5.4.5))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -16167,7 +16184,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@18.19.31)(ts-node@10.9.2(@types/node@18.19.31)(typescript@5.4.5)) + jest-config: 29.7.0(@types/node@18.19.31)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.11.20)(typescript@5.4.5)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -16187,7 +16204,6 @@ snapshots: - babel-plugin-macros - supports-color - ts-node - optional: true '@jest/create-cache-key-function@29.7.0': dependencies: @@ -16871,7 +16887,7 @@ snapshots: transitivePeerDependencies: - chokidar - '@nestjs/swagger@7.4.2(@nestjs/common@10.3.7(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.8(@nestjs/common@10.3.7(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/platform-express@10.4.8)(encoding@0.1.13)(reflect-metadata@0.1.14)(rxjs@7.8.1))(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)': + '@nestjs/swagger@7.4.2(@nestjs/common@10.3.7(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.8)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)': dependencies: '@microsoft/tsdoc': 0.15.1 '@nestjs/common': 10.3.7(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) @@ -16886,7 +16902,7 @@ snapshots: class-transformer: 0.5.1 class-validator: 0.14.1 - '@nestjs/terminus@10.2.3(@nestjs/axios@3.0.2(@nestjs/common@10.3.7(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(axios@1.7.7)(rxjs@7.8.1))(@nestjs/common@10.3.7(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.8(@nestjs/common@10.3.7(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/platform-express@10.4.8)(encoding@0.1.13)(reflect-metadata@0.1.14)(rxjs@7.8.1))(reflect-metadata@0.1.14)(rxjs@7.8.1)': + '@nestjs/terminus@10.2.3(@nestjs/axios@3.0.2(@nestjs/common@10.3.7(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(axios@1.7.7)(rxjs@7.8.1))(@nestjs/common@10.3.7(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.8)(reflect-metadata@0.1.14)(rxjs@7.8.1)': dependencies: '@nestjs/common': 10.3.7(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) '@nestjs/core': 10.4.8(@nestjs/common@10.3.7(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/platform-express@10.4.8)(encoding@0.1.13)(reflect-metadata@0.1.14)(rxjs@7.8.1) @@ -16897,7 +16913,7 @@ snapshots: optionalDependencies: '@nestjs/axios': 3.0.2(@nestjs/common@10.3.7(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(axios@1.7.7)(rxjs@7.8.1) - '@nestjs/testing@10.3.7(@nestjs/common@10.3.7(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.8(@nestjs/common@10.3.7(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/platform-express@10.4.8)(encoding@0.1.13)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/platform-express@10.4.8(@nestjs/common@10.3.7(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.8))': + '@nestjs/testing@10.3.7(@nestjs/common@10.3.7(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.8)(@nestjs/platform-express@10.4.8)': dependencies: '@nestjs/common': 10.3.7(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) '@nestjs/core': 10.4.8(@nestjs/common@10.3.7(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/platform-express@10.4.8)(encoding@0.1.13)(reflect-metadata@0.1.14)(rxjs@7.8.1) @@ -18209,7 +18225,7 @@ snapshots: '@sentry/types': 5.30.0 tslib: 1.14.1 - '@sentry/nextjs@7.110.0(encoding@0.1.13)(next@14.2.10(@babel/core@7.24.4)(@playwright/test@1.43.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)(webpack@5.96.1(esbuild@0.17.19))': + '@sentry/nextjs@7.110.0(encoding@0.1.13)(next@14.2.10(@babel/core@7.24.4)(@playwright/test@1.43.1)(babel-plugin-macros@3.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)(webpack@5.96.1(esbuild@0.17.19))': dependencies: '@rollup/plugin-commonjs': 24.0.0(rollup@2.78.0) '@sentry/core': 7.110.0 @@ -18221,7 +18237,7 @@ snapshots: '@sentry/vercel-edge': 7.110.0 '@sentry/webpack-plugin': 1.21.0(encoding@0.1.13) chalk: 3.0.0 - next: 14.2.10(@babel/core@7.24.4)(@playwright/test@1.43.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + next: 14.2.10(@babel/core@7.24.4)(@playwright/test@1.43.1)(babel-plugin-macros@3.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 resolve: 1.22.8 rollup: 2.78.0 @@ -18494,7 +18510,7 @@ snapshots: '@svgr/core': 8.1.0(typescript@5.4.5) cosmiconfig: 8.3.6(typescript@5.4.5) deepmerge: 4.3.1 - svgo: 3.2.0 + svgo: 3.3.2 transitivePeerDependencies: - typescript @@ -18571,7 +18587,7 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/jest-dom@6.4.2(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@18.19.31)(ts-node@10.9.2(@types/node@18.19.31)(typescript@5.4.5)))(vitest@1.5.0(@types/node@18.19.31)(jsdom@24.0.0(bufferutil@4.0.7)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.3))(terser@5.30.3))': + '@testing-library/jest-dom@6.4.2(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@18.19.31)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.31)(typescript@5.4.5)))(vitest@1.5.0(@types/node@18.19.31)(jsdom@24.0.0(bufferutil@4.0.7)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.3))(terser@5.30.3))': dependencies: '@adobe/css-tools': 4.3.3 '@babel/runtime': 7.24.4 @@ -18584,7 +18600,7 @@ snapshots: optionalDependencies: '@jest/globals': 29.7.0 '@types/jest': 29.5.12 - jest: 29.7.0(@types/node@18.19.31)(ts-node@10.9.2(@types/node@18.19.31)(typescript@5.4.5)) + jest: 29.7.0(@types/node@18.19.31)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.31)(typescript@5.4.5)) vitest: 1.5.0(@types/node@18.19.31)(jsdom@24.0.0(bufferutil@4.0.7)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.3))(terser@5.30.3) '@testing-library/react-hooks@8.0.1(@types/react@18.2.21)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': @@ -21818,13 +21834,13 @@ snapshots: safe-buffer: 5.2.1 sha.js: 2.4.11 - create-jest@29.7.0(@types/node@18.19.31)(ts-node@10.9.2(@types/node@18.19.31)(typescript@5.4.5)): + create-jest@29.7.0(@types/node@18.19.31)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.31)(typescript@5.4.5)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.19.31)(ts-node@10.9.2(@types/node@18.19.31)(typescript@5.4.5)) + jest-config: 29.7.0(@types/node@18.19.31)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.31)(typescript@5.4.5)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -22673,7 +22689,7 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.50.0)(typescript@5.4.5))(eslint@8.50.0))(eslint@8.50.0): + eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.29.1)(eslint@8.50.0): dependencies: confusing-browser-globals: 1.0.11 eslint: 8.50.0 @@ -22682,18 +22698,18 @@ snapshots: object.entries: 1.1.8 semver: 6.3.1 - eslint-config-airbnb-typescript@17.1.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.50.0)(typescript@5.4.5))(eslint@8.50.0)(typescript@5.4.5))(@typescript-eslint/parser@6.21.0(eslint@8.50.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.50.0)(typescript@5.4.5))(eslint@8.50.0))(eslint@8.50.0): + eslint-config-airbnb-typescript@17.1.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.50.0)(typescript@5.4.5))(eslint@8.50.0)(typescript@5.4.5))(@typescript-eslint/parser@6.21.0(eslint@8.50.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@8.50.0): dependencies: '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.50.0)(typescript@5.4.5))(eslint@8.50.0)(typescript@5.4.5) '@typescript-eslint/parser': 6.21.0(eslint@8.50.0)(typescript@5.4.5) eslint: 8.50.0 - eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.50.0)(typescript@5.4.5))(eslint@8.50.0))(eslint@8.50.0) + eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.1)(eslint@8.50.0) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.50.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.50.0) - eslint-config-airbnb@19.0.4(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.50.0)(typescript@5.4.5))(eslint@8.50.0))(eslint-plugin-jsx-a11y@6.8.0(eslint@8.50.0))(eslint-plugin-react-hooks@4.6.0(eslint@8.50.0))(eslint-plugin-react@7.34.1(eslint@8.50.0))(eslint@8.50.0): + eslint-config-airbnb@19.0.4(eslint-plugin-import@2.29.1)(eslint-plugin-jsx-a11y@6.8.0(eslint@8.50.0))(eslint-plugin-react-hooks@4.6.0(eslint@8.50.0))(eslint-plugin-react@7.34.1(eslint@8.50.0))(eslint@8.50.0): dependencies: eslint: 8.50.0 - eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.50.0)(typescript@5.4.5))(eslint@8.50.0))(eslint@8.50.0) + eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.1)(eslint@8.50.0) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.50.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.50.0) eslint-plugin-jsx-a11y: 6.8.0(eslint@8.50.0) eslint-plugin-react: 7.34.1(eslint@8.50.0) @@ -22732,7 +22748,7 @@ snapshots: dependencies: eslint: 8.57.0 - eslint-config-react-app@5.2.1(@typescript-eslint/eslint-plugin@2.34.0(@typescript-eslint/parser@2.34.0(eslint@6.8.0)(typescript@3.9.10))(eslint@6.8.0)(typescript@3.9.10))(@typescript-eslint/parser@2.34.0(eslint@6.8.0)(typescript@3.9.10))(babel-eslint@10.1.0(eslint@8.57.0))(eslint-plugin-flowtype@3.13.0(eslint@8.57.0))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@2.34.0(eslint@6.8.0)(typescript@3.9.10))(eslint@6.8.0))(eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.0))(eslint-plugin-react-hooks@2.5.1(eslint@8.57.0))(eslint-plugin-react@7.34.1(eslint@8.57.0))(eslint@6.8.0)(typescript@3.9.10): + eslint-config-react-app@5.2.1(@typescript-eslint/eslint-plugin@2.34.0(@typescript-eslint/parser@2.34.0(eslint@6.8.0)(typescript@3.9.10))(eslint@6.8.0)(typescript@3.9.10))(@typescript-eslint/parser@2.34.0(eslint@6.8.0)(typescript@3.9.10))(babel-eslint@10.1.0(eslint@6.8.0))(eslint-plugin-flowtype@3.13.0(eslint@6.8.0))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@2.34.0(eslint@6.8.0)(typescript@3.9.10))(eslint@6.8.0))(eslint-plugin-jsx-a11y@6.8.0(eslint@6.8.0))(eslint-plugin-react-hooks@2.5.1(eslint@6.8.0))(eslint-plugin-react@7.34.1(eslint@6.8.0))(eslint@6.8.0)(typescript@3.9.10): dependencies: '@typescript-eslint/eslint-plugin': 2.34.0(@typescript-eslint/parser@2.34.0(eslint@6.8.0)(typescript@3.9.10))(eslint@6.8.0)(typescript@3.9.10) '@typescript-eslint/parser': 2.34.0(eslint@6.8.0)(typescript@3.9.10) @@ -22760,7 +22776,7 @@ snapshots: debug: 4.3.4(supports-color@5.5.0) enhanced-resolve: 5.16.0 eslint: 8.50.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.50.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.50.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.50.0))(eslint@8.50.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.50.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.50.0) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.50.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.50.0) fast-glob: 3.3.2 get-tsconfig: 4.7.3 @@ -22772,7 +22788,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.50.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.50.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.50.0))(eslint@8.50.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.50.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.50.0): dependencies: debug: 3.2.7 optionalDependencies: @@ -22808,7 +22824,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.50.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.50.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.50.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.50.0))(eslint@8.50.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.50.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.50.0) hasown: 2.0.2 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -25785,16 +25801,16 @@ snapshots: - supports-color - utf-8-validate - jest-cli@29.7.0(@types/node@18.19.31)(ts-node@10.9.2(@types/node@18.19.31)(typescript@5.4.5)): + jest-cli@29.7.0(@types/node@18.19.31)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.31)(typescript@5.4.5)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.19.31)(typescript@5.4.5)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.31)(typescript@5.4.5)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.19.31)(ts-node@10.9.2(@types/node@18.19.31)(typescript@5.4.5)) + create-jest: 29.7.0(@types/node@18.19.31)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.31)(typescript@5.4.5)) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@18.19.31)(ts-node@10.9.2(@types/node@18.19.31)(typescript@5.4.5)) + jest-config: 29.7.0(@types/node@18.19.31)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.31)(typescript@5.4.5)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -25851,7 +25867,7 @@ snapshots: - supports-color - utf-8-validate - jest-config@29.7.0(@types/node@18.19.31)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.11.20)(typescript@5.4.5)): + jest-config@29.7.0(@types/node@18.19.31)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.31)(typescript@5.4.5)): dependencies: '@babel/core': 7.24.4 '@jest/test-sequencer': 29.7.0 @@ -25877,12 +25893,13 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 18.19.31 - ts-node: 10.9.2(@types/node@20.11.20)(typescript@5.4.5) + ts-node: 10.9.2(@types/node@18.19.31)(typescript@5.4.5) transitivePeerDependencies: - babel-plugin-macros - supports-color + optional: true - jest-config@29.7.0(@types/node@18.19.31)(ts-node@10.9.2(@types/node@18.19.31)(typescript@5.4.5)): + jest-config@29.7.0(@types/node@18.19.31)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.11.20)(typescript@5.4.5)): dependencies: '@babel/core': 7.24.4 '@jest/test-sequencer': 29.7.0 @@ -25908,11 +25925,10 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 18.19.31 - ts-node: 10.9.2(@types/node@18.19.31)(typescript@5.4.5) + ts-node: 10.9.2(@types/node@20.11.20)(typescript@5.4.5) transitivePeerDependencies: - babel-plugin-macros - supports-color - optional: true jest-config@29.7.0(@types/node@20.11.20)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.11.20)(typescript@5.4.5)): dependencies: @@ -26450,12 +26466,12 @@ snapshots: - supports-color - utf-8-validate - jest@29.7.0(@types/node@18.19.31)(ts-node@10.9.2(@types/node@18.19.31)(typescript@5.4.5)): + jest@29.7.0(@types/node@18.19.31)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.31)(typescript@5.4.5)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.19.31)(typescript@5.4.5)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.31)(typescript@5.4.5)) '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@18.19.31)(ts-node@10.9.2(@types/node@18.19.31)(typescript@5.4.5)) + jest-cli: 29.7.0(@types/node@18.19.31)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.31)(typescript@5.4.5)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -27717,17 +27733,17 @@ snapshots: next-compose-plugins@2.2.1: {} - next-dev-https@0.1.2(next@14.2.10(@babel/core@7.24.4)(@playwright/test@1.43.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0): + next-dev-https@0.1.2(next@14.2.10(@babel/core@7.24.4)(@playwright/test@1.43.1)(babel-plugin-macros@3.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0): dependencies: arg: 5.0.2 - next: 14.2.10(@babel/core@7.24.4)(@playwright/test@1.43.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + next: 14.2.10(@babel/core@7.24.4)(@playwright/test@1.43.1)(babel-plugin-macros@3.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) qrcode-terminal: 0.12.0 react: 18.2.0 selfsigned: 2.4.1 - next-router-mock@0.9.13(next@14.2.10(@babel/core@7.24.4)(@playwright/test@1.43.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0): + next-router-mock@0.9.13(next@14.2.10(@babel/core@7.24.4)(@playwright/test@1.43.1)(babel-plugin-macros@3.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0): dependencies: - next: 14.2.10(@babel/core@7.24.4)(@playwright/test@1.43.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + next: 14.2.10(@babel/core@7.24.4)(@playwright/test@1.43.1)(babel-plugin-macros@3.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 next-tick@1.1.0: {} @@ -27737,7 +27753,7 @@ snapshots: enhanced-resolve: 5.16.0 escalade: 3.1.2 - next@14.2.10(@babel/core@7.24.4)(@playwright/test@1.43.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + next@14.2.10(@babel/core@7.24.4)(@playwright/test@1.43.1)(babel-plugin-macros@3.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@next/env': 14.2.10 '@swc/helpers': 0.5.5 @@ -27747,7 +27763,7 @@ snapshots: postcss: 8.4.31 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - styled-jsx: 5.1.1(@babel/core@7.24.4)(react@18.2.0) + styled-jsx: 5.1.1(@babel/core@7.24.4)(babel-plugin-macros@3.1.0)(react@18.2.0) optionalDependencies: '@next/swc-darwin-arm64': 14.2.10 '@next/swc-darwin-x64': 14.2.10 @@ -30280,12 +30296,13 @@ snapshots: transitivePeerDependencies: - '@babel/core' - styled-jsx@5.1.1(@babel/core@7.24.4)(react@18.2.0): + styled-jsx@5.1.1(@babel/core@7.24.4)(babel-plugin-macros@3.1.0)(react@18.2.0): dependencies: client-only: 0.0.1 react: 18.2.0 optionalDependencies: '@babel/core': 7.24.4 + babel-plugin-macros: 3.1.0 stylelint-config-prettier@9.0.5(stylelint@14.11.0): dependencies: @@ -30450,7 +30467,7 @@ snapshots: svg-tags@1.0.0: {} - svgo@3.2.0: + svgo@3.3.2: dependencies: '@trysound/sax': 0.2.0 commander: 7.2.0 @@ -31023,7 +31040,7 @@ snapshots: enquirer: 2.4.1 eslint: 6.8.0 eslint-config-prettier: 6.15.0(eslint@6.8.0) - eslint-config-react-app: 5.2.1(@typescript-eslint/eslint-plugin@2.34.0(@typescript-eslint/parser@2.34.0(eslint@6.8.0)(typescript@3.9.10))(eslint@6.8.0)(typescript@3.9.10))(@typescript-eslint/parser@2.34.0(eslint@6.8.0)(typescript@3.9.10))(babel-eslint@10.1.0(eslint@8.57.0))(eslint-plugin-flowtype@3.13.0(eslint@8.57.0))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@2.34.0(eslint@6.8.0)(typescript@3.9.10))(eslint@6.8.0))(eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.0))(eslint-plugin-react-hooks@2.5.1(eslint@8.57.0))(eslint-plugin-react@7.34.1(eslint@8.57.0))(eslint@6.8.0)(typescript@3.9.10) + eslint-config-react-app: 5.2.1(@typescript-eslint/eslint-plugin@2.34.0(@typescript-eslint/parser@2.34.0(eslint@6.8.0)(typescript@3.9.10))(eslint@6.8.0)(typescript@3.9.10))(@typescript-eslint/parser@2.34.0(eslint@6.8.0)(typescript@3.9.10))(babel-eslint@10.1.0(eslint@6.8.0))(eslint-plugin-flowtype@3.13.0(eslint@6.8.0))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@2.34.0(eslint@6.8.0)(typescript@3.9.10))(eslint@6.8.0))(eslint-plugin-jsx-a11y@6.8.0(eslint@6.8.0))(eslint-plugin-react-hooks@2.5.1(eslint@6.8.0))(eslint-plugin-react@7.34.1(eslint@6.8.0))(eslint@6.8.0)(typescript@3.9.10) eslint-plugin-flowtype: 3.13.0(eslint@6.8.0) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.6.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.8.0(eslint@6.8.0) @@ -31549,7 +31566,7 @@ snapshots: vite-plugin-magical-svg@1.2.1(vite@5.2.8(@types/node@18.19.31)(terser@5.30.3)): dependencies: magic-string: 0.30.9 - svgo: 3.2.0 + svgo: 3.3.2 vite: 5.2.8(@types/node@18.19.31)(terser@5.30.3) xml2js: 0.6.2